tiff-4.0.3/0000755000212300117540000000000012027361331007445 500000000000000tiff-4.0.3/man/0000755000212300117540000000000012027361331010220 500000000000000tiff-4.0.3/man/TIFFRGBAImage.3tiff0000644000212300117540000002212511244562247013237 00000000000000.\" $Id: TIFFRGBAImage.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1991-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFRGBAImage 3TIFF "October 29, 2004" "libtiff" .SH NAME TIFFRGBAImageOK, TIFFRGBAImageBegin, TIFFRGBAImageGet, TIFFRGBAImageEnd \- read and decode an image into a raster .SH SYNOPSIS .B "#include " .sp .B "typedef unsigned char TIFFRGBValue;" .B "typedef struct _TIFFRGBAImage TIFFRGBAImage;" .sp .BI "int TIFFRGBAImageOK(TIFF *" tif ", char " emsg[1024] ")" .br .BI "int TIFFRGBAImageBegin(TIFFRGBAImage *" img ", TIFF* " tif ", int " stopOnError ", char " emsg[1024] ")" .br .BI "int TIFFRGBAImageGet(TIFFRGBAImage *" img ", uint32* " raster ", uint32 " width " , uint32 " height ")" .br .BI "void TIFFRGBAImageEnd(TIFFRGBAImage *" img ")" .br .SH DESCRIPTION The routines described here provide a high-level interface through which .SM TIFF images may be read into memory. Images may be strip- or tile-based and have a variety of different characteristics: bits/sample, samples/pixel, photometric, etc. Decoding state is encapsulated in a .I TIFFRGBAImage structure making it possible to capture state for multiple images and quickly switch between them. The target raster format can be customized to a particular application's needs by installing custom routines that manipulate image data according to application requirements. .PP The default usage for these routines is: check if an image can be processed using .IR TIFFRGBAImageOK , construct a decoder state block using .IR TIFFRGBAImageBegin , read and decode an image into a target raster using .IR TIFFRGBAImageGet , and then release resources using .IR TIFFRGBAImageEnd . .I TIFFRGBAImageGet can be called multiple times to decode an image using different state parameters. If multiple images are to be displayed and there is not enough space for each of the decoded rasters, multiple state blocks can be managed and then calls can be made to .I TIFFRGBAImageGet as needed to display an image. .PP The generated raster is assumed to be an array of .I width times .I height 32-bit entries, where .I width must be less than or equal to the width of the image (\c .I height may be any non-zero size). If the raster dimensions are smaller than the image, the image data is cropped to the raster bounds. If the raster height is greater than that of the image, then the image data are placed in the lower part of the raster. (Note that the raster is assume to be organized such that the pixel at location (\fIx\fP,\fIy\fP) is \fIraster\fP[\fIy\fP*\fIwidth\fP+\fIx\fP]; with the raster origin in the .B lower-left hand corner.) .PP Raster pixels are 8-bit packed red, green, blue, alpha samples. The macros .IR TIFFGetR , .IR TIFFGetG , .IR TIFFGetB , and .I TIFFGetA should be used to access individual samples. Images without Associated Alpha matting information have a constant Alpha of 1.0 (255). .PP .I TIFFRGBAImageGet converts non-8-bit images by scaling sample values. Palette, grayscale, bilevel, .SM CMYK\c , and YCbCr images are converted to .SM RGB transparently. Raster pixels are returned uncorrected by any colorimetry information present in the directory. .PP The parameter .I stopOnError specifies how to act if an error is encountered while reading the image. If .I stopOnError is non-zero, then an error will terminate the operation; otherwise .I TIFFRGBAImageGet will continue processing data until all the possible data in the image have been requested. .SH "ALTERNATE RASTER FORMATS" To use the core support for reading and processing .SM TIFF images, but write the resulting raster data in a different format one need only override the ``\fIput methods\fP'' used to store raster data. These methods are are defined in the .I TIFFRGBAImage structure and initially setup by .I TIFFRGBAImageBegin to point to routines that pack raster data in the default .SM ABGR pixel format. Two different routines are used according to the physical organization of the image data in the file: .IR PlanarConfiguration =1 (packed samples), and .IR PlanarConfiguration =2 (separated samples). Note that this mechanism can be used to transform the data before storing it in the raster. For example one can convert data to colormap indices for display on a colormap display. .SH "SIMULTANEOUS RASTER STORE AND DISPLAY" It is simple to display an image as it is being read into memory by overriding the put methods as described above for supporting alternate raster formats. Simply keep a reference to the default put methods setup by .I TIFFRGBAImageBegin and then invoke them before or after each display operation. For example, the .IR tiffgt (1) utility uses the following put method to update the display as the raster is being filled: .sp .nf .ft C static void putContigAndDraw(TIFFRGBAImage* img, uint32* raster, uint32 x, uint32 y, uint32 w, uint32 h, int32 fromskew, int32 toskew, unsigned char* cp) { (*putContig)(img, raster, x, y, w, h, fromskew, toskew, cp); if (x+w == width) { w = width; if (img->orientation == ORIENTATION_TOPLEFT) lrectwrite(0, y-(h-1), w-1, y, raster-x-(h-1)*w); else lrectwrite(0, y, w-1, y+h-1, raster); } } .ft R .fi .sp (the original routine provided by the library is saved in the variable .IR putContig .) .SH "SUPPORTING ADDITIONAL TIFF FORMATS" The .I TIFFRGBAImage routines support the most commonly encountered flavors of .SM TIFF. It is possible to extend this support by overriding the ``\fIget method\fP'' invoked by .I TIFFRGBAImageGet to read .SM TIFF image data. Details of doing this are a bit involved, it is best to make a copy of an existing get method and modify it to suit the needs of an application. .SH NOTES Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be either 1, 3, or 4 (i.e. .I SamplesPerPixel minus .IR ExtraSamples ). .PP Palette image colormaps that appear to be incorrectly written as 8-bit values are automatically scaled to 16-bits. .SH "RETURN VALUES" All routines return 1 if the operation was successful. Otherwise, 0 is returned if an error was encountered and .I stopOnError is zero. .SH DIAGNOSTICS All error messages are directed to the .IR TIFFError (3TIFF) routine. .PP .BR "Sorry, can not handle %d-bit pictures" . The image had .I BitsPerSample other than 1, 2, 4, 8, or 16. .PP .BR "Sorry, can not handle %d-channel images" . The image had .I SamplesPerPixel other than 1, 3, or 4. .PP \fBMissing needed "PhotometricInterpretation" tag\fP. The image did not have a tag that describes how to display the data. .PP \fBNo "PhotometricInterpretation" tag, assuming RGB\fP. The image was missing a tag that describes how to display it, but because it has 3 or 4 samples/pixel, it is assumed to be .SM RGB. .PP \fBNo "PhotometricInterpretation" tag, assuming min-is-black\fP. The image was missing a tag that describes how to display it, but because it has 1 sample/pixel, it is assumed to be a grayscale or bilevel image. .PP .BR "No space for photometric conversion table" . There was insufficient memory for a table used to convert image samples to 8-bit .SM RGB. .PP \fBMissing required "Colormap" tag\fP. A Palette image did not have a required .I Colormap tag. .PP .BR "No space for tile buffer" . There was insufficient memory to allocate an i/o buffer. .PP .BR "No space for strip buffer" . There was insufficient memory to allocate an i/o buffer. .PP .BR "Can not handle format" . The image has a format (combination of .IR BitsPerSample , .IR SamplesPerPixel , and .IR PhotometricInterpretation ) that can not be handled. .PP .BR "No space for B&W mapping table" . There was insufficient memory to allocate a table used to map grayscale data to .SM RGB. .PP .BR "No space for Palette mapping table" . There was insufficient memory to allocate a table used to map data to 8-bit .SM RGB. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFReadRGBAImage (3TIFF), .BR TIFFReadRGBAImageOriented (3TIFF), .BR TIFFReadRGBAStrip (3TIFF), .BR TIFFReadRGBATile (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFbuffer.3tiff0000644000212300117540000000627411244562247013041 00000000000000.\" $Id: TIFFbuffer.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1995 Sam Leffler .\" Copyright (c) 1995 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFBUFFER 3TIFF "November 1, 2005" "libtiff" .SH NAME TIFFReadBufferSetup, TIFFWriteBufferSetup \- I/O buffering control routines .SH SYNOPSIS .nf .B "#include " .sp .BI "int TIFFReadBufferSetup(TIFF *" tif ", tdata_t " buffer ", tsize_t " size ");" .BI "int TIFFWriteBufferSetup(TIFF *" tif ", tdata_t " buffer ", tsize_t " size ");" .fi .SH DESCRIPTION The following routines are provided for client-control of the I/O buffers used by the library. Applications need never use these routines; they are provided only for ``intelligent clients'' that wish to optimize memory usage and/or eliminate potential copy operations that can occur when working with images that have data stored without compression. .PP .I TIFFReadBufferSetup sets up the data buffer used to read raw (encoded) data from a file. If the specified pointer is .SM NULL (zero), then a buffer of the appropriate size is allocated. Otherwise the caller must guarantee that the buffer is large enough to hold any individual strip of raw data. .I TIFFReadBufferSetup returns a non-zero value if the setup was successful and zero otherwise. .PP .I TIFFWriteBufferSetup sets up the data buffer used to write raw (encoded) data to a file. If the specified .I size is \-1 then the buffer size is selected to hold a complete tile or strip, or at least 8 kilobytes, whichever is greater. If the specified .I buffer is .SM NULL (zero), then a buffer of the appropriate size is dynamically allocated. .I TIFFWriteBufferSetup returns a non-zero value if the setup was successful and zero otherwise. .SH DIAGNOSTICS .BR "%s: No space for data buffer at scanline %ld" . .I TIFFReadBufferSetup was unable to dynamically allocate space for a data buffer. .PP .BR "%s: No space for output buffer" . .I TIFFWriteBufferSetup was unable to dynamically allocate space for a data buffer. .SH "SEE ALSO" .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFFieldName.3tiff0000644000212300117540000000354612005255231013377 00000000000000.\" $Id: TIFFFieldName.3tiff,v 1.1 2012-07-29 15:45:29 tgl Exp $ .\" .\" Copyright (c) 2012, Tom Lane .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFFieldName 3TIFF "July 26, 2012" "libtiff" .SH NAME TIFFFieldName \- Get TIFF field name from field information .SH SYNOPSIS .B "#include " .sp .BI "const char* TIFFFieldName(const TIFFField* " fip ")" .SH DESCRIPTION .BR TIFFFieldName returns the textual name for a TIFF field. .P .I fip is a field information pointer previously returned by .BR TIFFFindField , .BR TIFFFieldWithTag , or .BR TIFFFieldWithName . .br .SH "RETURN VALUES" .br .BR TIFFFieldName returns a constant C string. .br .SH "SEE ALSO" .BR libtiff (3TIFF), .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFFieldWriteCount.3tiff0000644000212300117540000000537212005255232014622 00000000000000.\" $Id: TIFFFieldWriteCount.3tiff,v 1.1 2012-07-29 15:45:30 tgl Exp $ .\" .\" Copyright (c) 2012, Tom Lane .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFFieldWriteCount 3TIFF "July 26, 2012" "libtiff" .SH NAME TIFFFieldWriteCount \- Get number of values to be written to field .SH SYNOPSIS .B "#include " .sp .BI "int TIFFFieldWriteCount(const TIFFField* " fip ")" .SH DESCRIPTION .BR TIFFFieldWriteCount returns the number of values to be written into the specified TIFF field; that is, the number of arguments that should be supplied to .BR TIFFSetField . For most field types this is a small positive integer, typically 1 or 2, but there are some special values: .br .BR TIFF_VARIABLE indicates that a variable number of values is possible; then, a .BR uint16 .I count argument and a pointer .I data argument must be supplied to .BR TIFFSetField . .br .BR TIFF_VARIABLE2 is the same as .BR TIFF_VARIABLE except that the .I count argument must have type .BR uint32 . (On most modern machines, this makes no practical difference, and the .I count argument can simply be an .BR int in either case.) .br .BR TIFF_SPP indicates that the number of arguments must be equal to the image's number of samples per pixel. .P .I fip is a field information pointer previously returned by .BR TIFFFindField , .BR TIFFFieldWithTag , or .BR TIFFFieldWithName . .P For most field types, .BR TIFFFieldWriteCount returns the same value as .BR TIFFFieldReadCount , but there are some exceptions. .br .SH "RETURN VALUES" .br .BR TIFFFieldWriteCount returns an integer. .br .SH "SEE ALSO" .BR libtiff (3TIFF), .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiff2rgba.10000644000212300117540000000665211244562247012112 00000000000000.\" $Id: tiff2rgba.1,v 1.4 2006-04-20 12:17:19 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFF2RGBA 1 "November 2, 2005" "libtiff" .SH NAME tiff2rgba \- convert a .SM TIFF image to RGBA color space .SH SYNOPSIS .B tiff2rgba [ .I options ] .I input.tif .I output.tif .SH DESCRIPTION .I Tiff2rgba converts a wide variety of TIFF images into an RGBA TIFF image. This includes the ability to translate different color spaces and photometric interpretation into RGBA, support for alpha blending, and translation of many different bit depths into a 32bit RGBA image. .P Internally this program is implemented using the .I TIFFReadRGBAImage() function, and it suffers any limitations of that image. This includes limited support for > 8 BitsPerSample images, and flaws with some esoteric combinations of BitsPerSample, photometric interpretation, block organization and planar configuration. .P The generated images are stripped images with four samples per pixel (red, green, blue and alpha) or if the .B \-n flag is used, three samples per pixel (red, green, and blue). The resulting images are always planar configuration contiguous. For this reason, this program is a useful utility for transform exotic TIFF files into a form ingestible by almost any TIFF supporting software. .SH OPTIONS .TP .B \-c Specify a compression scheme to use when writing image data: .B "\-c none" for no compression (the default), .B "\-c packbits" for the PackBits compression algorithm, .B "\-c zip" for the Deflate compression algorithm, .B "\-c jpeg" for the JPEG compression algorithm, and .B "\-c lzw" for Lempel-Ziv & Welch. .TP .B \-r Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes. .TP .B \-b Process the image one block (strip/tile) at a time instead of by reading the whole image into memory at once. This may be necessary for very large images on systems with limited RAM. .TP .B \-n Drop the alpha component from the output file, producing a pure RGB file. Currently this does not work if the .B \-b flag is also in effect. .SH "SEE ALSO" .BR tiff2bw (1), .BR TIFFReadRGBAImage (3t), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/gif2tiff.10000644000212300117540000000506111244562247011735 00000000000000.\" $Id: gif2tiff.1,v 1.4 2006-04-20 12:17:19 dron Exp $ .\" .\" Copyright (c) 1991-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH GIF2TIFF 1 "November 2, 2005" "libtiff" .SH NAME gif2tiff \- create a .SM TIFF file from a GIF87 format image file .SH SYNOPSIS .B gif2tiff [ .I options ] .I input.gif .I output.tif .SH DESCRIPTION .I Gif2tiff converts a file in the GIF87 format to .SM TIFF. The .SM TIFF image is created as a palette image, with samples compressed with the Lempel-Ziv & Welch algorithm (\c .IR Compression =5). These characteristics can overridden, or explicitly specified with the options described below. .SH OPTIONS .TP .B \-c Specify a compression scheme to use when writing image data: .B "\-c none" for no compression, .B "\-c packbits" for the PackBits compression algorithm, .B "\-c zip" for the Deflate compression algorithm, and .B "\-c lzw" for Lempel-Ziv & Welch (the default). .TP .B \-r Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes. .SH NOTES The program is based on Paul Haeberli's .I fromgif program which, in turn, is based on Marcel J.E. Mol's GIF reader. .SH BUGS Should have more options to control output format. .SH "SEE ALSO" .BR pal2rgb (1), .BR tiffinfo (1), .BR tiffcp (1), .BR tiffmedian (1), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFWriteDirectory.3tiff0000644000212300117540000001237111501546110014525 00000000000000.\" $Id: TIFFWriteDirectory.3tiff,v 1.3 2010-12-12 01:45:35 faxguy Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFWriteDirectory 3TIFF "September 26, 2001" "libtiff" .SH NAME TIFFWriteDirectory, TIFFRewriteDirectory, TIFFCheckpointDirectory \- write the current directory in an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "int TIFFWriteDirectory(TIFF *" tif ")" .br .BI "int TIFFRewriteDirectory(TIFF *" tif ")" .br .BI "int TIFFCheckpointDirectory(TIFF *" tif ")" .SH DESCRIPTION .IR TIFFWriteDirectory will write the contents of the current directory to the file and setup to create a new subfile in the same file. Applications only need to call .IR TIFFWriteDirectory when writing multiple subfiles to a single .SM TIFF file. .IR TIFFWriteDirectory is automatically called by .IR TIFFClose and .IR TIFFFlush to write a modified directory if the file is open for writing. .PP The .IR TIFFRewriteDirectory function operates similarly to .IR TIFFWriteDirectory, but can be called with directories previously read or written that already have an established location in the file. It will rewrite the directory, but instead of place it at it's old location (as .IR TIFFWriteDirectory would) it will place them at the end of the file, correcting the pointer from the preceding directory or file header to point to it's new location. This is particularly important in cases where the size of the directory and pointed to data has grown, so it won't fit in the space available at the old location. .PP The .IR TIFFCheckpointDirectory writes the current state of the tiff directory into the file to make what is currently in the file readable. Unlike .IR TIFFWriteDirectory, .IR TIFFCheckpointDirectory does not free up the directory data structures in memory, so they can be updated (as strips/tiles are written) and written again. Reading such a partial file you will at worst get a tiff read error for the first strip/tile encountered that is incomplete, but you will at least get all the valid data in the file before that. When the file is complete, just use .IR TIFFWriteDirectory as usual to finish it off cleanly. .SH "RETURN VALUES" 1 is returned when the contents are successfully written to the file. Otherwise, 0 is returned if an error was encountered when writing the directory contents. .SH DIAGNOSTICS All error messages are directed to the .IR TIFFError (3TIFF) routine. .PP .BR "Error post-encoding before directory write" . Before writing the contents of the current directory, any pending data are flushed. This message indicates that an error occurred while doing this. .PP .BR "Error flushing data before directory write" . Before writing the contents of the current directory, any pending data are flushed. This message indicates that an error occurred while doing this. .PP .BR "Cannot write directory, out of space" . There was not enough space to allocate a temporary area for the directory that was to be written. .PP .BR "Error writing directory count" . A write error occurred when writing the count of fields in the directory. .PP .BR "Error writing directory contents" . A write error occurred when writing the directory fields. .PP .BR "Error writing directory link" . A write error occurred when writing the link to the next directory. .PP \fBError writing data for field "%s"\fP. A write error occurred when writing indirect data for the specified field. .PP .BR "Error writing TIFF header" . A write error occurred when re-writing header at the front of the file. .PP .BR "Error fetching directory count" . A read error occurred when fetching the directory count field for a previous directory. This can occur when setting up a link to the directory that is being written. .PP .BR "Error fetching directory link" . A read error occurred when fetching the directory link field for a previous directory. This can occur when setting up a link to the directory that is being written. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFError (3TIFF), .BR TIFFReadDirectory (3TIFF), .BR TIFFSetDirectory (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/fax2tiff.10000644000212300117540000001743311244562247011754 00000000000000.\" $Id: fax2tiff.1,v 1.7 2006-04-20 12:17:19 dron Exp $ .\" .\" Copyright (c) 1990-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH FAX2TIFF 1 "November 2, 2005" "libtiff" .SH NAME fax2tiff \- create a .SM TIFF Class F fax file from raw fax data .SH SYNOPSIS .B fax2tiff [ .I options ] [ .B \-o .I output.tif ] .I input.raw .SH DESCRIPTION .I Fax2tiff creates a .SM TIFF file containing .SM CCITT Group 3 or Group 4 encoded data from one or more files containing ``raw'' Group 3 or Group 4 encoded data (typically obtained directly from a fax modem). By default, each row of data in the resultant .SM TIFF file is 1-dimensionally encoded and padded or truncated to 1728 pixels, as needed. The resultant image is a set of low resolution (98 lines/inch) or medium resolution (196 lines/inch) pages, each of which is a single strip of data. The generated file conforms to the .SM TIFF Class F (\c .SM FAX\c ) specification for storing facsimile data. This means, in particular, that each page of the data does .B not include the trailing .I "return to control" (\c .SM RTC\c ) code; as required for transmission by the .SM CCITT Group 3 specifications. The old, ``classic'', format is created if the .B \-c option is used. (The Class F format can also be requested with the .B \-f option.) .PP The default name of the output image is .IR fax.tif ; this can be changed with the .B \-o option. Each input file is assumed to be a separate page of facsimile data from the same document. The order in which input files are specified on the command line is the order in which the resultant pages appear in the output file. .SH OPTIONS Options that affect the interpretation of input data are: .TP .B \-3 Assume input data is .SM CCITT Group 3 encoded (default). .TP .B \-4 Assume input data is .SM CCITT Group 4 encoded. .TP .B \-U Assume input data is uncompressed (Group 3 or Group 4). .TP .B \-1 Assume input data is encoded with the 1-dimensional version of the .SM CCITT Group 3 Huffman encoding algorithm (default). .TP .B \-2 Assume input data is 2-dimensional version of the .SM CCITT Group 3 Huffman encoding algorithm. .TP .B \-P Assume input data is .B not EOL-aligned (default). This option has effect with Group 3 encoded input only. .TP .B \-A Assume input data is EOL-aligned. This option has effect with Group 3 encoded input only. .TP .B \-M Treat input data as having bits filled from most significant bit (\c .SM MSB\c ) to most least bit (\c .SM LSB\c ). .TP .B \-L Treat input data as having bits filled from least significant bit (\c .SM LSB\c ) to most significant bit (\c .SM MSB\c ) (default). .TP .B \-B Assume input data was encoded with black as 0 and white as 1. .TP .B \-W Assume input data was encoded with black as 1 and white as 0 (default). .TP .B \-R Specify the vertical resolution, in lines/inch, of the input images. By default input are assumed to have a vertical resolution of 196 lines/inch. If images are low resolution facsimile, a value of 98 lines/inch should be specified. .TP .B \-X Specify the width, in pixels, of the input images. By default input are assumed to have a width of 1728 pixels. .PP Options that affect the output file format are: .TP .B \-o Specify the name of the output file. .TP .B \-7 Force output to be compressed with the .SM CCITT Group 3 Huffman encoding algorithm (default). .TP .B \-8 Force output to be compressed with the .SM CCITT Group 4 Huffman encoding. .TP .B \-u Force output to be uncompressed (Group 3 or Group 4). .TP .B \-5 Force output to be encoded with the 1-dimensional version of the .SM CCITT Group 3 Huffman encoding algorithm. .TP .B \-6 Force output to be encoded with the 2-dimensional version of the .SM CCITT Group 3 Huffman encoding algorithm (default). .TP .B \-a Force the last bit of each .I "End Of Line" (\c .SM EOL\c ) code to land on a byte boundary (default). This ``zero padding'' will be reflected in the contents of the .I Group3Options tag of the resultant .SM TIFF file. This option has effect with Group 3 encoded output only. .TP .B \-p Do not EOL-align output. This option has effect with Group 3 encoded output only. .TP .B \-c Generate "classic" Group 3 TIFF format. .TP .B \-f Generate TIFF Class F (TIFF/F) format (default). .TP .B \-m Force output data to have bits filled from most significant bit (\c .SM MSB\c ) to most least bit (\c .SM LSB\c ). .TP .B \-l Force output data to have bits filled from least significant bit (\c .SM LSB\c ) to most significant bit (\c .SM MSB\c ) (default). .TP .B \-r Specify the number of rows (scanlines) in each strip of data written to the output file. By default (or when value .B 0 is specified), .I tiffcp attempts to set the rows/strip that no more than 8 kilobytes of data appear in a strip (with except of G3/G4 compression schemes). If you specify special value .B \-1 it will results in infinite number of the rows per strip. The entire image will be the one strip in that case. This is default in case of G3/G4 output compression schemes. .TP .B \-s Stretch the input image vertically by writing each input row of data twice to the output file. .TP .B \-v Force .I fax2tiff to print the number of rows of data it retrieved from the input file. .TP .B \-z Force output to be compressed with the LZW encoding. .SH DIAGNOSTICS The following warnings and errors come from the decoding routines in the library. .PP .BR "Warning, %s: Premature EOL at scanline %d (x %d).\en" . The input data had a row that was shorter than the expected width. The row is padded with white. .PP .BR "%s: Premature EOF at scanline %d (x %d).\en" . The decoder ran out of data in the middle of a scanline. The resultant row is padded with white. .PP .BR "%s: Bad code word at row %d, x %d\en" . An invalid Group 3 .I code was encountered while decoding the input file. The row number and horizontal position is given. The remainder of the input row is discarded, while the corresponding output row is padded with white. .PP .BR "%s: Bad 2D code word at scanline %d.\en" . An invalid Group 4 or 2D Group 3 .I code was encountered while decoding the input file. The row number and horizontal position is given. The remainder of the input row is discarded, while the corresponding output row is padded with white. .SH BUGS Input data are assumed to have a a ``top left'' orientation; it should be possible to override this assumption from the command line. .SH "SEE ALSO" .BR "\s-1CCITT\s+1 Recommendation T.4" (Standardization of Group 3 Facsimile Apparatus for Document Transmission). .PP .BR "The Spirit of TIFF Class F", an appendix to the TIFF 5.0 specification prepared by Cygnet Technologies. .PP .BR tiffinfo (1), .BR tiffdither (1), .BR tiffgt (1), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFWriteEncodedStrip.3tiff0000644000212300117540000000703111244562247015156 00000000000000.\" $Id: TIFFWriteEncodedStrip.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFWriteEncodedStrip 3TIFF "October 15, 1995" "libtiff" .SH NAME TIFFWritedEncodedStrip \- compress and write a strip of data to an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "tsize_t TIFFWriteEncodedStrip(TIFF *" tif ", tstrip_t " strip ", tdata_t " buf ", tsize_t " size ")" .SH DESCRIPTION Compress .I size bytes of raw data from .I buf and write the result to the specified strip; replacing any previously written data. Note that the value of .I strip is a ``raw strip number.'' That is, the caller must take into account whether or not the data are organized in separate planes (\c .IR PlanarConfiguration =2). .SH NOTES The library writes encoded data using the native machine byte order. Correctly implemented .SM TIFF readers are expected to do any necessary byte-swapping to correctly process image data with BitsPerSample greater than 8. .PP The strip number must be valid according to the current settings of the .I ImageLength and .I RowsPerStrip tags. An image may be dynamically grown by increasing the value of .I ImageLength prior to each call to .IR TIFFWriteEncodedStrip . .SH "RETURN VALUES" \-1 is returned if an error was encountered. Otherwise, the value of .IR size is returned. .SH DIAGNOSTICS All error messages are directed to the .IR TIFFError (3TIFF) routine. .PP \fB%s: File not open for writing\fP. The file was opened for reading, not writing. .PP \fBCan not write scanlines to a tiled image\fP. The image is assumed to be organized in tiles because the .I TileWidth and .I TileLength tags have been set with .IR TIFFSetField (3TIFF). .PP \fB%s: Must set "ImageWidth" before writing data\fP. The image's width has not be set before the first write. See .IR TIFFSetField (3TIFF) for information on how to do this. .PP \fB%s: Must set "PlanarConfiguration" before writing data\fP. The organization of data has not be defined before the first write. See .IR TIFFSetField (3TIFF) for information on how to do this. .PP \fB%s: No space for strip arrays"\fP. There was not enough space for the arrays that hold strip offsets and byte counts. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFWriteScanline (3TIFF), .BR TIFFWriteRawStrip (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFWriteRawStrip.3tiff0000644000212300117540000000623211244562247014350 00000000000000.\" $Id: TIFFWriteRawStrip.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFWriteRawstrip 3TIFF "October 15, 1995" "libtiff" .SH NAME TIFFWriteRawStrip \- write a strip of raw data to an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "tsize_t TIFFWriteRawStrip(TIFF *" tif ", tstrip_t " strip ", tdata_t " buf ", tsize_t " size ")" .SH DESCRIPTION Append .I size bytes of raw data to the specified strip. .SH NOTES The strip number must be valid according to the current settings of the .I ImageLength and .I RowsPerStrip tags. An image may be dynamically grown by increasing the value of .I ImageLength prior to each call to .IR TIFFWriteRawStrip . .SH "RETURN VALUES" \-1 is returned if an error occurred. Otherwise, the value of .IR size is returned. .SH DIAGNOSTICS All error messages are directed to the .BR TIFFError (3TIFF) routine. .PP \fB%s: File not open for writing\fP. The file was opened for reading, not writing. .PP \fBCan not write scanlines to a tiled image\fP. The image is assumed to be organized in tiles because the .I TileWidth and .I TileLength tags have been set with .BR TIFFSetField (3TIFF). .PP \fB%s: Must set "ImageWidth" before writing data\fP. The image's width has not be set before the first write. See .BR TIFFSetField (3TIFF) for information on how to do this. .PP \fB%s: Must set "PlanarConfiguration" before writing data\fP. The organization of data has not be defined before the first write. See .BR TIFFSetField (3TIFF) for information on how to do this. .PP \fB%s: No space for strip arrays"\fP. There was not enough space for the arrays that hold strip offsets and byte counts. .PP \fB%s: Strip %d out of range, max %d\fP. The specified strip is not a valid strip according to the currently specified image dimensions. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFWriteEncodedStrip (3TIFF), .BR TIFFWriteScanline (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFstrip.3tiff0000644000212300117540000000710711244562247012725 00000000000000.\" $Id: TIFFstrip.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1992-1997 Sam Leffler .\" Copyright (c) 1992-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFSTRIP 3TIFF "October 15, 1995" "libtiff" .SH NAME TIFFDefaultStripSize, TIFFStripSize, TIFFVStripSize, TIFFRawStripSize, TIFFComputeStrip, TIFFNumberOfStrips \- strip-related utility routines .SH SYNOPSIS .B "#include " .sp .BI "uint32 TIFFDefaultStripSize(TIFF *" tif ", uint32 " estimate ")" .br .BI "tsize_t TIFFStripSize(TIFF *" tif ")" .br .BI "tsize_t TIFFVStripSize(TIFF *" tif ", uint32 " nrows ")" .br .BI "tsize_t TIFFRawStripSize(TIFF *" tif ", tstrip_t " strip ")" .br .BI "tstrip_t TIFFComputeStrip(TIFF *" tif ", uint32 " row ", tsample_t " sample ")" .br .BI "tstrip_t TIFFNumberOfStrips(TIFF *" tif ")" .SH DESCRIPTION .I TIFFDefaultStripSize returns the number of rows for a reasonable-sized strip according to the current settings of the .IR ImageWidth , .IR BitsPerSample , .IR SamplesPerPixel , tags and any compression-specific requirements. If the .I estimate parameter, if non-zero, then it is taken as an estimate of the desired strip size and adjusted according to any compression-specific requirements. The value returned by this function is typically used to define the .I RowsPerStrip tag. In lieu of any unusual requirements .I TIFFDefaultStripSize tries to create strips that have approximately 8 kilobytes of uncompressed data. .PP .IR TIFFStripSize returns the equivalent size for a strip of data as it would be returned in a call to .IR TIFFReadEncodedStrip or as it would be expected in a call to .IR TIFFWriteEncodedStrip . .PP .I TIFFVStripSize returns the number of bytes in a strip with .I nrows rows of data. .PP .I TIFFRawStripSize returns the number of bytes in a raw strip (i.e. not decoded). .PP .IR TIFFComputeStrip returns the strip that contains the specified coordinates. A valid strip is always returned; out-of-range coordinate values are clamped to the bounds of the image. The .I row parameter is always used in calculating a strip. The .I sample parameter is used only if data are organized in separate planes (\c .IR PlanarConfiguration =2). .PP .IR TIFFNumberOfStrips returns the number of strips in the image. .SH DIAGNOSTICS None. .SH "SEE ALSO" .BR TIFFReadEncodedStrip (3TIFF), .BR TIFFReadRawStrip (3TIFF), .BR TIFFWriteEncodedStrip (3TIFF), .BR TIFFWriteRawStrip (3TIFF), .BR libtiff (3TIFF), .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFClose.3tiff0000644000212300117540000000376511244563144012634 00000000000000.\" $Id: TIFFClose.3tiff,v 1.3 2009-08-24 19:13:40 bfriesen Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFClose 3TIFF "November 2, 2005" "libtiff" .SH NAME TIFFClose \- close a previously opened .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "void TIFFClose(TIFF *" tif ")" .SH DESCRIPTION .IR TIFFClose closes a file that was previously opened with .BR TIFFOpen (3TIFF). Any buffered data are flushed to the file, including the contents of the current directory (if modified); and all resources are reclaimed. .SH DIAGNOSTICS All error messages are directed to the .BR TIFFError (3TIFF) routine. Likewise, warning messages are directed to the .BR TIFFWarning (3TIFF) routine. .SH "SEE ALSO" .BR libtiff (3TIFF), .BR TIFFOpen (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiffgt.10000644000212300117540000001503611244562247011523 00000000000000.\" $Id: tiffgt.1,v 1.4 2006-04-20 12:17:19 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFGT 1 "September 20, 2005" "libtiff" .SH NAME tiffgt \- display an image stored in a .SM TIFF file (Silicon Graphics version) .SH SYNOPSIS .B tiffgt [ .I options ] .I "input.tif ..." .SH DESCRIPTION .I tiffgt displays one or more images stored using the Tag Image File Format, Revision 6.0. Each image is placed in a fixed size window that the user must position on the display (unless configured otherwise through X defaults). If the display has fewer than 24 bitplanes, or if the image does not warrant full color, then .SM RGB color values are mapped to the closest values that exist in the colormap (this is done using the .I rgbi routine found in the graphics utility library .BR \-lgutil .) .PP .I tiffgt correctly handles files with any of the following characteristics: .sp .5 .in +0.5i .ta \w'\fIPhotometricInterpretation\fP 'u .nf \fIBitsPerSample\fP 1, 2, 4, 8, 16 \fISamplesPerPixel\fP 1, 3, 4 (the 4th sample is ignored) \fIPhotometricInterpretation\fP 0 (min-is-white), 1 (min-is-black), 2 (RGB), 3 (palette), 6 (YCbCr) \fIPlanarConfiguration\fP 1 (contiguous), 2 (separate) \fIOrientation\fP 1 (top-left), 4 (bottom-left) .fi .in -0.5i .sp .5 Data may be organized as strips or tiles and may be compressed with any of the compression algorithms supported by the .IR libtiff (3) library. .PP For palette images (\c .IR PhotometricInterpretation =3), .I tiffgt inspects the colormap values and assumes either 16-bit or 8-bit values according to the maximum value. That is, if no colormap entry greater than 255 is found, .I tiffgt assumes the colormap has only 8-bit values; otherwise it assumes 16-bit values. This inspection is done to handle old images written by previous (incorrect) versions of .IR libtiff . .PP .I tiffgt can be used to display multiple images one-at-a-time. The left mouse button switches the display to the first image in the .I next file in the list of files specified on the command line. The right mouse button switches to the first image in the .I previous file in the list. The middle mouse button causes the first image in the first file specified on the command line to be displayed. In addition the following keyboard commands are recognized: .TP .B b Use a .I PhotometricInterpretation of MinIsBlack in displaying the current image. .TP .B l Use a .I FillOrder of lsb-to-msb in decoding the current image. .TP .B m Use a .I FillOrder of msb-to-lsb in decoding the current image. .TP .B c Use a colormap visual to display the current image. .TP .B r Use a true color (24-bit RGB) visual to display the current image. .TP .B w Use a .I PhotometricInterpretation of MinIsWhite in displaying the current image. .TP .B W Toggle (enable/disable) display of warning messages from the .SM TIFF library when decoding images. .TP .B E Toggle (enable/disable) display of error messages from the .SM TIFF library when decoding images. .TP .B z Reset all parameters to their default settings (\c .IR FillOrder , .IR PhotometricInterpretation , handling of warnings and errors). .TP .B PageUp Display the previous image in the current file or the last image in the previous file. .TP .B PageDown Display the next image in the current file or the first image in the next file. .TP .B Home Display the first image in the current file. .TP .B End Display the last image in the current file (unimplemented). .SH OPTIONS .TP .B \-c Force image display in a colormap window. .TP .B \-d Specify an image to display by directory number. By default the first image in the file is displayed. Directories are numbered starting at zero. .TP .B \-e Enable reporting of error messages from the .SM TIFF library. By default .I tiffgt silently ignores images that cannot be read. .TP .B \-f Force .I tiffgt to run as a foreground process. By default .I tiffgt will place itself in the background once it has opened the requested image file. .TP .B \-l Force the presumed bit ordering to be .SM LSB to .SM MSB. .TP .B \-m Force the presumed bit ordering to be .SM MSB to .SM LSB. .TP .B \-o Specify an image to display by directory offset. By default the first image in the file is displayed. Directories offsets may be specified using C-style syntax; i.e. a leading ``0x'' for hexadecimal and a leading ``0'' for octal. .TP .B \-p Override the value of the .I PhotometricInterpretation tag; the parameter may be one of: .BR miniswhite , .BR minisblack , .BR rgb , .BR palette , .BR mask , .BR separated , .BR ycbcr , and .BR cielab . .TP .B \-r Force image display in a full color window. .TP .B \-s Stop on the first read error. By default all errors in the input data are ignored and .I tiffgt does it's best to display as much of an image as possible. .TP .B \-w Enable reporting of warning messages from the .SM TIFF library. By default .I tiffgt ignores warning messages generated when reading an image. .TP .B \-v Place information in the title bar describing what type of window (full color or colormap) is being used, the name of the input file, and the directory index of the image (if non-zero). By default, the window type is not shown in the title bar. .SH BUGS Images wider and taller than the display are silently truncated to avoid crashing old versions of the window manager. .SH "SEE ALSO" .BR tiffdump (1), .BR tiffinfo (1), .BR tiffcp (1), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiffcrop.10000644000212300117540000005423311501546110012041 00000000000000.\" $Id: tiffcrop.1,v 1.7 2010-12-12 01:45:35 faxguy Exp $ .\" tiffcrop -- a port of tiffcp.c extended to include extended processing of images .\" .\" Original code: .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .\" Additional code Copyright (c) 2006-2009 Richard Nolde .\" Lasted Updated 9/2009 .\" .if n .po 0 .TH "TIFFCROP" "1" "December, 2008" "libtiff" "" .SH "NAME" tiffcrop \- select, copy, crop, convert, extract, and/or process one or more .SM TIFF files. .SH "SYNOPSIS" .B tiffcrop [ .I options ] .I "src1.tif ... srcN.tif dst.tif" .SH "DESCRIPTION" .I Tiffcrop processes one or more files created according to the Tag Image File Format, Revision 6.0, specification into one or more .SM TIFF file(s). .I Tiffcrop is most often used to extract portions of an image for processing with bar code recognizer or OCR software when that software cannot restrict the region of interest to a specific portion of the image or to improve efficiency when the regions of interest must be rotated. It can also be used to subdivide all or part of a processed image into smaller sections and export individual images or sections of images as separate files or separate images within one or more files derived from the original input image or images. .PP The available functions can be grouped broadly into three classes: .IP Those that select individual images or sections of images from the input files. The options \-N for sequences or lists of individual images in the input files, \-Z for zones, \-z for regions, \-X and \-Y for fixed sized selections, \-m for margins, \-U for units, and \-E for edge reference provide a variety of ways to specify portions of the input image. .IP Those that allow the individual images or selections to be exported to one or more output files in different groupings and control the organization of the data in the output images. The options \-P for page size grouping, \-S for subdivision into columns and rows and \-e for export mode options that produce one or more files from each input image. The options \-r, \-s, \-t, \-w control strip and tile format and sizes while \-B \-L \-c \-f modify the endian addressing scheme, the compression options, and the bit fill sequence of images as they are written. .IP Those that perform some action on each image that is selected from the input file. The options include \-R for rotate, \-I for inversion of the photometric interpretation and/or data values, and \-F to flip (mirror) the image horizontally or vertically. .PP Functions are applied to the input image(s) in the following order: cropping, fixed area extraction, zone and region extraction, inversion, mirroring, rotation. .PP Functions are applied to the output image(s) in the following order: export mode options for grouping zones, regions, or images into one or more files, .I or row and column divisions with output margins, .I or page size divisions with page orientation options. .PP Finally, strip, tile, byte order, output resolution, and compression options are applied to all output images. .PP The output file(s) may be organized and compressed using a different algorithm from the input files. By default, .I tiffcrop will copy all the understood tags in a .SM TIFF directory of an input file to the associated directory in the output file. Options can be used to force the resultant image to be written as strips or tiles of data, respectively. .PP .I Tiffcrop can be used to reorganize the storage characteristics of data in a file, and to reorganize, extract, rotate, and otherwise process the image data as specified at the same time whereas tiffcp does not alter the image data within the file. .PP Using the options for selecting individual input images and the options for exporting images and/or segments defined as zones or regions of each input image, .I tiffcrop can perform the functions of tiffcp and tiffsplit in a single pass while applying multiple operations to individual selections or images. .PP .SH "OPTIONS" .TP .B \-h Display the syntax summary for tiffcrop. .TP .B \-v Report the current version and last modification date for tiffcrop. .TP .B \-N odd|even|#,#\-#,#|last Specify one or more series or range(s) of images within each file to process. The words .B odd or .B even may be used to specify all odd or even numbered images counting from one. Note that internally, TIFF images are numbered from zero rather than one but since this convention is not obvious to most users, tiffcrop used 1 to specifiy the first image in a multipage file. The word .B last may be used in place of a number in the sequence to indicate the final image in the file without knowing how many images there are. Ranges of images may be specified with a dash and multiple sets can be indicated by joining them in a comma\-separated list. eg. use .B \-N 1,5\-7,last to process the 1st, 5th through 7th, and final image in the file. .TP .B \-E top|bottom|left|right Specify the top, bottom, left, or right edge as the reference from which to calcuate the width and length of crop regions or sequence of postions for zones. When used with the \-e option for exporting zones or regions, the reference edge determines how composite images are arranged. Using \-E left or right causes successive zones or regions to be merged horizontally whereas using \-E top or bottom causes successive zones or regions to be arranged vertically. This option has no effect on export layout when multiple zones or regions are not being exported to composite images. Edges may be abbreviated to the first letter. .TP .B \-e combined|divided|image|multiple|separate Specify the export mode for images and selections from input images. The final filename on the command line is considered to be the destination file or filename stem for automatically generated sequences of files. Modes may be abbreviated to the first letter. .IP combined All images and selections are written to a single file with multiple selections from one image combined into a single image (default) .IP divided All images and selections are written to a single file with each selection from one image written to a new image .IP image Each input image is written to a new file (numeric filename sequence) with multiple selections from the image combined into one image .IP multiple Each input image is written to a new file (numeric filename sequence) with each selection from the image written to a new image .IP separate Individual selections from each image are written to separate files .TP .B \-U in|cm|px Specify the type of units to apply to dimensions for margins and crop regions for input and output images. Inches or centimeters are converted to pixels using the resolution unit specified in the TIFF file (which defaults to inches if not specified in the IFD). .TP .B \-m #,#,#,# Specify margins to be removed from the input image. The order must be top, left, bottom, right with only commas separating the elements of the list. Margins are scaled according to the current units and removed before any other extractions are computed.. .TP .B \-X # Set the horizontal (X\-axis) dimension of a region to extract relative to the specified origin reference. If the origin is the top or bottom edge, the X axis value will be assumed to start at the left edge. .TP .B \-Y # Set the vertical (Y\-axis) dimension of a region to extract relative to the specified origin reference. If the origin is the left or right edge, the Y axis value will be assumed to start at the top. .TP .B \-Z #:#,#:# Specify zones of the image designated as position X of Y equal sized portions measured from the reference edge, eg 1:3 would be first third of the image starting from the reference edge minus any margins specified for the confining edges. Multiple zones can be specified as a comma separated list but they must reference the same edge. To extract the top quarter and the bottom third of an image you would use .B \-Z 1:4,3:3. .TP .B \-z x1,y1,x2,y2: ... :xN,yN,xN+1,yN+1 Specify a series of coordinates to define regions for processing and exporting. The coordinates represent the top left and lower right corners of each region in the current units, eg inch, cm, or pixels. Pixels are counted from one to width or height and inches or cm are calculated from image resolution data. Each colon delimited series of four values represents the horizontal and vertical offsets from the top and left edges of the image, regardless of the edge specified with the \-E option. The first and third values represent the horizontal offsets of the corner points from the left edge while the second and fourth values represent the vertical offsets from the top edge. .TP .B \-F horiz|vert Flip, ie mirror, the image or extracted region horizontally or vertically. .TP .B \-R 90|180|270 Rotate the image or extracted region 90, 180, or 270 degrees clockwise. .TP .B \\-I [black|white|data|both] Invert color space, eg dark to light for bilevel and grayscale images. This can be used to modify negative images to positive or to correct images that have the PHOTOMETRIC_INTERPRETATIN tag set incorrectly. If the value is black or white, the PHOTOMETRIC_INTERPRETATION tag is set to MinIsBlack or MinIsWhite, without altering the image data. If the argument is data or both, the data values of the image are modified. Specifying both inverts the data and the PHOTOMETRIC_INTERPRETATION tag, whereas using data inverts the data but not the PHOTOMETRIC_INTERPRETATION tag. No support for modifying the color space of color images in this release. .TP .B \-H # Set the horizontal resolution of output images to # expressed in the current units. .TP .B \-V # Set the vertical resolution of the output images to # expressed in the current units. .TP .B \-J # Set the horizontal margin of an output page size to # expressed in the current units when sectioning image into columns x rows subimages using the \-S cols:rows option. .TP .B \-K # Set the vertical margin of an output page size to # expressed in the current units when sectioning image into columns x rows submiages using the \-S cols:rows option. .TP .B \-O portrait|landscape|auto Set the output orientation of the pages or sections. Auto will use the arrangement that requires the fewest pages. This option is only meaningful in conjunction with the -P option to format an image to fit on a specific paper size. .TP .B \-P page Format the output images to fit on page size paper. Use \-P list to show the supported page sizes and dimensions. You can define a custom page size by entering the width and length of the page in the current units with the following format #.#x#.#. .TP .B \-S cols:rows Divide each image into cols across and rows down equal sections. .TP .B \-B Force output to be written with Big\-Endian byte order. This option only has an effect when the output file is created or overwritten and not when it is appended to. .TP .B \-C Suppress the use of ``strip chopping'' when reading images that have a single strip/tile of uncompressed data. .TP .B \-c Specify the compression to use for data written to the output file: .B none for no compression, .B packbits for PackBits compression, .B lzw for Lempel\-Ziv & Welch compression, .B jpeg for baseline JPEG compression. .B zip for Deflate compression, .B g3 for CCITT Group 3 (T.4) compression, and .B g4 for CCITT Group 4 (T.6) compression. By default .I tiffcrop will compress data according to the value of the .I Compression tag found in the source file. .IP The .SM CCITT Group 3 and Group 4 compression algorithms can only be used with bilevel data. .IP Group 3 compression can be specified together with several T.4\-specific options: .B 1d for 1\-dimensional encoding, .B 2d for 2\-dimensional encoding, and .B fill to force each encoded scanline to be zero\-filled so that the terminating EOL code lies on a byte boundary. Group 3\-specific options are specified by appending a ``:''\-separated list to the ``g3'' option; e.g. .B "\-c g3:2d:fill" to get 2D\-encoded data with byte\-aligned EOL codes. .IP .SM LZW compression can be specified together with a .I predictor value. A predictor value of 2 causes each scanline of the output image to undergo horizontal differencing before it is encoded; a value of 1 forces each scanline to be encoded without differencing. LZW\-specific options are specified by appending a ``:''\-separated list to the ``lzw'' option; e.g. .B "\-c lzw:2" for .SM LZW compression with horizontal differencing. .TP .B \-f Specify the bit fill order to use in writing output data. By default, .I tiffcrop will create a new file with the same fill order as the original. Specifying .B "\-f lsb2msb" will force data to be written with the FillOrder tag set to .SM LSB2MSB, while .B "\-f msb2lsb" will force data to be written with the FillOrder tag set to .SM MSB2LSB. .TP .B \-i Ignore non\-fatal read errors and continue processing of the input file. .TP .B \-l Specify the length of a tile (in pixels). .I Tiffcrop attempts to set the tile dimensions so that no more than 8 kilobytes of data appear in a tile. .TP .B \-L Force output to be written with Little\-Endian byte order. This option only has an effect when the output file is created or overwritten and not when it is appended to. .TP .B \-M Suppress the use of memory\-mapped files when reading images. .TP .B \-p Specify the planar configuration to use in writing image data that has more than one sample per pixel. By default, .I tiffcrop will create a new file with the same planar configuration as the original. Specifying .B "\-p contig" will force data to be written with multi\-sample data packed together, while .B "\-p separate" will force samples to be written in separate planes. .TP .B \-r Specify the number of rows (scanlines) in each strip of data written to the output file. By default (or when value .B 0 is specified), .I tiffcrop attempts to set the rows/strip that no more than 8 kilobytes of data appear in a strip. If you specify the special value .B \-1 it will results in infinite number of the rows per strip. The entire image will be the one strip in that case. .TP .B \-s Force the output file to be written with data organized in strips (rather than tiles). .TP .B \-t Force the output file to be written with data organized in tiles (rather than strips). .TP .B \-w Specify the width of a tile (in pixels). .I tiffcrop attempts to set the tile dimensions so that no more than 8 kilobytes of data appear in a tile. .I tiffcrop attempts to set the tile dimensions so that no more than 8 kilobytes of data appear in a tile. .TP Debug and dump facility .B \-D opt1:value1,opt2:value2,opt3:value3:opt4:value4 Display program progress and/or dump raw data to non\-TIFF files. Options include the following and must be joined as a comma separated list. The use of this option is generally limited to program debugging and development of future options. An equal sign may be substituted for the colon in option:value pairs. .IP debug:N Display limited program progress indicators where larger N increase the level of detail. .IP format:txt|raw Format any logged data as ASCII text or raw binary values. ASCII text dumps include strings of ones and zeroes representing the binary values in the image data plus identifying headers. .IP level:N Specify the level of detail presented in the dump files. This can vary from dumps of the entire input or output image data to dumps of data processed by specific functions. Current range of levels is 1 to 3. .IP input:full\-path\-to\-directory/input\-dumpname .IP output:full\-path\-to\-directory/output\-dumpname .IP When dump files are being written, each image will be written to a separate file with the name built by adding a numeric sequence value to the dumpname and an extension of .txt for ASCII dumps or .bin for binary dumps. The four debug/dump options are independent, though it makes little sense to specify a dump file without specifying a detail level. .IP Note: Tiffcrop may be compiled with -DDEVELMODE to enable additional very low level debug reporting. .SH "EXAMPLES" The following concatenates two files and writes the result using .SM LZW encoding: .RS .nf tiffcrop \-c lzw a.tif b.tif result.tif .fi .RE .PP To convert a G3 1d\-encoded .SM TIFF to a single strip of G4\-encoded data the following might be used: .RS .nf tiffcrop \-c g4 \-r 10000 g3.tif g4.tif .fi .RE (1000 is just a number that is larger than the number of rows in the source file.) To extract a selected set of images from a multi\-image TIFF file use the \-N option described above. Thus, to copy the 1st and 3rd images of image file "album.tif" to "result.tif": .RS .nf tiffcrop \-N 1,3 album.tif result.tif .fi .RE .PP Invert a bilevel image scan of a microfilmed document and crop off margins of 0.25 inches on the left and right, 0.5 inch on the top, and 0.75 inch on the bottom. From the remaining portion of the image, select the second and third quarters, ie, one half of the area left from the center to each margin. .RS tiffcrop \-U in \-m 0.5,0.25,0.75,0.25 \-E left \-Z 2:4,3:4 \-I both MicrofilmNegative.tif MicrofilmPostiveCenter.tif .fi .RE .PP Extract only the final image of a large Architectural E sized multipage TIFF file and rotate it 90 degrees clockwise while reformatting the output to fit on tabloid sized sheets with one quarter of an inch on each side: .RS tiffcrop \-N last \-R 90 \-O auto \-P tabloid \-U in \-J 0.25 \-K 0.25 \-H 300 \-V 300 Big\-PlatMap.tif BigPlatMap\-Tabloid.tif .fi .RE The output images will have a specified resolution of 300 dpi in both directions. The orientation of each page will be determined by whichever choice requires the fewest pages. To specify a specific orientation, use the portrait or landscape option. The paper size option does not resample the image. It breaks each original image into a series of smaller images that will fit on the target paper size at the specified resolution. .fi .RE .PP Extract two regions 2048 pixels wide by 2048 pixels high from each page of a multi\-page input file and write each region to a separate output file. .RS tiffcrop \-U px \-z 1,1,2048,2048:1,2049,2048,4097 \-e separate CheckScans.tiff Check .fi .RE The output file names will use the stem Check with a numeric suffix which is incremented for each region of each image, eg Check\-001.tiff, Check\-002.tiff ... Check\-NNN.tiff. To produce a unique file for each page of the input image with one new image for each region of the input image on that page, change the export option to \-e multiple. .SH "NOTES" .PP In general, bilevel, grayscale, palette and RGB(A) data with bit depths from 1 to 32 bits should work in both interleaved and separate plane formats. Unlike tiffcp, tiffcrop can read and write tiled images with bits per sample that are not a multiple of 8 in both interleaved and separate planar format. Floating point data types are supported at bit depts of 16, 24, 32 and 64 bits per sample. .PP Not all images can be converted from one compression scheme to another. Data with some photometric interpretations and/or bit depths are tied to specific compression schemes and vice-versa, e.g. Group 3/4 compression is only usable for bilevel data. JPEG compression is only usable on 8 bit per sample data (or 12 bit if .I LibTIFF was compiled with 12 bit JPEG support). Support for OJPEG compressed images is problematic at best. Since OJPEG compression is no longer supported for writing images with LibTIFF, these images will be updated to the newer JPEG compression when they are copied or processed. This may cause the image to appear color shifted or distorted after conversion. In some cases, it is possible to remove the original compression from image data using the option -cnone. .PP Tiffcrop does not currently provide options to up or downsample data to different bit depths or convert data from one photometric interpretation to another, e.g. 16 bits per sample to 8 bits per sample or RGB to grayscale. .PP Tiffcrop is very loosely derived from code in .I tiffcp with extensive modifications and additions to support the selection of input images and regions and the exporting of them to one or more output files in various groupings. The image manipulation routines are entirely new and additional ones may be added in the future. It will handle tiled images with bit depths that are not a multiple of eight that tiffcp may refuse to read. .PP .I Tiffcrop was designed to handle large files containing many moderate sized images with memory usage that is independent of the number of images in the file. In order to support compression modes that are not based on individual scanlines, e.g. JPEG, it now reads images by strip or tile rather than by indvidual scanlines. In addition to the memory required by the input and output buffers associated with .I LibTIFF one or more buffers at least as large as the largest image to be read are required. The design favors large volume document processing uses over scientific or graphical manipulation of large datasets as might be found in research or remote sensing scenarios. .SH "SEE ALSO" .BR pal2rgb (1), .BR tiffinfo (1), .BR tiffcmp (1), .BR tiffcp (1), .BR tiffmedian (1), .BR tiffsplit (1), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiffinfo.10000644000212300117540000000524311244562247012043 00000000000000.\" $Id: tiffinfo.1,v 1.2 2005-11-02 11:07:19 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFINFO 1 "November 2, 2005" "libtiff" .SH NAME tiffinfo \- print information about .SM TIFF files .SH SYNOPSIS .B tiffinfo [ .I options ] .I "input.tif \&..." .SH DESCRIPTION .I Tiffinfo displays information about files created according to the Tag Image File Format, Revision 6.0. By default, the contents of each .SM TIFF directory in each file is displayed, with the value of each tag shown symbolically (where sensible). .SH OPTIONS .TP .B \-c Display the colormap and color/gray response curves, if present. .TP .B \-D In addition to displaying the directory tags, read and decompress all the data in each image (but not display it). .TP .B \-d In addition to displaying the directory tags, print each byte of decompressed data in hexadecimal. .TP .B \-j Display any \s-2JPEG\s0-related tags that are present. .TP .B \-o Set the initial .SM TIFF directory according to the specified file offset. The file offset may be specified using the usual C-style syntax; i.e. a leading ``0x'' for hexadecimal and a leading ``0'' for octal. .TP .B \-s Display the offsets and byte counts for each data strip in a directory. .TP .B \-z Enable strip chopping when reading image data. .TP .B \-# Set the initial .SM TIFF directory to .IR # . .SH "SEE ALSO" .BR pal2rgb (1), .BR tiffcp (1), .BR tiffcmp (1), .BR tiffmedian (1), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFSetDirectory.3tiff0000644000212300117540000000551011244562247014200 00000000000000.\" $Id: TIFFSetDirectory.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFSetDirectory 3TIFF "October 15, 1995" "libtiff" .SH NAME TIFFSetDirectory, TIFFSetSubDirectory \- set the current directory for an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "int TIFFSetDirectory(TIFF *" tif ", tdir_t " dirnum ")" .br .BI "int TIFFSetSubDirectory(TIFF *" tif ", uint32 " diroff ")" .SH DESCRIPTION .I TIFFSetDirectory changes the current directory and reads its contents with .IR TIFFReadDirectory . The parameter .I dirnum specifies the subfile/directory as an integer number, with the first directory numbered zero. .PP .I TIFFSetSubDirectory acts like .IR TIFFSetDirectory , except the directory is specified as a file offset instead of an index; this is required for accessing subdirectories linked through a .I SubIFD tag. .SH "RETURN VALUES" On successful return 1 is returned. Otherwise, 0 is returned if .I dirnum or .I diroff specifies a non-existent directory, or if an error was encountered while reading the directory's contents. .SH DIAGNOSTICS All error messages are directed to the .IR TIFFError (3TIFF) routine. .PP .BR "%s: Error fetching directory count" . An error was encountered while reading the ``directory count'' field. .PP .BR "%s: Error fetching directory link" . An error was encountered while reading the ``link value'' that points to the next directory in a file. .SH "SEE ALSO" .IR TIFFCurrentDirectory (3TIFF), .IR TIFFOpen (3TIFF), .IR TIFFReadDirectory (3TIFF), .IR TIFFWriteDirectory (3TIFF), .IR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFSetField.3tiff0000644000212300117540000001577311370550377013274 00000000000000.\" $Id: TIFFSetField.3tiff,v 1.5 2010-05-06 02:54:46 olivier Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFSetField 3TIFF "October 29, 2004" "libtiff" .SH NAME TIFFSetField, TIFFVSetField \- set the value(s) of a tag in a .SM TIFF file open for writing .SH SYNOPSIS .B "#include " .sp .BI "int TIFFSetField(TIFF *" tif ", ttag_t " tag ", " ... ")" .sp .B "#include " .sp .BI "int TIFFVSetField(TIFF *" tif ", ttag_t " tag ", va_list " ap ")" .SH DESCRIPTION .IR TIFFSetField sets the value of a field or pseudo-tag in the current directory associated with the open .SM TIFF file .IR tif . (A .I pseudo-tag is a parameter that is used to control the operation of the .SM TIFF library but whose value is not read or written to the underlying file.) To set the value of a field the file must have been previously opened for writing with .IR TIFFOpen (3TIFF); pseudo-tags can be set whether the file was opened for reading or writing. The field is identified by .IR tag , one of the values defined in the include file .B tiff.h (see also the table below). The actual value is specified using a variable argument list, as prescribed by the .IR stdarg (3) interface (\c or, on some machines, the .IR varargs (3) interface.) .PP .IR TIFFVSetField is functionally equivalent to .IR TIFFSetField except that it takes a pointer to a variable argument list. .I TIFFVSetField is useful for writing routines that are layered on top of the functionality provided by .IR TIFFSetField . .PP The tags understood by .IR libtiff , the number of parameter values, and the expected types for the parameter values are shown below. The data types are: .I char* is null-terminated string and corresponds to the .SM ASCII data type; .I uint16 is an unsigned 16-bit value; .I uint32 is an unsigned 32-bit value; .I uint16* is an array of unsigned 16-bit values. .I void* is an array of data values of unspecified type. Consult the .SM TIFF specification for information on the meaning of each tag. .PP .nf .ta \w'TIFFTAG_CONSECUTIVEBADFAXLINES'u+2n +\w'Count'u+2n +\w'TIFFFaxFillFunc \(dg'u+2n \fITag Name\fP \fICount\fP \fITypes\fP \fINotes\fP .sp 5p TIFFTAG_ARTIST 1 char* TIFFTAG_BADFAXLINES 1 uint32 TIFFTAG_BITSPERSAMPLE 1 uint16 \(dg TIFFTAG_CLEANFAXDATA 1 uint16 TIFFTAG_COLORMAP 3 uint16* 1< 0 TIFFTAG_SAMPLEFORMAT 1 uint16 \(dg TIFFTAG_SAMPLESPERPIXEL 1 uint16 \(dg value must be <= 4 TIFFTAG_SMAXSAMPLEVALUE 1 double TIFFTAG_SMINSAMPLEVALUE 1 double TIFFTAG_SOFTWARE 1 char* TIFFTAG_STONITS 1 double \(dg TIFFTAG_SUBFILETYPE 1 uint32 TIFFTAG_SUBIFD 2 uint16,uint32* count & offsets array TIFFTAG_TARGETPRINTER 1 char* TIFFTAG_THRESHHOLDING 1 uint16 TIFFTAG_TILEDEPTH 1 uint32 \(dg TIFFTAG_TILELENGTH 1 uint32 \(dg must be a multiple of 8 TIFFTAG_TILEWIDTH 1 uint32 \(dg must be a multiple of 8 TIFFTAG_TRANSFERFUNCTION 1 or 3\(dd uint16* 1<" .sp .BI "void TIFFWarning(const char *" module ", const char *" fmt ", " ... ")" .sp .B "#include " .sp .BI "typedef void (*TIFFWarningHandler)(const char *" module ", const char *" fmt ", va_list " ap ");" .sp .BI "TIFFWarningHandler TIFFSetWarningHandler(TIFFWarningHandler " handler ");" .SH DESCRIPTION .I TIFFWarning invokes the library-wide warning handler function to (normally) write a warning message to the .BR stderr . The .I fmt parameter is a .IR printf (3S) format string, and any number arguments can be supplied. The .I module parameter is interpreted as a string that, if non-zero, should be printed before the message; it typically is used to identify the software module in which a warning is detected. .PP Applications that desire to capture control in the event of a warning should use .IR TIFFSetWarningHandler to override the default warning handler. A .SM NULL (0) warning handler function may be installed to suppress error messages. .SH "RETURN VALUES" .IR TIFFSetWarningHandler returns a reference to the previous error handling function. .SH "SEE ALSO" .BR TIFFError (3TIFF), .BR libtiff (3TIFF), .BR printf (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFPrintDirectory.3tiff0000644000212300117540000000500011244562247014533 00000000000000.\" $Id: TIFFPrintDirectory.3tiff,v 1.1 2004-11-11 14:39:16 dron Exp $ .\" .\" Copyright (c) 1991-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFPrintDirectory 3TIFF "December 12, 1991" "libtiff" .SH NAME TIFFPrintDirectory \- print a description of a .SM TIFF directory .SH SYNOPSIS .B "#include " .sp .BI "void TIFFPrintDirectory(TIFF *" tif ", FILE *" fd ", long " flags ")" .SH DESCRIPTION .I TIFFPrintDirectory prints a description of the current directory in the specified .SM TIFF file to the standard I/O output stream .IR fd . The .I flags parameter is used to control the .I "level of detail" of the printed information; it is a bit-or of the flags defined in .BR tiffio.h : .sp .5 .nf .ta \w'#define 'u +\w'TIFFPRINT_JPEGDCTABLES 'u +\w'0x200 'u #define TIFFPRINT_NONE 0x0 /* no extra info */ #define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */ #define TIFFPRINT_CURVES 0x2 /* color/gray response curves */ #define TIFFPRINT_COLORMAP 0x4 /* colormap */ #define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */ #define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */ #define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */ .fi .SH NOTES In C++ the .I flags parameter defaults to 0. .SH "RETURN VALUES" None. .SH DIAGNOSTICS None. .SH "SEE ALSO" .IR libtiff (3TIFF), .IR TIFFOpen (3TIFF), .IR TIFFReadDirectory (3TIFF), .IR TIFFSetDirectory (3TIFF) tiff-4.0.3/man/TIFFReadRGBATile.3tiff0000644000212300117540000001331211244562247013704 00000000000000.\" $Id: TIFFReadRGBATile.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1991-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFReadRGBATile 3TIFF "December 10, 1998" "libtiff" .SH NAME TIFFReadRGBATile \- read and decode an image tile into a fixed-format raster .SH SYNOPSIS .B "#include " .sp .B "#define TIFFGetR(abgr) ((abgr) & 0xff)" .br .B "#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)" .br .B "#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)" .br .B "#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)" .sp .BI "int TIFFReadRGBATile(TIFF *" tif ", uint32 " x ", uint32 " y ", uint32 *" raster ")" .SH DESCRIPTION .IR TIFFReadRGBATile reads a single tile of a tile-based image into memory, storing the result in the user supplied RGBA .IR raster . The raster is assumed to be an array of width times length 32-bit entries, where width is the width of a tile (TIFFTAG_TILEWIDTH) and length is the height of a tile (TIFFTAG_TILELENGTH). .PP The .IR x and .IR y values are the offsets from the top left corner to the top left corner of the tile to be read. They must be an exact multiple of the tile width and length. .PP Note that the raster is assume to be organized such that the pixel at location (\fIx\fP,\fIy\fP) is \fIraster\fP[\fIy\fP*\fIwidth\fP+\fIx\fP]; with the raster origin in the .I lower-left hand corner of the tile. That is bottom to top organization. Edge tiles which partly fall off the image will be filled out with appropriate zeroed areas. .PP Raster pixels are 8-bit packed red, green, blue, alpha samples. The macros .IR TIFFGetR , .IR TIFFGetG , .IR TIFFGetB , and .I TIFFGetA should be used to access individual samples. Images without Associated Alpha matting information have a constant Alpha of 1.0 (255). .PP See the .IR TIFFRGBAImage (3TIFF) page for more details on how various image types are converted to RGBA values. .SH NOTES Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be either 1, 3, or 4 (i.e. .I SamplesPerPixel minus .IR ExtraSamples ). .PP Palette image colormaps that appear to be incorrectly written as 8-bit values are automatically scaled to 16-bits. .PP .I TIFFReadRGBATile is just a wrapper around the more general .IR TIFFRGBAImage (3TIFF) facilities. It's main advantage over the similar .IR TIFFReadRGBAImage() function is that for large images a single buffer capable of holding the whole image doesn't need to be allocated, only enough for one tile. The .IR TIFFReadRGBAStrip() function does a similar operation for stripped images. .SH "RETURN VALUES" 1 is returned if the image was successfully read and converted. Otherwise, 0 is returned if an error was encountered. .SH DIAGNOSTICS All error messages are directed to the .IR TIFFError (3TIFF) routine. .PP .BR "Sorry, can not handle %d-bit pictures" . The image had .I BitsPerSample other than 1, 2, 4, 8, or 16. .PP .BR "Sorry, can not handle %d-channel images" . The image had .I SamplesPerPixel other than 1, 3, or 4. .PP \fBMissing needed "PhotometricInterpretation" tag\fP. The image did not have a tag that describes how to display the data. .PP \fBNo "PhotometricInterpretation" tag, assuming RGB\fP. The image was missing a tag that describes how to display it, but because it has 3 or 4 samples/pixel, it is assumed to be .SM RGB. .PP \fBNo "PhotometricInterpretation" tag, assuming min-is-black\fP. The image was missing a tag that describes how to display it, but because it has 1 sample/pixel, it is assumed to be a grayscale or bilevel image. .PP .BR "No space for photometric conversion table" . There was insufficient memory for a table used to convert image samples to 8-bit .SM RGB. .PP \fBMissing required "Colormap" tag\fP. A Palette image did not have a required .I Colormap tag. .PP .BR "No space for tile buffer" . There was insufficient memory to allocate an i/o buffer. .PP .BR "No space for strip buffer" . There was insufficient memory to allocate an i/o buffer. .PP .BR "Can not handle format" . The image has a format (combination of .IR BitsPerSample , .IR SamplesPerPixel , and .IR PhotometricInterpretation ) that .I TIFFReadRGBAImage can not handle. .PP .BR "No space for B&W mapping table" . There was insufficient memory to allocate a table used to map grayscale data to .SM RGB. .PP .BR "No space for Palette mapping table" . There was insufficient memory to allocate a table used to map data to 8-bit .SM RGB. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFRGBAImage (3TIFF), .BR TIFFReadRGBAImage (3TIFF), .BR TIFFReadRGBAStrip (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFWriteScanline.3tiff0000644000212300117540000001303011244562247014323 00000000000000.\" $Id: TIFFWriteScanline.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFWriteScanline 3TIFF "December 16, 1991" "libtiff" .SH NAME TIFFWriteScanline \- write a scanline to an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "int TIFFWriteScanline(TIFF *" tif ", tdata_t " buf ", uint32 " row ", tsample_t " sample ")" .SH DESCRIPTION Write data to a file at the specified row. The .I sample parameter is used only if data are organized in separate planes (\c .IR PlanarConfiguration =2). The data are assumed to be uncompressed and in the native bit- and byte-order of the host machine. The data written to the file is compressed according to the compression scheme of the current .SM TIFF directory (see further below). If the current scanline is past the end of the current subfile, the .I ImageLength field is automatically increased to include the scanline (except for .IR PlanarConfiguration =2, where the .I ImageLength cannot be changed once the first data are written). If the .I ImageLength is increased, the .I StripOffsets and .I StripByteCounts fields are similarly enlarged to reflect data written past the previous end of image. .SH NOTES The library writes encoded data using the native machine byte order. Correctly implemented .SM TIFF readers are expected to do any necessary byte-swapping to correctly process image data with BitsPerSample greater than 8. The library attempts to hide bit-ordering differences between the image and the native machine by converting data from the native machine order. .PP In C++ the .I sample parameter defaults to 0. .PP Once data are written to a file for the current directory, the values of certain tags may not be altered; see .IR TIFFSetField (3TIFF) for more information. .PP It is not possible to write scanlines to a file that uses a tiled organization. The routine .IR TIFFIsTiled can be used to determine if the file is organized as tiles or strips. .SH "RETURN VALUES" .IR TIFFWriteScanline returns \-1 if it immediately detects an error and 1 for a successful write. .SH DIAGNOSTICS All error messages are directed to the .IR TIFFError (3TIFF) routine. .PP .BR "%s: File not open for writing . The file was opened for reading, not writing. .PP .BR "Can not write scanlines to a tiled image" . An attempt was made to write a scanline to a tiled image. The image is assumed to be organized in tiles because the .I TileWidth and .I TileLength tags have been set with .IR TIFFSetField (3TIFF). .PP .BR "Compression algorithm does not support random access" . Data was written in a non-sequential order to a file that uses a compression algorithm and that has .I RowsPerStrip greater than one. That is, data in the image is to be stored in a compressed form, and with multiple rows packed into a strip. In this case, the library does not support random access to the data. The data should either be written as entire strips, sequentially by rows, or the value of .I RowsPerStrip should be set to one. .PP \fB%s: Must set "ImageWidth" before writing data\fP. The image's width has not be set before the first write. See .BR TIFFSetField (3TIFF) for information on how to do this. .PP \fB%s: Must set "PlanarConfiguration" before writing data\fP. The organization of data has not be defined before the first write. See .BR TIFFSetField (3TIFF) for information on how to do this. .PP \fBCan not change "ImageLength" when using separate planes\fP. Separate image planes are being used (\c .IR PlanarConfiguration =2), but the number of rows has not been specified before the first write. The library supports the dynamic growth of an image only when data are organized in a contiguous manner (\c .IR PlanarConfiguration =1). .PP .BR "%d: Sample out of range, max %d" . The .I sample parameter was greater than the value of the SamplesPerPixel tag. .PP .BR "%s: No space for strip arrays . There was not enough space for the arrays that hold strip offsets and byte counts. .SH BUGS Writing subsampled YCbCR data does not work correctly because, for .IR PlanarConfiguration =2 the size of a scanline is not calculated on a per-sample basis, and for .IR PlanarConfiguration =1 the library does not pack the block-interleaved samples. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFWriteEncodedStrip (3TIFF), .BR TIFFWriteRawStrip (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiff2bw.10000644000212300117540000000537211244562247011605 00000000000000.\" $Id: tiff2bw.1,v 1.3 2006-04-20 12:17:19 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFF2BW 1 "November 2, 2005" "libtiff" .SH NAME tiff2bw \- convert a color .SM TIFF image to greyscale .SH SYNOPSIS .B tiff2bw [ .I options ] .I input.tif .I output.tif .SH DESCRIPTION .I Tiff2bw converts an .SM RGB or Palette color .SM TIFF image to a greyscale image by combining percentages of the red, green, and blue channels. By default, output samples are created by taking 28% of the red channel, 59% of the green channel, and 11% of the blue channel. To alter these percentages, the .BR \-R , .BR \-G , and .BR \-B options may be used. .SH OPTIONS .TP .B \-c Specify a compression scheme to use when writing image data: .B "\-c none" for no compression, .B "\-c packbits" for the PackBits compression algorithm, .B "\-c zip for the Deflate compression algorithm, .B "\-c g3 for the CCITT Group 3 compression algorithm, .B "\-c g4 for the CCITT Group 4 compression algorithm, and .B "\-c lzw" for Lempel-Ziv & Welch (the default). .TP .B \-r Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes. .TP .B \-R Specify the percentage of the red channel to use (default 28). .TP .B \-G Specify the percentage of the green channel to use (default 59). .TP .B \-B Specify the percentage of the blue channel to use (default 11). .SH "SEE ALSO" .BR pal2rgb (1), .BR tiffinfo (1), .BR tiffcp (1), .BR tiffmedian (1), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFReadRGBAImage.3tiff0000644000212300117540000001506111244562247014034 00000000000000.\" $Id: TIFFReadRGBAImage.3tiff,v 1.4 2006-10-13 07:22:01 dron Exp $ .\" .\" Copyright (c) 1991-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFReadRGBAImage 3TIFF "October 13, 2006" "libtiff" .SH NAME TIFFReadRGBAImage, TIFFReadRGBAImageOriented \- read and decode an image into a fixed-format raster .SH SYNOPSIS .B "#include " .sp .B "#define TIFFGetR(abgr) ((abgr) & 0xff)" .br .B "#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)" .br .B "#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)" .br .B "#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)" .sp .BI "int TIFFReadRGBAImage(TIFF *" tif ", uint32 " width ", uint32 " height ", uint32 *" raster ", int " stopOnError ")" .br .BI "int TIFFReadRGBAImageOriented(TIFF *" tif ", uint32 " width ", uint32 " height ", uint32 *" raster ", int " orientation ", int " stopOnError ")" .br .SH DESCRIPTION .IR TIFFReadRGBAImage reads a strip- or tile-based image into memory, storing the result in the user supplied .IR raster . The raster is assumed to be an array of .I width times .I height 32-bit entries, where .I width must be less than or equal to the width of the image (\c .I height may be any non-zero size). If the raster dimensions are smaller than the image, the image data is cropped to the raster bounds. If the raster height is greater than that of the image, then the image data are placed in the lower part of the raster. (Note that the raster is assume to be organized such that the pixel at location (\fIx\fP,\fIy\fP) is \fIraster\fP[\fIy\fP*\fIwidth\fP+\fIx\fP]; with the raster origin in the lower-left hand corner.) .PP .IR TIFFReadRGBAImageOriented works like .IR TIFFReadRGBAImage with except of that user can specify the raster origin position with the .I orientation parameter. Four orientations supported: .TP .B ORIENTATION_TOPLEFT origin in top-left corner, .TP .B ORIENTATION_TOPRIGHT origin in top-right corner, .TP .B ORIENTATION_BOTLEFT origin in bottom-left corner and .TP .B ORIENTATION_BOTRIGHT origin in bottom-right corner. .LP If you choose .B ORIENTATION_BOTLEFT result will be the same as returned by the .IR TIFFReadRGBAImage. .PP Raster pixels are 8-bit packed red, green, blue, alpha samples. The macros .IR TIFFGetR , .IR TIFFGetG , .IR TIFFGetB , and .I TIFFGetA should be used to access individual samples. Images without Associated Alpha matting information have a constant Alpha of 1.0 (255). .PP .I TIFFReadRGBAImage converts non-8-bit images by scaling sample values. Palette, grayscale, bilevel, .SM CMYK\c , and YCbCr images are converted to .SM RGB transparently. Raster pixels are returned uncorrected by any colorimetry information present in the directory. .PP The paramater .I stopOnError specifies how to act if an error is encountered while reading the image. If .I stopOnError is non-zero, then an error will terminate the operation; otherwise .I TIFFReadRGBAImage will continue processing data until all the possible data in the image have been requested. .SH NOTES In C++ the .I stopOnError parameter defaults to 0. .PP Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be either 1, 3, or 4 (i.e. .I SamplesPerPixel minus .IR ExtraSamples ). .PP Palettte image colormaps that appear to be incorrectly written as 8-bit values are automatically scaled to 16-bits. .PP .I TIFFReadRGBAImage is just a wrapper around the more general .IR TIFFRGBAImage (3TIFF) facilities. .SH "RETURN VALUES" 1 is returned if the image was successfully read and converted. Otherwise, 0 is returned if an error was encountered and .I stopOnError is zero. .SH DIAGNOSTICS All error messages are directed to the .IR TIFFError (3TIFF) routine. .PP .BR "Sorry, can not handle %d-bit pictures" . The image had .I BitsPerSample other than 1, 2, 4, 8, or 16. .PP .BR "Sorry, can not handle %d-channel images" . The image had .I SamplesPerPixel other than 1, 3, or 4. .PP \fBMissing needed "PhotometricInterpretation" tag\fP. The image did not have a tag that describes how to display the data. .PP \fBNo "PhotometricInterpretation" tag, assuming RGB\fP. The image was missing a tag that describes how to display it, but because it has 3 or 4 samples/pixel, it is assumed to be .SM RGB. .PP \fBNo "PhotometricInterpretation" tag, assuming min-is-black\fP. The image was missing a tag that describes how to display it, but because it has 1 sample/pixel, it is assumed to be a grayscale or bilevel image. .PP .BR "No space for photometric conversion table" . There was insufficient memory for a table used to convert image samples to 8-bit .SM RGB. .PP \fBMissing required "Colormap" tag\fP. A Palette image did not have a required .I Colormap tag. .PP .BR "No space for tile buffer" . There was insufficient memory to allocate an i/o buffer. .PP .BR "No space for strip buffer" . There was insufficient memory to allocate an i/o buffer. .PP .BR "Can not handle format" . The image has a format (combination of .IR BitsPerSample , .IR SamplesPerPixel , and .IR PhotometricInterpretation ) that .I TIFFReadRGBAImage can not handle. .PP .BR "No space for B&W mapping table" . There was insufficient memory to allocate a table used to map grayscale data to .SM RGB. .PP .BR "No space for Palette mapping table" . There was insufficient memory to allocate a table used to map data to 8-bit .SM RGB. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFRGBAImage (3TIFF), .BR TIFFReadRGBAStrip (3TIFF), .BR TIFFReadRGBATile (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFWriteTile.3tiff0000644000212300117540000000533511244562247013475 00000000000000.\" $Id: TIFFWriteTile.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFWriteTile 3TIFF "November 29, 1999" "libtiff" .SH NAME TIFFWriteTile \- encode and write a tile of data to an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "tsize_t TIFFWriteTile(TIFF *" tif ", tdata_t " buf ", uint32 " x ", uint32 " y ", uint32 " z ", tsample_t " sample ")" .SH DESCRIPTION Write the data for the tile .I containing the specified coordinates. The data in .I buf are is (potentially) compressed, and written to the indicated file, normally being appended to the end of the file. The buffer must be contain an entire tile of data. Applications should call the routine .IR TIFFTileSize to find out the size (in bytes) of a tile buffer. The .I x and .I y parameters are always used by .IR TIFFWriteTile . The .I z parameter is used if the image is deeper than 1 slice (\c .IR ImageDepth >1). The .I sample parameter is used only if data are organized in separate planes (\c .IR PlanarConfiguration =2). .SH "RETURN VALUES" .IR TIFFWriteTile returns \-1 if it detects an error; otherwise the number of bytes in the tile is returned. .SH DIAGNOSTICS All error messages are directed to the .BR TIFFError (3TIFF) routine. .SH "SEE ALSO" .BR TIFFCheckTile (3TIFF), .BR TIFFComputeTile (3TIFF), .BR TIFFOpen (3TIFF), .BR TIFFReadTile (3TIFF), .BR TIFFWriteScanline (3TIFF), .BR TIFFWriteEncodedTile (3TIFF), .BR TIFFWriteRawTile (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiffsplit.10000644000212300117540000000417211244563144012240 00000000000000.\" $Id: tiffsplit.1,v 1.6 2009-08-24 19:13:40 bfriesen Exp $ .\" .\" Copyright (c) 1992-1997 Sam Leffler .\" Copyright (c) 1992-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFSPLIT 1 "September 20, 2005" "libtiff" .SH NAME tiffsplit \- split a multi-image .SM TIFF into single-image .SM TIFF files .SH SYNOPSIS .B tiffsplit .I src.tif [ .I prefix ] .SH DESCRIPTION .I tiffsplit takes a multi-directory (page) .SM TIFF file and creates one or more single-directory (page) .SM TIFF files from it. The output files are given names created by concatenating a prefix, a lexically ordered suffix in the range [\fIaaa\fP-\fIzzz\fP], the suffix .I .tif (e.g. .IR xaaa.tif , .IR xaab.tif , .IR ... , .IR xzzz.tif ). If a prefix is not specified on the command line, the default prefix of .I x is used. .SH OPTIONS None. .SH BUGS Only a select set of ``known tags'' is copied when splitting. .SH "SEE ALSO" .BR tiffcp (1), .BR tiffinfo (1), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFtile.3tiff0000644000212300117540000001011311244562247012510 00000000000000.\" $Id: TIFFtile.3tiff,v 1.2 2005-11-02 11:07:19 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFTILE 3TIFF "February 14, 1992" "libtiff" .SH NAME TIFFTileSize, TIFFTileRowSize, TIFFVTileSize, TIFFDefaultTileSize, TIFFComputeTile, TIFFCheckTile, TIFFNumberOfTiles \- tile-related utility routines .SH SYNOPSIS .B "#include " .sp .BI "void TIFFDefaultTileSize(TIFF *" tif ", uint32 *" tw ", uint32 *" th ")" .br .BI "tsize_t TIFFTileSize(TIFF *" tif ")" .br .BI "tsize_t TIFFTileRowSize(TIFF *" tif ")" .br .BI "tsize_t TIFFVTileSize(TIFF *" tif ", uint32 " nrows ")" .br .BI "ttile_t TIFFComputeTile(TIFF *" tif ", uint32 " x ", uint32 " y ", uint32 " z ", tsample_t " sample ")" .br .BI "int TIFFCheckTile(TIFF *" tif ", uint32 " x ", uint32 " y ", uint32 " z ", tsample_t " sample ")" .br .BI "ttile_t TIFFNumberOfTiles(TIFF *" tif ")" .br .SH DESCRIPTION .I TIFFDefaultTileSize returns the pixel width and height of a reasonable-sized tile; suitable for setting up the .I TileWidth and .I TileLength tags. If the .I tw and .I th values passed in are non-zero, then they are adjusted to reflect any compression-specific requirements. The returned width and height are constrained to be a multiple of 16 pixels to conform with the .SM TIFF specification. .PP .I TIFFTileSize returns the equivalent size for a tile of data as it would be returned in a call to .I TIFFReadTile or as it would be expected in a call to .IR TIFFWriteTile . .PP .I TIFFVTileSize returns the number of bytes in a row-aligned tile with .I nrows of data. .PP .I TIFFTileRowSize returns the number of bytes of a row of data in a tile. .PP .IR TIFFComputeTile returns the tile that contains the specified coordinates. A valid tile is always returned; out-of-range coordinate values are clamped to the bounds of the image. The .I x and .I y parameters are always used in calculating a tile. The .I z parameter is used if the image is deeper than 1 slice (\c .IR ImageDepth >1). The .I sample parameter is used only if data are organized in separate planes (\c .IR PlanarConfiguration =2). .PP .IR TIFFCheckTile returns a non-zero value if the supplied coordinates are within the bounds of the image and zero otherwise. The .I x parameter is checked against the value of the .I ImageWidth tag. The .I y parameter is checked against the value of the .I ImageLength tag. The .I z parameter is checked against the value of the .I ImageDepth tag (if defined). The .I sample parameter is checked against the value of the .I SamplesPerPixel parameter if the data are organized in separate planes. .PP .IR TIFFNumberOfTiles returns the number of tiles in the image. .SH DIAGNOSTICS None. .SH "SEE ALSO" .BR TIFFReadEncodedTile (3TIFF), .BR TIFFReadRawTile (3TIFF), .BR TIFFReadTile (3TIFF), .BR TIFFWriteEncodedTile (3TIFF), .BR TIFFWriteRawTile (3TIFF), .BR TIFFWriteTile (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFmemory.3tiff0000644000212300117540000000560011244562247013070 00000000000000.\" $Id: TIFFmemory.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1995 Sam Leffler .\" Copyright (c) 1995 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH MEMORY 3TIFF "October 15, 1995" "libtiff" .SH NAME _TIFFmalloc, \c _TIFFrealloc, \c _TIFFfree, \c _TIFFmemset, \c _TIFFmemcpy, \c _TIFFmemcmp, \c \- memory management-related functions for use with .SM TIFF files .SH SYNOPSIS .B "#include " .sp .BI "tdata_t _TIFFmalloc(tsize_t " size ");" .br .BI "tdata_t _TIFFrealloc(tdata_t " buffer ", tsize_t " size ");" .br .BI "void _TIFFfree(tdata_t " buffer ");" .br .BI "void _TIFFmemset(tdata_t " s ", int " c ", tsize_t " n ");" .br .BI "void _TIFFmemcpy(tdata_t " dest ", const tdata_t " src ", tsize_t " n ");" .br .BI "int _TIFFmemcmp(const tdata_t " s1 ", const tdata_t "s2 ", tsize_t " n ");" .SH DESCRIPTION These routines are provided for writing portable software that uses .IR libtiff ; they hide any memory-management related issues, such as dealing with segmented architectures found on 16-bit machines. .PP .I _TIFFmalloc and .I _TIFFrealloc are used to dynamically allocate and reallocate memory used by .IR libtiff ; such as memory passed into the I/O routines. Memory allocated through these interfaces is released back to the system using the .I _TIFFfree routine. .PP Memory allocated through one of the above interfaces can be set to a known value using .IR _TIFFmemset , copied to another memory location using .IR _TIFFmemcpy , or compared for equality using .IR _TIFFmemcmp . These routines conform to the equivalent .SM ANSI C routines: .IR memset , .IR memcpy , and .IR memcmp , repsectively. .SH DIAGNOSTICS None. .SH "SEE ALSO" .BR malloc (3), .BR memory (3), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFswab.3tiff0000644000212300117540000000554511244562247012524 00000000000000.\" $Id: TIFFswab.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH SWAB 3TIFF "November 04, 2004" "libtiff" .SH NAME TIFFGetBitRevTable, TIFFReverseBits, TIFFSwabShort, TIFFSwabLong, TIFFSwabArrayOfShort, TIFFSwabArrayOfLong \- byte- and bit-swapping routines .SH SYNOPSIS .B "#include " .sp .BI "const unsigned char* TIFFGetBitRevTable(int " reversed ")" .br .BI "void TIFFReverseBits(u_char *" data ", unsigned long " nbytes ")" .br .BI "void TIFFSwabShort(uint16 *" data ")" .br .BI "void TIFFSwabLong(uint32 *" data ")" .br .BI "void TIFFSwabArrayOfShort(uint16 *" data ", unsigned long " nshorts ")" .br .BI "void TIFFSwabArrayOfLong(uint32 *" data ", unsigned long " nlongs ")" .SH DESCRIPTION The following routines are used by the library to swap 16- and 32-bit data and to reverse the order of bits in bytes. .PP .IR TIFFSwabShort and .IR TIFFSwabLong swap the bytes in a single 16-bit and 32-bit item, respectively. .IR TIFFSwabArrayOfShort and .IR TIFFSwabArrayOfLong swap the bytes in an array of 16-bit and 32-bit items, respectively. .PP .IR TIFFReverseBits replaces each byte in .I data with the equivalent bit-reversed value. This operation is performed with a lookup table, which is returned using the .IR TIFFGetBitRevTable function. .I reversed parameter specifies which table should be returned. Supply .I 1 if you want bit reversal table. Supply .I 0 to get the table that do not reverse bit values. It is a lookup table that can be used as an .IR "identity function" ; i.e. .IR "TIFFNoBitRevTable[n] == n" . .SH DIAGNOSTICS None. .SH "SEE ALSO" .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/bmp2tiff.10000644000212300117540000000531511244562247011750 00000000000000.\" $Id: bmp2tiff.1,v 1.7 2006-04-20 12:17:19 dron Exp $ .\" .\" Copyright (c) 2004, Andrey Kiselev .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH BMP2TIFF 1 "15 October, 2004" "libtiff" .SH NAME bmp2tiff \- create a .SM TIFF file from a Microsoft Windows Device Independent Bitmap image file .SH SYNOPSIS .B bmp2tiff [ .I options ] .I input.bmp [ .I input2.bmp ...\& ] .I output.tiff .SH DESCRIPTION .I bmp2tiff converts a Microsoft Windows Device Independent Bitmap image file to .SM TIFF. If several input BMP files are being specified the multipage .SM TIFF output file will be created. By default, the .SM TIFF image is created with data samples packed (\c .IR PlanarConfiguration =1), compressed with the PackBits algorithm (\c .IR Compression =32773), and with each strip no more than 8 kilobytes. These characteristics can overridden, or explicitly specified with the options described below. .SH OPTIONS .TP .B \-c Specify a compression scheme to use when writing image data: .B "\-c none" for no compression, .B "\-c packbits" for the PackBits compression algorithm (the default), .B "\-c jpeg" for the baseline JPEG compression algorithm, .B "\-c zip" for the Deflate compression algorithm, and .B "\-c lzw" for Lempel-Ziv & Welch. .TP .BI \-r " number" Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes. .SH "SEE ALSO" .BR gif2tiff (1), .BR pal2rgb (1), .BR ppm2tiff (1), .BR raw2tiff (1), .BR ras2tiff (1), .BR sgi2tiff (1), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFReadTile.3tiff0000644000212300117540000000611411244562247013252 00000000000000.\" $Id: TIFFReadTile.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFReadTile 3TIFF "December 16, 1991" "libtiff" .SH NAME TIFFReadTile \- read and decode a tile of data from an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "tsize_t TIFFReadTile(TIFF *" tif ", tdata_t " buf ", uint32 " x ", uint32 " y ", uint32 " z ", tsample_t " sample ")" .SH DESCRIPTION Return the data for the tile .I containing the specified coordinates. The data placed in .I buf are returned decompressed and, typically, in the native byte- and bit-ordering, but are otherwise packed (see further below). The buffer must be large enough to hold an entire tile of data. Applications should call the routine .IR TIFFTileSize to find out the size (in bytes) of a tile buffer. The .I x and .I y parameters are always used by .IR TIFFReadTile . The .I z parameter is used if the image is deeper than 1 slice (\c .IR ImageDepth >1). The .I sample parameter is used only if data are organized in separate planes (\c .IR PlanarConfiguration =2). .SH NOTES The library attempts to hide bit- and byte-ordering differences between the image and the native machine by converting data to the native machine order. Bit reversal is done if the .I FillOrder tag is opposite to the native machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file was written with a byte order opposite to the native machine byte order, .SH "RETURN VALUES" .IR TIFFReadTile returns \-1 if it detects an error; otherwise the number of bytes in the decoded tile is returned. .SH DIAGNOSTICS All error messages are directed to the .BR TIFFError (3TIFF) routine. .SH "SEE ALSO" .BR TIFFCheckTile (3TIFF), .BR TIFFComputeTile (3TIFF), .BR TIFFOpen (3TIFF), .BR TIFFReadEncodedTile (3TIFF), .BR TIFFReadRawTile (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/ppm2tiff.10000644000212300117540000000563211244562247011770 00000000000000.\" $Id: ppm2tiff.1,v 1.5 2006-03-01 11:20:33 dron Exp $ .\" .\" Copyright (c) 1991-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH PPM2TIFF 1 "March 1, 2006" "libtiff" .SH NAME ppm2tiff \- create a .SM TIFF file from .SM PPM, PGM and .SM PBM image files .SH SYNOPSIS .B ppm2tiff [ .I options ] [ .I input.ppm ] .I output.tif .SH DESCRIPTION .I ppm2tiff converts a file in the .SM PPM, PGM and .SM PBM image formats to .SM TIFF. By default, the .SM TIFF image is created with data samples packed (\c .IR PlanarConfiguration =1), compressed with the Packbits algorithm (\c .IR Compression =32773), and with each strip no more than 8 kilobytes. These characteristics can be overridden, or explicitly specified with the options described below .PP If the .SM PPM file contains greyscale data, then the .I PhotometricInterpretation tag is set to 1 (min-is-black), otherwise it is set to 2 (RGB). .PP If no .SM PPM file is specified on the command line, .I ppm2tiff will read from the standard input. .SH OPTIONS .TP .B \-c Specify a compression scheme to use when writing image data: .B none for no compression, .B packbits for PackBits compression (will be used by default), .B lzw for Lempel-Ziv & Welch compression, .B jpeg for baseline JPEG compression, .B zip for Deflate compression, .B g3 for CCITT Group 3 (T.4) compression, and .B g4 for CCITT Group 4 (T.6) compression. .TP .B \-r Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes. .TP .B \-R Mark the resultant image to have the specified X and Y resolution (in dots/inch). .SH "SEE ALSO" .BR tiffinfo (1), .BR tiffcp (1), .BR tiffmedian (1), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/fax2ps.10000644000212300117540000001117311244562247011441 00000000000000.\" $Id: fax2ps.1,v 1.4 2006-04-20 12:17:19 dron Exp $ .\" .\" Copyright (c) 1991-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .ds Ps PostScript .if n .po 0 .TH FAX2PS 1 "November 2, 2005" "libtiff" .SH NAME fax2ps \- convert a .SM TIFF facsimile to compressed \*(Ps\(tm .SH SYNOPSIS .B fax2ps [ .I options ] [ .I file ...\& ] .SH DESCRIPTION .I fax2ps reads one or more .SM TIFF facsimile image files and prints a compressed form of \*(Ps on the standard output that is suitable for printing. .PP By default, each page is scaled to reflect the image dimensions and resolutions stored in the file. The .B \-x and .B \-y options can be used to specify the horizontal and vertical image resolutions (lines/inch), respectively. If the .B \-S option is specified, each page is scaled to fill an output page. The default output page is 8.5 by 11 inches. Alternate page dimensions can be specified in inches with the .B \-W and .B \-H options. .PP By default .I fax2ps generates \*(Ps for all pages in the file. The .B \-p option can be used to select one or more pages from a multi-page document. .PP .I fax2ps generates a compressed form of \*(Ps that is optimized for sending pages of text to a \*(Ps printer attached to a host through a low-speed link (such as a serial line). Each output page is filled with white and then only the black areas are drawn. The \*(Ps specification of the black drawing operations is optimized by using a special font that encodes the move-draw operations required to fill the black regions on the page. This compression scheme typically results in a substantially reduced \*(Ps description, relative to the straightforward imaging of the page with a \*(Ps .I image operator. This algorithm can, however, be ineffective for continuous-tone and white-on-black images. For these images, it sometimes is more efficient to send the raster bitmap image directly; see .BR tiff2ps (1). .SH OPTIONS .TP 10 .BI \-p " number" Print only the indicated page. Multiple pages may be printed by specifying this option more than once. .TP 10 .BI \-x " resolution" Use .I resolution as the horizontal resolution, in dots/inch, of the image data. By default this value is taken from the file. .TP 10 .BI \-y " resolution" Use .I resolution as the vertical resolution, in lines/inch, of the image data. By default this value is taken from the file. .TP 10 .B \-S Scale each page of image data to fill the output page dimensions. By default images are presented according to the dimension information recorded in the .SM TIFF file. .TP 10 .BI \-W " width" Use .I width as the width, in inches, of the output page. .TP 10 .BI \-H " height" Use .I height as the height, in inches, of the output page. .SH DIAGNOSTICS Some messages about malformed .SM TIFF images come from the .SM TIFF library. .PP Various messages about badly formatted facsimile images may be generated due to transmission errors in received facsimile. .I fax2ps attempts to recover from such data errors by resynchronizing decoding at the end of the current scanline. This can result in long horizontal black lines in the resultant \*(Ps image. .SH NOTES If the destination printer supports \*(Ps Level II then it is always faster to just send the encoded bitmap generated by the .BR tiff2ps (1) program. .SH BUGS .I fax2ps should probably figure out when it is doing a poor job of compressing the output and just generate \*(Ps to image the bitmap raster instead. .SH "SEE ALSO" .BR tiff2ps (1), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiffsv.10000644000212300117540000001005711244562247011537 00000000000000.\" $Id: tiffsv.1,v 1.3 2005-11-02 11:07:19 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFSV 1 "September 20, 2005" "libtiff" .SH NAME tiffsv \- save an image from the framebuffer in a .SM TIFF file (Silicon Graphics version) .SH SYNOPSIS .B tiffsv [ .I options ] .I output.tif [ .I "x1 x2 y1 y2" ] .SH DESCRIPTION .I tiffsv saves all or part of the framebuffer in a file using the Tag Image File Format, Revision 6.0. By default, the image is saved with data samples packed (\c .IR PlanarConfiguration =1), compressed with the Lempel-Ziv & Welch algorithm (\c .IR Compression =5), and with each strip no more than 8 kilobytes. These characteristics can be overridden, or explicitly specified with the options described below. .SH OPTIONS .TP .B \-b Save the image as a greyscale image as if it were processed by .IR tiff2bw (1). This option is included for compatibility with the standard .IR scrsave (6D) program. .TP .B \-c Specify the compression to use for data written to the output file: .B none for no compression, .B packbits for PackBits compression, .B jpeg for baseline JPEG compression, .B zip for Deflate compression, and .B lzw for Lempel-Ziv & Welch compression (default). .IP .SM LZW compression can be specified together with a .I predictor value. A predictor value of 2 causes each scanline of the output image to undergo horizontal differencing before it is encoded; a value of 1 forces each scanline to be encoded without differencing. LZW-specific options are specified by appending a ``:''-separated list to the ``lzw'' option; e.g. .B "\-c lzw:2" for .SM LZW compression with horizontal differencing. .TP .B \-p Specify the planar configuration to use in writing image data. By default, .I tiffsv will create a new file with the data samples packed contiguously. Specifying .B "\-p contig" will force data to be written with multi-sample data packed together, while .B "\-p separate" will force samples to be written in separate planes. .TP .B \-r Specify the number of rows (scanlines) in each strip of data written to the output file. By default, .I tiffsv attempts to set the rows/strip that no more than 8 kilobytes of data appear in a strip. .SH NOTE Except for the use of .SM TIFF, this program is equivalent to the standard .I scrsave program. This means, for example, that you can use it in conjunction with the standard .IR icut program simply by creating a link called .IR scrsave , or by creating a shell script called .I scrsave that invokes .I tiffgt with the appropriate options. .SH BUGS If data are saved compressed and in separate planes, then the rows in each strip is silently set to one to avoid limitations in the .BR libtiff (3TIFF) library. .SH "SEE ALSO" .BR scrsave (6D) .BR pal2rgb (1), .BR tiffdump (1), .BR tiffgt (1), .BR tiffinfo (1), .BR tiffcp (1), .BR tiffmedian (1), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFFieldTag.3tiff0000644000212300117540000000373312005255232013231 00000000000000.\" $Id: TIFFFieldTag.3tiff,v 1.1 2012-07-29 15:45:30 tgl Exp $ .\" .\" Copyright (c) 2012, Tom Lane .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFFieldTag 3TIFF "July 26, 2012" "libtiff" .SH NAME TIFFFieldTag \- Get TIFF field tag value from field information .SH SYNOPSIS .B "#include " .sp .BI "uint32 TIFFFieldTag(const TIFFField* " fip ")" .SH DESCRIPTION .BR TIFFFieldTag returns the numeric tag value for a TIFF field. This can be compared to various constants exported by the .BR libtiff header files, such as .BR TIFFTAG_IMAGEWIDTH . .P .I fip is a field information pointer previously returned by .BR TIFFFindField , .BR TIFFFieldWithTag , or .BR TIFFFieldWithName . .br .SH "RETURN VALUES" .br .BR TIFFFieldTag returns an integer tag value. .br .SH "SEE ALSO" .BR libtiff (3TIFF), .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiffset.10000644000212300117540000000526111544110275011674 00000000000000.\" $Id: tiffset.1,v 1.5 2011-03-26 12:07:20 fwarmerdam Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFSET 1 "November 21, 2004" "libtiff" .SH NAME tiffset \- set a field in a .SM TIFF header .SH SYNOPSIS .B tiffset [ .I options ] .I filename.tif .SH DESCRIPTION .I Tiffset sets the value of a .SM TIFF header to a specified value. .SH OPTIONS .TP .BI \-d " dirnumber" change the current directory (starting at 0). .TP .BI \-s " tagnumber" "\fR [\fP" " count" "\fR ]\fP" " value ..." Set the value of the named tag to the value or values specified. .TP .BI \-sd " diroffset" change the current directory by offset. .TP .BI \-sf " tagnumber filename" Set the value of the tag to the contents of filename. This option is supported for ASCII tags only. .SH EXAMPLES The following example sets the image description tag (270) of a.tif to the contents of the file descrip: .RS .nf tiffset \-sf 270 descrip a.tif .fi .RE .PP The following example sets the artist tag (315) of a.tif to the string ``Anonymous'': .RS .nf tiffset \-s 315 Anonymous a.tif .fi .RE .PP This example sets the resolution of the file a.tif to 300 dpi: .RS .nf tiffset \-s 296 2 a.tif tiffset \-s 282 300.0 a.tif tiffset \-s 283 300.0 a.tif .fi .RE .PP Set the photometric interpretation of the third page of a.tif to min-is-black (ie. inverts it): .RS .nf tiffset -d 2 -s 262 1 a.tif .fi .RE .SH "SEE ALSO" .BR tiffdump (1), .BR tiffinfo (1), .BR tiffcp (1), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/sgi2tiff.10000644000212300117540000000542711244562247011760 00000000000000.\" $Id: sgi2tiff.1,v 1.4 2006-04-20 12:17:19 dron Exp $ .\" .\" Copyright (c) 1991-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH SGI2TIFF 1 "November 2, 2005" "libtiff" .SH NAME sgi2tiff \- create a .SM TIFF file from an .SM SGI image file .SH SYNOPSIS .B sgi2tiff [ .I options ] .I input.rgb .I output.tif .SH DESCRIPTION .I sgi2tiff converts a file in the .SM SGI image format to .SM TIFF. By default, the .SM TIFF image is created with data samples packed (\c .IR PlanarConfiguration =1), compressed with the Lempel-Ziv & Welch algorithm (\c .IR Compression =5), and with each strip no more than 8 kilobytes. These characteristics can overridden, or explicitly specified with the options described below. .SH OPTIONS .TP .B \-c Specify a compression scheme to use when writing image data: .B "\-c none" for no compression, .B "\-c packbits" for the PackBits compression algorithm), .B "\-c jpeg" for the baseline JPEG compression algorithm, .B "\-c zip for the Deflate compression algorithm, and .B "\-c lzw" for Lempel-Ziv & Welch (the default). .TP .B \-p Explicitly select the planar configuration used in organizing data samples in the output image: .B "\-p contig" for samples packed contiguously, and .B "\-p separate" for samples stored separately. By default samples are packed. .TP .B \-r Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes. .SH BUGS Does not record colormap information. .SH "SEE ALSO" .BR tiffinfo (1), .BR tiffcp (1), .BR tiffmedian (1), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFError.3tiff0000644000212300117540000000511011244562247012645 00000000000000.\" $Id: TIFFError.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFError 3TIFF "October 15, 1995" "libtiff" .SH NAME TIFFError, TIFFSetErrorHandler \- library error handling interface .SH SYNOPSIS .B "#include " .sp .BI "void TIFFError(const char *" module ", const char *" fmt ", " ... ")" .sp .B "#include " .sp .BI "typedef void (*TIFFErrorHandler)(const char *" module ", const char *" fmt ", va_list " ap ");" .br .B "TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler handler);" .SH DESCRIPTION .I TIFFError invokes the library-wide error handling function to (normally) write an error message to the .BR stderr . The .I fmt parameter is a .IR printf (3S) format string, and any number arguments can be supplied. The .I module parameter, if non-zero, is printed before the message; it typically is used to identify the software module in which an error is detected. .PP Applications that desire to capture control in the event of an error should use .IR TIFFSetErrorHandler to override the default error handler. A .SM NULL (0) error handling function may be installed to suppress error messages. .SH "RETURN VALUES" .IR TIFFSetErrorHandler returns a reference to the previous error handling function. .SH "SEE ALSO" .BR TIFFWarning (3TIFF), .BR libtiff (3TIFF), .BR printf (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/pal2rgb.10000644000212300117540000000635711244562247011577 00000000000000.\" $Id: pal2rgb.1,v 1.3 2005-11-02 11:07:19 dron Exp $ .\" .\" Copyright (c) 1990-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH PAL2RGB 1 "September 20, 2005" "libtiff" .SH NAME pal2rgb \- convert a palette color .SM TIFF image to a full color image .SH SYNOPSIS .B pal2rgb [ .I options ] .I input.tif .I output.tif .SH DESCRIPTION .I Pal2rgb converts a palette color .SM TIFF image to a full color image by applying the colormap of the palette image to each sample to generate a full color .SM RGB image. .SH OPTIONS Options that affect the interpretation of input data are: .TP .B \-C This option overrides the default behavior of .I pal2rgb in determining whether or not colormap entries contain 16-bit or 8-bit values. By default the colormap is inspected and if no colormap entry greater than 255 is found, the colormap is assumed to have only 8-bit values; otherwise 16-bit values (as required by the .SM TIFF specification) are assumed. The .B \-C option can be used to explicitly specify the number of bits for colormap entries: .B "\-C 8" for 8-bit values, .B "\-C 16" for 16-bit values. .PP Options that affect the output file format are: .TP .B \-p Explicitly select the planar configuration used in organizing data samples in the output image: .B "\-p contig" for samples packed contiguously, and .B "\-p separate" for samples stored separately. By default samples are packed. .TP .B \-c Use the specific compression algorithm to encoded image data in the output file: .B "\-c packbits" for Macintosh Packbits, .B "\-c lzw" for Lempel-Ziv & Welch, .B "\-c zip" for Deflate, .B "\-c none" for no compression. If no compression-related option is specified, the input file's compression algorithm is used. .TP .B \-r Explicitly specify the number of rows in each strip of the output file. If the .B \-r option is not specified, a number is selected such that each output strip has approximately 8 kilobytes of data in it. .SH BUGS Only 8-bit images are handled. .SH "SEE ALSO" .BR tiffinfo (1), .BR tiffcp (1), .BR tiffmedian (1), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFReadRawStrip.3tiff0000644000212300117540000000471111244562247014131 00000000000000.\" $Id: TIFFReadRawStrip.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFReadRawStrip 3TIFF "October 15, 1995" "libtiff" .SH NAME TIFFReadRawStrip \- return the undecoded contents of a strip of data from an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "tsize_t TIFFReadRawStrip(TIFF *" tif ", tstrip_t " strip ", tdata_t " buf ", tsize_t " size ")" .SH DESCRIPTION Read the contents of the specified strip into the (user supplied) data buffer. Note that the value of .I strip is a ``raw strip number.'' That is, the caller must take into account whether or not the data is organized in separate planes (\c .IR PlanarConfiguration =2). To read a full strip of data the data buffer should typically be at least as large as the number returned by .IR TIFFStripSize . .SH "RETURN VALUES" The actual number of bytes of data that were placed in .I buf is returned; .IR TIFFReadEncodedStrip returns \-1 if an error was encountered. .SH DIAGNOSTICS All error messages are directed to the .BR TIFFError (3TIFF) routine. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFReadEncodedStrip (3TIFF), .BR TIFFReadScanline (3TIFF), .BR TIFFStripSize (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFReadDirectory.3tiff0000644000212300117540000001404511501546110014306 00000000000000.\" $Id: TIFFReadDirectory.3tiff,v 1.3 2010-12-12 01:45:35 faxguy Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFReadDirectory 3TIFF "October 15, 1995" "libtiff" .SH NAME TIFFReadDirectory \- get the contents of the next directory in an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "int TIFFReadDirectory(TIFF *" tif ")" .SH DESCRIPTION Read the next directory in the specified file and make it the current directory. Applications only need to call .I TIFFReadDirectory to read multiple subfiles in a single .SM TIFF file\(em the first directory in a file is automatically read when .IR TIFFOpen is called. .SH NOTES If the library is compiled with .SM STRIPCHOP_SUPPORT enabled, then images that have a single uncompressed strip or tile of data are automatically treated as if they were made up of multiple strips or tiles of approximately 8 kilobytes each. This operation is done only in-memory; it does not alter the contents of the file. However, the construction of the ``chopped strips'' is visible to the application through the number of strips [tiles] returned by .I TIFFNumberOfStrips [\c .IR TIFFNumberOfTiles ]. .SH "RETURN VALUES" If the next directory was successfully read, 1 is returned. Otherwise, 0 is returned if an error was encountered, or if there are no more directories to be read. .SH DIAGNOSTICS All error messages are directed to the .IR TIFFError (3TIFF) routine. All warning messages are directed to the .IR TIFFWarning (3TIFF) routine. .PP \fBSeek error accessing TIFF directory\fP. An error occurred while positioning to the location of the directory. .PP \fBWrong data type %d for field "%s"\fP. The tag entry in the directory had an incorrect data type. For example, an .I ImageDescription tag with a .SM SHORT data type. .PP \fBTIFF directory is missing required "%s" field\fP. The specified tag is required to be present by the .SM TIFF 5.0 specification, but is missing. The directory is (usually) unusable. .PP \fB%s: Rational with zero denominator\fP. A directory tag has a .SM RATIONAL value whose denominator is zero. .PP \fBIncorrect count %d for field "%s" (%lu, expecting %lu); tag ignored\fP. The specified tag's count field is bad. For example, a count other than 1 for a .I SubFileType tag. .PP \fBCannot handle different per-sample values for field "%s"\fP. The tag has .I SamplesPerPixel values and they are not all the same; e.g. .IR BitsPerSample . The library is unable to handle images of this sort. .PP \fBCount mismatch for field "%s"; expecting %d, got %d\fP. The count field in a tag does not agree with the number expected by the library. This should never happen, so if it does, the library refuses to read the directory. .PP \fBInvalid TIFF directory; tags are not sorted in ascending order\fP. The directory tags are not properly sorted as specified in the .SM TIFF 5.0 specification. This error is not fatal. .PP \fBIgnoring unknown field with tag %d (0x%x)\fP. An unknown tag was encountered in the directory; the library ignores all such tags. .PP \fBTIFF directory is missing required "ImageLength" field\fP. The image violates the specification by not having a necessary field. There is no way for the library to recover from this error. .PP \fBTIFF directory is missing required "PlanarConfig" field\fP. The image violates the specification by not having a necessary field. There is no way for the library to recover from this error. .PP \fBTIFF directory is missing required "StripOffsets" field\fP. The image has multiple strips, but is missing the tag that specifies the file offset to each strip of data. There is no way for the library to recover from this error. .PP \fBTIFF directory is missing required "TileOffsets" field\fP. The image has multiple tiles, but is missing the tag that specifies the file offset to each tile of data. There is no way for the library to recover from this error. .PP \fBTIFF directory is missing required "StripByteCounts" field\fP. The image has multiple strips, but is missing the tag that specifies the size of each strip of data. There is no way for the library to recover from this error. .PP \fBTIFF directory is missing required "StripByteCounts" field, calculating from imagelength\fP. The image violates the specification by not having a necessary field. However, when the image is comprised of only one strip or tile, the library will estimate the missing value based on the file size. .PP \fBBogus "StripByteCounts" field, ignoring and calculating from imagelength\fP. Certain vendors violate the specification by writing zero for the StripByteCounts tag when they want to leave the value unspecified. If the image has a single strip, the library will estimate the missing value based on the file size. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFWriteDirectory (3TIFF), .BR TIFFSetDirectory (3TIFF), .BR TIFFSetSubDirectory (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiffdither.10000644000212300117540000000737311244562247012375 00000000000000.\" $Id: tiffdither.1,v 1.4 2006-04-20 12:17:19 dron Exp $ .\" .\" Copyright (c) 1990-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFDITHER 1 "September 20, 2005" "libtiff" .SH NAME tiffdither \- convert a greyscale image to bilevel using dithering .SH SYNOPSIS .B tiffdither [ .I options ] .I input.tif .I output.tif .SH DESCRIPTION .I tiffdither converts a single channel 8-bit greyscale image to a bilevel image using Floyd-Steinberg error propagation with thresholding. .SH OPTIONS .TP .B \-c Specify the compression to use for data written to the output file: .B none for no compression, .B packbits for PackBits compression, .B lzw for Lempel-Ziv & Welch compression, .B zip for Deflate compression, .B g3 for CCITT Group 3 (T.4) compression, and .B g4 for CCITT Group 4 (T.6) compression. By default .I tiffdither will compress data according to the value of the .I Compression tag found in the source file. .IP The .SM CCITT Group 3 and Group 4 compression algorithms can only be used with bilevel data. .IP Group 3 compression can be specified together with several T.4-specific options: .B 1d for 1-dimensional encoding, .B 2d for 2-dimensional encoding, and .B fill to force each encoded scanline to be zero-filled so that the terminating EOL code lies on a byte boundary. Group 3-specific options are specified by appending a ``:''-separated list to the ``g3'' option; e.g. .B "\-c g3:2d:fill" to get 2D-encoded data with byte-aligned EOL codes. .IP .SM LZW compression can be specified together with a .I predictor value. A predictor value of 2 causes each scanline of the output image to undergo horizontal differencing before it is encoded; a value of 1 forces each scanline to be encoded without differencing. LZW-specific options are specified by appending a ``:''-separated list to the ``lzw'' option; e.g. .B "\-c lzw:2" for .SM LZW compression with horizontal differencing. .TP .B \-f Specify the bit fill order to use in writing output data. By default, .I tiffdither will create a new file with the same fill order as the original. Specifying .B "\-f lsb2msb" will force data to be written with the .I Fill\%Order tag set to .SM LSB2MSB , while .B "\-f msb2lsb" will force data to be written with the .I Fill\%Order tag set to .SM MSB2LSB . .TP .B \-t Set the threshold value for dithering. By default the threshold value is 128. .SH NOTES The dither algorithm is taken from the .BR tiffmedian (1) program (written by Paul Heckbert). .SH "SEE ALSO" .BR pal2rgb (1), .BR fax2tiff (1), .BR tiffinfo (1), .BR tiffcp (1), .BR tiff2bw (1), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFReadScanline.3tiff0000644000212300117540000000737511244562247014123 00000000000000.\" $Id: TIFFReadScanline.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFReadScanline 3TIFF "October 15, 1995" "libtiff" .SH NAME TIFFReadScanline \- read and decode a scanline of data from an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "int TIFFReadScanline(TIFF *" tif ", tdata_t " buf ", uint32 " row ", tsample_t " sample ")" .SH DESCRIPTION Read the data for the specified row into the (user supplied) data buffer .IR buf . The data are returned decompressed and, in the native byte- and bit-ordering, but are otherwise packed (see further below). The buffer must be large enough to hold an entire scanline of data. Applications should call the routine .IR TIFFScanlineSize to find out the size (in bytes) of a scanline buffer. The .I row parameter is always used by .IR TIFFReadScanline ; the .I sample parameter is used only if data are organized in separate planes (\c .IR PlanarConfiguration =2). .SH NOTES The library attempts to hide bit- and byte-ordering differences between the image and the native machine by converting data to the native machine order. Bit reversal is done if the .I FillOrder tag is opposite to the native machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file was written with a byte order opposite to the native machine byte order, .PP In C++ the .I sample parameter defaults to 0. .SH "RETURN VALUES" .IR TIFFReadScanline returns \-1 if it detects an error; otherwise 1 is returned. .SH DIAGNOSTICS All error messages are directed to the .IR TIFFError (3TIFF) routine. .PP .BR "Compression algorithm does not support random access" . Data was requested in a non-sequential order from a file that uses a compression algorithm and that has .I RowsPerStrip greater than one. That is, data in the image is stored in a compressed form, and with multiple rows packed into a strip. In this case, the library does not support random access to the data. The data should either be accessed sequentially, or the file should be converted so that each strip is made up of one row of data. .SH BUGS Reading subsampled YCbCR data does not work correctly because, for .IR PlanarConfiguration =2 the size of a scanline is not calculated on a per-sample basis, and for .IR PlanarConfiguration =1 the library does not unpack the block-interleaved samples; use the strip- and tile-based interfaces to read these formats. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFReadEncodedStrip (3TIFF), .BR TIFFReadRawStrip (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFFieldPassCount.3tiff0000644000212300117540000000440012005255231014424 00000000000000.\" $Id: TIFFFieldPassCount.3tiff,v 1.1 2012-07-29 15:45:29 tgl Exp $ .\" .\" Copyright (c) 2012, Tom Lane .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFFieldPassCount 3TIFF "July 26, 2012" "libtiff" .SH NAME TIFFFieldPassCount \- Get whether to pass a count to TIFFGet/SetField .SH SYNOPSIS .B "#include " .sp .BI "int TIFFFieldPassCount(const TIFFField* " fip ")" .SH DESCRIPTION .BR TIFFFieldPassCount returns true (nonzero) if .BR TIFFGetField and .BR TIFFSetField expect a .I count value to be passed before the actual data pointer. .P .I fip is a field information pointer previously returned by .BR TIFFFindField , .BR TIFFFieldWithTag , or .BR TIFFFieldWithName . .P When a .I count is required, it will be of type .BR uint32 when .BR TIFFFieldReadCount reports .BR TIFF_VARIABLE2 , and of type .BR uint16 otherwise. (This distinction is critical for use of .BR TIFFGetField , but normally not so for use of .BR TIFFSetField .) .br .SH "RETURN VALUES" .br .BR TIFFFieldPassCount returns an integer that is always 1 (true) or 0 (false). .br .SH "SEE ALSO" .BR libtiff (3TIFF), .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/thumbnail.10000644000212300117540000000553011244562247012221 00000000000000.\" $Id: thumbnail.1,v 1.2 2005-11-02 11:07:19 dron Exp $ .\" .\" Copyright (c) 1994-1997 Sam Leffler .\" Copyright (c) 1994-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH THUMBNAIL 1 "November 2, 2005" "libtiff" .SH NAME thumbnail \- create a .SM TIFF file with thumbnail images .SH SYNOPSIS .B thumbnail [ .I options ] .I input.tif .I output.tif .SH DESCRIPTION .I thumbnail is a program written to show how one might use the SubIFD tag (#330) to store thumbnail images. .I thumbnail copies a .SM TIFF Class F facsimile file to the output file and for each image an 8-bit greyscale .IR "thumbnail sketch" . The output file contains the thumbnail image with the associated full-resolution page linked below with the SubIFD tag. .PP By default, thumbnail images are 216 pixels wide by 274 pixels high. Pixels are calculated by sampling and filtering the input image with each pixel value passed through a contrast curve. .SH OPTIONS .TP .B \-w Specify the width of thumbnail images in pixels. .TP .B \-h Specify the height of thumbnail images in pixels. .TP .B \-c Specify a contrast curve to apply in generating the thumbnail images. By default pixels values are passed through a linear contrast curve that simply maps the pixel value ranges. Alternative curves are: .B exp50 for a 50% exponential curve, .B exp60 for a 60% exponential curve, .B exp70 for a 70% exponential curve, .B exp80 for a 80% exponential curve, .B exp90 for a 90% exponential curve, .B exp for a pure exponential curve, .B linear for a linear curve. .SH BUGS There are no options to control the format of the saved thumbnail images. .SH "SEE ALSO" .BR tiffdump (1), .BR tiffgt (1), .BR tiffinfo (1), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiffcp.10000644000212300117540000002107511504662152011506 00000000000000.\" $Id: tiffcp.1,v 1.12 2010-12-23 13:38:47 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFCP 1 "February 24, 2007" "libtiff" .SH NAME tiffcp \- copy (and possibly convert) a .SM TIFF file .SH SYNOPSIS .B tiffcp [ .I options ] .I "src1.tif ... srcN.tif dst.tif" .SH DESCRIPTION .I tiffcp combines one or more files created according to the Tag Image File Format, Revision 6.0 into a single .SM TIFF file. Because the output file may be compressed using a different algorithm than the input files, .I tiffcp is most often used to convert between different compression schemes. .PP By default, .I tiffcp will copy all the understood tags in a .SM TIFF directory of an input file to the associated directory in the output file. .PP .I tiffcp can be used to reorganize the storage characteristics of data in a file, but it is explicitly intended to not alter or convert the image data content in any way. .SH OPTIONS .TP .BI \-b " image" subtract the following monochrome image from all others processed. This can be used to remove a noise bias from a set of images. This bias image is typically an image of noise the camera saw with its shutter closed. .TP .B \-B Force output to be written with Big-Endian byte order. This option only has an effect when the output file is created or overwritten and not when it is appended to. .TP .B \-C Suppress the use of ``strip chopping'' when reading images that have a single strip/tile of uncompressed data. .TP .B \-c Specify the compression to use for data written to the output file: .B none for no compression, .B packbits for PackBits compression, .B lzw for Lempel-Ziv & Welch compression, .B zip for Deflate compression, .B lzma for LZMA2 compression, .B jpeg for baseline JPEG compression, .B g3 for CCITT Group 3 (T.4) compression, and .B g4 for CCITT Group 4 (T.6) compression. By default .I tiffcp will compress data according to the value of the .I Compression tag found in the source file. .IP The .SM CCITT Group 3 and Group 4 compression algorithms can only be used with bilevel data. .IP Group 3 compression can be specified together with several T.4-specific options: .B 1d for 1-dimensional encoding, .B 2d for 2-dimensional encoding, and .B fill to force each encoded scanline to be zero-filled so that the terminating EOL code lies on a byte boundary. Group 3-specific options are specified by appending a ``:''-separated list to the ``g3'' option; e.g. .B "\-c g3:2d:fill" to get 2D-encoded data with byte-aligned EOL codes. .IP .SM LZW, Deflate and .SM LZMA2 compression can be specified together with a .I predictor value. A predictor value of 2 causes each scanline of the output image to undergo horizontal differencing before it is encoded; a value of 1 forces each scanline to be encoded without differencing. A value 3 is for floating point predictor which you can use if the encoded data are in floating point format. LZW-specific options are specified by appending a ``:''-separated list to the ``lzw'' option; e.g. .B "\-c lzw:2" for .SM LZW compression with horizontal differencing. .IP .SM Deflate and .SM LZMA2 encoders support various compression levels (or encoder presets) set as character ``p'' and a preset number. ``p1'' is the fastest one with the worst compression ratio and ``p9'' is the slowest but with the best possible ratio; e.g. .B "\-c zip:3:p9" for .SM Deflate encoding with maximum compression level and floating point predictor. .TP .B \-f Specify the bit fill order to use in writing output data. By default, .I tiffcp will create a new file with the same fill order as the original. Specifying .B "\-f lsb2msb" will force data to be written with the FillOrder tag set to .SM LSB2MSB, while .B "\-f msb2lsb" will force data to be written with the FillOrder tag set to .SM MSB2LSB. .TP .B \-i Ignore non-fatal read errors and continue processing of the input file. .TP .B \-l Specify the length of a tile (in pixels). .I tiffcp attempts to set the tile dimensions so that no more than 8 kilobytes of data appear in a tile. .TP .B \-L Force output to be written with Little-Endian byte order. This option only has an effect when the output file is created or overwritten and not when it is appended to. .TP .B \-M Suppress the use of memory-mapped files when reading images. .TP .B \-p Specify the planar configuration to use in writing image data that has one 8-bit sample per pixel. By default, .I tiffcp will create a new file with the same planar configuration as the original. Specifying .B "\-p contig" will force data to be written with multi-sample data packed together, while .B "\-p separate" will force samples to be written in separate planes. .TP .B \-r Specify the number of rows (scanlines) in each strip of data written to the output file. By default (or when value .B 0 is specified), .I tiffcp attempts to set the rows/strip that no more than 8 kilobytes of data appear in a strip. If you specify special value .B \-1 it will results in infinite number of the rows per strip. The entire image will be the one strip in that case. .TP .B \-s Force the output file to be written with data organized in strips (rather than tiles). .TP .B \-t Force the output file to be written with data organized in tiles (rather than strips). options can be used to force the resultant image to be written as strips or tiles of data, respectively. .TP .B \-w Specify the width of a tile (in pixels). .I tiffcp attempts to set the tile dimensions so that no more than 8 kilobytes of data appear in a tile. .I tiffcp attempts to set the tile dimensions so that no more than 8 kilobytes of data appear in a tile. .TP .B \-x Force the output file to be written with PAGENUMBER value in sequence. .TP .BI \-,= character substitute .I character for `,' in parsing image directory indices in files. This is necessary if filenames contain commas. Note that .B \-,= with whitespace immediately following will disable the special meaning of the `,' entirely. See examples. .SH EXAMPLES The following concatenates two files and writes the result using .SM LZW encoding: .RS .nf tiffcp \-c lzw a.tif b.tif result.tif .fi .RE .PP To convert a G3 1d-encoded .SM TIFF to a single strip of G4-encoded data the following might be used: .RS .nf tiffcp \-c g4 \-r 10000 g3.tif g4.tif .fi .RE (1000 is just a number that is larger than the number of rows in the source file.) To extract a selected set of images from a multi-image TIFF file, the file name may be immediately followed by a `,' separated list of image directory indices. The first image is always in directory 0. Thus, to copy the 1st and 3rd images of image file ``album.tif'' to ``result.tif'': .RS .nf tiffcp album.tif,0,2 result.tif .fi .RE A trailing comma denotes remaining images in sequence. The following command will copy all image with except the first one: .RS .nf tiffcp album.tif,1, result.tif .fi .RE Given file ``CCD.tif'' whose first image is a noise bias followed by images which include that bias, subtract the noise from all those images following it (while decompressing) with the command: .RS .nf tiffcp \-c none \-b CCD.tif CCD.tif,1, result.tif .fi .RE If the file above were named ``CCD,X.tif'', the .B \-,= option would be required to correctly parse this filename with image numbers, as follows: .RS .nf tiffcp \-c none \-,=% \-b CCD,X.tif CCD,X%1%.tif result.tif .SH "SEE ALSO" .BR pal2rgb (1), .BR tiffinfo (1), .BR tiffcmp (1), .BR tiffmedian (1), .BR tiffsplit (1), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiffdump.10000644000212300117540000000544711244562247012063 00000000000000.\" $Id: tiffdump.1,v 1.5 2006-04-20 12:17:19 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFDUMP 1 "October 23, 2005" "libtiff" .SH NAME tiffdump \- print verbatim information about .SM TIFF files .SH SYNOPSIS .B tiffdump [ .I options ] .I "name \&..." .SH DESCRIPTION .I tiffdump displays directory information from files created according to the Tag Image File Format, Revision 6.0. The header of each .SM TIFF file (magic number, version, and first directory offset) is displayed, followed by the tag contents of each directory in the file. For each tag, the name, data type, count, and value(s) is displayed. When the symbolic name for a tag or data type is known, the symbolic name is displayed followed by it's numeric (decimal) value. Tag values are displayed enclosed in ``<>'' characters immediately preceded by the value of the count field. For example, an .I ImageWidth tag might be displayed as ``ImageWidth (256) SHORT (3) 1<800>''. .PP .I tiffdump is particularly useful for investigating the contents of .SM TIFF files that .I libtiff does not understand. .SH OPTIONS .TP .B \-h Force numeric data to be printed in hexadecimal rather than the default decimal. .TP .BI \-m " items" Change the number of indirect data items that are printed. By default, this will be 24. .TP .BI \-o " offset" Dump the contents of the .SM IFD at the a particular file offset. The file offset may be specified using the usual C-style syntax; i.e. a leading ``0x'' for hexadecimal and a leading ``0'' for octal. .SH "SEE ALSO" .BR tiffinfo (1), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/rgb2ycbcr.10000644000212300117540000000611411244562247012114 00000000000000.\" $Header: /cvs/maptools/cvsroot/libtiff/man/rgb2ycbcr.1,v 1.4 2006-04-20 12:17:19 dron Exp $ .\" .\" Copyright (c) 1991-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH RGB2YCBCR 1 "November 2, 2005" "libtiff" .SH NAME rgb2ycbcr \- convert non-YCbCr .SM TIFF images to a YCbCr .SM TIFF image .SH SYNOPSIS .B rgb2ycbcr [ .I options ] .I "src1.tif src2.tif ... dst.tif" .SH DESCRIPTION .I rgb2ycbcr converts .SM RGB color, greyscale, or bi-level .SM TIFF images to YCbCr images by transforming and sampling pixel data. If multiple files are specified on the command line each source file is converted to a separate directory in the destination file. .PP By default, chrominance samples are created by sampling 2 by 2 blocks of luminance values; this can be changed with the .B \-h and .B \-v options. Output data are compressed with the .SM PackBits compression scheme, by default; an alternate scheme can be selected with the .B \-c option. By default, output data are compressed in strips with the number of rows in each strip selected so that the size of a strip is never more than 8 kilobytes; the .B \-r option can be used to explicitly set the number of rows per strip. .SH OPTIONS .TP .B \-c Specify a compression scheme to use when writing image data: .B "\-c none" for no compression, .B "\-c packbits" for the PackBits compression algorithm (the default), .B "\-c jpeg" for the JPEG compression algorithm, .B "\-c zip" for the deflate compression algorithm, and .B "\-c lzw" for Lempel-Ziv & Welch. .TP .B \-h Set the horizontal sampling dimension to one of: 1, 2 (default), or 4. .TP .B \-r Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes. .TP .B \-v Set the vertical sampling dimension to one of: 1, 2 (default), or 4. .SH "SEE ALSO" .BR tiffinfo (1), .BR tiffcp (1), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff tiff-4.0.3/man/TIFFquery.3tiff0000644000212300117540000001036711244562247012733 00000000000000.\" $Id: TIFFquery.3tiff,v 1.1 2004-11-11 14:39:16 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH QUERY 3TIFF "October 29, 2004" "libtiff" .SH NAME TIFFCurrentRow, TIFFCurrentStrip, TIFFCurrentTile, TIFFCurrentDirectory, TIFFLastDirectory, TIFFFileno, TIFFFileName, TIFFGetMode, TIFFIsTiled, TIFFIsByteSwapped, TIFFIsUpSampled, TIFFIsMSB2LSB, TIFFGetVersion \- query routines .SH SYNOPSIS .B "#include " .sp .BI "uint32 TIFFCurrentRow(TIFF* " tif ")" .br .BI "tstrip_t TIFFCurrentStrip(TIFF* " tif ")" .br .BI "ttile_t TIFFCurrentTile(TIFF* " tif ")" .br .BI "tdir_t TIFFCurrentDirectory(TIFF* " tif ")" .br .BI "int TIFFLastDirectory(TIFF* " tif ")" .br .BI "int TIFFFileno(TIFF* " tif ")" .br .BI "char* TIFFFileName(TIFF* " tif ")" .br .BI "int TIFFGetMode(TIFF* " tif ")" .br .BI "int TIFFIsTiled(TIFF* " tif ")" .br .BI "int TIFFIsByteSwapped(TIFF* " tif ")" .br .BI "int TIFFIsUpSampled(TIFF* " tif ")" .br .BI "int TIFFIsMSB2LSB(TIFF* " tif ")" .br .BI "const char* TIFFGetVersion(void)" .SH DESCRIPTION The following routines return status information about an open .SM TIFF file. .PP .IR TIFFCurrentDirectory returns the index of the current directory (directories are numbered starting at 0). This number is suitable for use with the .IR TIFFSetDirectory routine. .PP .IR TIFFLastDirectory returns a non-zero value if the current directory is the last directory in the file; otherwise zero is returned. .PP .IR TIFFCurrentRow , .IR TIFFCurrentStrip , and .IR TIFFCurrentTile , return the current row, strip, and tile, respectively, that is being read or written. These values are updated each time a read or write is done. .PP .IR TIFFFileno returns the underlying file descriptor used to access the .SM TIFF image in the filesystem. .PP .IR TIFFFileName returns the pathname argument passed to .IR TIFFOpen or .IR TIFFFdOpen . .PP .IR TIFFGetMode returns the mode with which the underlying file was opened. On .SM UNIX systems, this is the value passed to the .IR open (2) system call. .PP .IR TIFFIsTiled returns a non-zero value if the image data has a tiled organization. Zero is returned if the image data is organized in strips. .PP .IR TIFFIsByteSwapped returns a non-zero value if the image data was in a different byte-order than the host machine. Zero is returned if the TIFF file and local host byte-orders are the same. Note that TIFFReadTile(), TIFFReadStrip() and TIFFReadScanline() functions already normally perform byte swapping to local host order if needed. .PP .I TIFFIsUpSampled returns a non-zero value if image data returned through the read interface routines is being up-sampled. This can be useful to applications that want to calculate I/O buffer sizes to reflect this usage (though the usual strip and tile size routines already do this). .PP .I TIFFIsMSB2LSB returns a non-zero value if the image data is being returned with bit 0 as the most significant bit. .PP .IR TIFFGetVersion returns an .SM ASCII string that has a version stamp for the .SM TIFF library software. .SH DIAGNOSTICS None. .SH "SEE ALSO" .IR libtiff (3TIFF), .IR TIFFOpen (3TIFF), .IR TIFFFdOpen (3TIFF) tiff-4.0.3/man/TIFFOpen.3tiff0000644000212300117540000002263111244562247012464 00000000000000.\" $Id: TIFFOpen.3tiff,v 1.2 2005-07-01 12:36:22 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFOpen 3TIFF "July 1, 2005" "libtiff" .SH NAME TIFFOpen, TIFFFdOpen, TIFFClientOpen \- open a .SM TIFF file for reading or writing .SH SYNOPSIS .B "#include " .sp .BI "TIFF* TIFFOpen(const char *" filename ", const char *" mode ")" .br .BI "TIFF* TIFFFdOpen(const int " fd ", const char *" filename ", const char *" mode ")" .sp .B "typedef tsize_t (*TIFFReadWriteProc)(thandle_t, tdata_t, tsize_t);" .br .B "typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);" .br .B "typedef int (*TIFFCloseProc)(thandle_t);" .br .B "typedef toff_t (*TIFFSizeProc)(thandle_t);" .br .B "typedef int (*TIFFMapFileProc)(thandle_t, tdata_t*, toff_t*);" .br .B "typedef void (*TIFFUnmapFileProc)(thandle_t, tdata_t, toff_t);" .sp .BI "TIFF* TIFFClientOpen(const char *" filename ", const char *" mode ", thandle_t " clientdata ", TIFFReadWriteProc " readproc ", TIFFReadWriteProc " writeproc ", TIFFSeekProc " seekproc ", TIFFCloseProc " closeproc ", TIFFSizeProc " sizeproc ", TIFFMapFileProc " mapproc ", TIFFUnmapFileProc " unmapproc ")" .SH DESCRIPTION .IR TIFFOpen opens a .SM TIFF file whose name is .I filename and returns a handle to be used in subsequent calls to routines in .IR libtiff . If the open operation fails, then zero is returned. The .I mode parameter specifies if the file is to be opened for reading (``r''), writing (``w''), or appending (``a'') and, optionally, whether to override certain default aspects of library operation (see below). When a file is opened for appending, existing data will not be touched; instead new data will be written as additional subfiles. If an existing file is opened for writing, all previous data is overwritten. .PP If a file is opened for reading, the first .SM TIFF directory in the file is automatically read (also see .IR TIFFSetDirectory (3TIFF) for reading directories other than the first). If a file is opened for writing or appending, a default directory is automatically created for writing subsequent data. This directory has all the default values specified in .SM TIFF Revision 6.0: .IR BitsPerSample =1, .IR ThreshHolding "=bilevel art scan," .IR FillOrder =1 (most significant bit of each data byte is filled first), .IR Orientation =1 (the 0th row represents the visual top of the image, and the 0th column represents the visual left hand side), .IR SamplesPerPixel =1, .IR RowsPerStrip =infinity, .IR ResolutionUnit =2 (inches), and .IR Compression =1 (no compression). To alter these values, or to define values for additional fields, .IR TIFFSetField (3TIFF) must be used. .PP .IR TIFFFdOpen is like .IR TIFFOpen except that it opens a .SM TIFF file given an open file descriptor .IR fd . The file's name and mode must reflect that of the open descriptor. The object associated with the file descriptor .BR "must support random access" . .PP .IR TIFFClientOpen is like .IR TIFFOpen except that the caller supplies a collection of functions that the library will use to do \s-1UNIX\s+1-like I/O operations. The .I readproc and .I writeproc are called to read and write data at the current file position. .I seekproc is called to change the current file position a la .IR lseek (2). .I closeproc is invoked to release any resources associated with an open file. .I sizeproc is invoked to obtain the size in bytes of a file. .I mapproc and .I unmapproc are called to map and unmap a file's contents in memory; c.f. .IR mmap (2) and .IR munmap (2). The .I clientdata parameter is an opaque ``handle'' passed to the client-specified routines passed as parameters to .IR TIFFClientOpen . .SH OPTIONS The open mode parameter can include the following flags in addition to the ``r'', ``w'', and ``a'' flags. Note however that option flags must follow the read-write-append specification. .TP .B l When creating a new file force information be written with Little-Endian byte order (but see below). By default the library will create new files using the native .SM CPU byte order. .TP .B b When creating a new file force information be written with Big-Endian byte order (but see below). By default the library will create new files using the native .SM CPU byte order. .TP .B L Force image data that is read or written to be treated with bits filled from Least Significant Bit (\s-1LSB\s+1) to Most Significant Bit (\s-1MSB\s+1). Note that this is the opposite to the way the library has worked from its inception. .TP .B B Force image data that is read or written to be treated with bits filled from Most Significant Bit (\s-1MSB\s+1) to Least Significant Bit (\s-1LSB\s+1); this is the default. .TP .B H Force image data that is read or written to be treated with bits filled in the same order as the native .SM CPU. .TP .B M Enable the use of memory-mapped files for images opened read-only. If the underlying system does not support memory-mapped files or if the specific image being opened cannot be memory-mapped then the library will fallback to using the normal system interface for reading information. By default the library will attempt to use memory-mapped files. .TP .B m Disable the use of memory-mapped files. .TP .B C Enable the use of ``strip chopping'' when reading images that are comprised of a single strip or tile of uncompressed data. Strip chopping is a mechanism by which the library will automatically convert the single-strip image to multiple strips, each of which has about 8 Kilobytes of data. This facility can be useful in reducing the amount of memory used to read an image because the library normally reads each strip in its entirety. Strip chopping does however alter the apparent contents of the image because when an image is divided into multiple strips it looks as though the underlying file contains multiple separate strips. Finally, note that default handling of strip chopping is a compile-time configuration parameter. The default behaviour, for backwards compatibility, is to enable strip chopping. .TP .B c Disable the use of strip chopping when reading images. .TP .B h Read TIFF header only, do not load the first image directory. That could be useful in case of the broken first directory. We can open the file and proceed to the other directories. .SH "BYTE ORDER" The .SM TIFF specification (\fBall versions\fP) states that compliant readers .IR "must be capable of reading images written in either byte order" . Nonetheless some software that claims to support the reading of .SM TIFF images is incapable of reading images in anything but the native .SM CPU byte order on which the software was written. (Especially notorious are applications written to run on Intel-based machines.) By default the library will create new files with the native byte-order of the .SM CPU on which the application is run. This ensures optimal performance and is portable to any application that conforms to the TIFF specification. To force the library to use a specific byte-order when creating a new file the ``b'' and ``l'' option flags may be included in the call to open a file; for example, ``wb'' or ``wl''. .SH "RETURN VALUES" Upon successful completion .IR TIFFOpen , .IR TIFFFdOpen , and .IR TIFFClientOpen return a .SM TIFF pointer. Otherwise, NULL is returned. .SH DIAGNOSTICS All error messages are directed to the .IR TIFFError (3TIFF) routine. Likewise, warning messages are directed to the .IR TIFFWarning (3TIFF) routine. .PP \fB"%s": Bad mode\fP. The specified .I mode parameter was not one of ``r'' (read), ``w'' (write), or ``a'' (append). .PP .BR "%s: Cannot open" . .IR TIFFOpen () was unable to open the specified filename for read/writing. .PP .BR "Cannot read TIFF header" . An error occurred while attempting to read the header information. .PP .BR "Error writing TIFF header" . An error occurred while writing the default header information for a new file. .PP .BR "Not a TIFF file, bad magic number %d (0x%x)" . The magic number in the header was not (hex) 0x4d4d or (hex) 0x4949. .PP .BR "Not a TIFF file, bad version number %d (0x%x)" . The version field in the header was not 42 (decimal). .PP .BR "Cannot append to file that has opposite byte ordering" . A file with a byte ordering opposite to the native byte ordering of the current machine was opened for appending (``a''). This is a limitation of the library. .SH "SEE ALSO" .IR libtiff (3TIFF), .IR TIFFClose (3TIFF) tiff-4.0.3/man/tiff2ps.10000644000212300117540000001612711244562247011617 00000000000000.\" $Id: tiff2ps.1,v 1.10 2009-01-12 02:05:19 bfriesen Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .ds Ps PostScript .if n .po 0 .TH TIFF2PS 1 "November 2, 2005" "libtiff" .SH NAME tiff2ps \- convert a .SM TIFF image to \*(Ps\*(Tm .SH SYNOPSIS .B tiff2ps [ .I options ] .I "input.tif ..." .SH DESCRIPTION .I tiff2ps reads .SM TIFF images and writes \*(Ps or Encapsulated \*(Ps (EPS) on the standard output. By default, .I tiff2ps writes Encapsulated \*(Ps for the first image in the specified .SM TIFF image file. .PP By default, .I tiff2ps will generate \*(Ps that fills a printed area specified by the .SM TIFF tags in the input file. If the file does not contain .I XResolution or .I YResolution tags, then the printed area is set according to the image dimensions. The .B \-w and .B \-h options (see below) can be used to set the dimensions of the printed area in inches; overriding any relevant .SM TIFF tags. .PP The \*(Ps generated for .SM RGB, palette, and .SM CMYK images uses the .I colorimage operator. The \*(Ps generated for greyscale and bilevel images uses the .I image operator. When the .I colorimage operator is used, \*(Ps code to emulate this operator on older \*(Ps printers is also generated. Note that this emulation code can be very slow. .PP Color images with associated alpha data are composited over a white background. .SH OPTIONS .TP .B \-1 Generate \*(Ps Level 1 (the default). .TP .B \-2 Generate \*(Ps Level 2. .TP .B \-3 Generate \*(Ps Level 3. It basically allows one to use the /flateDecode filter for ZIP compressed TIFF images. .TP .B \-a Generate output for all IFDs (pages) in the input file. .TP .B \-b Specify the bottom margin for the output (in inches). This does not affect the height of the printed image. .TP .B \-c Center the image in the output. This option only shows an effect if both the .B \-w and the .B \-h option are given. .TP .B \-d Set the initial .SM TIFF directory to the specified directory number. (NB: Directories are numbered starting at zero.) This option is useful for selecting individual pages in a multi-page (e.g. facsimile) file. .TP .B \-e Force the generation of Encapsulated \*(Ps (implies .BR \-z ). .TP .B \-h Specify the vertical size of the printed area (in inches). .TP .B \-H Specify the maximum height of image (in inches). Images with larger sizes will be split in several pages. Option .B \-L may be used for specifying size of split images overlapping. .TP .B \-W Specify the maximum width of image (in inches). Images with larger sizes will be split in several pages. Options .B \-L and .B \-W are mutually exclusive. .B \-i Enable/disable pixel interpolation. This option requires a single numeric value: zero to disable pixel interpolation and non-zero to enable. The default is enabled. .TP .B \-L Specify the size of overlapping for split images (in inches). Used in conjunction with .B \-H option and .B \-W option. .TP .B \-l Specify the left margin for the output (in inches). This does not affect the width of the printed image. .TP .B \-m Where possible render using the .I imagemask \*(Ps operator instead of the .I image operator. When this option is specified .I tiff2ps will use .I imagemask for rendering 1 bit deep images. If this option is not specified or if the image depth is greater than 1 then the .I image operator is used. .TP .B \-o Set the initial .SM TIFF directory to the .SM IFD at the specified file offset. This option is useful for selecting thumbnail images and the like which are hidden using the .I SubIFD tag. .TP .B \-p Force the generation of (non-Encapsulated) \*(Ps. .TP .B \-r 90|180|270|auto Rotate image by 90, 180, 270 degrees or auto. Auto picks the best fit for the image on the specified paper size (eg portrait or landscape) if -h or -w is specified. Rotation is in degrees counterclockwise. Auto rotates 90 degrees ccw to produce landscape. .TP .B \-s Generate output for a single IFD (page) in the input file. .TP .B \-w Specify the horizontal size of the printed area (in inches). .TP .B \-x Override resolution units specified in the TIFF as centimeters. .TP .B \-y Override resolution units specified in the TIFF as inches. .TP .B \-z When generating \*(Ps Level 2, data is scaled so that it does not image into the .I deadzone on a page (the outer margin that the printing device is unable to mark). This option suppresses this behavior. When \*(Ps Level 1 is generated, data is imaged to the entire printed page and this option has no affect. .SH EXAMPLES The following generates \*(Ps Level 2 for all pages of a facsimile: .RS .nf tiff2ps \-a2 fax.tif | lpr .fi .RE Note also that if you have version 2.6.1 or newer of Ghostscript then you can efficiently preview facsimile generated with the above command. .PP To generate Encapsulated \*(Ps for a the image at directory 2 of an image use: .RS .nf tiff2ps \-d 1 foo.tif .fi .RE (Notice that directories are numbered starting at zero.) .PP If you have a long image, it may be split in several pages: .RS .nf tiff2ps \-h11 \-w8.5 \-H14 \-L.5 foo.tif > foo.ps .fi .RE The page size is set to 8.5x11 by .B \-w and .B \-h options. We will accept a small amount of vertical compression, so .B \-H set to 14. Any pages between 11 and 14 inches will be fit onto one page. Pages longer than 14 inches are cut off at 11 and continued on the next page. The .B \-L.5 option says to repeat a half inch on the next page (to improve readability). .SH BUGS Because \*(Ps does not support the notion of a colormap, 8-bit palette images produce 24-bit \*(Ps images. This conversion results in output that is six times bigger than the original image and which takes a long time to send to a printer over a serial line. Matters are even worse for 4-, 2-, and 1-bit palette images. .PP Does not handle tiled images when generating \*(Ps Level I output. .SH "SEE ALSO" .BR pal2rgb (1), .BR tiffinfo (1), .BR tiffcp (1), .BR tiffgt (1), .BR tiffmedian (1), .BR tiff2bw (1), .BR tiffsv (1), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFReadEncodedTile.3tiff0000644000212300117540000000566011244562247014541 00000000000000.\" $Id: TIFFReadEncodedTile.3tiff,v 1.3 2006-10-13 07:22:01 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFReadEncodedTile 3TIFF "October 13, 2006" "libtiff" .SH NAME TIFFReadEncodedTile \- read and decode a tile of data from an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "int TIFFReadEncodedTile(TIFF *" tif ", ttile_t " tile ", tdata_t " buf ", tsize_t " size ")" .SH DESCRIPTION Read the specified tile of data and place up to .I size bytes of decompressed information in the (user supplied) data buffer. .SH NOTES The value of .I tile is a ``raw tile number.'' That is, the caller must take into account whether or not the data are organized in separate planes (\c .IR PlanarConfiguration =2). .IR TIFFComputeTile automatically does this when converting an (x,y,z,sample) coordinate quadruple to a tile number. To read a full tile of data the data buffer should be at least as large as the value returned by .IR TIFFTileSize . .PP The library attempts to hide bit- and byte-ordering differences between the image and the native machine by converting data to the native machine order. Bit reversal is done if the .I FillOrder tag is opposite to the native machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file was written with a byte order opposite to the native machine byte order, .SH "RETURN VALUES" The actual number of bytes of data that were placed in .I buf is returned; .IR TIFFReadEncodedTile returns \-1 if an error was encountered. .SH DIAGNOSTICS All error messages are directed to the .BR TIFFError (3TIFF) routine. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFReadRawTile (3TIFF), .BR TIFFReadTile (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/Makefile.am0000644000212300117540000000521012005263022012164 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. dist_man1_MANS = \ bmp2tiff.1 \ fax2ps.1 \ fax2tiff.1 \ gif2tiff.1 \ pal2rgb.1 \ ppm2tiff.1 \ ras2tiff.1 \ raw2tiff.1 \ rgb2ycbcr.1 \ sgi2tiff.1 \ thumbnail.1 \ tiff2bw.1 \ tiff2pdf.1 \ tiff2ps.1 \ tiff2rgba.1 \ tiffcmp.1 \ tiffcp.1 \ tiffcrop.1 \ tiffdither.1 \ tiffdump.1 \ tiffgt.1 \ tiffinfo.1 \ tiffmedian.1 \ tiffset.1 \ tiffsplit.1 \ tiffsv.1 dist_man3_MANS = \ libtiff.3tiff \ TIFFbuffer.3tiff \ TIFFClose.3tiff \ TIFFcodec.3tiff \ TIFFcolor.3tiff \ TIFFDataWidth.3tiff \ TIFFError.3tiff \ TIFFFieldDataType.3tiff \ TIFFFieldName.3tiff \ TIFFFieldPassCount.3tiff \ TIFFFieldReadCount.3tiff \ TIFFFieldTag.3tiff \ TIFFFieldWriteCount.3tiff \ TIFFFlush.3tiff \ TIFFGetField.3tiff \ TIFFmemory.3tiff \ TIFFOpen.3tiff \ TIFFPrintDirectory.3tiff \ TIFFquery.3tiff \ TIFFReadDirectory.3tiff \ TIFFReadEncodedStrip.3tiff \ TIFFReadEncodedTile.3tiff \ TIFFReadRawStrip.3tiff \ TIFFReadRawTile.3tiff \ TIFFReadRGBAImage.3tiff \ TIFFReadRGBAStrip.3tiff \ TIFFReadRGBATile.3tiff \ TIFFReadScanline.3tiff \ TIFFReadTile.3tiff \ TIFFRGBAImage.3tiff \ TIFFSetDirectory.3tiff \ TIFFSetField.3tiff \ TIFFsize.3tiff \ TIFFstrip.3tiff \ TIFFswab.3tiff \ TIFFtile.3tiff \ TIFFWarning.3tiff \ TIFFWriteDirectory.3tiff \ TIFFWriteEncodedStrip.3tiff \ TIFFWriteEncodedTile.3tiff \ TIFFWriteRawStrip.3tiff \ TIFFWriteRawTile.3tiff \ TIFFWriteScanline.3tiff \ TIFFWriteTile.3tiff tiff-4.0.3/man/raw2tiff.10000644000212300117540000001250611244563144011760 00000000000000.\" $Id: raw2tiff.1,v 1.7 2009-08-24 19:13:40 bfriesen Exp $ .\" .\" Copyright (c) 1990-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH RAW2TIFF 1 "November 2, 2005" "libtiff" .SH NAME raw2tiff \- create a .SM TIFF file from a raw data .SH SYNOPSIS .B raw2tiff [ .I options ] .I input.raw .I output.tif .SH DESCRIPTION .I raw2tiff converts a raw byte sequence into .SM TIFF. By default, the .SM TIFF image is created with data samples packed (\c .IR PlanarConfiguration =1), compressed with the PackBits algorithm (\c .IR Compression =32773), and with each strip no more than 8 kilobytes. These characteristics can overridden, or explicitly specified with the options described below. .SH OPTIONS .TP .BI \-H " number" size of input image file header in bytes (0 by default). This amount of data just will be skipped from the start of file while reading. .TP .BI \-w " number" width of input image in pixels (can be guessed, see .SM .B "GUESSING THE IMAGE GEOMETRY" below). .TP .BI \-l " number" length of input image in lines (can be guessed, see .SM .B "GUESSING THE IMAGE GEOMETRY" below). .TP .BI \-b " number" number of bands in input image (1 by default). .TP .BI \-d " data_type" type of samples in input image, where .I data_type may be: .ta \w'\fBdouble \fR'u .br .B byte\t 8-bit unsigned integer (default), .br .B short\t 16-bit unsigned integer, .br .B long\t 32-bit unsigned integer, .br .B sbyte\t 8-bit signed integer, .br .B sshort\t 16-bit signed integer, .br .B slong\t 32-bit signed integer, .br .B float\t 32-bit IEEE floating point, .br .B double\t 64-bit IEEE floating point. .TP .BI \-i " config" type of samples interleaving in input image, where .I config may be: .ta \w'\fBpixel \fR'u .br .B pixel\t pixel interleaved data (default), .br .B band\t band interleaved data. .TP .BI \-p " photo" photometric interpretation (color space) of the input image, where .I photo may be: .ta \w'\fBminiswhite \fR'u .br .B miniswhite\t white color represented with 0 value, .br .B minisblack\t black color represented with 0 value (default), .br .B rgb\t image has RGB color model, .br .B cmyk\t image has CMYK (separated) color model, .br .B ycbcr\t image has YCbCr color model, .br .B cielab\t image has CIE L*a*b color model, .br .B icclab\t image has ICC L*a*b color model, .br .B itulab\t image has ITU L*a*b color model. .TP .B \-s swap bytes fetched from the input file. .TP .B \-L input data has LSB2MSB bit order (default). .TP .B \-M input data has MSB2LSB bit order. .TP .B \-c Specify a compression scheme to use when writing image data: .B "\-c none" for no compression, .B "\-c packbits" for the PackBits compression algorithm (the default), .B "\-c jpeg" for the baseline JPEG compression algorithm, .B "\-c zip" for the Deflate compression algorithm, and .B "\-c lzw" for Lempel-Ziv & Welch. .TP .BI \-r " number" Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes. .SH GUESSING THE IMAGE GEOMETRY .I raw2tiff can guess image width and height in case one or both of these parameters are not specified. If you omit one of those parameters, the complementary one will be calculated based on the file size (taking into account header size, number of bands and data type). If you omit both parameters, the statistical approach will be used. Utility will compute correlation coefficient between two lines at the image center using several appropriate line sizes and the highest absolute value of the coefficient will indicate the right line size. That is why you should be cautious with the very large images, because guessing process may take a while (depending on your system performance). Of course, the utility can't guess the header size, number of bands and data type, so it should be specified manually. If you don't know anything about your image, just try with the several combinations of those options. .P There is no magic, it is just a mathematical statistics, so it can be wrong in some cases. But for most ordinary images guessing method will work fine. .SH "SEE ALSO" .BR pal2rgb (1), .BR tiffinfo (1), .BR tiffcp (1), .BR tiffmedian (1), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFsize.3tiff0000644000212300117540000000430111244562247012527 00000000000000.\" $Id: TIFFsize.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFSIZE 3TIFF "October 15, 1995" "libtiff" .SH NAME TIFFScanlineSize, TIFFRasterScanlineSize, \- return the size of various items associated with an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "tsize_t TIFFRasterScanlineSize(TIFF *" tif ")" .br .BI "tsize_t TIFFScanlineSize(TIFF *" tif ")" .SH DESCRIPTION .I TIFFScanlineSize returns the size in bytes of a row of data as it would be returned in a call to .IR TIFFReadScanline , or as it would be expected in a call to .IR TIFFWriteScanline . .PP .I TIFFRasterScanlineSize returns the size in bytes of a complete decoded and packed raster scanline. Note that this value may be different from the value returned by .I TIFFScanlineSize if data is stored as separate planes. .SH DIAGNOSTICS None. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFReadScanline (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFWriteRawTile.3tiff0000644000212300117540000000564511244562247014153 00000000000000.\" $Id: TIFFWriteRawTile.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFWriteRawtile 3TIFF "December 16, 1991" "libtiff" .SH NAME TIFFWriteRawTile \- write a tile of raw data to an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "tsize_t TIFFWriteRawTile(TIFF *" tif ", ttile_t " tile ", tdata_t " buf ", tsize_t " size ")" .SH DESCRIPTION Append .I size bytes of raw data to the specified tile. .SH "RETURN VALUES" \-1 is returned if an error occurred. Otherwise, the value of .IR size is returned. .SH DIAGNOSTICS All error messages are directed to the .BR TIFFError (3TIFF) routine. .PP \fB%s: File not open for writing\fP. The file was opened for reading, not writing. .PP \fBCan not write tiles to a stripped image\fP. The image is assumed to be organized in strips because neither of the .I TileWidth or .I TileLength tags have been set with .BR TIFFSetField (3TIFF). .PP \fB%s: Must set "ImageWidth" before writing data\fP. The image's width has not be set before the first write. See .BR TIFFSetField (3TIFF) for information on how to do this. .PP \fB%s: Must set "PlanarConfiguration" before writing data\fP. The organization of data has not be defined before the first write. See .BR TIFFSetField (3TIFF) for information on how to do this. .PP \fB%s: No space for tile arrays"\fP. There was not enough space for the arrays that hold tile offsets and byte counts. .PP \fB%s: Specified tile %d out of range, max %d\fP. The specified tile is not valid according to the currently specified image dimensions. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFWriteEncodedTile (3TIFF), .BR TIFFWriteScanline (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFWriteEncodedTile.3tiff0000644000212300117540000000657611244562247014767 00000000000000.\" $Id: TIFFWriteEncodedTile.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFWriteEncodedTile 3TIFF "December 16, 1991" "libtiff" .SH NAME TIFFWritedEncodedTile \- compress and write a tile of data to an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "tsize_t TIFFWriteEncodedTile(TIFF *" tif ", ttile_t " tile ", tdata_t " buf ", tsize_t " size ")" .SH DESCRIPTION Compress .I size bytes of raw data from .I buf and .B append the result to the end of the specified tile. Note that the value of .I tile is a ``raw tile number.'' That is, the caller must take into account whether or not the data are organized in separate places (\c .IR PlanarConfiguration =2). .IR TIFFComputeTile automatically does this when converting an (x,y,z,sample) coordinate quadruple to a tile number. .SH NOTES The library writes encoded data using the native machine byte order. Correctly implemented .SM TIFF readers are expected to do any necessary byte-swapping to correctly process image data with BitsPerSample greater than 8. .SH "RETURN VALUES" \-1 is returned if an error was encountered. Otherwise, the value of .IR size is returned. .SH DIAGNOSTICS All error messages are directed to the .BR TIFFError (3TIFF) routine. .PP \fB%s: File not open for writing\fP. The file was opened for reading, not writing. .PP \fBCan not write tiles to a stripped image\fP. The image is assumed to be organized in strips because neither of the .I TileWidth or .I TileLength tags have been set with .BR TIFFSetField (3TIFF). .PP \fB%s: Must set "ImageWidth" before writing data\fP. The image's width has not be set before the first write. See .BR TIFFSetField (3TIFF) for information on how to do this. .PP \fB%s: Must set "PlanarConfiguration" before writing data\fP. The organization of data has not be defined before the first write. See .BR TIFFSetField (3TIFF) for information on how to do this. .PP \fB%s: No space for tile arrays"\fP. There was not enough space for the arrays that hold tile offsets and byte counts. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFWriteTile (3TIFF), .BR TIFFWriteRawTile (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiffcmp.10000644000212300117540000000543311244563144011665 00000000000000.\" $Id: tiffcmp.1,v 1.6 2009-08-24 19:13:40 bfriesen Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFCMP 1 "November 2, 2005" "libtiff" .SH NAME tiffcmp \- compare two .SM TIFF files .SH SYNOPSIS .B tiffcmp [ .I options ] .I "file1.tif file2.tif" .SH DESCRIPTION .I Tiffcmp compares the tags and data in two files created according to the Tagged Image File Format, Revision 6.0. The schemes used for compressing data in each file are immaterial when data are compared\-data are compared on a scanline-by-scanline basis after decompression. Most directory tags are checked; notable exceptions are: .IR GrayResponseCurve , .IR ColorResponseCurve , and .IR ColorMap tags. Data will not be compared if any of the .IR BitsPerSample , .IR SamplesPerPixel , or .I ImageWidth values are not equal. By default, .I tiffcmp will terminate if it encounters any difference. .SH OPTIONS .TP .B \-l List each byte of image data that differs between the files. .TP .BI \-z " number" List specified number of image data bytes that differs between the files. .TP .B \-t Ignore any differences in directory tags. .SH BUGS Tags that are not recognized by the library are not compared; they may also generate spurious diagnostics. .PP The image data of tiled files is not compared, since the .I TIFFReadScanline() function is used. An error will be reported for tiled files. .PP The pixel and/or sample number reported in differences may be off in some exotic cases. .SH "SEE ALSO" .BR pal2rgb (1), .BR tiffinfo (1), .BR tiffcp (1), .BR tiffmedian (1), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFReadRGBAStrip.3tiff0000644000212300117540000001325111244562247014112 00000000000000.\" $Id: TIFFReadRGBAStrip.3tiff,v 1.3 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1991-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFReadRGBAStrip 3TIFF "December 10, 1998" "libtiff" .SH NAME TIFFReadRGBAStrip \- read and decode an image strip into a fixed-format raster .SH SYNOPSIS .B "#include " .sp .B "#define TIFFGetR(abgr) ((abgr) & 0xff)" .br .B "#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)" .br .B "#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)" .br .B "#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)" .sp .BI "int TIFFReadRGBAStrip(TIFF *" tif ", uint32 " row ", uint32 *" raster ")" .SH DESCRIPTION .IR TIFFReadRGBAStrip reads a single strip of a strip-based image into memory, storing the result in the user supplied RGBA .IR raster . The raster is assumed to be an array of width times rowsperstrip 32-bit entries, where width is the width of the image (TIFFTAG_IMAGEWIDTH) and rowsperstrip is the maximum lines in a strip (TIFFTAG_ROWSPERSTRIP). .PP The .IR row value should be the row of the first row in the strip (strip * rowsperstrip, zero based). .PP Note that the raster is assume to be organized such that the pixel at location (\fIx\fP,\fIy\fP) is \fIraster\fP[\fIy\fP*\fIwidth\fP+\fIx\fP]; with the raster origin in the .I lower-left hand corner of the strip. That is bottom to top organization. When reading a partial last strip in the file the last line of the image will begin at the beginning of the buffer. .PP Raster pixels are 8-bit packed red, green, blue, alpha samples. The macros .IR TIFFGetR , .IR TIFFGetG , .IR TIFFGetB , and .I TIFFGetA should be used to access individual samples. Images without Associated Alpha matting information have a constant Alpha of 1.0 (255). .PP See the .IR TIFFRGBAImage (3TIFF) page for more details on how various image types are converted to RGBA values. .SH NOTES Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be either 1, 3, or 4 (i.e. .I SamplesPerPixel minus .IR ExtraSamples ). .PP Palette image colormaps that appear to be incorrectly written as 8-bit values are automatically scaled to 16-bits. .PP .I TIFFReadRGBAStrip is just a wrapper around the more general .IR TIFFRGBAImage (3TIFF) facilities. It's main advantage over the similar .IR TIFFReadRGBAImage() function is that for large images a single buffer capable of holding the whole image doesn't need to be allocated, only enough for one strip. The .IR TIFFReadRGBATile() function does a similar operation for tiled images. .SH "RETURN VALUES" 1 is returned if the image was successfully read and converted. Otherwise, 0 is returned if an error was encountered. .SH DIAGNOSTICS All error messages are directed to the .IR TIFFError (3TIFF) routine. .PP .BR "Sorry, can not handle %d-bit pictures" . The image had .I BitsPerSample other than 1, 2, 4, 8, or 16. .PP .BR "Sorry, can not handle %d-channel images" . The image had .I SamplesPerPixel other than 1, 3, or 4. .PP \fBMissing needed "PhotometricInterpretation" tag\fP. The image did not have a tag that describes how to display the data. .PP \fBNo "PhotometricInterpretation" tag, assuming RGB\fP. The image was missing a tag that describes how to display it, but because it has 3 or 4 samples/pixel, it is assumed to be .SM RGB. .PP \fBNo "PhotometricInterpretation" tag, assuming min-is-black\fP. The image was missing a tag that describes how to display it, but because it has 1 sample/pixel, it is assumed to be a grayscale or bilevel image. .PP .BR "No space for photometric conversion table" . There was insufficient memory for a table used to convert image samples to 8-bit .SM RGB. .PP \fBMissing required "Colormap" tag\fP. A Palette image did not have a required .I Colormap tag. .PP .BR "No space for tile buffer" . There was insufficient memory to allocate an i/o buffer. .PP .BR "No space for strip buffer" . There was insufficient memory to allocate an i/o buffer. .PP .BR "Can not handle format" . The image has a format (combination of .IR BitsPerSample , .IR SamplesPerPixel , and .IR PhotometricInterpretation ) that .I TIFFReadRGBAImage can not handle. .PP .BR "No space for B&W mapping table" . There was insufficient memory to allocate a table used to map grayscale data to .SM RGB. .PP .BR "No space for Palette mapping table" . There was insufficient memory to allocate a table used to map data to 8-bit .SM RGB. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFRGBAImage (3TIFF), .BR TIFFReadRGBAImage (3TIFF), .BR TIFFReadRGBATile (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFcolor.3tiff0000644000212300117540000001732511340563101012670 00000000000000.\" $Id: TIFFcolor.3tiff,v 1.4 2009-11-30 12:22:26 fwarmerdam Exp $ .\" .\" Copyright (c) 2003, Andrey Kiselev .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH COLOR 3TIFF "December 21, 2003" "libtiff" .SH NAME TIFFYCbCrToRGBInit, TIFFYCbCrtoRGB, TIFFCIELabToRGBInit, TIFFCIELabToXYZ, TIFFXYZToRGB \- color conversion routines. .SH SYNOPSIS .B "#include " .sp .BI "int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB *" ycbcr ", float *" luma ", float *"refBlackWhite" );" .br .BI "void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *" ycbcr ", uint32 " Y ", int32 " Cb ", int32 " Cr ", uint32 *" R ", uint32 *" G ", uint32 *" B " );" .sp .BI "int TIFFCIELabToRGBInit(TIFFCIELabToRGB *" cielab ", const TIFFDisplay *" display ", float *" refWhite ");" .br .BI "void TIFFCIELabToXYZ(TIFFCIELabToRGB *" cielab ", uint32 " L ", int32 " a ", int32 " b ", float *" X ", float *" Y ", float *" Z ");" .br .BI "void TIFFXYZToRGB(TIFFCIELabToRGB *" cielab ", float " X ", float " Y ", float " Z" , uint32 *" R ", uint32 *" G ", uint32 *" B ");" .SH DESCRIPTION TIFF supports several color spaces for images stored in that format. There is usually a problem of application to handle the data properly and convert between different colorspaces for displaying and printing purposes. To simplify this task libtiff implements several color conversion routines itself. In particular, these routines used in .B TIFFRGBAImage(3TIFF) interface. .PP .B TIFFYCbCrToRGBInit() used to initialize .I YCbCr to .I RGB conversion state. Allocating and freeing of the .I ycbcr structure belongs to programmer. .I TIFFYCbCrToRGB defined in .B tiffio.h as .PP .RS .nf typedef struct { /* YCbCr->RGB support */ TIFFRGBValue* clamptab; /* range clamping table */ int* Cr_r_tab; int* Cb_b_tab; int32* Cr_g_tab; int32* Cb_g_tab; int32* Y_tab; } TIFFYCbCrToRGB; .fi .RE .PP .I luma is a float array of three values representing proportions of the red, green and blue in luminance, Y (see section 21 of the TIFF 6.0 specification, where the YCbCr images discussed). .I TIFFTAG_YCBCRCOEFFICIENTS holds that values in TIFF file. .I refBlackWhite is a float array of 6 values which specifies a pair of headroom and footroom image data values (codes) for each image component (see section 20 of the TIFF 6.0 specification where the colorinmetry fields discussed). .I TIFFTAG_REFERENCEBLACKWHITE is responsible for storing these values in TIFF file. Following code snippet should helps to understand the the technique: .PP .RS .nf float *luma, *refBlackWhite; uint16 hs, vs; /* Initialize structures */ ycbcr = (TIFFYCbCrToRGB*) _TIFFmalloc(TIFFroundup(sizeof(TIFFYCbCrToRGB), sizeof(long)) + 4*256*sizeof(TIFFRGBValue) + 2*256*sizeof(int) + 3*256*sizeof(int32)); if (ycbcr == NULL) { TIFFError("YCbCr->RGB", "No space for YCbCr->RGB conversion state"); exit(0); } TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRCOEFFICIENTS, &luma); TIFFGetFieldDefaulted(tif, TIFFTAG_REFERENCEBLACKWHITE, &refBlackWhite); if (TIFFYCbCrToRGBInit(ycbcr, luma, refBlackWhite) < 0) exit(0); /* Start conversion */ uint32 r, g, b; uint32 Y; int32 Cb, Cr; for each pixel in image TIFFYCbCrtoRGB(img->ycbcr, Y, Cb, Cr, &r, &g, &b); /* Free state structure */ _TIFFfree(ycbcr); .fi .RE .PP .PP .B TIFFCIELabToRGBInit() initializes the .I CIE L*a*b* 1976 to .I RGB conversion state. .B TIFFCIELabToRGB defined as .PP .RS .nf #define CIELABTORGB_TABLE_RANGE 1500 typedef struct { /* CIE Lab 1976->RGB support */ int range; /* Size of conversion table */ float rstep, gstep, bstep; float X0, Y0, Z0; /* Reference white point */ TIFFDisplay display; float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */ float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */ float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */ } TIFFCIELabToRGB; .fi .RE .PP .I display is a display device description, declared as .PP .RS .nf typedef struct { float d_mat[3][3]; /* XYZ -> luminance matrix */ float d_YCR; /* Light o/p for reference white */ float d_YCG; float d_YCB; uint32 d_Vrwr; /* Pixel values for ref. white */ uint32 d_Vrwg; uint32 d_Vrwb; float d_Y0R; /* Residual light for black pixel */ float d_Y0G; float d_Y0B; float d_gammaR; /* Gamma values for the three guns */ float d_gammaG; float d_gammaB; } TIFFDisplay; .fi .RE .PP For example, the one can use sRGB device, which has the following parameters: .PP .RS .nf TIFFDisplay display_sRGB = { { /* XYZ -> luminance matrix */ { 3.2410F, -1.5374F, -0.4986F }, { -0.9692F, 1.8760F, 0.0416F }, { 0.0556F, -0.2040F, 1.0570F } }, 100.0F, 100.0F, 100.0F, /* Light o/p for reference white */ 255, 255, 255, /* Pixel values for ref. white */ 1.0F, 1.0F, 1.0F, /* Residual light o/p for black pixel */ 2.4F, 2.4F, 2.4F, /* Gamma values for the three guns */ }; .fi .RE .PP .I refWhite is a color temperature of the reference white. The .I TIFFTAG_WHITEPOINT contains the chromaticity of the white point of the image from where the reference white can be calculated using following formulae: .PP .RS refWhite_Y = 100.0 .br refWhite_X = whitePoint_x / whitePoint_y * refWhite_Y .br refWhite_Z = (1.0 - whitePoint_x - whitePoint_y) / whitePoint_y * refWhite_X .br .RE .PP The conversion itself performed in two steps: at the first one we will convert .I CIE L*a*b* 1976 to .I CIE XYZ using .B TIFFCIELabToXYZ() routine, and at the second step we will convert .I CIE XYZ to .I RGB using .B TIFFXYZToRGB(). Look at the code sample below: .PP .RS .nf float *whitePoint; float refWhite[3]; /* Initialize structures */ img->cielab = (TIFFCIELabToRGB *) _TIFFmalloc(sizeof(TIFFCIELabToRGB)); if (!cielab) { TIFFError("CIE L*a*b*->RGB", "No space for CIE L*a*b*->RGB conversion state."); exit(0); } TIFFGetFieldDefaulted(tif, TIFFTAG_WHITEPOINT, &whitePoint); refWhite[1] = 100.0F; refWhite[0] = whitePoint[0] / whitePoint[1] * refWhite[1]; refWhite[2] = (1.0F - whitePoint[0] - whitePoint[1]) / whitePoint[1] * refWhite[1]; if (TIFFCIELabToRGBInit(cielab, &display_sRGB, refWhite) < 0) { TIFFError("CIE L*a*b*->RGB", "Failed to initialize CIE L*a*b*->RGB conversion state."); _TIFFfree(cielab); exit(0); } /* Now we can start to convert */ uint32 r, g, b; uint32 L; int32 a, b; float X, Y, Z; for each pixel in image TIFFCIELabToXYZ(cielab, L, a, b, &X, &Y, &Z); TIFFXYZToRGB(cielab, X, Y, Z, &r, &g, &b); /* Don't forget to free the state structure */ _TIFFfree(cielab); .fi .RE .PP .SH "SEE ALSO" .BR TIFFRGBAImage (3TIFF) .BR libtiff (3TIFF), .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFGetField.3tiff0000644000212300117540000001733111756024612013244 00000000000000.\" $Id: TIFFGetField.3tiff,v 1.6 2012-05-19 23:15:22 bfriesen Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFGetField 3TIFF "March 18, 2005" "libtiff" .SH NAME TIFFGetField, TIFFVGetField \- get the value(s) of a tag in an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "int TIFFGetField(TIFF *" tif ", ttag_t " tag ", " ... ")" .sp .B "#include " .sp .BI "int TIFFVGetField(TIFF *" tif ", ttag_t " tag ", va_list " ap ")" .br .BI "int TIFFGetFieldDefaulted(TIFF *" tif ", ttag_t " tag ", " ... ")" .br .BI "int TIFFVGetFieldDefaulted(TIFF *" tif ", ttag_t " tag ", va_list " ap ")" .SH DESCRIPTION .IR TIFFGetField returns the value of a tag or pseudo-tag associated with the the current directory of the opened .SM TIFF file .IR tif . (A .I pseudo-tag is a parameter that is used to control the operation of the .SM TIFF library but whose value is not read or written to the underlying file.) The file must have been previously opened with .IR TIFFOpen (3TIFF). The tag is identified by .IR tag , one of the values defined in the include file .B tiff.h (see also the table below). The type and number of values returned is dependent on the tag being requested. The programming interface uses a variable argument list as prescribed by the .IR stdarg (3) interface. The returned values should only be interpreted if .IR TIFFGetField returns 1. .PP .IR TIFFVGetField is functionally equivalent to .IR TIFFGetField except that it takes a pointer to a variable argument list. .I TIFFVGetField is useful for layering interfaces on top of the functionality provided by .IR TIFFGetField . .PP .IR TIFFGetFieldDefaulted and .IR TIFFVGetFieldDefaulted are identical to .IR TIFFGetField and .IR TIFFVGetField , except that if a tag is not defined in the current directory and it has a default value, then the default value is returned. .PP The tags understood by .IR libtiff(3TIFF), the number of parameter values, and the types for the returned values are shown below. The data types are specified as in C and correspond to the types used to specify tag values to .IR TIFFSetField (3TIFF). Remember that .IR TIFFGetField returns parameter values, so all the listed data types are pointers to storage where values should be returned. Consult the .SM TIFF specification (or relevant industry specification) for information on the meaning of each tag and their possible values. .PP .nf .ta \w'TIFFTAG_CONSECUTIVEBADFAXLINES'u+2n +\w'Count'u+2n +\w'TIFFFaxFillFunc*'u+2n \fITag Name\fP \fICount\fP \fITypes\fP \fINotes\fP .sp 5p TIFFTAG_ARTIST 1 char** TIFFTAG_BADFAXLINES 1 uint32* TIFFTAG_BITSPERSAMPLE 1 uint16* TIFFTAG_CLEANFAXDATA 1 uint16* TIFFTAG_COLORMAP 3 uint16** 1< .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFDataWidth 3TIFF "September 12, 2002" "libtiff" .SH NAME TIFFDataWidth \- Get the size of TIFF data types .SH SYNOPSIS .B "#include " .sp .BI "int TIFFDataWidth(TIFFDataType " type ")" .SH DESCRIPTION .I TIFFDataWidth returns a size of .I type in bytes. Currently following data types are supported: .br .I TIFF_BYTE .br .I TIFF_ASCII .br .I TIFF_SBYTE .br .I TIFF_UNDEFINED .br .I TIFF_SHORT .br .I TIFF_SSHORT .br .I TIFF_LONG .br .I TIFF_SLONG .br .I TIFF_FLOAT .br .I TIFF_IFD .br .I TIFF_RATIONAL .br .I TIFF_SRATIONAL .br .I TIFF_DOUBLE .br .SH "RETURN VALUES" .br .IR TIFFDataWidth returns a number of bytes occupied by the item of given type. 0 returned when uknown data type supplied. .SH "SEE ALSO" .BR libtiff (3TIFF), .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFcodec.3tiff0000644000212300117540000000602411616002447012630 00000000000000.\" $Id: TIFFcodec.3tiff,v 1.3 2011-08-02 14:09:43 bfriesen Exp $ .\" .\" Copyright (c) 1995 Sam Leffler .\" Copyright (c) 1995 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH CODEC 3TIFF "October 29, 2004" "libtiff" .SH NAME TIFFFindCODEC, TIFFRegisterCODEC, TIFFUnRegisterCODEC, TIFFIsCODECConfigured \- codec-related utility routines .SH SYNOPSIS .B "#include " .sp .BI "const TIFFCodec* TIFFFindCODEC(uint16 " scheme ");" .br .BI "TIFFCodec* TIFFRegisterCODEC(uint16 " scheme ", const char *" method ", TIFFInitMethod " init ");" .br .BI "void TIFFUnRegisterCODEC(TIFFCodec *" codec ");" .br .BI "int TIFFIsCODECConfigured(uint16 " scheme ");" .SH DESCRIPTION .I libtiff supports a variety of compression schemes implemented by software .IR codecs . Each codec adheres to a modular interface that provides for the decoding and encoding of image data; as well as some other methods for initialization, setup, cleanup, and the control of default strip and tile sizes. Codecs are identified by the associated value of the .SM TIFF .I Compression tag; e.g. 5 for .SM LZW compression. .PP The .I TIFFRegisterCODEC routine can be used to augment or override the set of codecs available to an application. If the specified .I scheme already has a registered codec then it is .I overridden and any images with data encoded with this compression scheme will be decoded using the supplied codec. .PP .I TIFFIsCODECConfigured returns 1 if the codec is configured and working. Otherwise 0 will be returned. .SH DIAGNOSTICS .BR "No space to register compression scheme %s" . .I TIFFRegisterCODEC was unable to allocate memory for the data structures needed to register a codec. .PP .BR "Cannot remove compression scheme %s; not registered" . .I TIFFUnRegisterCODEC did not locate the specified codec in the table of registered compression schemes. .SH "SEE ALSO" .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFReadEncodedStrip.3tiff0000644000212300117540000000575311244562247014750 00000000000000.\" $Id: TIFFReadEncodedStrip.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFReadEncodedStrip 3TIFF "October 15, 1995" "libtiff" .SH NAME TIFFReadEncodedStrip \- read and decode a strip of data from an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "tsize_t TIFFReadEncodedStrip(TIFF *" tif ", tstrip_t " strip ", tdata_t " buf ", tsize_t " size ")" .SH DESCRIPTION Read the specified strip of data and place up to .I size bytes of decompressed information in the (user supplied) data buffer. .SH NOTES The value of .I strip is a ``raw strip number.'' That is, the caller must take into account whether or not the data are organized in separate planes (\c .IR PlanarConfiguration =2). To read a full strip of data the data buffer should typically be at least as large as the number returned by .BR TIFFStripSize (3TIFF). If the -1 passed in .I size parameter, the whole strip will be read. You should be sure you have enough space allocated for the buffer. .PP The library attempts to hide bit- and byte-ordering differences between the image and the native machine by converting data to the native machine order. Bit reversal is done if the .I FillOrder tag is opposite to the native machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file was written with a byte order opposite to the native machine byte order, .SH "RETURN VALUES" The actual number of bytes of data that were placed in .I buf is returned; .IR TIFFReadEncodedStrip returns \-1 if an error was encountered. .SH DIAGNOSTICS All error messages are directed to the .BR TIFFError (3TIFF) routine. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFReadRawStrip (3TIFF), .BR TIFFReadScanline (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiff2pdf.10000644000212300117540000001566411501546110011736 00000000000000.\" $Id: tiff2pdf.1,v 1.7 2010-12-11 22:47:49 faxguy Exp $ .\" .\" Copyright (c) 2003 Ross Finlayson .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the name of .\" Ross Finlayson may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Ross Finlayson. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL ROSS FINLAYSON BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .\" Process this file with .\" groff -man -Tascii tiff2pdf.1 .\" .TH TIFF2PDF 1 "April 20, 2006" "libtiff" .SH NAME tiff2pdf \- convert a TIFF image to a PDF document .SH SYNOPSIS .B tiff2pdf [ .I options ] .I input.tiff .SH DESCRIPTION .I tiff2pdf opens a TIFF image and writes a PDF document to standard output. .PP The program converts one TIFF file to one PDF file, including multiple page TIFF files, tiled TIFF files, black and white. grayscale, and color TIFF files that contain data of TIFF photometric interpretations of bilevel, grayscale, RGB, YCbCr, CMYK separation, and ICC L*a*b* as supported by .I libtiff and PDF. .PP If you have multiple TIFF files to convert into one PDF file then use .I tiffcp or other program to concatenate the files into a multiple page TIFF file. If the input TIFF file is of huge dimensions (greater than 10000 pixels height or width) convert the input image to a tiled TIFF if it is not already. .PP The standard output is standard output. Set the output file name with the .BI \-o " output.pdf" option. .PP All black and white files are compressed into a single strip CCITT G4 Fax compressed PDF, unless tiled, where tiled black and white images are compressed into tiled CCITT G4 Fax compressed PDF, .I libtiff CCITT support is assumed. .PP Color and grayscale data can be compressed using either JPEG compression, ITU-T T.81, or Zip/Deflate LZ77 compression. Set the compression type using the .B \-j or .B \-z options. JPEG compression support requires that .I libtiff be configured with JPEG support, and Zip/Deflate compression support requires that .I libtiff be configured with Zip support, in tiffconf.h. Use only one or the other of .B \-j and .B \-z. .PP If the input TIFF contains single strip CCITT G4 Fax compressed information, then that is written to the PDF file without transcoding, unless the options of no compression and no passthrough are set, .B \-d and .B \-n. .PP If the input TIFF contains JPEG or single strip Zip/Deflate compressed information, and they are configured, then that is written to the PDF file without transcoding, unless the options of no compression and no passthrough are set. .PP The default page size upon which the TIFF image is placed is determined by the resolution and extent of the image data. Default values for the TIFF image resolution can be set using the .B \-x and .B \-y options. The page size can be set using the .B \-p option for paper size, or .B \-w and .B \-l for paper width and length, then each page of the TIFF image is centered on its page. The distance unit for default resolution and page width and length can be set by the .B \-u option, the default unit is inch. .PP Various items of the output document information can be set with the .BR \-e , .BR \-c , .BR \-a , .BR \-t , .BR \-s , and .B \-k options. Setting the argument of the option to "" for these tags causes the relevant document information field to be not written. Some of the document information values otherwise get their information from the input TIFF image, the software, author, document name, and image description. .PP The Portable Document Format (PDF) specification is copyrighted by Adobe Systems, Incorporated. .SH OPTIONS .TP .BI \-o " output-file" Set the output to go to file. .I output-file .TP .B \-j Compress with JPEG (requires .I libjpeg configured with .IR libtiff ). .TP .B \-z Compress with Zip/Deflate (requires .I zlib configured with .IR libtiff ). .TP .BI \-q " quality" Set the compression quality, 1-100 for JPEG. .TP .B \-n Do not allow data to be converted without uncompressing, no compressed data passthrough. .TP .BI \-b Set PDF ``Interpolate'' user preference. .TP .B \-d Do not compress (decompress). .TP .B \-i Invert colors. .TP .BI \-p " paper-size" Set paper size, e.g., .BR letter , .BR legal , .BR A4 . .TP .B \-F Cause the tiff to fill the PDF page. .TP .BR \-u " [" i | m ] Set distance unit, .B i for inch, .B m for centimeter. .TP .BI \-w " width" Set width in units. .TP .BI \-l " length" Set length in units. .TP .BI \-x " xres" Set x/width resolution default. .TP .BI \-y " yres" Set y/length resolution default. .TP .BR \-r " [" d | o ] Set .B d for resolution default for images without resolution, .B o for resolution override for all images. .TP .BI \-f Set PDF ``Fit Window'' user preference. .TP .BI \-e " YYYYMMDDHHMMSS" Set document information date, overrides image or current date/time default, .I YYYYMMDDHHMMSS. .TP .BI \-c " creator" Set document information creator, overrides image software default. .TP .BI \-a " author" Set document information author, overrides image artist default. .TP .BI \-t " title" Set document information title, overrides image document name default. .TP .BI \-s " subject" Set document information subject, overrides image image description default. .TP .BI \-k " keywords" Set document information keywords. .TP .B \-h List usage reminder to stderr and exit. .SH EXAMPLES .TP The following example would generate the file output.pdf from input.tiff. .RS .nf tiff2pdf \-o output.pdf input.tiff .fi .RE .PP The following example would generate PDF output from input.tiff and write it to standard output. .RS .nf tiff2pdf input.tiff .fi .RE .PP The following example would generate the file output.pdf from input.tiff, putting the image pages on a letter sized page, compressing the output with JPEG, with JPEG quality 75, setting the title to ``Document'', and setting the ``Fit Window'' option. .RS .nf tiff2pdf \-p letter \-j \-q 75 \-t "Document" \-f \-o output.pdf input.tiff .fi .RE .SH BUGS Please report bugs via the web interface at .IP \%http://bugzilla.remotesensing.org/enter_bug.cgi?product=libtiff .SH "SEE ALSO" .BR libtiff (3), .BR tiffcp (1), .BR tiff2ps (1) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFFlush.3tiff0000644000212300117540000000474411244562247012651 00000000000000.\" $Id: TIFFFlush.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFFlush 3TIFF "December 16, 1991" "libtiff" .SH NAME TIFFFlush, TIFFFlushData \- flush pending writes to an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "int TIFFFlush(TIFF *" tif ")" .br .BI "int TIFFFlushData(TIFF *" tif ")" .SH DESCRIPTION .IR TIFFFlush causes any pending writes for the specified file (including writes for the current directory) to be done. In normal operation this call is never needed \- the library automatically does any flushing required. .PP .IR TIFFFlushData flushes any pending image data for the specified file to be written out; directory-related data are not flushed. In normal operation this call is never needed \- the library automatically does any flushing required. .SH "RETURN VALUES" 0 is returned if an error is encountered, otherwise 1 is returned. .SH DIAGNOSTICS All error messages are directed to the .BR TIFFError (3TIFF) routine. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFWriteEncodedStrip (3TIFF), .BR TIFFWriteEncodedTile (3TIFF), .BR TIFFWriteRawStrip (3TIFF), .BR TIFFWriteRawTile (3TIFF), .BR TIFFWriteScanline (3TIFF), .BR TIFFWriteTile (3TIFF) .BR libtiff (3TIFF), .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/Makefile.in0000644000212300117540000004665212027361163012225 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = man DIST_COMMON = $(dist_man1_MANS) $(dist_man3_MANS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" man3dir = $(mandir)/man3 NROFF = nroff MANS = $(dist_man1_MANS) $(dist_man3_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_man1_MANS = \ bmp2tiff.1 \ fax2ps.1 \ fax2tiff.1 \ gif2tiff.1 \ pal2rgb.1 \ ppm2tiff.1 \ ras2tiff.1 \ raw2tiff.1 \ rgb2ycbcr.1 \ sgi2tiff.1 \ thumbnail.1 \ tiff2bw.1 \ tiff2pdf.1 \ tiff2ps.1 \ tiff2rgba.1 \ tiffcmp.1 \ tiffcp.1 \ tiffcrop.1 \ tiffdither.1 \ tiffdump.1 \ tiffgt.1 \ tiffinfo.1 \ tiffmedian.1 \ tiffset.1 \ tiffsplit.1 \ tiffsv.1 dist_man3_MANS = \ libtiff.3tiff \ TIFFbuffer.3tiff \ TIFFClose.3tiff \ TIFFcodec.3tiff \ TIFFcolor.3tiff \ TIFFDataWidth.3tiff \ TIFFError.3tiff \ TIFFFieldDataType.3tiff \ TIFFFieldName.3tiff \ TIFFFieldPassCount.3tiff \ TIFFFieldReadCount.3tiff \ TIFFFieldTag.3tiff \ TIFFFieldWriteCount.3tiff \ TIFFFlush.3tiff \ TIFFGetField.3tiff \ TIFFmemory.3tiff \ TIFFOpen.3tiff \ TIFFPrintDirectory.3tiff \ TIFFquery.3tiff \ TIFFReadDirectory.3tiff \ TIFFReadEncodedStrip.3tiff \ TIFFReadEncodedTile.3tiff \ TIFFReadRawStrip.3tiff \ TIFFReadRawTile.3tiff \ TIFFReadRGBAImage.3tiff \ TIFFReadRGBAStrip.3tiff \ TIFFReadRGBATile.3tiff \ TIFFReadScanline.3tiff \ TIFFReadTile.3tiff \ TIFFRGBAImage.3tiff \ TIFFSetDirectory.3tiff \ TIFFSetField.3tiff \ TIFFsize.3tiff \ TIFFstrip.3tiff \ TIFFswab.3tiff \ TIFFtile.3tiff \ TIFFWarning.3tiff \ TIFFWriteDirectory.3tiff \ TIFFWriteEncodedStrip.3tiff \ TIFFWriteEncodedTile.3tiff \ TIFFWriteRawStrip.3tiff \ TIFFWriteRawTile.3tiff \ TIFFWriteScanline.3tiff \ TIFFWriteTile.3tiff all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign man/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(dist_man1_MANS) @$(NORMAL_INSTALL) @list1='$(dist_man1_MANS)'; \ list2=''; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(dist_man1_MANS)'; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-man3: $(dist_man3_MANS) @$(NORMAL_INSTALL) @list1='$(dist_man3_MANS)'; \ list2=''; \ test -n "$(man3dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.3[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ done; } uninstall-man3: @$(NORMAL_UNINSTALL) @list='$(dist_man3_MANS)'; test -n "$(man3dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the 'missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically 'make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-man3 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 uninstall-man3 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-man3 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am uninstall uninstall-am uninstall-man uninstall-man1 \ uninstall-man3 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/man/TIFFFieldDataType.3tiff0000644000212300117540000000363112005255231014225 00000000000000.\" $Id: TIFFFieldDataType.3tiff,v 1.1 2012-07-29 15:45:29 tgl Exp $ .\" .\" Copyright (c) 2012, Tom Lane .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFFieldDataType 3TIFF "July 26, 2012" "libtiff" .SH NAME TIFFFieldDataType \- Get TIFF data type from field information .SH SYNOPSIS .B "#include " .sp .BI "TIFFDataType TIFFFieldDataType(const TIFFField* " fip ")" .SH DESCRIPTION .BR TIFFFieldDataType returns the data type stored in a TIFF field. .P .I fip is a field information pointer previously returned by .BR TIFFFindField , .BR TIFFFieldWithTag , or .BR TIFFFieldWithName . .br .SH "RETURN VALUES" .br .BR TIFFFieldDataType returns a member of the enum type .BR TIFFDataType . .br .SH "SEE ALSO" .BR libtiff (3TIFF), .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/libtiff.3tiff0000644000212300117540000004465612005263022012525 00000000000000.\" $Id: libtiff.3tiff,v 1.4 2012-07-29 15:45:30 tgl Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH INTRO 3TIFF "November 2, 2005" "libtiff" .SH NAME libtiff \- introduction to .IR libtiff , a library for reading and writing .SM TIFF files .SH SYNOPSIS .B "#include " .sp cc file.c .B -ltiff .SH DESCRIPTION .I libtiff is a library for reading and writing data files encoded with the .I "Tag Image File" format, Revision 6.0 (or revision 5.0 or revision 4.0). This file format is suitable for archiving multi-color and monochromatic image data. .PP The library supports several compression algorithms, as indicated by the .I Compression field, including: no compression (1), .SM CCITT 1D Huffman compression (2), .SM CCITT Group 3 Facsimile compression (3), .SM CCITT Group 4 Facsimile compression (4), Lempel-Ziv & Welch compression (5), baseline JPEG compression (7), word-aligned 1D Huffman compression (32771), and PackBits compression (32773). In addition, several nonstandard compression algorithms are supported: the 4-bit compression algorithm used by the .I ThunderScan program (32809) (decompression only), NeXT's 2-bit compression algorithm (32766) (decompression only), an experimental LZ-style algorithm known as Deflate (32946), and an experimental CIE LogLuv compression scheme designed for images with high dynamic range (32845 for LogL and 32845 for LogLuv). Directory information may be in either little- or big-endian byte order\-byte swapping is automatically done by the library. Data bit ordering may be either Most Significant Bit (\c .SM MSB\c ) to Least Significant Bit (\c .SM LSB\c ) or .SM LSB to .SM MSB. Finally, the library does not support files in which the .IR BitsPerSample , .IR Compression , .IR MinSampleValue , or .IR MaxSampleValue fields are defined differently on a per-sample basis (in Rev. 6.0 the .I Compression tag is not defined on a per-sample basis, so this is immaterial). .SH "DATA TYPES" The library makes extensive use of C typedefs to promote portability. Two sets of typedefs are used, one for communication with clients of the library and one for internal data structures and parsing of the .SM TIFF format. The following typedefs are exposed to users either through function definitions or through parameters passed through the varargs interfaces. .in +.5i .sp 5p .ta +\w'typedef unsigned <\fIthing\fP> uint32; 'u .nf typedef unsigned short uint16; 16-bit unsigned integer typedef unsigned <\fIthing\fP> uint32; 32-bit unsigned integer .sp 5p typedef unsigned int ttag_t; directory tag typedef uint16 tdir_t; directory index typedef uint16 tsample_t; sample number typedef uint32 tstrip_t; strip number typedef uint32 ttile_t; tile number typedef int32 tsize_t; i/o size in bytes typedef void* tdata_t; image data ref typedef void* thandle_t; client data handle typedef int32 toff_t; file offset .fi .sp 5p .in -.5i Note that .IR tstrip_t , .IR ttile_t , and .I tsize_t are constrained to be no more than 32-bit quantities by 32-bit fields they are stored in in the .SM TIFF image. Likewise .I tsample_t is limited by the 16-bit field used to store the .I SamplesPerPixel tag. .I tdir_t constrains the maximum number of .SM IFDs that may appear in an image and may be an arbitrary size (w/o penalty). .I ttag_t must be either int, unsigned int, pointer, or double because the library uses a varargs interface and .SM "ANSI C" restricts the type of the parameter before an ellipsis to be a promoted type. .I toff_t is defined as int32 because TIFF file offsets are (unsigned) 32-bit quantities. A signed value is used because some interfaces return \-1 on error. Finally, note that user-specified data references are passed as opaque handles and only cast at the lowest layers where their type is presumed. .SH "LIST OF ROUTINES" The following routines are part of the library. Consult specific manual pages for details on their operation; on most systems doing ``man function-name'' will work. .sp .nf .ta \w'TIFFCheckpointDirectory'u+2n \fIName\fP \fIDescription\fP .sp 5p TIFFCheckpointDirectory writes the current state of the directory TIFFCheckTile very x,y,z,sample is within image TIFFCIELabToRGBInit initialize CIE L*a*b* 1976 to RGB conversion state TIFFCIELabToXYZ perform CIE L*a*b* 1976 to CIE XYZ conversion TIFFClientOpen open a file for reading or writing TIFFClose close an open file TIFFComputeStrip return strip containing y,sample TIFFComputeTile return tile containing x,y,z,sample TIFFCurrentDirectory return index of current directory TIFFCurrentRow return index of current scanline TIFFCurrentStrip return index of current strip TIFFCurrentTile return index of current tile TIFFDataWidth return the size of TIFF data types TIFFError library error handler TIFFFdOpen open a file for reading or writing TIFFFieldDataType get data type from field information TIFFFieldName get field name from field information TIFFFieldPassCount get whether to pass a value count to Get/SetField TIFFFieldReadCount get number of values to be read from field TIFFFieldTag get tag value from field information TIFFFieldWithName get field information given field name TIFFFieldWithTag get field information given tag TIFFFieldWriteCount get number of values to be written to field TIFFFileName return name of open file TIFFFileno return open file descriptor TIFFFindCODEC find standard codec for the specific scheme TIFFFindField get field information given tag and data type TIFFFlush flush all pending writes TIFFFlushData flush pending data writes TIFFGetBitRevTable return bit reversal table TIFFGetField return tag value in current directory TIFFGetFieldDefaulted return tag value in current directory TIFFGetMode return open file mode TIFFGetVersion return library version string TIFFIsCODECConfigured check, whether we have working codec TIFFIsMSB2LSB return true if image data is being returned with bit 0 as the most significant bit TIFFIsTiled return true if image data is tiled TIFFIsByteSwapped return true if image data is byte-swapped TIFFNumberOfStrips return number of strips in an image TIFFNumberOfTiles return number of tiles in an image TIFFOpen open a file for reading or writing TIFFPrintDirectory print description of the current directory TIFFReadBufferSetup specify i/o buffer for reading TIFFReadDirectory read the next directory TIFFReadEncodedStrip read and decode a strip of data TIFFReadEncodedTile read and decode a tile of data TIFFReadRawStrip read a raw strip of data TIFFReadRawTile read a raw tile of data TIFFReadRGBAImage read an image into a fixed format raster TIFFReadScanline read and decode a row of data TIFFReadTile read and decode a tile of data TIFFRegisterCODEC override standard codec for the specific scheme TIFFReverseBits reverse bits in an array of bytes TIFFRGBAImageBegin setup decoder state for TIFFRGBAImageGet TIFFRGBAImageEnd release TIFFRGBAImage decoder state TIFFRGBAImageGet read and decode an image TIFFRGBAImageOK is image readable by TIFFRGBAImageGet TIFFScanlineSize return size of a scanline TIFFSetDirectory set the current directory TIFFSetSubDirectory set the current directory TIFFSetErrorHandler set error handler function TIFFSetField set a tag's value in the current directory TIFFSetWarningHandler set warning handler function TIFFStripSize returns size of a strip TIFFRawStripSize returns the number of bytes in a raw strip TIFFSwabShort swap bytes of short TIFFSwabLong swap bytes of long TIFFSwabArrayOfShort swap bytes of an array of shorts TIFFSwabArrayOfLong swap bytes of an array of longs TIFFTileRowSize return size of a row in a tile TIFFTileSize return size of a tile TIFFUnRegisterCODEC unregisters the codec TIFFVGetField return tag value in current directory TIFFVGetFieldDefaulted return tag value in current directory TIFFVSetField set a tag's value in the current directory TIFFVStripSize returns the number of bytes in a strip TIFFWarning library warning handler TIFFWriteDirectory write the current directory TIFFWriteEncodedStrip compress and write a strip of data TIFFWriteEncodedTile compress and write a tile of data TIFFWriteRawStrip write a raw strip of data TIFFWriteRawTile write a raw tile of data TIFFWriteScanline write a scanline of data TIFFWriteTile compress and write a tile of data TIFFXYZToRGB perform CIE XYZ to RGB conversion TIFFYCbCrToRGBInit initialize YCbCr to RGB conversion state TIFFYCbCrtoRGB perform YCbCr to RGB conversion .sp Auxiliary functions: _TIFFfree free memory buffer _TIFFmalloc dynamically allocate memory buffer _TIFFmemcmp compare contents of the memory buffers _TIFFmemcpy copy contents of the one buffer to another _TIFFmemset fill memory buffer with a constant byte _TIFFrealloc dynamically reallocate memory buffer .fi .SH "TAG USAGE" The table below lists the .SM TIFF tags that are recognized and handled by the library. If no use is indicated in the table, then the library reads and writes the tag, but does not use it internally. Note that some tags are meaningful only when a particular compression scheme is being used; e.g. .I Group3Options is only useful if .I Compression is set to .SM CCITT Group 3 encoding. Tags of this sort are considered .I codec-specific tags and the library does not recognize them except when the .I Compression tag has been previously set to the relevant compression scheme. .sp .nf .ta \w'TIFFTAG_JPEGTABLESMODE'u+2n +\w'Value'u+2n +\w'R/W'u+2n \fITag Name\fP \fIValue\fP \fIR/W\fP \fILibrary Use/Notes\fP .sp 5p .nf Artist 315 R/W BadFaxLines 326 R/W BitsPerSample 258 R/W lots CellLength 265 parsed but ignored CellWidth 264 parsed but ignored CleanFaxData 327 R/W ColorMap 320 R/W ColorResponseUnit 300 parsed but ignored Compression 259 R/W choosing codec ConsecutiveBadFaxLines 328 R/W Copyright 33432 R/W DataType 32996 R obsoleted by SampleFormat tag DateTime 306 R/W DocumentName 269 R/W DotRange 336 R/W ExtraSamples 338 R/W lots FaxRecvParams 34908 R/W FaxSubAddress 34909 R/W FaxRecvTime 34910 R/W FillOrder 266 R/W control bit order FreeByteCounts 289 parsed but ignored FreeOffsets 288 parsed but ignored GrayResponseCurve 291 parsed but ignored GrayResponseUnit 290 parsed but ignored Group3Options 292 R/W used by Group 3 codec Group4Options 293 R/W HostComputer 316 R/W ImageDepth 32997 R/W tile/strip calculations ImageDescription 270 R/W ImageLength 257 R/W lots ImageWidth 256 R/W lots InkNames 333 R/W InkSet 332 R/W JPEGTables 347 R/W used by JPEG codec Make 271 R/W Matteing 32995 R obsoleted by ExtraSamples tag MaxSampleValue 281 R/W MinSampleValue 280 R/W Model 272 R/W NewSubFileType 254 R/W called SubFileType in spec NumberOfInks 334 R/W Orientation 274 R/W PageName 285 R/W PageNumber 297 R/W PhotometricInterpretation 262 R/W used by Group 3 and JPEG codecs PlanarConfiguration 284 R/W data i/o Predictor 317 R/W used by LZW and Deflate codecs PrimaryChromacities 319 R/W ReferenceBlackWhite 532 R/W ResolutionUnit 296 R/W used by Group 3 codec RowsPerStrip 278 R/W data i/o SampleFormat 339 R/W SamplesPerPixel 277 R/W lots SMinSampleValue 340 R/W SMaxSampleValue 341 R/W Software 305 R/W StoNits 37439 R/W StripByteCounts 279 R/W data i/o StripOffsets 273 R/W data i/o SubFileType 255 R/W called OSubFileType in spec TargetPrinter 337 R/W Thresholding 263 R/W TileByteCounts 324 R/W data i/o TileDepth 32998 R/W tile/strip calculations TileLength 323 R/W data i/o TileOffsets 324 R/W data i/o TileWidth 322 R/W data i/o TransferFunction 301 R/W WhitePoint 318 R/W XPosition 286 R/W XResolution 282 R/W YCbCrCoefficients 529 R/W used by TIFFRGBAImage support YCbCrPositioning 531 R/W tile/strip size calulcations YCbCrSubsampling 530 R/W YPosition 286 R/W YResolution 283 R/W used by Group 3 codec .SH "PSEUDO TAGS" In addition to the normal .SM TIFF tags the library supports a collection of tags whose values lie in a range outside the valid range of .SM TIFF tags. These tags are termed .I pseud-tags and are used to control various codec-specific functions within the library. The table below summarizes the defined pseudo-tags. .sp .nf .ta \w'TIFFTAG_JPEGTABLESMODE'u+2n +\w'Codec'u+2n +\w'R/W'u+2n \fITag Name\fP \fICodec\fP \fIR/W\fP \fILibrary Use/Notes\fP .sp 5p .nf TIFFTAG_FAXMODE G3 R/W general codec operation TIFFTAG_FAXFILLFUNC G3/G4 R/W bitmap fill function TIFFTAG_JPEGQUALITY JPEG R/W compression quality control TIFFTAG_JPEGCOLORMODE JPEG R/W control colorspace conversions TIFFTAG_JPEGTABLESMODE JPEG R/W control contents of \fIJPEGTables\fP tag TIFFTAG_ZIPQUALITY Deflate R/W compression quality level TIFFTAG_PIXARLOGDATAFMT PixarLog R/W user data format TIFFTAG_PIXARLOGQUALITY PixarLog R/W compression quality level TIFFTAG_SGILOGDATAFMT SGILog R/W user data format .fi .TP .B TIFFTAG_FAXMODE Control the operation of the Group 3 codec. Possible values (independent bits that can be combined by or'ing them together) are: FAXMODE_CLASSIC (enable old-style format in which the .SM RTC is written at the end of the last strip), FAXMODE_NORTC (opposite of FAXMODE_CLASSIC; also called FAXMODE_CLASSF), FAXMODE_NOEOL (do not write .SM EOL codes at the start of each row of data), FAXMODE_BYTEALIGN (align each encoded row to an 8-bit boundary), FAXMODE_WORDALIGN (align each encoded row to an 16-bit boundary), The default value is dependent on the compression scheme; this pseudo-tag is used by the various G3 and G4 codecs to share code. .TP .B TIFFTAG_FAXFILLFUNC Control the function used to convert arrays of black and white runs to packed bit arrays. This hook can be used to image decoded scanlines in multi-bit depth rasters (e.g. for display in colormap mode) or for other purposes. The default value is a pointer to a builtin function that images packed bilevel data. .TP .B TIFFTAG_IPTCNEWSPHOTO Tag contaings image metadata per the IPTC newsphoto spec: Headline, captioning, credit, etc... Used by most wire services. .TP .B TIFFTAG_PHOTOSHOP Tag contains Photoshop captioning information and metadata. Photoshop uses in parallel and redundantly alongside IPTCNEWSPHOTO information. .TP .B TIFFTAG_JPEGQUALITY Control the compression quality level used in the baseline algorithm. Note that quality levels are in the range 0-100 with a default value of 75. .TP .B TIFFTAG_JPEGCOLORMODE Control whether or not conversion is done between RGB and YCbCr colorspaces. Possible values are: JPEGCOLORMODE_RAW (do not convert), and JPEGCOLORMODE_RGB (convert to/from RGB) The default value is JPEGCOLORMODE_RAW. .TP .B TIFFTAG_JPEGTABLESMODE Control the information written in the .I JPEGTables tag. Possible values (independent bits that can be combined by or'ing them together) are: JPEGTABLESMODE_QUANT (include quantization tables), and JPEGTABLESMODE_HUFF (include Huffman encoding tables). The default value is JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF. .TP .B TIFFTAG_ZIPQUALITY Control the compression technique used by the Deflate codec. Quality levels are in the range 1-9 with larger numbers yielding better compression at the cost of more computation. The default quality level is 6 which yields a good time-space tradeoff. .TP .B TIFFTAG_PIXARLOGDATAFMT Control the format of user data passed .I in to the PixarLog codec when encoding and passed .I out from when decoding. Possible values are: PIXARLOGDATAFMT_8BIT for 8-bit unsigned pixels, PIXARLOGDATAFMT_8BITABGR for 8-bit unsigned ABGR-ordered pixels, PIXARLOGDATAFMT_11BITLOG for 11-bit log-encoded raw data, PIXARLOGDATAFMT_12BITPICIO for 12-bit PICIO-compatible data, PIXARLOGDATAFMT_16BIT for 16-bit signed samples, and PIXARLOGDATAFMT_FLOAT for 32-bit IEEE floating point samples. .TP .B TIFFTAG_PIXARLOGQUALITY Control the compression technique used by the PixarLog codec. This value is treated identically to TIFFTAG_ZIPQUALITY; see the above description. .TP .B TIFFTAG_SGILOGDATAFMT Control the format of client data passed .I in to the SGILog codec when encoding and passed .I out from when decoding. Possible values are: SGILOGDATAFMT_FLTXYZ for converting between LogLuv and 32-bit IEEE floating valued XYZ pixels, SGILOGDATAFMT_16BITLUV for 16-bit encoded Luv pixels, SGILOGDATAFMT_32BITRAW and SGILOGDATAFMT_24BITRAW for no conversion of data, SGILOGDATAFMT_8BITRGB for returning 8-bit RGB data (valid only when decoding LogLuv-encoded data), SGILOGDATAFMT_FLTY for converting between LogL and 32-bit IEEE floating valued Y pixels, SGILOGDATAFMT_16BITL for 16-bit encoded L pixels, and SGILOGDATAFMT_8BITGRY for returning 8-bit greyscale data (valid only when decoding LogL-encoded data). .SH DIAGNOSTICS All error messages are directed through the .IR TIFFError routine. By default messages are directed to .B stderr in the form: .IR "module: message\en." Warning messages are likewise directed through the .IR TIFFWarning routine. .SH "SEE ALSO" .BR fax2tiff (1), .BR gif2tiff (1), .BR pal2rgb (1), .BR ppm2tiff (1), .BR rgb2ycbcr (1), .BR ras2tiff (1), .BR raw2tiff (1), .BR sgi2tiff (1), .BR tiff2bw (1), .BR tiffdither (1), .BR tiffdump (1), .BR tiffcp (1), .BR tiffcmp (1), .BR tiffgt (1), .BR tiffinfo (1), .BR tiffmedian (1), .BR tiffsplit (1), .BR tiffsv (1). .PP .BR "Tag Image File Format Specification \(em Revision 6.0" , an Aldus Technical Memorandum. .PP .BR "The Spirit of TIFF Class F" , an appendix to the TIFF 5.0 specification prepared by Cygnet Technologies. .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ .SH BUGS The library does not support multi-sample images where some samples have different bits/sample. .PP The library does not support random access to compressed data that is organized with more than one row per tile or strip. tiff-4.0.3/man/ras2tiff.10000644000212300117540000000570111244562247011756 00000000000000.\" $Id: ras2tiff.1,v 1.4 2006-04-20 12:17:19 dron Exp $ .\" .\" Copyright (c) 1990-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH RAS2TIFF 1 "November 2, 2005" "libtiff" .SH NAME ras2tiff \- create a .SM TIFF file from a Sun rasterfile .SH SYNOPSIS .B ras2tiff [ .I options ] .I input.ras .I output.tif .SH DESCRIPTION .I ras2tiff converts a file in the Sun rasterfile format to .SM TIFF. By default, the .SM TIFF image is created with data samples packed (\c .IR PlanarConfiguration =1), compressed with the Lempel-Ziv & Welch algorithm (\c .IR Compression =5), and with each strip no more than 8 kilobytes. These characteristics can overridden, or explicitly specified with the options described below. .PP Any colormap information in the rasterfile is carried over to the .SM TIFF file by including a .I Colormap tag in the output file. If the rasterfile has a colormap, the .I PhotometricInterpretation tag is set to 3 (palette); otherwise it is set to 2 (RGB) if the depth is 24 or 1 (min-is-black) if the depth is not 24. .SH OPTIONS .TP .B \-c Specify a compression scheme to use when writing image data: .B "\-c none" for no compression, .B "\-c packbits" for the PackBits compression algorithm, .B "\-c jpeg" for the baseline JPEG compression algorithm, .B "\-c zip for the Deflate compression algorithm, and .B "\-c lzw" for Lempel-Ziv & Welch (the default). .TP .B \-r Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes. .SH BUGS Does not handle all possible rasterfiles. In particular, .I ras2tiff does not handle run-length encoded images. .SH "SEE ALSO" .BR pal2rgb (1), .BR tiffinfo (1), .BR tiffcp (1), .BR tiffmedian (1), .BR libtiff (3) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFFieldReadCount.3tiff0000644000212300117540000000476012005255232014403 00000000000000.\" $Id: TIFFFieldReadCount.3tiff,v 1.1 2012-07-29 15:45:30 tgl Exp $ .\" .\" Copyright (c) 2012, Tom Lane .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFFieldReadCount 3TIFF "July 26, 2012" "libtiff" .SH NAME TIFFFieldReadCount \- Get number of values to be read from field .SH SYNOPSIS .B "#include " .sp .BI "int TIFFFieldReadCount(const TIFFField* " fip ")" .SH DESCRIPTION .BR TIFFFieldReadCount returns the number of values available to be read from the specified TIFF field; that is, the number of arguments that should be supplied to .BR TIFFGetField . For most field types this is a small positive integer, typically 1 or 2, but there are some special values: .br .BR TIFF_VARIABLE indicates that a variable number of values is possible; then, a .BR uint16 .I count argument and a pointer .I data argument must be supplied to .BR TIFFGetField . .br .BR TIFF_VARIABLE2 is the same as .BR TIFF_VARIABLE except that the .I count argument must have type .BR uint32 . .br .BR TIFF_SPP indicates that the number of arguments is equal to the image's number of samples per pixel. .P .I fip is a field information pointer previously returned by .BR TIFFFindField , .BR TIFFFieldWithTag , or .BR TIFFFieldWithName . .br .SH "RETURN VALUES" .br .BR TIFFFieldReadCount returns an integer. .br .SH "SEE ALSO" .BR libtiff (3TIFF), .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/TIFFReadRawTile.3tiff0000644000212300117540000000503211244562247013722 00000000000000.\" $Id: TIFFReadRawTile.3tiff,v 1.2 2005-11-02 11:07:18 dron Exp $ .\" .\" Copyright (c) 1988-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFReadRawTile 3TIFF "October 15, 1995" "libtiff" .SH NAME TIFFReadRawTile \- return an undecoded tile of data from an open .SM TIFF file .SH SYNOPSIS .B "#include " .sp .BI "tsize_t TIFFReadRawTile(TIFF *" tif ", ttile_t " tile ", tdata_t " buf ", tsize_t " size ")" .SH DESCRIPTION Read the contents of the specified tile into the (user supplied) data buffer. Note that the value of .I tile is a ``raw tile number.'' That is, the caller must take into account whether or not the data is organized in separate planes (\c .IR PlanarConfiguration =2). .I TIFFComputeTile automatically does this when converting an (x,y,z,sample) coordinate quadruple to a tile number. To read a full tile of data the data buffer should typically be at least as large as the value returned by .IR TIFFTileSize . .SH "RETURN VALUES" The actual number of bytes of data that were placed in .I buf is returned; .IR TIFFReadEncodedTile returns \-1 if an error was encountered. .SH DIAGNOSTICS All error messages are directed to the .BR TIFFError (3TIFF) routine. .SH "SEE ALSO" .BR TIFFOpen (3TIFF), .BR TIFFReadEncodedTile (3TIFF), .BR TIFFReadTile (3TIFF), .BR TIFFTileSize (3TIFF), .BR libtiff (3TIFF) .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/man/tiffmedian.10000644000212300117540000000647211244562247012352 00000000000000.\" $Id: tiffmedian.1,v 1.3 2005-11-02 11:07:19 dron Exp $ .\" .\" Copyright (c) 1990-1997 Sam Leffler .\" Copyright (c) 1991-1997 Silicon Graphics, Inc. .\" .\" Permission to use, copy, modify, distribute, and sell this software and .\" its documentation for any purpose is hereby granted without fee, provided .\" that (i) the above copyright notices and this permission notice appear in .\" all copies of the software and related documentation, and (ii) the names of .\" Sam Leffler and Silicon Graphics may not be used in any advertising or .\" publicity relating to the software without the specific, prior written .\" permission of Sam Leffler and Silicon Graphics. .\" .\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY .\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. .\" .\" IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR .\" ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, .\" OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, .\" WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF .\" LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE .\" OF THIS SOFTWARE. .\" .if n .po 0 .TH TIFFMEDIAN 1 "November 2, 2005" "libtiff" .SH NAME tiffmedian \- apply the median cut algorithm to data in a .SM TIFF file .SH SYNOPSIS .B tiffmedian [ .I options ] .I input.tif .I output.tif .SH DESCRIPTION .I tiffmedian applies the median cut algorithm to an .SM RGB image in .I input.tif to generate a palette image that is written to .IR output.tif . The generated colormap has, by default, 256 entries. The image data is quantized by mapping each pixel to the closest color values in the colormap. .SH OPTIONS .TP .B \-c Specify the compression to use for data written to the output file: .B none for no compression, .B packbits for PackBits compression, .B lzw for Lempel-Ziv & Welch compression, and .B zip for Deflate compression. By default .I tiffmedian will compress data according to the value of the .I Compression tag found in the source file. .IP .SM LZW compression can be specified together with a .I predictor value. A predictor value of 2 causes each scanline of the output image to undergo horizontal differencing before it is encoded; a value of 1 forces each scanline to be encoded without differencing. LZW-specific options are specified by appending a ``:''-separated list to the ``lzw'' option; e.g. .B "\-c lzw:2" for .SM LZW compression with horizontal differencing. .TP .B \-C Specify the number of entries to use in the generated colormap. By default all 256 entries/colors are used. .TP .B \-f Apply Floyd-Steinberg dithering before selecting a colormap entry. .TP .B \-r Specify the number of rows (scanlines) in each strip of data written to the output file. By default, .I tiffmedian attempts to set the rows/strip that no more than 8 kilobytes of data appear in a strip. .SH NOTES This program is derived from Paul Heckbert's .I median program. .SH "SEE ALSO" .BR pal2rgb (1), .BR tiffinfo (1), .BR tiffcp (1), .BR tiffcmp (1), .BR libtiff (3TIFF) .PP .BR "Color Image Quantization for Frame Buffer Display", Paul Heckbert, SIGGRAPH proceedings, 1982, pp. 297-307. .PP Libtiff library home page: .BR http://www.remotesensing.org/libtiff/ tiff-4.0.3/Makefile.in0000644000212300117540000007362512027361162011451 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = README $(am__configure_deps) $(dist_doc_DATA) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/libtiff-4.pc.in $(top_srcdir)/config/compile \ $(top_srcdir)/config/config.guess \ $(top_srcdir)/config/config.sub \ $(top_srcdir)/config/install-sh $(top_srcdir)/config/ltmain.sh \ $(top_srcdir)/config/missing \ $(top_srcdir)/config/mkinstalldirs $(top_srcdir)/configure \ ChangeLog TODO config/compile config/config.guess \ config/config.sub config/depcomp config/install-sh \ config/ltmain.sh config/missing config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = libtiff-4.pc CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(docdir)" "$(DESTDIR)$(pkgconfigdir)" DATA = $(dist_doc_DATA) $(pkgconfig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ cscope distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz $(distdir).zip GZIP_ENV = --best DIST_TARGETS = dist-gzip dist-zip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = $(LIBTIFF_DOCDIR) dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = 1.12 dist-zip foreign ACLOCAL_AMFLAGS = -I m4 docfiles = \ COPYRIGHT \ ChangeLog \ README \ README.vms \ RELEASE-DATE \ TODO \ VERSION EXTRA_DIST = \ HOWTO-RELEASE \ Makefile.vc \ SConstruct \ autogen.sh \ configure.com \ nmake.opt \ libtiff-4.pc.in dist_doc_DATA = $(docfiles) SUBDIRS = port libtiff tools build contrib test man html pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libtiff-4.pc all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): libtiff-4.pc: $(top_builddir)/config.status $(srcdir)/libtiff-4.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-dist_docDATA: $(dist_doc_DATA) @$(NORMAL_INSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-dist_docDATA: @$(NORMAL_UNINSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist-recursive cscopelist cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(docdir)" "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_docDATA install-pkgconfigDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-dist_docDATA uninstall-pkgconfigDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-cscope \ clean-generic clean-libtool cscope cscopelist \ cscopelist-recursive ctags ctags-recursive dist dist-all \ dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-dist_docDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgconfigDATA install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-dist_docDATA uninstall-pkgconfigDATA release: (rm -f $(top_srcdir)/RELEASE-DATE && echo $(LIBTIFF_RELEASE_DATE) > $(top_srcdir)/RELEASE-DATE) (rm -f $(top_srcdir)/VERSION && echo $(LIBTIFF_VERSION) > $(top_srcdir)/VERSION) (rm -f $(top_srcdir)/libtiff/tiffvers.h && sed 's,LIBTIFF_VERSION,$(LIBTIFF_VERSION),;s,LIBTIFF_RELEASE_DATE,$(LIBTIFF_RELEASE_DATE),' $(top_srcdir)/libtiff/tiffvers.h.in > $(top_srcdir)/libtiff/tiffvers.h) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/test/0000755000212300117540000000000012027361331010424 500000000000000tiff-4.0.3/test/rewrite_tag.c0000644000212300117540000002350511766757625013061 00000000000000/* $Id: rewrite_tag.c,v 1.5 2012-06-13 04:38:55 fwarmerdam Exp $ */ /* * Copyright (c) 2007, Frank Warmerdam * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Module to test _TIFFRewriteField(). */ #include "tif_config.h" #include #ifdef HAVE_UNISTD_H # include #endif #include "tiffio.h" #include "tiffiop.h" const uint32 width = 10; const uint32 length = 40; const uint32 rows_per_strip = 1; int test_packbits() { TIFF *tif; int i; unsigned char buf[10] = {0,0,0,0,0,0,0,0,0,0}; int length = 20; const char *filename = "test_packbits.tif"; /* Test whether we can write tags. */ tif = TIFFOpen(filename, "w"); if (!tif) { fprintf (stderr, "Can't create test TIFF file %s.\n", filename); return 1; } if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_PACKBITS)) { fprintf (stderr, "Can't set Compression tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width)) { fprintf (stderr, "Can't set ImageWidth tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, length)) { fprintf (stderr, "Can't set ImageLength tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8)) { fprintf (stderr, "Can't set BitsPerSample tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1)) { fprintf (stderr, "Can't set SamplesPerPixel tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rows_per_strip)) { fprintf (stderr, "Can't set SamplesPerPixel tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG)) { fprintf (stderr, "Can't set PlanarConfiguration tag.\n"); goto failure; } for (i = 0; i < length; i++ ) { if( !TIFFWriteEncodedStrip( tif, i, buf, 10 ) ) { fprintf (stderr, "Can't write image data.\n"); goto failure; } } TIFFClose(tif); /* Test whether we can write tags. */ tif = TIFFOpen(filename, "r+"); if (!tif) { fprintf (stderr, "Can't create test TIFF file %s.\n", filename); return 1; } buf[3] = 17; buf[6] = 12; if( !TIFFWriteEncodedStrip( tif, 6, buf, 10 ) ) { fprintf (stderr, "Can't write image data.\n"); goto failure; } TIFFClose(tif); unlink(filename); return 0; failure: /* Something goes wrong; close file and return unsuccessful status. */ TIFFClose(tif); /* unlink(filename); */ return 1; } /************************************************************************/ /* rewrite_test() */ /************************************************************************/ int rewrite_test( const char *filename, int length, int bigtiff, uint64 base_value ) { TIFF *tif; int i; unsigned char buf[10] = {5,6,7,8,9,10,11,12,13,14}; uint64 *rowoffset, *rowbytes; uint64 *upd_rowoffset; uint64 *upd_bytecount; /* Test whether we can write tags. */ if( bigtiff ) tif = TIFFOpen(filename, "w8"); else tif = TIFFOpen(filename, "w4"); if (!tif) { fprintf (stderr, "Can't create test TIFF file %s.\n", filename); return 1; } if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_PACKBITS)) { fprintf (stderr, "Can't set Compression tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width)) { fprintf (stderr, "Can't set ImageWidth tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, length)) { fprintf (stderr, "Can't set ImageLength tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8)) { fprintf (stderr, "Can't set BitsPerSample tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1)) { fprintf (stderr, "Can't set SamplesPerPixel tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rows_per_strip)) { fprintf (stderr, "Can't set SamplesPerPixel tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG)) { fprintf (stderr, "Can't set PlanarConfiguration tag.\n"); goto failure; } for (i = 0; i < length; i++ ) { if( !TIFFWriteScanline( tif, buf, i, 0 ) ) { fprintf (stderr, "Can't write image data.\n"); goto failure; } } TIFFClose(tif); /* Ok, now test whether we can read written values. */ tif = TIFFOpen(filename, "r+"); if (!tif) { fprintf (stderr, "Can't open test TIFF file %s.\n", filename); return 1; } if( !TIFFGetField( tif, TIFFTAG_STRIPOFFSETS, &rowoffset ) ) { fprintf (stderr, "Can't fetch STRIPOFFSETS.\n"); goto failure; } if( !TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &rowbytes ) ) { fprintf (stderr, "Can't fetch STRIPBYTECOUNTS.\n"); goto failure; } upd_rowoffset = (uint64 *) _TIFFmalloc(sizeof(uint64) * length); for( i = 0; i < length; i++ ) upd_rowoffset[i] = base_value + i*10; if( !_TIFFRewriteField( tif, TIFFTAG_STRIPOFFSETS, TIFF_LONG8, length, upd_rowoffset ) ) { fprintf (stderr, "Can't rewrite STRIPOFFSETS.\n"); goto failure; } _TIFFfree( upd_rowoffset ); upd_bytecount = (uint64 *) _TIFFmalloc(sizeof(uint64) * length); for( i = 0; i < length; i++ ) upd_bytecount[i] = 100 + i*10; if( !_TIFFRewriteField( tif, TIFFTAG_STRIPBYTECOUNTS, TIFF_LONG8, length, upd_bytecount ) ) { fprintf (stderr, "Can't rewrite STRIPBYTECOUNTS.\n"); goto failure; } _TIFFfree( upd_bytecount ); TIFFClose(tif); /* Reopen file and read back to verify contents */ tif = TIFFOpen(filename, "r"); if (!tif) { fprintf (stderr, "Can't open test TIFF file %s.\n", filename); return 1; } if( !TIFFGetField( tif, TIFFTAG_STRIPOFFSETS, &rowoffset ) ) { fprintf (stderr, "Can't fetch STRIPOFFSETS.\n"); goto failure; } for( i = 0; i < length; i++ ) { uint64 expect = base_value + i*10; if( rowoffset[i] != expect ) { fprintf( stderr, "%s:STRIPOFFSETS[%d]: Got %X:%08X instead of %X:%08X.\n", filename, i, (int) (rowoffset[i] >> 32), (int) (rowoffset[i]&0xFFFFFFFF), (int) (expect >> 32), (int) (expect & 0xFFFFFFFF) ); goto failure; } } if( !TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &rowbytes ) ) { fprintf (stderr, "Can't fetch STRIPBYTECOUNTS.\n"); goto failure; } for( i = 0; i < length; i++ ) { uint64 expect = 100 + i*10; if( rowbytes[i] != expect ) { fprintf( stderr, "%s:STRIPBYTECOUNTS[%d]: Got %X:%08X instead of %X:%08X.\n", filename, i, (int) (rowbytes[i] >> 32), (int) (rowbytes[i] & 0xFFFFFFFF), (int) (expect >> 32), (int) (expect & 0xFFFFFFFF) ); goto failure; } } TIFFClose( tif ); /* All tests passed; delete file and exit with success status. */ unlink(filename); return 0; failure: /* Something goes wrong; close file and return unsuccessful status. */ TIFFClose(tif); /* unlink(filename); */ return 1; } /************************************************************************/ /* main() */ /************************************************************************/ int main(int argc, char **argv) { (void) argc; (void) argv; int failure = 0; failure |= test_packbits(); /* test fairly normal use */ failure |= rewrite_test( "rewrite1.tif", 10, 0, 100 ); failure |= rewrite_test( "rewrite2.tif", 10, 1, 100 ); /* test case of fitting all in directory entry */ failure |= rewrite_test( "rewrite3.tif", 1, 0, 100 ); failure |= rewrite_test( "rewrite4.tif", 1, 1, 100 ); /* test with very large values that don't fit in 4bytes (bigtiff only) */ failure |= rewrite_test( "rewrite5.tif", 1000, 1, 0x6000000000ULL ); failure |= rewrite_test( "rewrite6.tif", 1, 1, 0x6000000000ULL ); return failure; } /* vim: set ts=8 sts=8 sw=8 noet: */ tiff-4.0.3/test/tiff2rgba-minisblack-1c-8b.sh0000755000212300117540000000035711244400051015471 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-1c-8b.tiff" outfile="o-tiff2rgba-minisblack-1c-8b.tiff" f_test_convert "$TIFF2RGBA" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-doubleflip-rgb-3c-16b.sh0000755000212300117540000000036411244400052016300 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/rgb-3c-16b.tiff" outfile="o-tiffcrop-doubleflip-rgb-3c-16b.tiff" f_test_convert "$TIFFCROP -F both" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-doubleflip-logluv-3c-16b.sh0000755000212300117540000000037211244400052017035 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/logluv-3c-16b.tiff" outfile="o-tiffcrop-doubleflip-logluv-3c-16b.tiff" f_test_convert "$TIFFCROP -F both" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extractz14-rgb-3c-16b.sh0000755000212300117540000000037611244400052016167 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/rgb-3c-16b.tiff" outfile="o-tiffcrop-extractz14-rgb-3c-16b.tiff" f_test_convert "$TIFFCROP -E left -Z1:4,2:4" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/long_tag.c0000644000212300117540000001032510773046356012320 00000000000000/* $Id: long_tag.c,v 1.4 2008/03/28 01:42:06 bfriesen Exp $ */ /* * Copyright (c) 2004, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Module to test LONG tags read/write functions. */ #include "tif_config.h" #include #ifdef HAVE_UNISTD_H # include #endif #include "tiffio.h" extern int CheckLongField(TIFF *, ttag_t, uint32); const char *filename = "long_test.tiff"; static struct Tags { ttag_t tag; short count; uint32 value; } long_tags[] = { { TIFFTAG_SUBFILETYPE, 1, FILETYPE_REDUCEDIMAGE|FILETYPE_PAGE|FILETYPE_MASK } }; #define NTAGS (sizeof (long_tags) / sizeof (long_tags[0])) const uint32 width = 1; const uint32 length = 1; const uint32 rows_per_strip = 1; int main(int argc, char **argv) { TIFF *tif; unsigned int i; unsigned char buf[3] = { 0, 127, 255 }; (void) argc; (void) argv; /* Test whether we can write tags. */ tif = TIFFOpen(filename, "w"); if (!tif) { fprintf (stderr, "Can't create test TIFF file %s.\n", filename); return 1; } if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width)) { fprintf (stderr, "Can't set ImageWidth tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, length)) { fprintf (stderr, "Can't set ImageLength tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8)) { fprintf (stderr, "Can't set BitsPerSample tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3)) { fprintf (stderr, "Can't set SamplesPerPixel tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rows_per_strip)) { fprintf (stderr, "Can't set SamplesPerPixel tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG)) { fprintf (stderr, "Can't set PlanarConfiguration tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB)) { fprintf (stderr, "Can't set PhotometricInterpretation tag.\n"); goto failure; } for (i = 0; i < NTAGS; i++) { if (!TIFFSetField(tif, long_tags[i].tag, long_tags[i].value)) { fprintf(stderr, "Can't set tag %d.\n", (int)long_tags[i].tag); goto failure; } } /* Write dummy pixel data. */ if (!TIFFWriteScanline(tif, buf, 0, 0) < 0) { fprintf (stderr, "Can't write image data.\n"); goto failure; } TIFFClose(tif); /* Ok, now test whether we can read written values. */ tif = TIFFOpen(filename, "r"); if (!tif) { fprintf (stderr, "Can't open test TIFF file %s.\n", filename); return 1; } if (CheckLongField(tif, TIFFTAG_IMAGEWIDTH, width) < 0) goto failure; if (CheckLongField(tif, TIFFTAG_IMAGELENGTH, length) < 0) goto failure; if (CheckLongField(tif, TIFFTAG_ROWSPERSTRIP, rows_per_strip) < 0) goto failure; for (i = 0; i < NTAGS; i++) { if (CheckLongField(tif, long_tags[i].tag, long_tags[i].value) < 0) goto failure; } TIFFClose(tif); /* All tests passed; delete file and exit with success status. */ unlink(filename); return 0; failure: /* Something goes wrong; close file and return unsuccessful status. */ TIFFClose(tif); unlink(filename); return 1; } /* vim: set ts=8 sts=8 sw=8 noet: */ tiff-4.0.3/test/bmp2tiff_rgb.sh0000755000212300117540000000031611246307452013254 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$IMG_RGB_3C_8B_BMP" outfile="o-bmp2tiff_rgb.tiff" f_test_convert "$BMP2TIFF" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extract-palette-1c-4b.sh0000755000212300117540000000041011273622560016430 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-4b.tiff" outfile="o-tiffcrop-extract-palette-1c-4b.tiff" f_test_convert "$TIFFCROP -U px -E top -X 60 -Y 60" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-R90-rgb-3c-8b.sh0000755000212300117540000000035011244400052014441 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/rgb-3c-8b.tiff" outfile="o-tiffcrop-R90-rgb-3c-8b.tiff" f_test_convert "$TIFFCROP -R90" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/images/0000755000212300117540000000000012027361331011671 500000000000000tiff-4.0.3/test/images/quad-tile.jpg.tiff0000644000212300117540000006567011762227126015155 00000000000000II*ôgÿØÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ€€"ÿÚ ?ùþŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¥û4ßeûW”ÞFÿ/ÌÇË»Æ}qIo—W1Û»¤‘‚(õ&½’? ÚÏáÐÁTܲãþZòw}3úq]8|3¬¤×OÌMØñz)óC%¼òA2–6(êz‚¦W0Š(  ›?›•G’þÚu 7'ùcõ­KYHØ›Ä6Ñ®:¬EŽ1PÂCØÛ‘ÿ<Ô~C$f¾Ö–K•(ÎÏTº˜Ò£R·Ûkä¿Th'€ôvëâȇýºþ.¬ÅðïCgRþ/nyЂG×}PªÊ‰dØ%²yéRÊ%=ëKîÿ"k/à ·üÍ2ûf*SðÇÂŒŒÅޝ”´@€}ǬÔ5e c,§ æzTxzz²ü?Èòú(¢¾LðBŠ*Å•¤—×°ÚÅ÷¤lgÐw?€æ„¯¢­ð&•û×Õ&A…ù ϯvþŸ‰¯OÒŸ{H=®^Î8ì­b¶„b8”(÷÷®‹@móKþè¯b2Thò¡Î£)3Ïþ'h?bÔãÕ¡LCwòËÀêèk¯¢üA¢Ç®èW6`÷l…Ç*?Ó5óÍż¶—2ÛΆ9¢bާ¨#‚+˨ԥtDâ™QY”t¶G~™nq—‘"ž£Óv•ÇÝ,?\ÿZŽkìð¸ŸÜCÑ~CÁ?y¯6YªÊ5RF«(Ôç\úl:.¡«Q𢆮ÁÚ¹gˆ=ª;gEWÊŸŸuþ²û=»ÞÈ0ò±û/søŸå\Οhooc‡$)9b;õܬ‹* Ѝ€­iY;²éÞV4–Zé|,Ûî&ÿp:ã_zë|Ûî®?ÜÎŒU{Sgv2—&oúÝ\ŠòŠÞû.¡³ b+ÝÍÑÀàþ ~•ìhµŸâ -sDºÓåÀ¦¿ºÝAü+Ɔ1)jyIs.Sæj*[«ilîæµ M ”u=ˆ85z†ÇE£±m,‚>ì„ÈëVUM“e2ö‘ùUÃ^µ E©¤,+µF¼Áj€TÉU,Iõf[‹µhAÚ¨EÚ´ í\•1'³IžcEfÆÜ\\€ßq~fÿ ánÊìüüÛÑíÅ¥§šÀy²óô^´¼Õ0Ï+3c²ŒÔ‹ Ééo/ýðk].§§ƒ¥¬ž¥ä–»Ê[Už>ÆÇðaþ5ÄÇowÿ>Óß³]—€a5©Œ°È‹övå”÷–¸q˜…쥩ۙ(}B®«cÒjMœRFµ8Zù‰bÏŒÂT³¡Ívÿ2cÔFxý×÷ÕvWä5êWÃP§QÁ#Ы……\¨^é[ñIŸO [ÜI Z6(HéqQÖ†½Ù|C©ÛîÝå]Ê›±ŒáÈÍPDiQ³1À©5å5­‘Ã%fЀp95»§xSP¾ä mï'Þ?Aþ8­Í BŠÁk…Wº<ú„öþõÒFkßÂeåSÄ?—ù˜*ªNÑ9ûÙñçÞNü Ïãš’_‡¶rô{éã8ÿ–ŠùbºXÍZŒ×t°x4­È¿УN2Ýg©ø'UÓÔË­Ü#¼9ܺÿ†k› ‚A#¨5ï1šç|Oàø5˜^êÍ-@sž‹/±÷÷üý¼ŒV_ïQû¿Èéž^Üy©ýÇ”QN’7ŠFŽE*èJ²ž Ž¢›^Aæl,Þþú+T`­!ÆOaԟʽCEð¶“d¨ßfIå&I†î}@< òËY͵ÜS©9Ãq^—câU¶*—P–_ùéëøõëèrZT§ ÉÆòOðò81°­6•=ŽêÖ0ˆª *€À´bZ欼O£Ê£7apêGôÅmA¬éL¡†¥hæeù×¥VMnŽ*t+EûÑs‡.Â{èÿ…‘ýA?âk¹œ|¦¸/‡R©]EŽZ Ùú0ÿïæ)¯’Æâm]Ÿk˜é˜É÷·ä|•â¥+âýh0 ýº~¿ïšµá‹ҵ䃄ùcϯsþ}i|yÿ#Ö³ÿ_-ZºDb6ÝGt ~§Ÿë]9tT«s˦§˜MŸ®¬ÙŒÕ˜ÍRŒÕ¨Í{³ÄáÑqj6ªQš³W$ñ»‡EØÚ­FÕF6Æy«Qšåž ÷0èà~#è«Ðë®§Êœïcå?ˆ~Ö¸*ö¿ڥÜ’('±_›úcñ¯¯2«NWG›ÐT«ó-¤¯ó ìmÿ}§[Hz˜Æ~£Šã«´ÑÓ:©õÿ¡µz9MgN«óG7ÊâüÈv52‘“šUš÷¥Š¹îágtzÃÖQ®J ÁkfÜîSý z4£å¯4ðüŒ)ÿ\ŸùW¦Ê>S_™f›Wùm¦aòGË_¡H>!jè™Á‘ŸVE'õ&¯Y8{XXt(§ô¨>*Dñ|EÔÙ†‚&^z-Gó Ðîºz.~hÎÓý?J÷ð­û¤|þeÍ¿6nÆÜâ­FjŒmV£jëž Xt]Fé\†©â-kJÔd¶2DBœ£Ç̧¡®®6¬ŸiÚoŸæ{pXc©^ãúÿúë’¥{õ=nY8^/T`ë#£Ãÿ~Åe¢µï¼=y©smoš(åeŽPÊC¨<ôäUÝ3ÂwS\D×-FO¼Hôôöë_? %y»(³×¥‚ÄUv„“«iW6£%•Ð_19SAª5¥¯ê-ªë—WlÙ øNr6Ž?*ͬj(©µŒj¨ª’PÚúèãy¤XãBîÇ ª2I¯Mð€ t[ÝQwÏËT_ï*Ò†uŸ»·s’¾"cy™±š¹–" Š>kFÙ9ôu1V>öŒ’¨7Ùt é‡a`q‚x쪽;ůäøJáp?zèœÿ¼ô¯1¯WÚLðsªœÕ’삊(®CÇ;TBö6ÎÜ–… ?UM§Š¿mUž;À‡óQQ2s_eGûµ~ÃÀÌ… YCQˆù«ÇÍÄ£é°íÄ %´•ÙÓøkNK{a¨Ì¹•ò"}ÕõúŸåõ¯RðN¡ÔbìÑÊ?¼¤ÿBZàîcQ(T@Tv ªiu-¼é424r¡ÊºœkééÑŒpþÊ:™âºo›nÍíäiļֲr*œKÍhÛŽE|íLQúEhaøøºèV¨÷fã%±Ð…8©ü«ÎëݵMk_õp#Ý4Xš{2x÷ °ÿW„×%*ê«•ºdïˆl(“€2M£ Ú}·[µˆ‚T>öú/'ùbµ<éÉF.O¡Ü´"„c÷haЍËÍhÜrÆ©‘ÍzÄÙ`²#Uæ¬D¼ÓUy«/53ÅO†‘nÙ9…ñB–:t8áÝß9ôìÕÑÛ/"°>"i’‹ ;T0—{vù~ë`0çßæÿ¾k†¦%JJ-îm“ú´¾_™çõ©áÔk¶Àç‚ÍDz“ý+.­é“­¶©m+à"È7Øw5QviŸ)]9R’]™ÙÜŸ˜Ö{žkJécYò/5ëáÀÙCšÐ·Š¡Zзë_S}åÔ<%gÿØ|ÞHÍÏåý+æ¯h‡ÃÞ/Ôtð¡bYKÂÀòÛ•€8ü*ý׌5Í ÅW³é:¤ð—i[1¶Ñ·æCÁééIã'!²¿º·[}ZÙ ùêæ9V\ò¤Aõw°xzô+ûFï þ¿Èð1çœïÝœ•v^ ±Ùos¨¸å¿sÓ«åùä!‰çž8cžF £Ô“^©ªiÚ|Qœ¬+Œúž¤þ$“^Ž&²¦’êÏ1­ËMo/É¥9cPÍJçš½`±'V d*еªëVbœñ'ÒáËöã‘]F¹áíü,žRÓ…kˆGûhÇ}@#þ\Í¿QYÚ_ÅýOCÕ.4ûèb¿Ò£‘€²Fˆù[£zàõõ¸j:õèjâîiš8§³g•ÑZ~!†Îzóû:U–ÆI ¶ì£Ëo˜ zŒí>àÖe}%Í.çϵgc¸ÒoF§¦©$â$Ï¡üžid‹¥qöÓi×KqäpÊz0ô5ÚØßÙêÑæ 7ñBÇæOQô¬êU•-z “£;­ŸàlD9«ð äÿá/Ócl¸uAýH¦Mã¸Ö7[k'ÜA ÎàcÐãò¯X¶ž2Œ²9 é¾Ós>sæÊÏœc9$Ô €x>ô”WÒ$’±à·wrKyÞÚæ+ˆÈDá×#¸9è–zͶ­ø[—ˆŸ™Ä{×›Ó‘Þ'28ä2œ\øŒ2¬–¶häÄacY©==%ºÓq\m·‰/à\¤Ê?¾9üÅiEâȉu«¯º0?ÏçKZ;+šáàéèÎZˆW;Š´òØd=ÊèjQã 66Ç—rãÕPS\òÃVežå ôã»:ÈŠÆ¥ØáTdŸA^9#´²¼÷˜–?S]ߎ#{ia¶³|º²‡‘ÀÛ‘€p3ŸÎ¸Êï˰õ)s:Š×±Ž? ¼ªö¸QEéžpR«20eb¬:pi( ÿÙÿØÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ€€"ÿÚ ?ùþŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ÖZ6¥¨ŒÙØÜL¿ÞD;>•®<âsÓK?÷þ?þ*½æ×OHÑUP*€À}-¥zÿQÃÅ{Òoîÿ‚yÐÇs½óu׃¼Ed ›I¸ rL`Iÿ æ±]7(êÊê°Áõq³t¬}gºf³Ëë8å a\Œ:ýr+àéý‰}ç§I*‹F|ÏEuþ3ð=džeûLæÓœà9Æ}úòy àœ˜Nƒ´‚Š(©$(¥±IàZ0øZ¹Bðhú„ª KgaŸÀSI½„Ú[™´VŒÞÖ­”4ú>¡<öιüÅgPÓ[‚wØ(¢ŠC (¢€>¸†éV’!é^c¡üPòQaÖmšR8óàõ^å¥w63ðÝôa£Õ­£$d¬íåíób»q ½7¬~íO,E'ïEú­MŸ&¢xA*EÔtöPVúØ‚2•yýk2÷Åš¤e›T¶ã…üÂïœ×¯RNÉ3ÜÀ¤šI2 SN†öÒkyãªQÔŽ ×Í~&Ðäðö½q§¹Ê)ÝyOðúƒ_Gi>"´×ä¹KxÞ?+wžY}qÚ¼Ãã-ŒjÚmèI—‰¸ê8#òçó«Fß$÷G·Š ýƒrVq<¦»Ÿü?“[+u¨³Ãj@e8w³èçôã<÷†´øõ ae @Èêz6:ÌÃ5íÞ¹IasûÅ|Ÿ¡#[Q¤¹It>;3ÇNŠöt·êÍ #Dðå²{8`ǪíøžOâjÊë$ŸÝB€´sY~"iîÙÎ|’»G lóúcò¥µŒ•ÒªEA3“ h©ÍݳiuiOXâüøÔ7–Ú&°6êºU´Äñ½ã GãÔ~Æ@éHùZÂUbô=ü-8³×þé÷p=χnŒc+o+ŒûnûËøæ¼“VÑïô;÷²Ômž ×±äêà¥}b÷fçý ‘÷†p1ïRx³Âö>(ÒšÖí6H¿43óDÞ£ÔzŽÿ‘®J“Œ]Qàù—»¹ówVÒîtmRãO»]³BåO£Ä{ÍR àiÅÙQ¥¤R…¯iâO[ J†­ÃÚª¢ÕØW‘XO{Ô«Á·FÛ_ƒ“¶PcoÄqúY¿oÌÓ,†7üó7°àëùS´¹¢³½‚êw ,’9uAÉ?¯=ñF»'ˆüCu©8eGm±#uDtSîMy©_™mc‡:¨¡U¼¿B߃å yt™ùš,Àÿõ뮲ÕfÓ/â#œpÊO = y½…ãØ^GpœíWʤ}0?§ãY‚GÃ#aЃ‚*ìZÕÂŒJQêx5œ©%ðìua0Š¨Ë‹ÆÞ1Ò¥Ì×3:ƒ–KˆC)üqœ} v>ø‘o¬È–z…©µ¹l,yh˜û÷NÝr=ÅgE«Û67Æê}°EM>¡lö1À쓼L±¶Üaˆ8?rÎGµG +Ý­a|ƒmµ­¼ýùØmR{‘žZ­Ë ×’x_ÅÚÞ›cž£QÆ»QüÒ²:ÁŠÓºñ î¦À3ùQ‚XÉúç­pJNmtG³ƒÃNZµoSƒø¡k}ã9E±Söx– Y{¸$ŸË ~ÆUFo©ÝÀ°Žg@[©Á#š­]ñVŠGÏדYJ[ÜìÌ|Ò¬u¢Ö¤”-·=+™ãWs³ Q£Ž®ÁÈ⤊ԓҧ¸¸³Ò­Ì÷³,kŽ«7°ëžxÆÝ–¬÷iVŒUäÌÿN¶^˜7ψ”}zþ€×Ö¦»¬É¬ßy¥JBƒlQ“£üMe×uÊ1÷·>0Å,Mne²Ñ\°Ô¦°s°îÍè©ÑZœŠ’³:Ë}FÖó„}ýÇàþµ`ÆA®.¬Ã¨ÝÁÀ:ràhn]T­Mb©©ÐæÄ7‰Õa÷”ÿB*Câ[ݸXàSêÿSYIÔg«GJ„(IUmOÄvÚTm ³]ã…ªöôþUÆÜë÷`¬—.ÿ |£ôëøÕ•I·ï³Z¹Ä¹yh«y±Îí$Œîʼn,OsM¢ŠÜñ ›_jvÀ‘'QÚeÏê0Z¾¾5˜ºÆØä†"¹z+žXZ2wq[ŽÆüþ0Õe]±´6ü`ùQóÿf±&ž[‰ “ÊòÈz³±bQÑZB:°å9KvQEhHQEQEQEQEQEÿÙÿØÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ€€"ÿÚ ?ùþŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ŠUFv ŠY@I­ÛøƒPÁ‹N’5þôÄGÀóúPgRµ:Jõ$—«0h®þÏá&µpžòÊFpô<úÖÜ^HÔÉâG=BÚnñÞ?•Kš[œ3Â-9ÿ3Éh¯mƒà]DºÝË>9+ € ŸçO›à-›Æ¾¿…fëÓ]J†a‡žÏðg‡ÑE±ÚQEØé^ :§‚5mJ$c}eåΪ æ/›xÇÐü1\Þ—göËÅF»_™þž•îÿ vêJÀa Žù«²öY×},—Þ®*’„êÿ-¿%ù=Ñ]Gü.þñUÍ¢¡rŸ:Õ»Ééõ#ðÏzåë;Œ(¢ŠôÏ 6ÒÊ žTSI—fá˜S×é]훇Ue ƒÐƒ^?lÅôûrqþ¬ËŠzK$Mº7d=2§è¼:”SLðå‘ýnnj¥Ÿš¿êw·íZpWA«jP.ص ¸×9ÂÌÃúÕÈõí`ÌZûÿükަO©ÓKƒk=ª¯¹Ÿ@ES´ÑB–T@zn`3_>¦£|îY¯n‰É&V$ŸÎ¬AÚ¹g€ï#ÛÂðc޳­÷Gþ å´QEjs…VŽd.ï78ýÔ_3{žÃüúV”©J¬Ô#»vFæ“f-,×#Ɇè+Ôþ³-åâò˜Ô‘î ÿ^xƒ-^ƒðß‹ë¿úæ?}.>”i`8ì—êtâéòeu[òüÑ©ñcÃðxEî M׺vg–L|ëù ýTW͵öjá—¡¯˜¾%xdøkų¤I¶Îë3ÁŽ€Êþô"¾F›èyø:žÒŠîŽ>Š(­Nƒ¦°%´«rzàÈšÕ}+-yèÆ¬ö);ÓE`´“^c–¬GU×­XJR>§ ô.EZ0•›hÁÚ¹*½3Ë袊ã?= dàWc§Ù‹+4‹¼ošCïÿÖ¬= È\]Ü~î«vÿ麚ú› dëËÑ”yê%Ø’1Íwÿx¾»ÿ®cù×®÷áßü]ÿ×!üë³4ÿvŸõÔôsUl²¯¢üÑéÑž+øáOøIü.æÍížfƒ%¸å?æuñž*b)¾&ü²¹ò™mnWg±ñ…ÛüPð»xwÅRÍ x±¾&hˆè­üKùœýô®"ºOnQåv7ôR Ï"Rqø ¶jŽ„A¶¸^á?çð«Æ½l;½$NJ µb:®µ:UHúœ3.ÅZv¬è»V„«’¡ìR<Æ•T»PK€sI[>µI.ZâLb?¸ êÞ¿‡õ¬0ô]jŠšê~y)r«›vv«ef/QËŸVïSРɧ-}´!pQŽÈíÀÒ¶¬š1]·Ãça¬N€ü¦Ü’=Ã.?™®*1[Úˆôÿ ^=î¤Ò,/ˆÓqÜH?ÉMpf:áçèz¤òú±JîdzFx©ÅyÂ|bðšõšïÿÍJ>3xDËk¿ü5ñR‹> F´±f§Äo øVâШ}ÿhvüFGã_/TApA¯£[ã/„cλÿÀs^1ã¹4kϾ§¡Ü¬¶×£ÌtÚU£“øwëžäšÖíf}_55}ÑGAoøùLu sôÏøÖ‘¬Úf^Æ<þ£ükYº×¯…ºDPÒ³©Ò Z™+IO…z"­+:.Õ¡jå¨{T3¢Š+„üü)A*A‚;ŠJ(Í#¾7»6:dæ›E7}À(¢Š(¢Š–ÞâKY„±0ãž„zV¬zÄN˜Œ‡¾9‹EkN´éì GÌŽ‰u SÏœ¿ˆ"¬¥Ý°ÿ—ˆ¿ï±\¥¯Öä÷G¡K0>‡dºœxÝsàÙþU(ñ›YËÙPŸþµqVr¬ÙÓý·Y|1_ˆQE‰ãQ@Q@Q@Q@Q@Q@Q@ÿÙÿØÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ€€"ÿÚ ?ùþŠ( Š( Š( Š( Š( Š( Š( Š( Šö+¯€Wh£ìž ‚Sƒ‘-±éÑš¹=oáOŠôHšcgì(2Ïfûñÿ 1ü»VQ¯N[2a%=c©ÄÑE©AEPEPEPEPE»¥øVûQ…nöíÊ»Œ– zSJæ´hT­.Jj좻Aá‹ uÉ&oVl,To§YÆNÛhÿÍk-õ=/ìjé^m#éË{Ë[ÀÆÚâ)Âõ1¸`?Dÿt×ðäŸ/Qã÷|ßUÙÍ÷kÁ­I¸œ/ °x¹P‹ºVüRgÇš˜ ªÞwß1ªµ­â€ÅÚÐ/çúèÕmn÷S¬IÔõ>ƒÖ½ˆ'+$bâÜùV÷ {in¤Ùä÷=‡Ö¶­ô8P;Ðñ«öÖÑÚÂ#ŒqÜ÷'Ö¦¯b† Wž¬÷0ù| ¯SWø%´xÛ`ŽûFh{;i3ºÉ=öŒÔôW_$mk¾Îµ‘•q¡Âà˜ÆÞ‡‘þ5‹qm-´›%B§·¡®¾¡¹¶ŽêƒŽÇ¸>µÉ[ «ÃFpâ2øM^žð9*[ˆÚv‰ú¯Zм†švg„Ó‹³6|)eo¨x¢ÂÖërXŒB’úã^±}\€0A^)gröW¶÷QýødYêGò¯¢.ôgÔ¬b¿Ó{ ñ‰Ur3‚21Øði]£è²•ÉW‘‚U.ºžgMFª’êôÏÃk¦¼ð“#g+‹ŸDbƒÿA¯™«é„ãþ-î™õ—ÿF½yµ%Ê“0Âë̼¿TvÏJ…$Eu=U†A¬Ù´!سéV,Ää“n„“ùVÀ^*9¶§Q3ÅÆTœåv<ÿáôŠºäŠz½»(úåOô¯G“î×™x øHPÖ7þUéÒ}ÚòñŸÅ>£8VÌ/Ý/Ôù{âü”}_ëþŠJKGó,áTúâ®|]U_ˆ7D(¡ˆ±©ÛŽ+D¹[ ù£9C^æW4¬ŸTNj8™Eõ5(¢ŠöÏd;×5ªÙý–çrÝÉÊûâºZ¯{j.íš3ÝTúçÄÑö°²Ý¸Ì?¶§eºØäè¥e(ÅXÀàƒÚ’¼#悊( ¾¦ð%‹iþÒ­ßź³:ˆüÍ|Ûá½(ë~#°Ó±•ž`ýÁËã ×Ö6©µ®]K5· ­NSùÀâ£qÅLFãŠTêŸ9z³Ç4]jÏÃ×ñj·ìëkw”]ÇæGR+Ð4Ÿø_^+ޝžÃˆfÌOœ`2y힇Ҽ[¼;zyyçê+Í+¦¾5%w¹öYò¶*3þïêÏCøÏÅã”u'3YÆíŸ]̼~ +¶¸{YÖTê:QéV5 BmB;/>yf{{'tŒI;=€"©V”“‚VÝDê~óž']msÔ"HÏÇp}*jä-îeµ“|MƒÜv?ZÚ·×!pêcoP2?ƽªØMZz3ÚÃæšµMàjÑP%å´˜ÛÇÒ½&1^"mÖ•Îú²Q¡DZ%1úSûS¥\$|®2W>\Ô¼Yksa5¤VÒ°• îv ~3žÕÉQE{ÜúLN.®&JUÁER9‚Š( Š( Š( Š( ‡Â0Ô<ª»0²Ã =»œ, tú“ƒî}M}áøÅ*±Ù݈®ÈæÖ’Oó~×ÊÔW-|,*»ìÁ¶×)öŸjëå=7Ǿ*ÒB­¦»x~êJþjÁò+q~2xÀ"«\Ú¹šÝr}Î8®_©TŽÍ]|Iü-Q^¡êQ@Q@Q@Q@Q@Q@Q@ÿÙÿØÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ€€"ÿÚ ?ùþŠ( Š( Š( Š( Š( Š( Š( Š( Šèî¬ ’' +ãå*1Ís•­JN®oˆÃÊŒ¬ØQE‘€QEQ]φ~^jè·ŒÆÊݰUæGOáüsô¯JÒ~xVÐ)’ÉîÜĤþƒ úTJ¢‰æVͰԥË{¿#çÊ+ê«Oø^Â/‡ôÆÎdµG?›k‡ø³à]*×ÂçXÒ4è-%¶”Ä ´4mòôpvôµ’Ä'.[C1…i(¥cÃh¢Šè=¢Š(¢Š(®~µÍê0ù7ÃüºgÕÝ2ëQT[;ig™OÜ ¥vT÷àz™‹V»èsµoR·[MBX‚=p ýk¨ÓüuoÔ5¦[{x”È``9Áì£õúW!<­=Ä“7Þ‘‹©9¬%ûËs§^ª5MÝ-ý_ü1hhB×lVu ™AVž3øâ³éUŠ:²œ2œƒYT4{ŸGéÒeEtV§¥y†â…´XÖé¡` ºò@>¾¿ç­wÚN³§_à[^Dìƒvò<ÔJ Ÿð•i»¸éÜéaéF§§A«ézuÈÌ7P´MÇ ŒqÔRBx«jk’tÚ=lÕ_Y˧ê6W ­åh¤³) þ¢¢Ž7–E³¹  w&½ã6‚tß 蕌ZœbAÇbáX_á?ð*ç|9á»ëFÖòx|›HdYdiNÒʧ'¯AÖº½¢PægÖP¥:Í(+Œñ¾‡oáï\XZ3pªñ†9 Оüæ¹ÚÑ×µYu½rïP•‰3HJƒÙz(ü+:4Ô–áUÅÍòmp­Ã—ˆg iX³†™øUÿ_è£T¥œ‘kù±ÕÏ÷Gõ¯rð•”K¤Ç$hª®HFàÓõ¯F†:~Ú¯ÃÓÌò±¸åAZ;› éÁ—J±V ‹tÊ¢š4Š=‘¢¢Š£VIJnLjTGÍb«NOÞw8?\˜<7zÀœ²ãý¢õ¯¯Xø—/—¡*óûÉÕxúý+ÉëL¹¤w#°î]ßùQ\ç²w6çþ%–œû„ëþ覧¨1ØÛFH%aE8ö -ÍkR–‡_«4íµNØb Fî q‘ì¹ÇÐÕè¼C­ÿ!}Cÿ_ük5rÈ®)ÁŸ[…¡Mêâ¾ãcíW²‰n§–y¥rÇ·sô•.½rl|+2œ;F"^¼BŸÐ“øTvERñÜÞ_† „K‘‘ê·õ"¹Õ;Í®"Ô°³’ÓCÍéUK°Ubp%hèQyºå¢ã8}ýº3ý+ÑŠ»Høj“䃗dvÄšu„6‰Ý¨ Gñ7sù×mà jæiS8YK‡%[ùút`ž2ÒƒôÆCúW“×°x¾âí¸­K!C¸¡ËfÓ¨¬ˆBO±ély[¥»» ÇýkZÐò+oÄ Õ¾ݺ¦éíä71‘×åaïòîã×Ëììîufq¾Q]áÿCÄ«CC—ÉÖí[8ËìéýáëYôªÅX2œr Zvw>¤9àãÜï.~ñªÖ®Ç:ßÙEt˜ù׿³wU‘9¯J–/Cƒ­£ÜúNaYW+Öµ¦¬ÛÖ¾r>N¾çϧ/ã›À§C)ÿ`æJçn®žõäËígþòö'ßœgéW|Uqö¯jÒåH7R*•è@bü€¬Hüï[k†¦£Bšê’ü…Š6šT‰]Ø*Rk¼¥•œV±ýØ×õ=Ïç\5´ßg»†lgËu|}k´’u™ˆÛ•†AõêåÑ‹æ}L1‘”§Э)ɨM=ÎM3½vN'­…¬Hjä5M:Õ¸k’p>§ ¬jÚž•ž5Ôtݪ1ŸNw 5œ‡(ãhû¤û~9­KcÒ¼òúO;P¹—žVn=É®«”Ë;ªáJ /[ßî_ðEÔÝ5 Å£n¶.ZO!*¸ïš­EòÍÝÜÕÑuQ§ÊÑÌ ·üØê§Öº—„:‡Bd09WWôí^ëN8ƒÄNZ'èÀÖsŒ·ƒ¥ïsÇsëyk:镨*¨$’p¯“㋤F_´Z©#–Ýr=Æx¬KÆž$Õ•–óXºd~¼µ#Á \°ÃMnx&­7«I³Ì×Îà‘Ë:dœÔtQ]ÇÒ¥m®ØêRZ,üñ÷}>•JЏT•9sEê&“Üéa»‚à~íÆºx5(®V§Žöæ!…™±ïÏó®øãî½õ÷4+FžèéÒ­E\ªê×j>òŸø .ž#ýøéß¡ó‹^ƒ÷ã§~†–Úc§7jÏÔu;Lšöòp3µ›æ?Eê á†&Rvެöð1”šI\Šêe €Aê |íñ7@MÄÞt ²Þñ|ÕppÀ~‡þ^ï¥ø’Ë]šê;PãÉ#i~ ¯¨¹þ•柶 =,»Ì¯ßþŸ¥w¬ԽœÕ™ôU赇’š³Vg–iÚZœVŶ¡Ë9ôQÉÿƽçÀöÐ¥”²Æ¡B0…ûª ~¿¥xß„@[›¹1ó€ØŸþ°¯NðFª#ºšÂGKóÇžì:ËùW£^3†UV¥/‹¯¢ßüÏŒÇÆUܩǥ¿ÌÚñôÌ‘ið±Teó%Çñs€>œÒ¼öîÝ—¾Srãí$Àì;~b¹ã=Ç×ñ®—HÓ`²]–éË}æ<³}kέ’Ò«QU¨”"º$—üêÝÏs/É«s'ð¯ëúÔâu­bï^ÕgÔoX¥9!sµG`èP«:‚Æš•ÒÃ(Lá6ôÛ“ŒUj´’VGŸ;ó;»±„æ=*i³ß‰-Û¾FáùŽJº5 /?ñýç\rÄÔŽ3· Y-Â8ŽzV…¼‘ÅP}oG¶k±!ë¶5'õéúÖF¡ã ä ÙÐñæ7.~—õúÔ*•ªé÷ž²Ì)RÛ¿¡¥âÝN;[ìè›3̓&Ó÷‡Üÿ,× JÌÎìîÅ™ŽK’M%vS‡$lxx¼T±59ä • ‚A‚;RQZÆåž¾vˆïÈ?çªýáõëN&´»Á·¸‹tBpß‘æ¹ *W4~aÓ~ÍÞ'iö9ãi©cµž†¸Ø¯. ÿUs4|cär8§¶¥~êU¯nYOPeb?_·ÄíÌzT³ ÑÛ?‘d›îçHWù'è:ŸÂ°õoyð5­‚´q7+pÌ= ®q˜³bI'$žô•žZԕ¾kZ¤y#î ¢Š*0(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙÿØÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ€€"ÿÚ ?ùþŠ( Š( Š*ÏØ.?³~ß埳ùžVïö±šM¥¸œ”wej(¢˜ÂŠ( Ÿ2Nû"äk£Ð¼/öØRòô²Àܤc‚ÞçÐWUµ½œ~]¼)ú(ëõõ¯k’Ô¯:–/ï<ÌFgNœœ ®×Üp°øoR—–‰b²0 æ®'…%Çï.ÑN?… ÿ ë\Õw5îRÉp0ø“—«ÿ+/1¯-¬¿¯3ÿ„b n\žøP*9<7û—,>©Ÿë[ìj5Ô²¼¹«{?Åÿ™qÅ×þoÈáh¢Šüü÷‚Š(  -à’êâ8"’F £ÜׯZèòøq´r¢Ú¨oÏšãü¤y’¶£*ð¹H³ëÜÿOν.ÔmÅyY„¥&”zkó>O=Æ¿h©Ó¿?øƒÜÛKgu-´ë¶Xœ£¯¡zĭŶ|ëEWÄv5¥´——q[D2ò0Qþ5 wÒ~WÔ¥^[)Gnçú~šW9q˜•‡¢ê?—©×év1ÙZEoÂF¡G¿½lÀ1U¡LUØ–¹*Ñ»?=¯QɶÇÞéÐjÚeÅ…ÀýÜñ”Î2Tö#è@?…xõ”Úuüöw ¶h\£qéí_DÅÅy×Å=¹pøŠã |­ùqøZxX8·ÒáÜw±Ä<<ž“Û×þùgEWI÷G©ø*Eo [(<¡p}Žâ­uÕÆxPÚQœ¤Ìäõ®º6¯ˆµ(¯#à3([SÕ—QªejªS+U¼IåJ%¥j•Zª«TÊÕ„ñ&GÍôQEx‡ëe› )u èma<ŒqÐw?…{…œv–±[ĸŽ5 £é\—€ôI©J¿4¿$Yþèêü«»‰+Ñ¡‡jŸ3ê|†wŒö•}”væIÕ¸ÅD‹VTÊóS‘w«šV.«©CgÏ-ýÐ:š§]Ÿ€§Ómå¸k‹„Žñð¨$8:ð}Iíì+³ J5kFvGé˜ÚÒ£BS‚»G}gkµ¼pD»cB¨ô¯Æ´ÈÔä•a¾žtOΪM·v9V§ALU©ÐW<¨²dˆ*ÂT’$/#* êÌpgÜø«@°í½ +œªH‡à¹5ŒéF?±’¥R«µ8·è®jê|:¶—qap?w:'Ú{¨8?…|á«iÓiZœös¦Ù"r¤{ƒÛÚ½sPø³¢Ù‚,`¸¾“±Ç”Ÿ™çô¯+ñ½qâ=^]Fæ(¢wˆ`^§s\XšÔ]N÷wº·Nÿ&¿¯á¬.7)*°åƒï½ý75<ø¿¹\òcëÏÿ^»øÚ¼ÏÂw1Ûë`HqæÆc_®Aþ•éµ|Æ&«…Kg0k~鑪ej¨S«W3Äž ¢ZV©UªªµL­XOa(žEWѨCuqn1 ıŒçäsëÅ[þßÖè/ÿ/þ5ERœ–ÌÎT©ËYE?‘¥ÿ µÿACÿ_üj9u­VpÚì€rÜ1ÇæjÝI¾¬J…%ªŠû‡I$“9yÏVc’i´QPj•‚Š( Gº=3Æ–ac¹Qsã$áñõïø×9EgR”*+M\Ƶ u£ËQ\ôk_iR%ó¡=÷&Géš¼¾1Їü¿äÿâkÊè®)e”_Wý|6yN÷kçÿõfñ®…ä]³ŸE‰óúTn>#ØÇ‘me<Äwrçü«Í褲ª {¿ŸùXPȰ‰ëwêÿÊÁEW¤{!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPÿÙÿØÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ€€"ÿÚ ?ñYt“>\¨ÿ^+:ky­Ø c+žž†ºç5Vh…ÂùE ïà($×Üâ8w V/Ø7}ëüÿÌ¥ŒŸÛÔ娥a†#ÐÒWôӳ=0¢ŠP¥ˆ '°¤QV×K¾a‘k(ú®?#é·¨¹ki1ì3]U¯kò?¹‘íaÝh¥ ©ÁØÒW9aEPJb‚Iè,q´²,h2Ìp½uVšlv1JGÌÿÐ{W§–å“ÇMÙÚ+wþ^fñ¤µÜ‹I¹q¹öÆ?ÚëùT¿Ù*½f'踭§ªï_aG#Ë©«J<Ï»oô²8Ö*¤«-RÕ}–ÒFBqæµâx®÷Ã^ ·ÒgKËÇ[‹µå$gÔg©÷ý;×B­SÆÜוˆÌ'ÊâÆæõëÅÂ>ì_mþóæØ~ÍqíÞT¬›±Œà‘š‚¯kHÑkº‚:•u¹{ƧÐ4¯íKì8>DCt‡×Ð~?Ð×̪R­_ÙÃvÏÒ½¬aET“ÒÄšF. ¢y‰ŠÛ±y¾Ÿã]D6vÖI¶Þ%OR:Ÿ©«ì¡*€ VJúÌ=Ú*òêúÿÀ< ¸º•宋±µBÏK+bªI&;ÖðÌ5ܨBâ\ÃÊâXÕ»Ü} s÷ÚkÚåЗ‹×¸úÖÙ’¸ ƒ‚Pk\F ˜BÓV—G×çÜî£Rt¶Øåè«7¶ßfŸ ÷•ÿ ­_ ˆ¡<=YR¨¬ÑêÆJJè½£½¾ü`±ëƒ×ÖÊ:× ŽÑººœ2œƒèk¾ n-"ºŒe$@ØÞÕô9'–”鮎ÿ§èyYŠ´ã>ú$YêÜ•VA^§×u1ƒ=ÉZ¦Fæª+TèÜ×ÇWÄè~s(Ÿ<ø£þFÍcþ¿fÿÐÍu¾²ÚO¾lÈÇù~˜®oÆÀê¸~øŸÐWwgMµEû« ù ô²dYÕì¿3ôuWõ*)uKò ‘jœ£¦éU¤‹=¨Çb\ny”æb\qY³KƒÖº ôù&c1éUõùÎäK|Ÿ¾âÓÌáÚrKÔô©b(E~òIz˜~o½(’·Wá߈ü³·ÿ¿Â§_‡>"ÿžvÿ÷øWÖåù–OÞ/¼ÕãðKþ^Çï9KõÚ“ÝNEdW Þ|?×m´û›‰–ÙbŠ&wo8p Myõqq¨Ô­ ´šwZÛÈïÀâiW‹öRRK°W øe‹h–Ù9ûÃÿ5çÕè~ˆÅ£[)êT·æIþµçåU]*Î^_äa›ÛØ/_Ñš¯amqÌ‘ úŽ WZɲʤû‚?•h%YJúU¥=d‘ó^Þ¤>BµLÍUV©‘¹¯Î+ât>vQ7Ô•I ²?>¥Ÿç]–ƒ2ÝèR/8ˆ!çºü§ùW'ñ&Æ·ŽHĉ zlúµàMX$Òis7ðçûÝÇâ9ü­}&IˆJI?´—Þ}ÕzN®WJqÕÆ1†§`Ñæ›äçµ]1Ð#®œ}î|÷µ ‚VÕ¡Ú sT㊮¸¯–«€æ•ÎZóæFŒMÎqÉã5v7¬øªÜf½Åž]Dfø×PKê²9¼ PORÿ/ž ùÖ½/â·ˆVyàЭß+ó®þþ>Uü$ýG¥y¥tâä¹ùWCïøg ,>ž[ÍßåÓüþdÖ°5ÕÔP/W`¿OzôÛhÖ8ÕaTµr±Ý+Þ¸á~Dú÷?çÖ»H…rÒ®£6fÕ¹¦ ºce*ÅXJíúÙàM›ªÕ25UV¬wÅV¼×Ýc)ló¯÷G¹ü3_ *“«.H+¶y°¡R´Ô)«¶yÿÄ“Ÿ?ýqOå\œr<2¤±±GF ¬#¡«:ž¥q«j3_]6ée9>€vØ ©_Q†„©ÒŒ^é#ôœG RÝ$RðÇŠ ÕâKk·H¯‡< }Ç¿·åíÔëÁA ‚èk¦Ò|s«iª±ÊËyí6wìÝ<×½G1ŒãË]|ÿÌð±Ù›sÃ?—ù´‰Vk…¶ø›§œ}§O¹ùfÊüþ8§OñFÂ1þ‹§\Êqÿ-YSŸÃuTžëÌYN9¾_fÿó= 1\·‹üuo¡A%ƒ¤Ú™ã•‡Ý»íùûðZÇÄgSFŠ[(ðÀNâ=Û¯åŠå ,I$’y$×5\\"¹hý穀ᶤªbÿðúÿ’Yi^Y¼ŽÅ™ROSM¢Šó¯JÚ#»ðÈS¢ÃŒg-»ë¸ÿLWA®ÂúªZNm'm±ÊÀ£ŠßýzîÒ¼zÓ•*­>ºŸ'˜Ó•:Ò¿]IÒ¬%@•a)ýhòfyÆ£ã½jùY"•-##„a¿ï£Èü1\Ó3;bY‰É$ä“IEzT¨Ó¤­MXûÊ8zT©E ¢Š+S`¢Š(¢Š(¢Š(¢Š(®‡Hñ]Å‚,)çÀ¼œ2¯ƹê+:”¡UrÍ\ʵ u£ËQ]¡eâM*ì ·iá—ä#óâ¶¡‘$]Ѻºú©È¯¢¼éåiü3·ãþGW"„Ÿ¹6¾Wÿ ¢Š+Õ=ࢊ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ÿÙÿØÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ€€"ÿÚ ?ñ?C†÷S¶´–ðÛ¤ÒÌ¥7mÏã#ŒûÖö­ð¯Ätm-¿‘}ç1ÿ|‘ü‰¬V%NA Ž„W»øT]oÖ—ŒC;ǶQþØá¿QŸ¡¯±Î2¬%%”cÊžŽÍïÓ{Ÿ-›æXÌ%jm8½kú‰ól±I ­¨Ñȧ ®0A÷Ê÷ïxJËÄ–ŒY+ô_Ü܃ìÕ—jðk«ilîå¶ K”u=ˆ85òØŒ;¢û¦z™VmO0¦ÚV’Ý—‘R¢—uEêNsž¨*–8PIö©E³ÿi%²Â›Wñ>´ÖJ˜Þ{î½Þ†kE·½køoÃÃÄW“Y­âÛαù‘‡L‡ÁŒçƒÎz¦éV´-E´mzÎø,r3Œå úUZWJ^ÍûÖЊòªèËÙ;JÚz–õOkºZ—kasêöÇé€ß¥s„H#u¾¹ ò®7Å>µÖ#{‹tH/ÀÈp0$>þ=kÀÂæò¿.!|×ê|öˆÜ䡉Vó_ªþ½ ¢$o ¯ŠRDb¬¤`‚:Šm{çÖ'p¢ŠP ’z@² ï¾j»f½Ò\Œ8ûD|÷ ?-¿‘® ÅM£jM£ë–š‚Œˆd‡ªž~D×Üâ*¬E SëÓÔðqØo­agK­´õ[ñ)ÆkÀÖýA•5«»ˆž›…CEyí]Xû6®¬tÍBñÕøÍm£« cøŠâ=Åv࣠ŠËtxñ©gc1ãªÒGZU’:õ£†:iÔ=kÁ:Õ<)m¹‰šÛýLÿ³ÓÿÛúÖ¤ã¯>øi¨›mj}5Éòîã܃ýµçÿAÝù ïµk¨lmå–fÀD.G|I¯‚Ͳÿa‰”RÑê¾ðO‡Ì0ÎŽ:PŠÒZ¯Ÿü£Ç|oqø¢àÆÞªÌ®+«:…캎¡=äß~W,G ì?U«Ö¡ QƒèÐpÔåJŒ!-ÒH±ee5ýÒÁå$žŠ=Mw:n‡o§ Ø»åï#JOiBËOWuÄòÎ{A[É}6]…4§%ï~Gƒ˜cÜäáî¯Ä§„ìŽ “NÇ=ˆþ•«c é¶n+T2ã˜þ½? ´•f1]’ÄS¦½Ôx5±u¤¬äÌŸÁšƒ)ÁÂÀÈ þ†¼n½³Å–ÍuàýJ5ÎDBN™áX1ýx|Þ.·µªÙô\6ÓÃMuæýQEIM<ñŸyØ(ük™+Ÿ@Ý•ÙÚéé>ØÿÓ$þB­ù ã  Ôñ@GE2ÇXâ(8Ïš:3äçVòmí¦BÿÞ_¡¦?4’cÛ°‘Tégõìt•FfñSŽÌΰÐí¬îc¹‹Ìó£;‘ËœƒøS¼];[øjáÙ‰’vX÷1É99?^­¸bäVÄŠøbK´ÏýðõÌ•Zõ”ëIÉ®æT+:غ|îú£ÌjÞ™Üê–ж6´ƒp=Çz©ZžeM~аÈÜGâT^¬>%sìkÉÆ”šè™é1­YD¨ãe}:º 9 «QÕxêÊWW¡Å2ÒÆ“DñJ¡£u*Ê{ƒÁàz¥„š^©uc.wA!Lú€x?ˆÁükßb8¯5øŸ¥y:•¶©ü· åÈ@þ5韨ÿÐkʧ‰N¿+êzÜ=‰öx—Eí%ø¯ø8é<%¦™îšõÔùq|©îÇüóÏEÍ2EË»QêMz¥„vq[D>TÏ©îú¿ ídê=£ùŸEšb½.E¼¿!Du"ÇSêUޝBìùyT#HêtŽž±Õˆã¯:XsžuCJ£ã wàÛðƒ/‰‡ÑH'ÿÍlD•¡ÍÃ*†ŽE(ê{ƒÁC©È±.XÕ_e§÷7T¶³›k¸g^±¸Èæ¬ë:lš>³w§Ë’Öò”ÿìƒøÕ–šgé‘”jAIjšüì6Ò$Ñ$‘°du ¤w®%q> ÖU¢lî¯0“üC¸úåô®Ù wÒ¯t|>3*\ô‰Ò¬!ªëS¡¯©‰Ðó¦ZCX/àË“(Ñã1g³nø jÜC^gãÿG©Nše¤… ·reaÑߦ¨þuˆS¯‰/Gwò:²¬4ëc ã´]ßËüö9->e·Ô­f»Èçè5ëëï^/^‹àÿÇ{i×O‹¨Æ#f?ëQþ{×èyF"1r£.»Káç8*±é¿¡Ó¬u*¥H¤T¯J­äå1ˆ•e„J¸¥@ÂsUøªñ­ZVH£i$eD@Y™Ž©&¦4:®ç‘üZ¶ŠÛÍ@óÚ+HRÁ™rü¸*è|k¯/ˆ|K=ÜYûãP—d)>óž‹õ¨í-žòî+xþô§©¯C²°ŠÊÙ ‰pª9=Éõ5† íå®ÃÆãYnÌ+ ÛD¹šVúí¥Zþ˳Amâ ÿ:Úhê´©ŠúÌ.Š^ìQã}n¤ß½#m2Íó›tîŒ*̸ÑcäÃ!SèÜŠèeJJê©”aê¯z ò:èר¶g-=¼–ï¶EÇ¡ìj*èæ êUÀ*{ź¶òrò‡ô¯˜Ì²yáW´†±üQêQ¯Ï£Ü­EWˆtßÕ¸– AVc¯«öÇæ•vŒUè¤â³£5f6®zµ.pTÍ’¼›âÆ‹­õ¦«nІërLª0 ŽC}H'?Ozõjâ¾+¶|)kÿ_©ÿ =y‰ÙIRÌ)òõÑž{ᚤ’—RÃ5Ý*W àéÄz³ÄÄ63r–k¿E®Ì¾j0>“7mb5숞0± 2I®PñD’LËhcn§Þ½D®¥X¤`ƒÞ¼·]Ñ'Ñoš7R`rL2vaéõë³1ÅWì›K­·ò ¥Q©QƦý?QW^¸'çn+øîWÓÖ¹êUfF §W9Äáj')9Gªnÿuö=ùai¿…Xémìîõü›;ig“û±¡l}}iIàO´ÛJb…s53ùnÎk×ô‹[3K‚ U„ mÀrùÜ{äÕÏ75îc³©IµN —Ï©ðõ¸’²¨Á$»ÞÿƒV>c»´žÆîKk˜ž)£8duÁ…A^ñzÍTÓ¯”ÓÄñ¶;ì ƒÿþ•çñÒi·ecírüWÖðЯk_óÙžè•a*ºTé^¯¶??™e N†«)©”Ös¬sIÑ«Ï>+êZéúr¶K;NãÓjÿ6ü«»–â+[y'žAQ©gfè¯ ñ&´úö¹=ó FNÈ—û¨:~=Ϲ¯>¤ù™ìpö ÕÅûV½Ø~}?Ì¡gtöWÜÇ÷£`Øõö¯VÓ´Šæg¯Ocï^E[^ñº=ÆÇËÚ9ùÓºûçWF«¦Ï©ÌðOh|Kñ=M,öv÷Öíou ËuV ¥Ô7p$öò¬‘°Èe:\ЗfŽVëáÍÖ´¼–ØáeóýAýj}3á­…½ÂË}y%Ú)ÈSËSõä’>˜®­ N­Y¸Ð½ùM'šãy9=£·Êÿ~æ‚KÀ€:RªJÔ\ÞÃci-ÕÌ‚8b]ÌÄôz×£‡§‡¦©ÒVH(¢Šfåí7W½Òf2ZLW?y*ßQ]®›ãëIKøàoO~¸ê?ZóÊ)©5±Å‰Ëèbu¨µî·=šßÄš4ɹu;P?Û!üŽ*ëël uHÉèeýkÃ(ªö’<©pí&ô›±ë·þ>Ñlù2µÜ£¢D¤Å–kϵÿê “·•l§)n‡åÔúšÃ¢¡¶÷;ðyN ùâ¯.ì(¢ŠL(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙ€JaPaVaB€C€D \aE ŒaS¼a[>ÂadÿÿÿÞÜÇ—>&É-„6*?ÏFBOôXÖþëЧ‹»¦¥s² xÿØÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÙà  à  à €eeeB€C€D eE PeS€e[>†eÄgÿÿÿÞÜÇ—>&É-„6*?ÏFBOôXÖþëЧ‹»¦¥s² xÿØÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÙà  à  à €ÒhØhÞhB€C€D ähE iSDi[>JiˆkÿÿÿÞÜÇ—>&É-„6*?ÏFBOôXÖþëЧ‹»¦¥s² xÿØÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÙà  à  à tiff-4.0.3/test/images/palette-1c-4b.tiff0000644000212300117540000003004211244340171014723 00000000000000MM*.¢iyˆ™™ˆ™˜™–‰i™þ™–fiùÎéîéîîžœ©ùÎÉÉÎÌœ™É™™ÎÌßýŸïÝþï!?þÿw–˜c™†g"UDD»ÿ¯Ú—sr#óO?úªª w‡—–‰wxx–™‡–f}î÷fjCÎîîîîîÎì̪­É—‰ˆ—œœ™y:»îîÞîîÞîî"­üÛwwvvbwwsJ«»»»¼»·™—3?DDª«» ‰y—y‡™™w–i‰y–sÍíÇz3ÌÍîîîîîÌÊ»¾˜fh†hˆˆˆ‰¾¾îîîîîÞîï=ê´Oú§fgxw¥ª«»»»ÛÛº™r34DJªºº°g‡xvwˆ‡‰™yy†y–zÍݺ£ÍîîîîîìÊ«»×ˆˆˆˆˆˆˆˆ‰œëîîîîîîîçs¾í»»úªófgUJª»»»»»»Ú÷r#5TJ«ºª y˜——Ì™xxv™y™—‰‡\½ÛzÍÎÎîîî쪫¼ˆˆhˆhˆˆˆˆˆˆ›îîîîîííÇu¾Þíô»Kû1ZJª«»»»½½Ë§r*TD»»ºª yÌÇÌÌÌLJig–wˆwˆgzº3ÌìÌ™†y—­Ü†ˆˆˆˆˆˆ‰ˆˆˆ‡‡ÎîîîîÝÊ%U®íë«¿»»µZ¤ª»»»»»»Ûµ!uDKº´»º@|ÌÌÌÌÌ̘fffvgvg†g"u½Éˆˆˆˆh™˜†ˆhhhˆˆˆ‰‰ˆˆˆ‰îîîí»¢'Z»ë´ýû»Û»¥DJª«»»»»Û½²:DD´K¤´ ÌÌÌÌÌÌÌÈggvfffffff'œ˜ˆˆˆˆˆ†††ˆhˆˆˆˆˆˆˆˆ˜‰ˆžîîÝ»¢"ZJ»´Ý»½ÝÛºZªªªº»»»»»¢DDDKD¤ZP|ÌÌÌÌÌÌÉfgÅU'wfffwùˆˆˆˆˆˆˆhˆˆ†ˆˆˆˆˆˆˆˆˆ‡ˆˆ›íÊÅs!+ZZ½¾ÝKîÝ»¥J¤ªª»»»»´RDDDDKD¤ \ÌÌÌîîÌÌgªUD¥'ffwc˜ˆˆˆˆˆˆˆˆ†ˆˆˆhˆˆˆˆˆ‰ˆˆˆˆ‰ÌÊwS"[[º½Ýí¿î¤¤ªª»»»´ôPDDTDDDJ@ÌÌÌÎîîÌÇfuUTªD¥qf9˜ˆˆˆˆˆˆh†hhˆˆˆˆˆˆˆˆ˜‡ˆˆˆx‰r¥RZZº«îÝÝîî»»Tªª»»»»»´P%DDEDDJºPÌÌÌÌμÌÈz¥¤ªºª§©†ˆˆˆˆˆˆ†ˆ†ˆhˆˆˆxhˆ˜ˆˆ‡ˆ˜ˆˆ`+¥r*¥ªªíÝÞîîÝ»Jªª»»Û¿»D $DDODKJK ÌÌÌÌîîÌ‘UZJ´Kº´˜ˆˆˆˆˆˆhˆhˆhˆˆhˆˆhˆˆˆˆ‡ˆxˆˆ‡ªRWuU«º½ÝîîíÛ»ªªª»»»»KEUDDÿôD¤« ÌÌÌÌîîÌzZJªK¿ª¤j˜ˆˆˆˆˆˆˆ†ˆhˆhhˆ†ˆˆhˆˆˆˆˆˆˆ‰ˆzwwW\«»ÛÞîîݽ۵ª»»»»»´ETDDOôDZJ ÌÌÌÌÎì̆Z¤D´´ýºEŸÈˆ†ˆˆˆˆˆˆg¯˜ˆhˆˆ‰††ˆˆ‰ˆˆˆxhˆˆ‡ww̪¿½îîÝÝ»»ªK»»¿»DEPDDD´´D¤º |ÌÌÌÌÌɇ¥Z´K¿íµR?˜ˆˆˆˆˆhhˆ…­øˆˆˆˆ‰ˆˆˆˆˆˆˆx†ˆ‡ˆˆ—uZª»ÝÞíݽ»»ºº»»»»KU DDDDDDK« ÌËÌÌÌ̆uZZ´´ýîÕ ª˜ˆˆˆˆˆ†ˆ‰¤íˆ†ˆi‰ˆˆh‰ˆˆˆ‰hˆxˆxˆ‰œUª»û»»»Û½»»»»»»´DPDDDK´DJK@*ZÌÌ̘fzU[KKîíC£ˆˆˆˆˆ†hˆ‡MÚˆˆ†hˆˆˆˆ†ˆˆˆˆˆ–ˆˆˆˆˆˆÌ«»»»»Û۽뻻»»»´UDDDDDD´ª°%UU»ÌvUUª´þîÓ!?˜ˆˆˆˆ†hˆˆ”N׈ˆˆ†ˆˆhh†‰ˆˆˆˆˆˆˆˆˆˆˆˆÌ»»»»»»Û½»»»»»E DDDDKDJª@%ZZZÌa¥EªOîïR–hˆˆˆˆˆˆˆˆôÞ¨hˆˆˆh†ˆˆˆ†ˆ–˜ˆ‰˜‰ˆ‡ˆˆˆŒ´»»«»½»»»»»»ºBDDDDD´J«°UZJ¤Êq*U¤KDMByf‰ˆˆ†ˆˆ†h‰[Û–ˆˆˆˆˆˆ†ˆˆˆˆ‰ˆˆˆ‰ˆˆ‰ˆˆˆ‰»«º»»»»Û»»»»»P$DDDDDJ» U¥ZªªRUU¤DûU!††˜ˆˆˆ††ˆˆ“]úˆhˆˆˆˆhˆˆhˆhˆ‰˜˜ˆˆˆˆˆˆˆˆ|«ªª»»»»»»»»»P$DDDDKª«°TZJ««µUZTýûRˆˆ˜ˆˆˆˆf†f?­¸hˆˆˆ‰˜hˆ˜ˆ†˜ˆˆ‰ˆ‰ˆ˜ˆˆ‰ˆˆˆ»«º»»»»»»»»¿DDDTDJ»°UZ¤ªªµUDKíE ˜†ˆ˜ˆˆˆhˆhƒ4Ûxˆhˆˆˆˆˆˆhˆ‰†ˆˆˆˆˆ˜ˆˆˆˆ‰ˆ‡Ê««»»»»»»½»»"UDDDUºD«°UTªªªªUOîÕ ˜ˆˆˆˆˆˆˆˆ†“4Û–†ˆˆˆˆˆˆˆˆ‰ˆˆˆˆˆ˜ˆˆˆˆ‰˜ˆˆˆœÌº«»»»½»UUDUUDDDDDDDK»°UZDJªDUýíR™ˆˆˆˆˆˆhhhô­·ˆˆˆhˆˆˆˆˆ˜ˆ˜˜ˆ‰ˆˆ‰˜‰‰ˆˆˆ‰ˆ‰Ë«¤»»»»U"%DDD%TDDDDDDDKK°UTZªªEUKÕ ˆ†ˆhhˆˆ††i4û©ˆˆˆˆˆˆˆˆˆˆˆ˜‰ˆˆ‰ˆ‰ˆˆˆ‰ˆˆ‰˜ˆ‰º¤K»DER"UDDÿDUDôODôDDKK°UUDZµ¥UEQ™ˆˆˆˆˆˆˆˆˆƒ:ݨˆhˆˆˆˆˆ‰ˆˆˆˆˆ‰ˆˆˆˆˆˆ˜ˆˆ˜ˆ‰‰˜Ìª»´UU%UUDDKOEDDKôOôôD»@UUE¤¥B"ˆˆˆhˆhˆh††„JÛ¨ˆˆˆˆˆˆˆ˜˜‰ˆ‰ˆˆˆˆ‰ˆ˜ˆ˜ˆˆˆ‰ˆˆˆŒJ¥""UUUODKôDDôÿÿÿDOD»@TUJ¤¥RÙˆˆˆˆ†ˆhˆˆh”Dݘ‰ˆˆˆˆˆ‰™˜ˆˆˆ˜‰‰ˆˆ˜ˆ‰ˆ‰ˆˆˆ‰˜ˆˆµU"UR%UDOôôôOÿÿßßÿôDD@UUUUU +Ùˆˆˆˆˆˆh††ˆT­Û˜ˆˆˆˆˆˆ‰™éˆˆ‰ˆˆˆˆˆˆˆ‰ˆˆˆˆˆˆˆˆˆ‚RUTTDDO¿OOÿþÝÿÿOOD°UUªEU˧hˆh††ˆˆˆˆjT­ß–˜ˆˆˆˆˆ‰™žˆˆˆˆˆˆ‰ˆ˜ˆˆ˜˜ˆ˜™ˆˆˆˆ‡"PUUDDôôOôôÿÿîÝÿÿÿ¿@UUÞµ ªGˆˆ†ˆhh†ˆhŠJ½Ýy˜ˆˆˆˆˆˆˆŽ˜hˆˆˆˆˆ‰˜ˆ˜‰ˆ‰™™˜ˆ˜ˆˆ€r%UUôDû¿ûôÿßßÝßÞÿÿ°%UîUQ*Ú£†hˆˆˆˆˆh‰4ôÝݨ‰†ˆˆˆ‰ˆˆ‰™ˆˆˆ˜ˆˆˆˆˆ™é˜™™î™ˆ™ˆˆb!"UTDOôû¿¿ýýÿÿýîîÿðË»»Ì«ÊW­ª§hˆ††hhˆ†ƒD¤ÝíȈ†ˆˆˆˆˆˆˆ™h†ˆˆ‰ˆˆˆˆžîÉžžé™‰é˜ˆ†"TTDDOÿßÿÿÝßÿÿîîô°¬»ÌÌ»ËÊvªªZhˆˆˆˆˆf†44ª½í؆ˆˆˆˆˆ‰ˆˆŽ˜ˆˆˆˆ‰ˆˆˆŽîîžîəˆˆ%UDDO¿ýÝûÿïÿDÿîîÿ°ÌÌ˾»¼Êwaºµª–†ˆ†ˆhg0DDª½í׆ˆˆˆˆˆ‰˜ˆ‰˜ˆˆ‰ˆ‰ˆˆ˜Žîîîî‰a%UTDKÿþÝßÿÝÿDýîÝÿ@ÌÌλ̼ÅWqªªU6h†ˆfv15%DMÛ¿§†ˆˆˆˆˆ™™ˆ™h†ˆˆˆˆˆ˜Žîîîîîȉ™™ˆ‰`%UTDôÿïîÿý¿ÿDÿÞôD@[¼Î̼ÌÅw_ª¥U©ˆˆˆi#3ETTDMßMº†ˆˆˆˆˆ‰éˆ™ˆˆˆ‰˜ˆ‰ˆžîîîî™˜ˆˆ%UDDÿýîíÿûÿÿÿOÿUD@Ì»ÌÌËÊÂwa[´¥Zºfˆh3úDEDTÝ­MÚø†ˆˆˆ‰‰™ˆ™hhˆˆˆˆˆ‰™îîžîˆ‰ˆˆUUTOOýîíß´ûÿÿõ2TD@Îë̼ÌÌWq[¤¥Tªfhlº¥ZD5ªU½½ßÚ»ˆˆˆˆ‰‰é˜‰ˆhˆˆˆ˜˜‰œîî™î阘ˆˆˆ‰†"U¥KOýîîßô¿ôýR5_D@Ë̾ËËÌw«ªET«ÆˆúUUJ¥\¥Þ½ë½»Çˆˆˆˆ™é˜ˆˆˆˆ‰ˆˆˆ™Ìîîžì™™ˆˆˆˆˆ–rUDDôýîîß¿ODU#5DO@Ìì¾ÌÌÅq«ªDªªÆhý¥UZªªªZ»ÛÛÛºÉhˆˆˆ™î˜ˆˆˆˆˆˆ‰˜‰žîé‰É™‰˜ˆ™ˆˆ–bTDOÿÞîîßôDER#TDOðËÌ̼ËÇ¿¯¤JªÌgúªuZªÊ¬ª»Ì¬Ë¼Ìhˆˆ˜žî鈈†ˆˆˆˆˆ‰œ™™™‰‰‰ˆˆ™˜‰ˆr"UDDKÝîîßôôR"4ODD@Í˼¼ÇvºúJúª¼|ãU¬¬ËÌ»¼»¼»¼»ˆˆˆ˜žî阈†hˆˆˆˆ™™™‰‰ˆˆ‰ˆˆžé‰˜"U¤DÿþîîÿO´2#MïDO@¬ËÌÌRº¤ªªª«Åúªªªª¬Ê»»»îìÜÎxˆˆˆžî阈hˆxˆ‰ˆˆ‰‰‰™‰ˆ˜ˆˆî쉘'UDOOÞîîÿûô"MÞïDDð%Ì\\Wú£JªªÌÌúªZª¬Ë¼½¼¾îî¼»˜‰ˆ‰žîhˆh‡ˆ˜ˆ˜˜™ˆˆ‰ˆˆ‰Î쌘"TDôÿþîîßOó%þîõDOð%UUUU¥!Êôªª¬ÌU:£¥ª¼Ì»Û¼¾îîîˈˆˆˆžî†hˆˆˆˆˆ˜ˆˆˆˆˆˆˆ‰îî™–uUDÿÿÿþîïÿBOîäUOô@%UUUUTU Ê£JUÊÊW¯¤ªªËÌ»½Ë¾îí¼Ì™ˆˆ‰žîî興ˆhˆ‰h‰˜™ˆˆˆˆˆˆ™îî™–5DOÿÿÞîýÿZÝï3DDD@UUUUUEU ªª:ŬªÅªúJª«»»í»¾íۼ̈ˆ‰ˆ™îhi––ˆˆˆˆˆˆ˜‰ˆˆˆžîéˆb5UDOÿþîïõ«îÓ5DDÿð%TUUUDU Å£ú\ŬW:ªªª¼»ÞÛ»»ë»ÌÌxˆˆˆžîî舆†hh†ˆˆˆ‰˜ˆˆˆˆˆžîéˆb%UTOOþÞßDÞîS5DOôð%MEUTTUº:ªZ\¥¥:ªª«¼ËÛ½¼Ë̼Ì̘ˆˆ‰™žî舆f–†iˆ‰˜ˆ‰˜ˆˆˆˆî`a#3TDôýÝïKÞï5UDDð"UôEUU ¬ªZZUu§ZªªªË»»»»¼Ì̼̖ˆˆˆ™žž™ˆˆfhhh†‡ˆˆ‰ˆˆˆˆ™î™ˆˆ`!"3UTDÿýÔ«îä"#UOOð%OUUP5:SWUUZuªJª«¼»»»ÌÌË¼ÌÆˆˆˆ‰˜™™˜ˆvg†fxˆˆxˆˆˆˆˆîˆ"5UEDÿ$­îïÿõ5DDð%RUR" ZWUUUWU¥¥¥J¬¼Ë»»¼ÌË¼ËÆˆˆ‰™™™˜˜ˆ†iŸÚhhˆˆ‰˜˜ˆ™î예ˆ!!!5#D­îîÝíôDOð ªZUWvzª¥ªª«ËË»»»»Ì»ÌÆhˆˆˆ‰™™‰‰™úýí×hxhˆˆˆ‰™žé˜ˆˆ ´r?ÛÝîîÝÿßDDð '&©fazZ¥\Zª¼¼»»ëìÌÌ̦fˆˆˆ˜ˆ‰‰‰35Míêhhxˆˆ‰‰žî™˜ˆ†˻˻»ÝîíÝÞîôôð "v™ffaZ¥\ªª«ª»«îëÌ̼Ìvˆˆˆˆˆ‰˜˜ˆ#3_ÝÝvˆˆ˜˜ˆ˜žÌ™ˆˆ…òËÜÛ«»ÞîíÝîîïT@)fag†aa¤UŪ¥«ºË¼»ë˼ÌËÆhˆˆˆˆˆ˜‰˜‚"5þÞvxˆˆˆ˜‰™œ˜ˆˆz²|ÌͻۻëîÝÞîîï4@"*–ff™†fªÌZZªª«¼»î¼ÌÌÌÌvfˆˆˆ‰ˆ‰ˆ˜‰5ýݶhˆˆ˜‰™œ™˜ˆˆ{ðÌÌËîíë¾¾îîîîß4@*Wqùfah–aa¤Uª¥ªªºË»»ìÌÌÌÌÆhhhˆˆˆ‰™ˆ˜†TMÝ×fˆˆˆ‰‰˜˜ˆˆˆ²ÌÌ˾ÞÛÞíîîîîîU@u|Å"|™aivfaaªªZ\ªª««»ëÌÌÌˈhhhˆˆˆˆˆ‰ˆ‡DKíêgxˆˆˆˆˆˆ˜†UÌÌÌîí¾Þîîîîîï5@|¥Wy™ffffffDªU¥Å«ªËË»ÌÌÌÌÌvfhˆˆˆˆ˜ˆ˜˜gUOíÞffˆ‡ˆ‰ˆˆˆˆ`0Ì̾ë¾îîîîîîîï%P|ªÇy—faf†faaªºª\\ªª»»ÌÌÌ̼¼aff†ˆˆˆˆ™ˆˆ4TÞþvgfˆˆˆˆˆ‰˜"!ÌÌÌ»ëëîîîîîîïP|zy™†aaffaª«µZªªª»Ë¼ÌÌËËÊaffˆhˆˆ˜ˆˆysTTþþ¦ffv—˜‡ˆˆ€%DEU ÌÌÌ»¾»ëîîîîîä#PzÊy÷†ffaffffaa¯ªªÊZª¬ËËËÌÌÌ»Ìgf‰ˆˆˆˆiTªDDý½áfbw§u«Ì†ªª¤EUzŬ»»¾Îëîîîîâ0zw™˜ffffaaajººªª¥\ª»Ì¼Ë¼Ì¼¼ffffhhˆf3K´¥DýÝã"wruª«º¥¤¤¤U ¬ªÊ˼˾¾îîîîà ziù†ffaffafa*Mªªªªª«Ë¼Ì̼¼»Êffffffai:DOÕDMÛê!"3'zªJ«Õ%ZJK¤¥S||¬«¼ë¼ëîîîîÐw—™fffffffzªºªªªª¬ËÌÌËËÌ˼aaaa3¤D»ôDKßÝ""'"uJ´¤¿EZ«D´DE*zʬËË»¾Îîîî0py™˜faaffaZ«ªªªªª«»Ë¼ÌÌÌ»·ff:¯DÿõDOÝÞQ"2"UJKûûºT¤´´»E *ªz¬¼»¼»î¾îî¼pyyffffaaaaaaZÚúªªªª¼Ì̼ÌÌ˼²#ww}£O¿ÿôDDßÞ²""%UDD¿¯¿´D»ÿßDPªªªËÌ»ËÌì»Ì®É`y©ffaafffafaf¯­»JªÊ¬»Ì»ì¼ÌËË·ab33ó3ªDD¿ÔTT½Ýå%¡'%DûûÝûûK«ÝÝô@'zªÌ¬Ì˼¼ÌÌÙ†`i–ffaffffZ´´«ª«¬»Ë¼ÌÌÌÌ˦aTDDOó2$0O´TT½Þä+³"UTªû»ºJ´»Þîïó39zª:šùÌÇ|̆h`y˜ffaaafafaab«ººªªª»ËËËÌÌ̼»¡%DDôKôC@%DDDD½ÝíT5S%J¯ºDZªDKÞîïE:£9ª£ÇwÌȈ†`yˆffffffaffª¿«ªªº¼¼¼¼ÌÌËÌ»qaTDODôOO1""UOD¿íí´¤%DôWuªDDýîíE3ss7w6v™™ˆ†h`iffafffffffª«ªªª«»ÌËÌÌÌÌ̺!DD¿¿KôßòDDDÿÞíÕ%¤UDBw|¤´ôûîïD'7wrgcg‡fffˆ`hhffffffaffffªÛ«¬º¬¼»Ë¼ÌÌÌ̵TDDôûÿýýâD´DûÞîÛB´"ZQqruªDûKýíÿbswv6fg†fhˆ†€hffffaaaffaªJªª¬ËËÌ̼ÌÌÌÌCTDOO¯¿ÿÞòó DDD¿ÞîÛÕTOEgrUZ´´ô´îD0aqaa†fhhˆˆ`f†††fafffffgªºªªÊ¬ÌÌμÌÌÌË@UDKKÚ»ÝÔ]ÿ DKDKÞíÝÔ[DR"%Tª¿K¿K¿ô&&fffhˆˆˆ€hhf†fffffffeªªºªª»¼ÌÌÌÌÌÌË DDDD¤O¯A½D"Dû¿»½Ý½ÛT´J"RUDD¿»¿»D0affh††hˆ€ffhf†ffffffafgªªªª¬¼¼Ì¼ÌÌÌÌË DDDDKK´ß :¿ÒT´Kû½í½D»ú²""UUJKKû¿KD fffˆhˆˆˆf†††h†ffffffacªÚ«««Ë»Ì̼ÌÌÌÌDûDôDKû½óTJûEK½ý½óU½µ%UUZKK¿¿û¿Effhfˆhˆˆ€ffh†hffffffffJ«ªªÊ¼ËËËÌÌÌ̵TD´ôDDOJôº2#S4Û¿Ýß½EMÕU""UªK¿¿ÿÝ¿Efh†h††ˆˆ€hfff†hffffaaw«ºº«ªË¼ÌÌÌÌÌ̵D´ÿ´DDDTUTª¤¤TôDTK¿E«S[R"UDTDO»ÝßûEfffhhˆˆˆˆffff†ffffa%¬ªªª¼ËÌÌÌ̼̻¡D´´Dô¿DDDDDODJôOE%5SKDKKKDJD´ÝÝßûµfff†ˆˆ†ˆ‰ffff†ffffafazªº¬ÊºËÌË»Ì˼ºPO¿ôDDDDDDDôDDDOK½ #UDKDô´K´¿û¿Þí¿ôfff†hˆˆˆˆ‰fafffffafawªº¬ª««ÌÌÌ̼˪ DôDDDDDDODDDOO¤OJõ5UDO´´ôÿKDKûÝÝÿDffff†iˆˆˆžàffffffffffaz»ªª«ÌÌÌË»¼¼¼¥O¤DDDôDDDDôôOKO¿ÿô#UUDDDû¿ÿ¿û¿¿ÝÝÝ´ff––hhˆˆˆîàffffffffaz«ªºÊ˼ÌË»Ì˺U%DôDDDDEôõTDDOôDýßÿóUDDôO»ÿÞþîß»ÝÝÝôfffffˆˆˆˆ‰îàfffffffa\ººªª¼»Ì̼̼ÊR%DT4DOCóTôôôDDDOÝîÿC3TDD´ÿÝîîîíÿýÝýû aafhˆ†ˆˆ‰Žîàfffaffff¥«Êʬ¼¼ÌË»ËËÊ"#DTDDDOCEDôôDOOÿîîîóUTDD¿¿ÞîîîíûÝÛ¿´ffiˆˆ†ˆ‰žîàffaffaa¥ªªºº¼Ë˼»ÌÊ¥!#44DôDCÿÿ_ODôDOÿîîîó5UDDOûÝîîîï¯ýßß´ ffh†ˆˆ‰žîàffffafaaa!Z«ª¬«¼¼Ì˾ÌÊ¥1#UDODCôDT__ôDDÿýîîîóUUTTDÿÝîîï¿»û¿¿K0fafch–ˆˆˆ™îîàffff#!z«¬Ê¬¼ËÌ»»¼ª3!%5CCOOóó?ôDODDOÝýîîÿ%%UTDOÿÝîïÿû»ûû´6fffˆˆˆˆ™îîffffb!!ªªªª¼ËÌÌ˼˪3 %UODOD4DCõõDDÿÿýíÝÞÿ%UUTDOÿ¿Ýÿ»´¿ûûôfffˆˆˆˆˆžîîffffa!!Z«ÊÌ«¼¼Ë¼»¼ª3!35CôôDõóO__DDDOÿÿýþÿ"UUUDDDôÿÿûÿ»´´´f–hˆˆˆˆžî™€fff!"!z¬ª¬»Ë»Ì»«ÌZu!"3TO??C?C__TDDôôOûÿôR%RUEDDDôûúûK´»ôffi‰ˆˆ™žî˜€fffawR%R*\ʬ¬¬¼Ë»¬ËªÅU#UTCDôÿE?DDUDÿOOûÿÿô%RUUTDDDOO¿´¯KôEaffh†ˆˆ‰žéˆ€fff!R%ª¬Êʬ¼¼Ë»ÊÅZW "S5??ó4óóDDUDDOKJúOóRUUUUEDDû´K´KDOµfiiˆˆˆ™é鈀aaqB%¬º¬«ËË˼ºÊÌ¥u"3333?4Dõ5ó5DDDODD¤ERR%UUUDDD¿¿K¤¿´Bfff††hˆ™ž™˜€arU"*«¬¬¬¼Ë˼ª¼¥§2#33333SS55U5DDô´DDOCR"U%UUTDDKKôK´KEafaf–iˆˆ™ééˆfffa%!uR!ZZºÊ«Ë¼»ºªºÊª¢!#3"#3333S5UEDDDôDDUUUUUUUDDKKô´DKô@ffiˆˆˆ‰ž˜ˆ`ffa"!#2'\¬ÊªÌ¬¼¼»Ëªª:¢#2"r#3#33%5UD¤ôD´DURUU%UUTJD´D´´´K@fffihˆ˜™™˜™`ffffa!!#7Ru[ªÊ«ËË˪«ºÅ¥§#5""#"333SUUDDDDDDSURUUUUETDD´DDOD@fi–†ˆ‰™™™f`ff!%uRªÊʬ¬¼¼ËÊÊÊÅzW33""3w2#333UUôDJD45"URUUUJTDK´´´KKPcffhhˆˆ‰™ˆˆ`aaf'UrW¥Z¬ª¼ËË»ªªªÌ¥W'33's3r#335UUTO?¤£3UUUUUUTZDDDDDDOPff––ˆˆˆ‰ˆ‰†`aa!\ZÊʼ˻̺̬¥§¢"#32372s:Z#UUDT¤úD2"%UUUUTDDDDDDôDPfffif†hˆˆ‰–†`q!Å̬¬¬¼Ë»ª\ªªª2!"32'3r"3W3S%DDDD33U%UUU%TEDDD´´Kô ffhhˆh†ˆ‰f`faªª«¬ËË»¼Ê¼ªª¥¡"#3*w7'5W335DDD£3""UUUUUUUTTDDDDD fai–††hˆˆ†f`aa¥¬Êʬ¼Ì»ªªÊªª¡!#3733#SU5"34DJ:£"%RUU%UUZ¥KDO´ú fffhi‰†hhf`f!¥ª¬«»¼¼ËººÊªUr"53s7"US733CCJ£3rU"%"U%UUETDD´ûôiff†ˆfh‰ff`a!\ªº¬ËË˼ª¬Êʪq""7373"7:SR33¤:Z7"""R%%UUUU¤D´´KD cff–fhˆ†f–faqJÊʬË˼«ª¬¼ªªq#2#w23:3¢#5ZZZ7""%R"%%UU¤EKDôKKPiffiif–fca0&ga¥\¬¬»¼»»¬«ÊªZ 1"2'37"3:Ss2u£££'""UURUUUZZDKKûô f–ffiffff`braa*¥Ê¬¬¼Ì̺«¼Ëʪ!3"2ss7'33W3%UCJ3""%RRUu%5ZJKKDD¯ ififfffff`wvaaZZªª«Ë»»»«»¼ª§r53ss"w:53#%4££"""UUUUU¤UEDDKôD1ffifaff'!zªªªÊËË»»»»Êª¤1"#ssr!#3u2%5¤:C""RUUUZUUJJZ´´´» !6cf`'qqaaZ¥¬Ê¬º¼Ëº«»¼ª§"2773r"**2"7C¥£""%%%U:E¥UDDDôDDb1c6fffc`"rrbª¥ªÊ»¼Ë»º¬»Ìª¢1""'37""3uW"%3£2"%%R55U¥D¤DE«D´´11fffcffwqvwaªªªªÊ¼¼¼Ê˼ºº¡"##s3b"sSS""::7r""3UUZDDDJJ¤KOD?6affc`www—xvwwgve«Z\¬Ê¬»¼ºË¼Ëªp1"'ss"#332%*3r"%%UUªZJ¤JKKDDEffcff1`|Çwwwwvqfeª¥ÊŬ¼¼Ëº¼»«Ê c"37""#:7"%3Z2r"%RUUUUEDDDDK´µcffffff`|ÌÇÇwwvvgq%ZUʺ¬»Ë»»»¼Ëª&"&72"733r2'5S2"""%RUUDDDDDKD´ðfffifca60¬ÌÌÌÇwwgvfzª¬\ª¬Ë»ºÊ¼¼¼·#'s'#3US%5*S'!""%UUTEDDDª´D@1f6fffff`ÌÌÌÇÇwwwaz¬\ªªÊ¼»»»»Ë»¢c"cr"'3Z#23S3r''""%UUUDEUZ¤ªJPfcffffaf`ÌÌÌÌÅÌwwvguUZª¬Ë¼¼¼»Ë¼Ë¡"37"3333SSZ¢"""'"%ZTJZJª¤£ fi6c6cf`ÌÌÌÌÌÇWwgª§\Êʫ˻¼¼¼ÌË 11&"7'#5Z5s532"""UUTUTJJZ¢a6ffffff`ÌÌÌÌÇ̬wqbZU\Zª¼»Ì»¼Ìˬp"w3"#3:S5WS£r&!"uUUTZD¤ª¥2f!fccff–`ÌÌÌÌÌÅÇwvZÅÅ̬˼˻¼Ì˼6#s1"3?£3:7£wa!!2c3UUTZZ¤¥ hˆˆˆˆffffif`{˼¾ÌÊ|Wr¥U\Ū¬»»¼»¼Ë¼#7s"#3:33£3"#"#UUTTTDUxˆ™™ˆˆfff6fi`ξîëÌÌ\ÇveUUª\¬ºË¼ËÌÌÌ·fc62#3£uu3sw&&"3UUEDDE ˆ™™œ™ˆˆaafifi`ÎîîîÌÌÇwauz|ÊzªÌ¼Ë»¼¼Ë²1322c:4S332!!!3"3U¥EDDU‰™Ìœ™˜˜‰fff––îîîîÌÅwwa%UWUz¬ÌË»¼ËËËqa&s6"3#233s2q!"%UZUDE &h‰œÌÌ™˜˜ˆˆaffif`îîîîÌÌÇwau||ÅZ¬¼ÌË̼» “r!#r"W27"a!a"%UUDB&gœÌÌîî™™—˜ˆfff–`ÎîîîÌÇwrUU|ÌÌÌ»¼Ì»·'3’b#r""ws6a"%UR% U!ˆœÌÎîîìéœÉ˜‰ffff`ž»îÌʧv"wuUZ¬»Ë¼¼Ë²c7!a&"r'"!"%_ÿÛB"hyœÌîîîîîîî鉈fi`̼ëÌÅÌ||ÌÌÌÌÌÌÌÌʬËÌËQgr"!!"c#6[ÞîÛ¢"h™œÌîîîîîîîff`μÌÌÌÌÌÌÌÌÌÌÌÌÌÌ˪Ë˼"wf&6a_ÝÛº¢'x‰™Ìîîîîîîîéž™†fÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ"ww'&61+¿»R"rg‰œÌÎîîîîîîé™™˜ˆ`ÌÌ̼ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌëÌ̼¼ÌÊw6" ™™™ÌÌììîîîî™™ˆˆ`ÌÌÌÌËÌÌÌÌÌÌÌÌÌ̾ÌÌÌËÌÌìÌÌì˼§aa"!‰™™œÌÌÌìîîî™–ˆˆ`œÌÌÌÌÌÌÌÌÌÌÌÌ̼ÌÌÌÌÌ˼ÌÌ»¼ÌìËÌw!fˆ†ˆˆ††‰™™œžé™ˆˆˆ€|ÌÌÌ»ÌÌÌÌÌÌÌÌ̼ÌÌÌÎÌ»ëÌìÌìììÌÌìÌqx‰ˆ–†xˆh†fffˆhh™hˆˆ`wlÌÎËÌÌÌÌÌÌÌÌÌÌÌÌìÌÌÌÌìÎîÎÎÌëìÌۼLjˆhhhihˆ‡ˆˆ†ˆˆ–ˆˆ™™˜`vÌÌÌëìÌÌÌÌÌÌìÌÌËÌÌ̼ÎÌÞîîîÎîìììÎÌÌq!bavfaa†††hhff†hf†–f–ˆ™†˜™Ì™f|ÌÌÌÌÌÌ̼̼ÌÌÎììÌÌîîîíÞîîîîîîîîÎîî¹affffiˆˆwˆˆ†ffhffhx††h††ffffihi–ˆ‰Žîìà¬ÌÌÎÎìμ¼ÌìÌÌËìÌÎî¾îîîîîîîîîîîîîîîîaafffffvg†hhhxˆˆˆ˜™Ìˆhˆ––fffffihf††f™ˆžééÀeÅÌÌÌËÌÌ»¼ÌÌÌÌîìËÌîîîîîîëìÜî¾îîîîîî¼vccfv†hxxg‡†ffh‰œœÉvf†h–h†z–ff˜––‰ˆžžçÝàuÌÌÌÌÌÌÌÌÌÌÌÌÎÎì¾ÎîîîîìÌ»ÍÍì¾ëîÎÍÎÌÏüÌöviv†‡†v‡fvxˆ‰™ÎìÈff–†hf/ö†ifh†ˆ‰œžíÝà"ÌÌÌÌÌÌÌÌÌÌÌÌìëîìëîìÌÌ̽¾ÛÎÎëîëìÜÜÝíÞÎîÜöff–‡i‡xˆfh†ˆ‡™Ì“ÌÉfffhf?–h†i–˜ˆ™œî®íà%ÌÌÌÌÌìÌìÎÌÌÎìÎììÌ̼Ì˽¼ÝÎÞÝîíîîÞíîîîÝÞÞîö&fˆ—ˆ™‡††‡‰ˆÌÎꫬ†ffifÙh†–fhˆ˜™œîÝîЗ /\/pg/x)1A/€@0/ÂSpalette-1c-4b.tiffÑÉÐGraphicsMagick 1.2 unreleased Q16 http://www.GraphicsMagick.org/-\^n pbtn/¤ÈœœÊ¢ËÊ–n« ½¬Å{E× bívÚ£×–Ð!-\t1XH±Íʧ¸>Ñ…Òá¶÷Ä­1?EQ«A3 y/ð)0CU,^óSœÒµTtiff-4.0.3/test/images/palette-1c-8b.tiff0000644000212300117540000006171411244340171014741 00000000000000MM*\¤l}x}ppp“ppp“p}pppppppppp}¬Ûð¬qqqqq¬ðððððððððððîðíí¬í¬¬ÍÍÏÏÍ•ÌÍÍÍÌÍͬ̔~~“p¬íÛÛÝÝÝÝÝÝÝÝÝÝÿÿÿÿ 7ÚÝÝÝÛqqqqppqq~opdq776GHHž¤¬¬ž¨Úžžqq 77HH7HžžÛ¬±¬¬ wyyy{ww{yyyyxyxyywwwnošÃÇâ¬od^^˜£®Åñò÷óööó÷÷÷ò÷âÄÀ¯Ÿ ©ÄÔÎzlwwwwz‘‘‘‘‘zzx~°ÅÇâãææóóæææó÷óôöýã%%LÉÂÂâÄuzsywr{drrl{y{˜>?¡³³¼Æ¼¼ÉÉÃÁÉîzy~~s1EJKNNR¢²³¼¼¹³²l‘wyy{yyywwwxywxxxxxwxwwwv®Çòá¬zv˜°ÖñòóóôôôóõôóòÖ¯£œ¦©ÇØ‘hhmnƒ‚jm……ƒmƒn†nz¾Øââæççæææççôçæææôû!Eâ㩦?O·©¤¤ylllllrs˜—››ÐÐËËÊw^\v—ENN¡²¡¡¨êþýá=' ŸŸ«ŒŒŒ€…miŒoŒ Þæ±n‚ƒƒƒƒmn‰‰Œ‰„‰ƒƒ„ƒ„„†††‡ˆ‰n††nnˆˆnˆjˆ‚ˆ‚Žz›¥­³ÁÃüɹ¼ÆÈÈÇÆÇÇÇÆ³³»»Á¼ÃÃóN;$ IKONNLOO¢RMN¢¢²´²3>;;;=›¯ËÊ{er—=LN¡¢¢¢ÞêüûÞ<&  ˜|ooŒŒ€……€‚€€mm…‰Œ}œªåÂz‚ƒƒƒ…ƒ…mm‰‰„mƒƒƒ†m„†‡‡‡ˆ‡ˆ‡ˆ†ˆˆˆnŽ‚nˆˆˆˆˆ‚ˆ›´³»¼¼¼¹¼¼¼ÃÆÈÇÇÆÇ¼¼³¼Á¾¼Ãó². BKOPMPOOO¢OO¢¡²³²3??™???™™š_˜=BIN²¡N§êýê§2t}ihŒŒŒŒ…€…fiiŒ‰žMßã°„ƒ‚……†……ƒmm„„ƒmnƒƒƒ†ƒ††‡‡‡‡‰ˆˆŽŽˆnnˆˆˆˆˆˆˆˆˆ‚ˆË³³¼¼³³¼´¼¹ÃÆÃÉÆÆÆ¼¼»Ã¼¼ÁüN!:NMONJINN¢¢ ¢²´¼¹2??¡¡¡¡¡¥¡vs—=?N¡¡NO§ÞäM"sigpŒŒŒi„‰D©è¸~€mƒ…ˆƒ‚ƒŒƒƒmƒn…ƒ…ƒm„†„†‡‡‡†ˆ‰ˆ‰ˆŽˆˆˆn†ˆˆ‚ˆ‚ˆˆ‚ŽÎ»´³´¼´¼¼¼É¹ÃÃÆÆÃ¼¼»¼ÃÆÃ¹¹=.PONKNIIOO¢¢¢²³»¼>??¡?¡´¡´´¥%uB?N¡NPM§§L>!d‹iiiŒŒŒ€Œiii…~DFÞÞ°mƒ…ŒˆŒŒŒ…‰ˆ„mƒƒ„†‰ƒƒ†„„†‰ˆˆŽˆŽˆˆˆˆˆ†ˆˆˆˆˆˆˆ‚ˆ‚ˆ¯´´¼´¼¹³¼¼¹¼ÃÆÆÆ¼¼¼¼ÃÃü¹$$IPKMMJBL¢OR¡¦³¼¼>N™N?´¡´´´´—<=??LLÚßß§:!iŒŒfiix5G©è·z‚ƒm‚ƒ……ŒŠ“„„ƒ…Œ„„‰„„„†n†ˆˆˆ†Ž†ˆnŽˆˆˆˆnˆˆˆˆˆˆŠŠˆ‚¾´¼¼´À³´¼É¼ÉÆÆÆ¼¼¼¼ÆÃù²BLNLMMIBPO O²³¼³>?N¡¡´™¡´¥´?>;LISàüè 2  “ŒŒŒŒŒ€ii…|.M±¸«…ƒ‚………Š‚Œ……Œ†ƒ„„„†„„†Œ††††ˆ†ˆˆ†ŽˆŽˆˆˆˆŽ†ˆˆˆˆˆˆŠˆŠˆÊ³´¼´´¼¼¼¼¼¼¼ÉÆÆÃ¼¼ÉÉù¡&.@IINJPB@I¢O¢³³¾¼>??¡¡?´´´´¡¡>?IÚìüæE3}“Œ…iŒŒ„iii}6: Þ·x…m…m……ŒŠŒŠ…ŠŠŒ…ŒŒŒ‡‡Œ†‰††††ˆŽ†ŽˆˆˆŽ†ˆˆˆˆˆˆˆ‚Žˆˆ‚ŠŠŽË´´´´´´¼¼¼¼ÃÆÉƼ¼Ÿ:????´?´´´¡?9?§üûä?²ä§:!d–‰ŒpŒiii}HŸ©äÁxŒm……ƒƒƒ„Œ‡ŠŠŠŠŒŒŒŒ†Œ„‡‰„‰‡‰ˆ‰ˆˆ‰ˆ‹ŽˆŠŽˆˆŠˆˆˆˆŠˆŠŠŽŽŠ‚ŽŽÊ´¡´´¹¼ÉɳN?::#$##@TPKKRµUP99KKWKWUUURUKKJ ¡¦³»³>?????´?¡²N=3???2! )“ŒiiŒiG¡Þä®o‰Œm……ƒƒ……‡‚ŒŒŒŒŒ…ŒŒƒŒ‰‰‡ŠŒˆ‰ˆ‰‡ˆˆŠˆ††ŽŽˆˆˆˆˆˆˆˆŽ‚ˆŠŽŽŽŽ‚Ê¡W´´¼´?9;###888@IPKWKORUUWTTKKUUUVUUUUWKKM¡¢´´??????´´²??3,, 0°‡ŒiiimfxGC²äÈ«„‰‰………………Š‚…ŠŠ‹‹nŒŒ‡†‰‡‰‡‰‰ˆˆ‡‡ˆŠˆ‹ŽˆŽˆˆˆˆˆŠˆŽŠŽŠŠŠŠŽ‚‚ÊW´´N>,33,:;888IPPWWWUUVUUUPKUUVßYYßßUUUKKO ¡²?????´?????)Â~…‰Œ…iŒ|FN·¸È~…‰‰„„„…ƒ…‚ŒŒŠ‹–•–ƒƒ††‰Œ‰†‰ˆ‡ˆ‡‡ˆˆˆˆˆŠˆˆŠˆŠŠŠ‚Š‚Ž‚ŠŠŠŽŠˆˆŽ›?>3!&#=:#8;IOWWWUUV¹UUµWKUVYYààYYYVVVUR¢¢¡>?????´???3 (ÄÂzŒ„mixœE¢ääÃy†o‰„………ƒˆ…ŠŒŒŠ’’–í–m††„„‰†‰‡‰‡‡‡†ˆ‡Š‡ˆˆŽŠŽˆˆŠŠŠŠŽŠŠŠŠŠŽˆ‚ˆ‚Ž% &,,,89;IPKKUUUU¹VVµµµYYYìéåàYàYVVUVR¢¡3????´??;>  °Å©zŒii~AL¢èäÅxo‰‰†Œ…Œ‡…‚ŠŠŠŠ‹••ŒjƒŒ„Œ†„††‰‡ˆ††ˆˆŠŠˆŠŽ‹ŠˆŠŠŠŽŽŽŽŠŠŠŠŠˆŠ‚ˆ%%'''89TIPKWWUVUU¶¶¶µUYYàYåìåààYYYY¶U§¢3???¨å 83 u©¢ziiŒii…€xFM ¸èãÈx‰‰„Œ„ŒŒ‡…ŒŠŠ‹ŒŒŠ’•“…ƒŒ„Œ‡„‰ˆˆ‰‡‡†ˆŽˆŠŠ‹‹ŠŠˆ‹“““–‹ŠŠŠŠŠŠŒ‚Š_ ))&$.9IPTKWWUUU¹V¶¹VVUßààààåìàYåëàYVU²3???åç=>3 (³©¦ vŒif}AO ¸ææä«n‰‰„„„ŒˆŒŠŒŒŒŠŠ‹Š‹‹•‰m„„Œ„‡‡‡‰‹‡Šˆ‡…ˆŠŠí•–ŽŠ“”–Ííí–ŽŠŠ•“ŠŠŠŠˆ (%&,.9;PPPWWWµµ¶¶¶ÞYɹààYYVYYYìëìëàV§§˜¼­ºÅĺ¯­¯°°˜s Ÿ¸©¤Ÿf…iiožœF¢ ¸æçã±n‰o„„ŒŒƒ…ŒŠŒŠ‹ŒŠŒŒ–•…m„††‡‰‡‰ˆ‡ˆ‡‡ˆŠŠŠ“îõõí“–ííïðí•ŠŠŽÍ–‹ŒˆˆŠ_ &3#9TIPPWU²UVßßààßVUÞààYVVUYàììþêßµµ«×ÀÀ¾¿Äľľ®º­vb)·©© L m€Œiimd6QGN¢¢·æéæÜn†„„„„Œ…ЇŒŒŒ‹‹‹‹ŠŒ•‰mn„†‡ˆˆˆ‰Š‰ˆˆˆŠŠŠ’õúöõîíïõõúí”ŽŠ’îÍ–‹ˆ‚Žˆ %.899TPPOUU¶¶ààåYÉßUßëààVUKYàìþüêÞ·¸«×¿¿Ä¿¾Äľ¾¾­™™sbŸ¸©³Ÿ—Oxfiiid&CJCM³¢©äçäá|om„„Œ„ŒˆŒŠŠ‹‹‹‹‹‹…”–i†ƒ†ƒ‰ˆ‰‰‰ˆˆˆˆŠŠŽ’îýúúõïõúýúú•ŠŠ’î••’ŠˆŽŽ 2>;?IPWPUURXàåìàß¶¶¹åêXVKKYåìþüåÞµ¢£×ÕÓ¿ÕÕ¿¿Äľ›™˜sd¦©¦ŸŸ—Neiiiiiix4-A6!IO ¸äã·ª }„miŒ…Œ…ŒŒŒŒŠ‹Œ‰•mmƒƒn††‡‡Ž‰ˆŠˆŠŽŠ’ïúúúúõõúýúúÍŠŠ”í•–ŠŠ‚Žj /8>>9>=;?™=,©ªªœ ª¤¡¥›­½™˜ ª  Ÿ ¦¥­¯¯¯»ÅÅ»®ÄæùùøòÇľÕwƒ‹‹ŠŠ‹’•íúýþï–Šˆnjjnnn†††n†ˆŠŠˆŽ‹ŠŽ‹ŠŠŠŠŠŠ‚ŠŠ‚Š’õýý’js)?>?PPP?:—¤¤ž Ÿ™Ÿ¥­´˜uLª¨   ¥¥­Ä¯ÄáãäáÁÁÂãæãÅÅ¿½¾¯lƒŠ‡ŒŠ‹‹–îõúúú•‹‹Œjmnmƒnn†††††ˆˆˆˆŠŽŽˆŠŠŠŽˆ‚‚ŠŠ‚’îúúõ”Ž’Ž(.=EBCJSSYYàëììëàYDŸäçû÷44@CCKTVSY3??M9>>???NI=$ Ÿ°ž  —Ÿ™Ÿ™¥—<— ©¤¢¤¦¥­ººÅãáäᮺÁáÅÆÄÓ¾½¿Ñwm‡ŒŒŠŒ‹’Íïúúúî’Šƒlklmmnnnnnn†ˆŽˆŽˆŽŠŠŽŠŽ‚‚ŠŠŠŒŒ–ïúúî’ŠŠ‡ (-AABBJRS¨Yàëëëààª<·æûö4 4@TTTVSVY3;§èU9>;;???;<±£œ ¤Ÿ—ŸŸŸ™Ÿ£˜——©§ ¤¦­½­»ÅÅáááÁ­®¾½¾Ä¿ÀÀ½¿zi‡‡ŠŒŠ‹’•Ïîõõî’ŠŠnkknonmnmn†ˆnŽŽˆŽŽŽŽŽˆˆˆŠŠŠ‚Š’íõõî–ŠŠŠj(-.4@@CISSSÚëåëàߘ©âçûª $4@@TTKSSY3$>Lߨ;8;;?;"'¤ œŸŸœœ—L=—=——Ÿ¢©¦¤¦¥­ººÄÄÅÅÁ»º½»¾¿¿¾À¾½¿Ìm†ŒŒŒ‡Š–”ÍÍÍ•’‹‹nkcclmnmlkn‚ˆŽˆˆˆŽˆˆˆˆ‚ˆŠ‚ŠŠ’ÍõõÍ’ŽŠˆŠ_ &-#6B;BJKK¶ßààßœœ¸éçû- " 4@TTSSVY%$38O¸E#888"&œDœ=Lœ==<<<œœ—œŸ¤  ¤¥¥ººº»®Á»»¾½¾¾¿¾À¾¾¿škm‡…Š‡ŠŽ““’––“‹ŠŠnocaokkkonnˆˆˆnˆˆˆˆˆˆˆˆŠŠŠŽíïõî–’ŠŠ‚ˆ&&",.#:@@BCMQ4*œ¦ãêûçÚÚÚG44@TKTSY!33$$>.333!,Ÿœ==—==<;—˜v˜¤˜—ŸŸ¤ ¡¥­ººº­»»ÄÁÁ»¾¾Æ¼À¾ÀÀ¿«mn†Œ…ˆˆ‹’’’’‹Šƒiml}~Û¬lmn†nnˆnˆˆˆˆŠˆŠŽŠ–îõúî’ŽŠŠ‚‚ "$A&0ª¢·ãûûöéó÷éåX4CTKYY!!!! .Ÿ£=—==uvrb2Ÿ£œŸŸŸŸŸ¥¥­º®ºº»Ä¾¿¾¾¿¾¿¾¿«hm„ŒŠˆ…Š‹‹’’’’‹‰~¬ªª±äåääshljwnˆˆˆˆˆŠŠŠŠ’íîïî”’ŠŠ‚Šg ±±u(œÁâ·äæéççãæä±èùà@TTKY vvsr«~ym]2 Ÿ=ŸŸ¡£Ÿ¡¥¦­ºº»»ÁÅäãÅ¿¾¾¿ÀÀ¾¿šcnn†„Œ†Œ‡‹Š‹’’‹‹‹’DEAALäèèæÛbljnnˆˆˆˆˆˆˆŽŽÌîïîÍ’ŠŠˆˆˆ\ - ½ÖⱤª·©ÂÃãéæêéææããéöýÜ@TSK  %sl_ x“ok`[]Z˜ ŸœŸ¥Ÿ£Ÿ¥¥¥­¦¥ººÆáããÅÄ¿¼¾¾¾½¾~`kmn„††‡ŠŒŠ‹‹‹Ž‹Ž‹Ž+#44A¸æèäóbjwˆˆˆŠ{ˆŠˆˆŽŽ–ÏîÍ’’ŠŠ‚ƒˆv¹,ËÒÄÅ®ÂȤ±Â³ãéãûææãâéöøûûH@JT'«^Zcxoo`[[\ZŸ ŸŸŸŸŸ¤Ÿ¤¥¥¥­º»º»Åááľ¾¿¿À¾À¾~^km„„„…Œ‡Š‡‹‹‹‹‹Ž‹o("4#Bäç¸é~_jnˆˆˆˆˆˆŽŽŽ‘””Í”–’ЂЂ†¤· (ÎѱÒÄÅáÂÅ·¦éããæãèäæôööøüÚ#CT!&«”l[`p}oh][[[Z¤¢Ÿ™™¡Ÿ£¡¢¦¥­´®®»ÄÅãÇ¿¿¿¿¿¼À¾¿z^lmmmnmƒ‡‡‡ŠŠ‹’ŽŽŠ‹c+4@·çäèÏblnˆˆˆˆŠˆŽŽ’’””’‘’‹ŠŠˆŠ{¢Þ!šÎÒ¾±ÖâæããÇÇââ÷æéôööööûêûÞ#BK˜›˜˜% |Í}kZZZ]p}ok\[[ ¢ŸLŸ£ŸŸŸ¥¥¥­¥´º»ÁÈÅÄ¿¿¾¿¿¿¿¾¾y`kmmnm„‡†‡ŠŒŠ‹Ž‹ŽŽŽ‰sC@Oäåäûsbnjw†ˆˆˆˆŽŽŽ’ŽŠŠŠŠŠŠ‚™È"ί¯¾¾Çòããóãââ÷æçöøøûøôûêýä$@@v™˜˜˜šs~Í}o^\Zk}lk^[[[[s¦¢¢ŸŸŸŸ£¤Ÿ¦¦­­­ºÄÃÅÄÓ¿À¿¿Ó¿¿½¾l`kmmmmnn†…ˆŠŠŠŠ‹ŽŠ‹ŽŠƒdCBIäéÞê¬_cljnnnˆˆˆˆŠŠŠˆˆˆŠŠ‹Še>œ1 ʯί¾Åããòãòâãæ÷öêùûùûûöøýÚ$@Tv››™˜v{~~}ok\[[Z]opk^[[[[[[)Ÿ § ŸŸ££££¥¦¦¥­½¾¾ÆÄ¿¿À¿¾Æ¿¿½¾dckkmmmnˆ……ŒŒŠŠ‹‹‹ŽŠ†ncABB¶çääæbcjjnjˆnˆ†ˆˆˆˆˆŠŠŠŽŽj 20̯¯¯¯ÅÇòòòãâ÷÷æööùùùûûûôþª 4@v›™ššrz~}ok`_[[[[hok`][[[[[˜¢¢¤©¢Ÿœ£ŸŸ¤¥¥¥º½ÄÅĿĿÀ¿¿¿¿¾»°dackkmmm…‚ŠŠŒŠŠ’ŽŽŽ‹Šˆ†hACAOäå¸ôsbblllljn†ƒƒ‚‚‚ˆŠˆˆ )'-!ΰ°¯½ÄÅââââââãóöôûûùùûöêþž 4@v›š£v}~~omh\Z[Z[\km^[_\[[[[Z˜©§©©¦ŸŸ£Ÿ££¥£¦º»¾¾ÄÄÄ¿¿¿¿¿À¿½°b``ckkmmƒ†‡ŠŠŠŠŠŠˆŒƒxs|AM@JÞçµé\lkkllwwxyŽx‰i„‰)—¡NLI2"«°¯°­ºÄÇÅÅÇÇâò÷æéöûûûûûçû5#4˜£›˜l~”}ole^\[_]hke[[\[[[ZZŸ§©©©¢¤Ÿ£œ£££¥­­º½¼¿¿¿¿¿¾¿À¼Àº°a\`cckkmnn„†…Œˆˆ‡mlz| §CJMB·ê¸æãbbrstvv𫱱Íxm *Ÿ¥¡¡¡¡NNA$ š°°­­±ÄÅÄÇÇÖââò÷ööôûçööûû" #8v›˜l~~}“mk^\_[\]]h^]][[[[ZZb¡©©©¦¢¦¦¤¤ ¤£¥­ºº½¾¾¿¾¾ÄÆ¿»À»¼°a``ckkkmnmmƒ‚nkaatM¢§ªIMM²çäÞç|()t˜u0v˜££¤¦Á«!<™¡¡²²²²NP='  š«£°°°ÁÄÄÅÅÄÇØâò÷ööööûøûæ "$˜šy}~–ome]___^]]e]]]\[[Z[[%£©©©©¤¦¦¤¦¤¤¥¦®­º¾À¾¿ÀÓÆ¿¿¾ÀÀ¼«a`\`c^chhh`c\d||5M §¨¸BJBOæèµû±!&)/5˜)s/¤¤¤¢©·¸D>™¡¡N²²²NNLB'˜«£££®°®»¾ÄÄÄÖÇØãóööööööÜ{y~}~}me][Z[_[_]]^]]]]]][[[*¡©ª©©¦¤¦¦¤¤¦¥¦®º»À»¿¿¿Æ¿¾¿¿¿»¼˜a\\tQMO§¸ÞEIBIÞ鵿æ'&)0D0))1œœ ¦©¢§¶¹§:=¡¡²²²²²²NI6t™£££°®®®ÄÄľÄÄÇâóóóöóóö5(td~“}}of][[ZZ[ZZ[]]][[[[[[[Z˜¦©©©¦¤¥¦¤¤¤¤¥®º®¾½¾¾¿¾¾À¿¿¿¿»¼t cklt6FM§QKR¶¶CIIB·æÞäé'11*)/<=L¢§¢µ¶¶µ¸¶EL¡´³²²µ¢¢NB"!««£¤¤¤°®°Ä¯ÄÄÄÖÇã÷÷âò÷Ø"±Õzx}~~oig]Z_ZZZ]]^]][[[][[Z[œ¦¨©©¦¤¦¤¤¤¥¦®»º½À¾¾¿¾¾À¿¿¿¿¿»¿&stttvy|¬ FQ§¨§S¶ÞQIOB¢Þäèûª!'-++)1ELS§²µ···¶§µ¸Þ²O"ckkhhkmƒ…………Œm^€iijefffgg]]]]gghg]]][]]]]u¥¡©¦¦¤¦¦°®®®»½½ÀĿɿ¿ÀÀÀÀÀÓ¿-#IPNOOOL   ª§ª¨H ?ÇÞªF EM¸¹©¢³¹ÁæäâÁäéª:¢ªFŸ)/..8;BMMO²§··¸µµ·¢ON a^^hhhkmmmmƒm…ƒ…n\‚fmffffefeg]]]gfhg]]]]]]]]|¥¦¦¦©¦¤¦°®®®¯¾½¾Ò¾¿¿ÀÀ¿ÀÓ¿¿» @JNMOOLMEF ¤©ª¨Þª$³¹·ª-Bµ¨LM¢·¸ÅæãæäÞEL·¸©µÃ,2.::=BLN¡¢²µµµ¸¸¶U·NI``^kimmmmm„„…Œ…ŒmZjfe€jfffffee]]hheg]]]]]`[\˜¥¦©©¦®©®¦®»»½½À¾¿¿¾¿ÀÒ¿¿Ó¿¿¤ TOMOOOKKM §§©©©Âää7<œ ²·¸O.O¸Þ¸äâçª#BB³âäž .A=::>—LN¢µ²·¸¶¸¸¹µµ¢:  \^kkkkimmimi…Œmfeeejjfejffe]geiig]]^]]ZZb˜Ÿ©©©¤±®¦®®®»½½À¾¿¾¿¿¿ÀÀÒÀ¾¼A$JO§§R§OKOKRM ¤¦ª ¸©6"666-Ÿä·§ÞãæÂª§äž@ª¨¸05!#,,/u£Ÿ¢¢µ·¸¸ÞßßÞ¸µµ#  `hkhhmmmiii………Œ‰Zffeegffffhfe^]ehh]^]]][Zb£¥±©¦¦¦¦¦±®¯½¾À¾À¾¾¾¿¿À¿¿À¾³' TM§§§§RMKKOMMŸœDD1¤©©©§FDEª§OMB¢N¸â© E§±21®1"'.uœ™LNO¡²µ¸Èèèèß¶·µ-  chkhefmhm„m„m…m…ŒŒ}_eejeeejfiiig^]ghg][[[[%££©©¦¦¦®¦®®®¾À½¾¿¾¾¾¿¾¿À¼»» "I§§§§§QJKOMRJFEGAEE MOMRMMMOK§§¨ž" %D.:;<—¡¤ ¤·¢¦¡¢¢OO¢²O²µ¸ÞäååÞÞµ·A`lkhhhkmmmmm„m„…Œ\e_be_^egefee]]^^e]][[ZZr™¦·®¦¦®®¤®®¯¾¾¾¿¾¿Ä¿¿¿¾¾À»¤1$J¨¨ RMJJJKOMJPJMJOJKSKORKKKSRRRµ¸¸" --#8BPPRµOO¢RU¢²§¢¢¢¢¢¸ä¸äåçàÞµµFo^hkmmhim…m…ƒ„………Œ–•_j___eeggeeeeg]]]e][[Z/—¦±¦¦¤®¦¦®®±½½À¾¿¾Ä¿¿¿À¾»­Ÿ+ 8M©ª§JIMJMQMJMMJJJJQKTSKSKRRRRKRR§¶¶G".:@@BIOOµ²O²µ§O§©§§µO§©¸ÞèèåèÚ¸µ okchhkimiimnnŒ………Œ“ðð_e___^__gehgee]e]]]][[v™©±¦®°¦¦­®®¯¾½¾¾¿ÃÄ¿¿¾¾¾»¥DAM¨§MCFMJOMMMCJCJCJJJSSKRRµWRRR§¨¶¸§Q".@@@ITPOOU§§µµ¨¶¨¶ÞÚß¶¨·Þäèèèßà¸O ca``kkmmmmmmŒ†ŒŒŒ‰“íïê_e___g^]^eee^^__]]]]Zu𦱦¦¥­¥®®®¯½À½¾¾ÃÄ¿¾¾¾º¦Ÿ-!BM  JFMFJMFJMCCHJJJTJSKKKKRUKRµßßàÚXS4$:ABJJJPOµµµ¶ßàààåååêèÚµ¸äèèàäè¶² \cca`hhmimmmm…„ŒƒŒ‰•ïúì_j^_ee^[[^eg^g^g]]]]ZZ˜£©®¦¦¥¤®®®»½½½¾¿»¾¾¾¾¾¾®¥E'"AIMBCJCCMFJCHHCJQQQQKKTJKURKKRSàêùêààG$@@BIJIOO§µµÚèêùùùùëøê訸ÞèääÞßµ²c\\a`hkmmm„mm…„Œ‡‹“íúùùbg_ee__ZZ^^^^_]ZZZZZ™˜¦±°¥¦­®®½¯½½Ñ¾¾Ä¾Ä¾À¾º­Ÿ5$AELEFFFCFCFHJHCSJQJJSSJKKKRRRSÚåùùùëëX44@CCITPOOµ¨ÚàåùüùùùùêàÞÞÈääÞÞÞ§R caa\^ackkm„mm„ƒƒŒŒ“•ïõýù_e^_e^^_ZZg^g]_Z%—£¦³¦¥¥°®°®»½¿À¾¾¾Åè¾½»¥£E-$AADCFFLJFQFHCHQCHHSSSSSRKKKRSÚÚåùùüùìÝ$AABC9TIPORßÚÜêìüùùùêæÚ¸©¸äÞ¸¸¸§¢aa\``^kmm„………ƒƒ…‡”îïýýø_g__^ee]ZZ__^_ ,™™®©°¦®­­®»°½½¾ÀÄÄÂÅ»¯®¥ŸD+ -AADF FCFHžQHHQCHCCSSSSJKKKJRSÚàêëùüüüà$4A99@TIIK§¨ßàèêøøêçè訪©¸Â¶©¸§¢aa\b`ckkmm„mƒ†…‡ŒŠ”ïõýýïbjee_ejeZZ [(s(1u2˜™¤®¥­®­­®®¯½½¯¾»¾¾º¾®®£—1'-4DEFHFFQQHHHHHCHHHJHSSSKKKSSßàèååêêìüå4#@889BIILOR¨ÚßèèååèÚ¨¨©·©·¸¸¸¨§  \\\`c`kkm„„‰ƒƒ‡ŒŠ‹•ïõúõÍ_e__^efe_Zbs+()  ˜˜£¦¦¤¥­­­®¯¯½½½À¾®»¾¯®¤£œ5&-;;;8>;;B;IEEMOMMM §   ¢¢¢¢§Fa\^chkmmmmmƒŠ‡Œ“•–Œio_eg^^^^_\ !(u99;E;IEEEŸŸLM M OMN¢ RO¢A \a\`ckkmmmmƒƒmŒŒŒ“–“omhZ_____Z '/uu<—/£—£¦®¦®®®½½¯½º»®®¥¦°®°°££œ—u -616.-***5|6**-6.65.D6ABEFM MMM F FDA:>:8:;:9B;B:AELLMM L  ¢  ¢OO¢O§D a`ac`hkmmmmƒƒ„ŒŒ‹‹‰Œim`ZZ___[%2/<—(v/œœ£¦®®°¥°½¯½¯¾½»¦¥­¥¦¦£œœ0+061116*0ut0t*005555.D£—£­®­­®®º½½½½»¾®£­­®®°¤£Ÿ  &&+6<5611|0*-.5ADD50-..5DMF   œFœ5//,222>>>:;<;=E=BBELLEEMMOOR¢µR¢!aa`h`h`hkkimi„mmm„mmihh` Zt)=£™™¥®­­°­½¯½¯½º®¦¥®®®°¥¤ŸŸ "+.D50|˜|1*01DDDD50.1.AEEM FœD5))/2221>><<<<;EEEEELLIL M O§¢§µµ  ahhhkkkimm„mi„mmmmkkh`a % (™£Ÿ£­®®¦®¯½½¯½»¾­­£¥®®®°££u&++-11-0uu00'1DDDDD16115DD GœE|**),),,2.20.::<221>::=EE;LMLLLM¢§M§O§§R" ahckkhkhkhmmkihih```aarrbb   !™Ÿ™™­®­­­ºº½¯½º»®¦®®»®®­¤££*  ++0.0*tt||))15œDD501.1DDœE F5**//,.<<:.2<2<:=B=LŸLLŸ¢¢ O§§§R²"  akhookkmkhhmhhh``a``abb%rb\  /¥Ÿ—£¥­¥¥®º¯½½»¯Á¦¥®Ä®®º®¥¤ ++-50**tu50)*0D5D55611.DEDFHGD00/'.><:::A=:::A==IœLEM §§ § ¢R¢!hookhkmhhhh`a``h`ha%rvtrbbb   u¡¡Ÿ£¥£­­­º¯½½®ÅᱦÁı®®¦¥¥ +*-6500u|tt**0tDDœ512/->A<=EEEEILELNMMMO ¢ ¢MN²$a``qhhhhh````aa˜Ë››ššš{{{{v{rrrrlbb™¡¦œ—¥¥¥­­­º½ºº»º®ºº¾»½º®»  +++**tt|0+*0-6DDD50---.1EDD1*()+'-.2.—=<˜£™›£™­ºº½½Àº»º½¾¾¾¿»®   (tstt*&++6DDD5D11u555*(()/:<;=L==?LPPPP'nˆ‘ÊÊËÊÊ‘ˆŠŠ‹o\ \a``hkiipioÛûûûùùøæ¾½››šv{rb%˜˜>˜—™—™™£­¯½½½½»¾¾¾¾¿¾¾Ä˜  *t5t(((+*0151111111((&%),<:ALNL?LLPI# &dknwÊÊÊÎÏÍÌ‘nŠˆka``hhmmmmhÜöûûøûêõį™ššsrrb%22˜2™™˜˜™™›­½½½¾½º½½¾À¾¾»% ss||*(++*000/00u|0t*s&&-.;;I?LLP;$ ./mnÎÎËÔïõõïÌ‘‘Ž‹mcaaa`hhhi`Ïóóóóóóñ¯°›šzrbb %/%/˜˜˜——™­¯½½½º¾½½¿¾À¾¾  sstts((++***(*ttt*t*%',.;;;8#$""1:'mˆ‘ÊÊÊÔ÷úýýúòîÍ”~Í•~”‹Œk`a`hhhqh«ñØñÖÄľ¯°›vrb%%st/2˜—™™¯½½º®º¾À½¾»¾%  (t|ts((((())*s*|d(%!!"6HÜÚªÞÈ ,1smwy‘ÊÊÏõõýýýùëùúúúæùøÛî–Œo``hk`«ØÕÕÕÄÒ¯¯š˜zzvššššš°¯°°°«°£ššš°™¥­­­½¾¾½¾˜     sttt(&&((*tsss    1âöé÷öæ© ',/lnz”ÊÎîõýýýþúûýûúüüøüùÍ•}‰mh`ah`«×ÄÕÒÒ¯¯°¯¯ÑÑÓÒÑÔÒÒÔÔÑÔÒÓÕÒÒÒÑÒÒ½°£›°­­­­™   sssd((d((  2Â÷ââÈÂÁ¡1()rn’ÊÎÙñôúúùùúýúýüüúþõ”ÍÍ”“Œh`«Ó¿¿¯¯¯ÏÎÑÒÑÒÒÑÑÎÑÑÑÎÑÒÒÔÒÑÒÒÑÒÕÕÕ¿ÒÎ᝭«(%((&    sss( 3Æâ·È³¿HNW,WÜY2LàZMˆT,g‚h-x™z o´htkìvÈohu£lÓWiSõYÞSúpílVj*v‚w–‡’m¯A¯Œ§Ò§ƒµ¿¯›­s™˜–Nˆ›ˆ„˜˜cœê­Åª³¨QµÓ¸½¾©©G«Ë¹,¶¾µ,¶Ó«c°óÍÈÈËCÑÞÊ­ËÊÉKÇÇÈÍNÆËşNJȗל”ºL­ÐŸ}˜ðS—á·ã¹¤º*¬û©öºAº½«T»§¸»¶†¹ÕÏüѻΡÄcÆ ÆÅÀÆGÎÑÇdÈÈ›ÆÿÒ É#ÉØÒ¾Ïý¥¼ƒhâ# ©o“ ´&*:aI”`äÚ_'C0s6éuTÅM''/â8„8*n¯9EGµQõyðm8JÎGðW½GùWMZ S‰gîi*xfix¤vBgsw|Ewxd‡þ‘h‰–,‡Ó—…•«Ÿ‘)‰¾˜;œ-‡ô™›5‹D™N¦m©Ã´ž§y©Ö´Bµ£²·§g¹)³á§¼ÃÃ(Áa°2Ä‚ ‹ -ˆ ßá_Hß-¿%¶26qâ!k:'t%ï5j)14°4o6ª(ÁJ€Rah„wÜp'H°JQcmÌV[u»SoYeüñ7&Õ,,->'‚3Ì4º7*6´8T:¨-p;CËGßO|psS¯T=méuùa–˜ í¦¸’ªøš!•”ñ§ºª´¹I·å©–¬dµÅ¶ÈºÁ¼_ºÎ²••»“ ¹æº¶ºö°ð¸“ÃpǬÇAÄÆ1Æ ÇJÒBÃÇÆÓôÅHÊ×ÒœÑÞË[ËÔ-˧ÊàÖ÷ÕÔfâ<8¹fiŽe´£¯ïĄɹÌÉÒÜÑ‚ÌÂÍ×ÔcÔ{曺ߛ˜µo¤éÈ ÈÎæÊ Öd×ÀÏzՃסÚnÐÎã˜Ü·ÛçàC™¡¬Ä·rŸÎ€ÔiÙ2Ù¾ÊãþãMÜ×ß_Ø&ä–ãËæôéN©ïH-³³3ðš ld&Í#ªè® µíRÚ$úáþ Ì¥n:¨%’&»#Â!RJÙ%)“6œ/€ )*´)œ+á4=2ô+µ6J8˜,7¬;&,›(DkC2F']Æ8C:¾9ò;$:¹<<,ø;öFêEœG8VþE±G»WÀVeJ²VžY¦JV­I»XN fRfim¼Oùi'y<]–Àƒ}  UÕ#j"ú¸$×%ó1Õ$§"Kì&i(F')¥4œQñIsù,n8;J0ˆ*ú5.[0ãSGEIèNËb$”å&C*s&È*m+L'Ë4¿)ñ3z-”De+ö6ñ2o4š49JS gíXð<8¡=Ë5s;‰FsL nšHóVïJçXqH$TóLKVXfÝv‰gùo I‘oMT•J9PlGVeWDO€j w”jKx f>NW¸\M˜VNVøM£gKx/f4g(wÉh‚x&xsmL8˜:TPqµL.mu=ÓJsWÔXçLzg‚w_g%uÄ€y‰s’Ƥƒˆ’~«î‡ôˆ3™Ö¹š¨Ä¸I©Ã²ÂÉŠÎêЊ’î¦É¦<‰ “m§Ó¹³¶]›ÙÈ.ÕýÊÖÈøÙ!Ö?äRÄêtiff-4.0.3/test/images/miniswhite-1c-1b.pbm0000644000212300117540000000572711246011227015303 00000000000000P4 157 151 ýûêÃô8ï訥]Áàùh8z (€·S[ (ÿü0þ€8îþÚðÛä €Ö·TíÞP`€Ýÿÿ¿À  €ÿ÷t?øÿ÷Ú`€€ûÿü?ÿíÝÿàÀ  ÷¿üÿ¾ûklâ>E ð/ÿþÿßëÿöÈ<åCûûÿÿúýû9@<”€àówûÿkoùä}Â÷÷ÿÿýÿ½Xpxàóÿï½¶÷óØx€ïÿžïoïÀø‚@Ëÿü÷ýýü0ô(€ÿÿüÿÝÿwˆùÀ ‡ýè?×÷×ÿðð ”=€¿ÿð?þÿ]þü?ø ¡=}ßô;½û«^ù €:ÿïÿ ïÿߥ¶Öü( Gÿ÷ßÐýgûÿÿÿ?üÈÿïÿáûþýý¿n€?ûÿÝÿàþww[Ö÷€øH  ÿÿcÿÞÝÚ»þ ?àH?ïûÿ{÷ÿÿßgà‡À€ˆ?÷ÿþÿoù©õº¸-@ (ýÿÿþûïÿ_ÿÌ2D`ä_ÿ¯ÿüïÛ]¶í¯ÚÌ?ÿ?ÿ½ýy÷ÿwú¿/¸¨¿þ7ÿüÁ¿¯«¾ëÿV@ÿü¿üõüýöþëÿúÿüwÿøýü_¿\­Õ¿è ÿü¿ÿåW{íðàsÿõ ð?ÿð×ï½õØWÿù€ð¿ÿÌþõ»¯pqÿôð?ÿÀg½¿°aßø ò¿ÿüßýßÖàd¿åàì¦÷ißþ UÿäàÂÁ~ôÝ·ðo¯ùàO‡Rñÿ¾Ðz¿ò€⇀tWç ¯ïøm ÅÀ~¿àú¿ú>À ð_ö¸«,ïúø@À"ðë¡Zü/ðРÿÅ@ À-ÿþ®X'åÀ€€Ä@p~_ÕÜ/ù€@Æ¿À@ À÷ùø/ô”À€€àïûUÐú  ¹§åxþ®ÿp/ý€ŠÀ#„ ¿ûŸð?ö€8†¯Éˆðûjù`oýH6@á¿Á$„°ûßÿ ÿþØ<áßè› î»þùiÀÿâ  ÿÿÖ”@½môýÿÿÿÿ€@ÿÿÉ~ö“?kßÿà ÿÿþþ › ?þÿÀÿÿýÿìõð=e ÿÿ€ÿÿÿüPûëü=Ö‚çÿ0ÿÿÿüÿVxý/çÿßÏÿý@@Ökøú_gÿ›ÿÿü%ÿþPßûÿÿ‡?ÿþÿÞøßwÿÿ8$ÿÿü ý³x½ïÿÿ(¦ÿÿü ï÷jþ¿òÿ8 ÿÿøý¾Èá‡à p“ÿÿøÿþÖÈOx·ÿÿüÿþî! ø/ÿÿø ÿü„ì`€xÿÿÿøÿðÝ€ÈàßÿÿðDÿ¾à¯ÿÿðýú›€é8_ÿÿø {œ üø¿ÿÿðLå˜úÝ1ø¿ÿÿð?@Oü6 €ügÖøÿÿÿø~ð1¿ˆû_߸ÿÿÿðyú€? ÿÿÿðÿÿÿð|€ðÿÿÿøÿÿÿè@ðð þÿÿÿ¸ÿÿÿðö 8t=Ðÿÿÿøÿÿÿøò¤vÿÿÿðÿÿÿðôpí@ÿÿÿØÿÿÿððØú ÿÿûøÿÿÿà€ÀI(†øÿÿÿðÿÿÿàÁ¢¸?"€ÿÿßðÿÿÿðàB Ôÿÿþ ÿÿÿààh ÿÿÿÀÿÿÿðÆD T@ÿÿ÷@ÿÿÿЩ@H ÿÿ{ÿÿÿà¤"ÖÿÿÿÿÿÿÀ™EPDÿÿíÿÿÿàÕ ¢ÿÿþÿÿÿà/¨Š„Ú€ÿÿôÿÿÿÐR¨  *ÿý¿ÿÿÿÀ?¤C@õ€ÿÿüÿÿÿ?ÕjZÿÿlÿÿÿÄ?Pb€õ„ÿûÜÿÿÿÀOîÑŒÀj"ÿÿ¸8ÿÿÿ€äõL!ÿÿôhÿÿÿ »êVHŠZ°ÿÿØ8ÿÿÿ€É$µÀIzE€ÿÿxxÿÿ¯@÷ûª"§˜ “ÿÿêxÿÿÿ€ï®_‘Ee@ ÿÿüøÿÿŸ ?ù÷ÔHj¶‰ÿÿóøÿÿÿ?ûýÕŠ…ÚÔÿÿÚøÿÿ_ú—¦à¥%Ñcÿÿÿøÿÿÿ@¿õÅÛZ¥šCÿÿúxÿÿÿÿ{¥¢å*eÿÿßøÿÿÿ`ÿ³Ûl7ª© ÿÿÿøÿÿÿ@ÿM¤ÒBåZ„Cÿÿÿøÿÿþ_ÿ¶ë™ü£ ÿÿëøÿÿþ@?ÿÛtôG›h$ÿÿÿøÿÿÿ¿ÿíÕÊÆõÙÿÿÿøÿÿÿ€ÿ¶x}«*†ƒÿÿÿøÿÿþ@?ÿÞö¬Ev¶  ÿÿÿøÿÿþ?ÿ×mV—Ú‘Bÿÿÿøÿÿþ?ÿzz~ë$ƒÿÿÿøÿÿü@ÿÿÞ½›gx–bÿÿÿøÿÿþ@ÿÿµVžÖ’ýÿÿøÿÿý ÿÿîn·gÝH¨ÿÿÿø¿ÿþ@ÿÿïûVWª‰'ÿÿÿøßøÿÿü~¾¯õhPGÿÿÿø‰§ø„ÿÿùîSV®†/ÿÿÿø]øÿÿÿu®¯óªÿÿÿø6øÿÿý~¾7û˜ÿÿÿø‹ù ÿÿþÙS¯ÿ£@ÿÿÿøòÿÿÿ~ª_ÿè?ÿÿÿøø ÿÿý[U§þÖÈ¿ÿÿÿøñÿÿÿüR¯ÿÕ2zÿÿÿøæ ÿÿÿ__ÿø€§ÿÿøòÿÿÿ{&WÿêŠþÿÿøù@ÿÿÿÞ›¯ÿ’1ýÀÿÿøù@ÿÿÿŸå¿ÿê'þ¯ÿøöÿÿÿÿ¾ÿúþMøü€ÿÿÿ?_ÿÿý¿øøþäÿÿÿïþÿÿÿ„Þøÿÿÿÿÿÿÿÿ€}ø?ÿÿÿÿÿÿÿÿ€>ø6ÿÿÿÿÿÿÿÿ“ûø_ÿÿÿÿÿÿÿóý€¸?ÿÿÿÿÿÿÿþPØÿÿÿÿÿÿÿûÿ øÿÿÿÿÿÿÿÿÿÿÿø ?ÿÿÿÿÿÿÿÝþàÿÿÿÿÿÿýÿ÷|àÿÿçÿÿÿÿÿÿöÀÿÿÿÿþ¾ÿÿÄÐÿþÿÿýÿoíø€ÿþÿÈÿçÿð€ÿ[¿øÿϽÀ€?¼ÿÐÿÏÿPtiff-4.0.3/test/images/README.txt0000644000212300117540000000116011246013437013310 00000000000000The test files in this directory mostly have dimension 157x151. The naming convention is photometric-channels-bits.tiff minisblack-1c-16b.tiff minisblack-1c-8b.tiff miniswhite-1c-1b.tiff palette-1c-1b.tiff palette-1c-4b.tiff palette-1c-8b.tiff rgb-3c-16b.tiff rgb-3c-8b.tiff logluv-3c-16b.tiff: logluv compression/photometric interp minisblack-2c-8b-alpha.tiff: grey+alpha BMP files (anchient BMPv2 since v3 does not work): palette-1c-8b.bmp rgb-3c-8b.bmp GIF files (anchient GIF '87 since modern GIF does not work): palette-1c-8b.gif PNM files: minisblack-1c-8b.pgm miniswhite-1c-1b.pbm rgb-3c-8b.ppm tiff-4.0.3/test/images/rgb-3c-8b.tiff0000644000212300117540000021345611244340172014062 00000000000000MM*Ú¢45±EK¬=F¶@N¸;R¾;Q¿²#"¯!¶'#¼-&¾,&¿)%À*%À)%¾%%¾&&Ä+'Ã+)Á('Á0(¿;,»<+´^1ºÁX¾ÓzºÊ„»ÏŒ»Óž¿Ø¹¾×¸¼Ô¤»Ó¤¼Ô­½Ö³¼×¶ÀÖ·Àس¾Õ«½Õ«¾Ö¯½Õ³Èå×[\BZ7~•A²Ø²ÐœšÄf—½Vv›@€µV—¾g‘³b‘«SŸžUŸY8œ5"¤:#§@$¤5 ¦=&¤@#˜^)ˆ„7|‘;y¦E…µJ‘¿M—ÄRœÈS¦ÌW¦ÌZ¦Î[©Ï_¬Ñd°Òg­Òl­Ôm¯Ôl­Ñj¦Òh¢¯V¬d;µ[9¨W8wX7dy>o‹Cq›Gr Ks¡Ku£H}­N‡·P‘¿UœÇYŸÇX¢ÊYŸÈX ÇXÄTš=#ºV+³K'´Q&³N1°L'±K$³J(³H&³M(³@)³I(¸P-·M,µK/¹P3¸N4µO5µM3¹R2¹J3¹J2ºN1¹J2ºI0·J.·F-²C+œb/ž¬JµÖrÀÙ¿Ú¹Ö‚¬Çt’¨X†“DˆD§¯P½ÇiÃÏ„ÆÒÉÔ—ËÖ¬ËØ¶ÌÜÁÍáÉÎáÉÌàÃÈÕ¼ÇÒ°ÄЉ»À_œ¡I†¢N•»_¥Él³ØÅÌy¼fE¶&!¶,$»-$¾1$¿.%Â0%Å1&Ç1'Æ7(Ç6)Ç5'È8)Ç7*Ç3(È3'È4'Ë5)Ç<)Ät=ûaÂ߇ÁÛ™ÀÕ£ÂÛ³ÁÙ®¿×ª¾Øµ¿Û¹ÀÙ»ÁÙ¿ÂÜ¿ÀÚ¹¿×®Àת¿×©ÀשÁÕ~j6we*y<˜¸oºÜ±³Ö¬°ÒªÐ†¡Èr‚³H›ÌjŸÌi„·K¸P›Âk•‘I“L,-ž4¡9’> ƒ{2•>‚¨E†´GŽ»K”ÃM™ÆQÈP¤ÍS¥ÌTªÏX­ÑX®Ó\°Ób¯Ôi°×p°Öl±Öi°Ôk¥Ðc¤šK¶[5¢M0nS.kt7y…>dŽ?`’@h™Dx©J¶Q‰½R“ÃV ÉY¤ËY¢ÊZ–ÃV•ÂUŒÃR“9¶O)³L&°W%±W1³Y*´b&¶j,·v-ºy.¸t2µb1¯I*¯A'±C(µI-²N5³J2·L/¹N0·J1¹M.½Q0½N0¼Q0ºN/¸M1ºK0¹E,¤Q,™ˆ;¤¿Y´Øv»Ú‡»Ù„›¸aƒŒ?‡“J¥±X½ÈnÄÏ„ÇЇÊÚÎäœÍãœÍá§ÍÛ²ÏÕµÍÙªËá³ÇÞ ´Â_™¢IŒ¨UÁiªÑoµÒs¹›d¼U9Â:/Á2)¿0'À-%¿.&Á/&Ã1'Ä/&Ä2(Æ5)Ç3)Æ3(Æ4(Ç3'Ç4'Ê7)Ë9+È7*É6+Ç-&Æ;&Ãz@ÊÑ‚Èç©ÃÚ­ÁÚ¶ÁÝÂÁÜÃÁÞÀÀÚ¼ÁÚÂÂÝÂÁÚ¸¾Ö«¼Ó¡ºÒÂÚŠ¤¥^tc/{v5€ BŸÊm½Ý¶µÖ¬¶Ù®¿Þ˾ݢ“¿X‚²S•Âf–Á^‰¸I‘Ã\œÑk™Åb‹z=_ tŒe)‚–=‡¨I‰µMŒ¹I’¿O™ÅM›ÇR£ÊS¤ËV§ÍWªÏ[©ÍXªÐ[«Ñ^°Ôe±Õj²×p²Öo²Ôm­Õi›Á[ªp<–@.nE)~j3†ˆ?nŽ?h—Bv¨J„¶O‹¾V”ÄXœË[£Ì\¤ÊZ ÉX›ÇY—ÁR‹¿QW,»Œ@¸‰2º-¿˜-Àš/ä3Ű6Ç»:Ⱦ<Ⱦ?ƵCÁ•=µV+ª;'¯A+´E/¶C-±=,¯A)±C+³H-³J.¶I,µD*µG.´G/²D.´G/·C.¬8'šP(—‡;œ°R¢¾]ŸH|~8ˆ„>­¶ZÁËrÇÔ€ÉÛ}Ľg¹‹Kµb9·O0¹A8º4>¼<,ÀX;¾uB§?—¹R§Ör¯Út³±Z¬J-§¶*#Á5,Á0'Â-&Ã/%Ä1&Ä1'Å.'Ç2(Ç2(Ë3)Ë3)Ê6+Ë6)Ê4*É5'É8'Ê6+Æ3*Ç7*È:+Ä7+À-"¿H(Ä¥`Ëé¬ÉèÉÅßËÁÝÄÀÛ¹½Ú»¾Û½¾Ú¶¼×«¹Ð˜¶Ë¶Ëqž¤Rsf/„‡:‚‡7…£EœÂQ¼Þ¹Ø¯´ØŸÆäž¼g±Q‘ÀdŸÊ|©Î„“ÀP’Â\ŸÉoÌk Öhu…;Q?ƒ9„¢G‚­P‡´J‹¹H’ÁO—ÆP ËS¥ÍU¨ÎW¬Ï^¨Ï]¥Í\©Ð]­Ò`®Ôd¯Õj®Ôs±Ôs²Õm°Õh”É]‡z?x1%k9%…k4…”Cl›Ep¤H~²L‡ºSÁX˜ÈY›ÊY™ÇXÇY›ÇWšÈY–ÅV‡ÀR’†?ʾKô:Æ·5Ç·3ȵ5ɺ7Ⱦ9ÇÀ<ÈÄ?ÇÃEÇÃGÈÈGƪA²W.¡2%©7(­3'©5&§1#¥.#¤3%¨>'ª9%ª6%¨8&¨8$«5%¨7)©3&¯3(¯2'¦3&˜9&@'tP(n0‰9­®R¿ËfÁÇkÁn?µ&´¼ÆÊË Ë ÌÈÃ%!¾N.µuB·e<¾2&Á$ Â-$Á,"¾+%¾+%½,&¾-'Á0&Ã0(Ã/'Ä1&Å1(Ç/)Ê2)Ë6(Ê5(Ê6)Ê7'Ê6)Ë6)É7)Ë8)Ê8+È9+Æ:+Ç6)Á2!Áo@ËÑ•ÎñÍÇàÈÂÚºÁÚ·¼×¯»Ô¢»Ò‘·Êy°¾a£°[k^2iT&‰~7„~6©J™»I³ÙwÂ⮲Ô~«Ðwl–8’¿i¹Øš¯Òƒ£Êk¢Ê]¥Ëg¨Îz¨Í{¥Ìp¨Óg™¸Q}•={ H¬N†¶JŒ¼M”ÂP™ÅQ¡ËT¤ÊV¥ÌU©ÏZ¨Ï]©Ïc¬Ñ^«Ñ^­Òc®Õi±Õr²Õr±ÔmªÑfŽÁZomƸ6ȼ7Ç»6ȼ9Ⱦ8ǽ<ÆÁ@ÇÄBÆÄHÆÄJÇÆIÊÉKÆ@¦9$™&"›'!+˜0$–H-ž?+›, ˜'š)!—'–#–"ž'!£' ¢#"¢)"§,&¬(%ž5(‚C(ƒ>$‹`0¤¦Oµ±]ÆV<ÀÀ!!Å#!É$!Ì'#É($Ì'#Ì)$Ê(#Ê'#Ç'$Ã$!½¾¿&!Á'!Á) Ä-"Å.&Ã,'À.%Â0&Æ2'Æ0'Å0&Å/%Ç0&È2(Ê5)Ì5)Ë6*É6'É4(É5)Ë9)É9+Ê8+Ç:+Æ:.Ç:,È<)Æ>-À0#½B$Å¡iËç³Å⽿֯ºÓ ¸Î‰¹Êr¬¶V¡¬N‘žYso3qQ&rEwi*ޱYˆ£E‘µI¢Äf›ÄZ‘¾a~®X§Ð„»Úº¢Æg–ÀdœÇa±Ô{®Ñ’­Ñ‘®Ò„§Îv¥Í]•²Lv˜BªLˆµF‘¾M”ÁO—ÄO›ÄPÅQžÈQŸÈR¢ËX©Ïa¬Ð_¬Ò_­Òb°Ôe±Ôj¯Òl¯ÓiŸË_µTRU.0 UD(h”Fu°Pv«Qn¡Jx©K€²Oƒ¶R„·R‚·R}°S~°P€¯L­O„±N€·Ož‰*ÏÅ<ÆÀ:ÈÃ<ÇÃ>ÈÅBÈÆCÆÁFÆÂMÅÃRÅÅ`ÅÅaÈÇYÈÅRËÁM¹a-š $›%•a3‘¡P–ˆIŒT+|R)€d/ˆ_.O,•1%˜–šš  #"ž""¤J/”Z3ˆ4!’c1¥£ZÈ[HÈÃ"Ã$!Ç# Ï'!Ï("Ì&"Î("Î+%Í)"Ë&"É)#Ä,"Â)"Â,$Á+"¿)!Á,"Ã/$Â-&Â3'Â3(Ã.%Ä/%Å0&Å1(Ç1'Ê2(Ç3(Ê6)Ê5(Ê7*Ê5'Ì4(Í4*Í7(Ì5+Ê7*È9)Ç9*Æ<+Ã:(Ã9)Å<*Å7(Â/Àf;ÅˈÁß¡¹Ì‡´Äk«·U Ÿ@•Arg8x}Žª[‹¤T{žAt¢B{«E­F‡«FŽ’B”e5›7&Ÿ¡!¦"#¤!#¯O1 Y3‡1"xF¾oUÏ$&Á ÂÆ#!È%#Ê$"Î'"Î$!Ë$"Ë("Ë)#Ç(#Ã% Å& Æ%!Å+#Æ,"Ã)Ã) Æ,&Ä+&Ã0&Ã1'Ä-%Æ0%Ä3&Ä1&Ç0'Æ1'È3*È3)Æ3(È5*È4)È4(É2*Ë6*Ê2)Ê5)Æ7(Ä5)Æ7)Å9)Å7(Ê9*Ë=*È:*Å."ÅI%ħ[·Èkª­K§’=‘^+tf5z†HJ€‚=s_*{>–Æf„®KšÅZšÅ`¸J«Ñl½Ü®±Ï–³Õ ¼Ü½ÀÚ¶˜¸bžÄ{ºÜºÂÞÒ¿Ýͷת°Ó}ªÏe¦È_}¤D‚®C‚²Hˆ³IЏH½K’ÁM–ÅQœÈW¥ÌZ¤ÌZ£Í]¦Ï_©Ð^ªÏa©ÐeŸËc“ÆZ‚¸UhG;!)^@wµS~¶R|¶Ts¦PkœGn¡Hv§M{¦M{¦Lx¨L|ªM®N…³Q‹¶R€ºSšŽ/ÍÍGÅÈGÇÌRÈËVÈÎ]ÉÑ€ÊÙ²È×¶ÉÞÄÊßËÉÑ•ÊÊ\ÌÅFξC¾e/™C)ŽQ„ŸS{žDz«D~±G…µIЏM‰¹N‰¸N‹¹N¡G™Y2“‰)…-X6ªbË12Å Æ!"Á!Ç# Ì#!Î# Î&"Í'!Ë'#Ë'"É& Â$!Á% À$¿%"¾'"¼%»'½'¾)#Â+'Ä-&Â.&Â,%Ã.%Ã.&Ã-&Å-%Å.'Å0(Æ3'È2%Ç2&Æ4(Ë5)Ë4)É5)Ê5,Ë6,È4)È6*Ä4*Å7*Ã6(Å7*É9*Æ7)Ä;)Æ7'Ê>%Ã|9`.w3n7ŽŸ`§Y‡Nƒ‰@|W)y…6•É^„¤H‡ª>¯Óm´U‡°A©Íq»Ü³½Ý½¾Û¨®Í{­Ïw¶×˜ºÛ¾ÅàÔÄàÒ¼Û´´Õƒ®Ïj¯ÐaŒ²Nw¤A~¯H‰µK޼J’ÁN˜ÄQ ÊU§Î^©Ïb©Ïa¦Ðb¨Ða©Ï\¨Ñ`ªÑd›È^ÂZz°R_r9,)'h¥Jx´R{µQ}¹Tz²To£Mi™Iq¢Nw©Oy¨Lx¨L±O†·Q½U–ÀUˆÂS©’4ËÐLÄÉKÇÎSÇÎVÇÎZÉÐ`ÈÍdÅÊlÄÍ…ÆÎ“ÈÇmÈÃIÌÂDÌ”6¨9!‰6!…G„ S|ŸAz¦A„³F‰·G‹¸J‘¼N“½P’½P’ÀTÁP¶O`5L 8*HŒŽ]Ìh]É"$ÁË"#ÂÅÊ! Ë%!Í% Í$!Ì$"Ê$"Æ# Ã%!Á)"À& ½%À) À'½&º&¿( Â+%Ä+'Æ0(Ä,'Ã-%Ä/(À.&Á0&Â0(À0'Á-&Â0%Å0&Å0(Ç1(Ê6+Ë5)Ë4+Í8,Ê6*É7+È5,Ç6)Ä4&Æ7)Ê;+Í;*Ë9'È;)È=+ÕB,°8%3_W0ž»~‚ŽM~ŠB€€;xZ-rd/‹¶N„¦E|›=—¼V—¾Z†­H‡ªG¸ØªµÕ–¨Ì{ªÏŠªÏ‘®Ó¨¹ÜÆÀÞË»ÝÁ¹Ù¤¸Ö…²Òu¬ÐbŸÅ[~«E„·M޽O‘ÀM—ÄOÈT¤ÌX©Ïa©Ðg¨Ðf©ÑeªÑc§Ða¢Î_ Í_–Å[‰¹Uv¤LUW.*@F!r¯N{²O{³O|¶S}³Ny°uq¥–m¢hu¦Ly«M{®MƒµP‹»S”ÁW›ÃV‘ÆT°”8ËÓQÈÊLÈËMÈËMÇÊMÇÈKÇÉ^ÄËŽÄÍ¢È×½ÌÖ¹ÊÆl;EÊt/r dr7…Hz¢C{ªC‚³I…¶IйK½O‘¿Q’¾U“¿W¿VÁTÂUŒ­QQ'-fR/ªhÖIMÉ Æ!Ì"$Ì"#É Ê"Ë&"Ê&"È""È"!Æ$"Ã"!Â$#¼(!¿&!Á& À&¾#À À# ¾' Â)#À("Á,%Æ/)Æ-&Ä+%Ã/(Â.'Ä/'Á.&¿*%À+&Ã0(Á.&Ç3*È4+Ë4)Ë4)Ë5+É5*È6*É4,Å5+Á3)Â7*Å7+Ç:*Ê<,È9)Å8%Æ:)ÐA-¥6ŒP‹«l‰J‚=“v6‰M(x[.s3‡‰7žA‘µQšÀ]™¿`—º^«Ì|©Ï{«Ò𳨾½ÝÍ¿ßÔ½Ýѹܱץ±ÕŒ¶Ö~·Ö€¬Ðh©Í_޹M‹ºM‘ÀR—ÅR ÊS¢ÌW§Í]©Ïd«Òf§Ðh§Òf¥Ñc¢Î`Ë]•È[ÁZ~®QjŠ@G06Xk1p´Qx³Pu³Oy¶Qy´R|´¦~³³sª™s¦H{©K|­N°P‰·P½TšÂWÅSŸ”8ÎÐNÇÇHÉÉGÆÇFÇÆAÇÅ=ÇËjÉÚ¿ÊÚÅÍßÄÍÛ·ËÌs̱?ÂT%l …T – I}¢Hz¨D±G‡¸J¼L½P‘¿Q¿S¾X޼[޾VÁU‡½S|ªKi:"n †ˆT³}bÖ@IÅ"#Æ É!$Ä É !Ë##Ë$"Ë#!Ê$%Ê%"É'#È(!Ã%!Á$!¿$ À%!¾$¹'$ªW:¾NEÀ&À'#Á+#À+&Á/'Ã-(À.(Â.)Ã-(Ä-*Ê00Ç.-¿/(»)#»,%Ã/)Â/)Æ6+È2*Ë3*Ì5+Ê6+É4)Æ4(Æ6*Ä5(Â5(Â7)Á3(Â7(À7'Â9(Ä:)Ì?+½\5{H‚d6]0‡T+‡Z0Œ†HŠe.Ž—@”µO•Á\™Åb¤Ím¬ÒzªÐ©Ï…±Ö©¾ßËÉãÙÉâÚÂàѶڴ¯Ô–°Ò‚´Ô}¸×‚²Óo¯Ð]ŸÄSŒ»M’ÁR–ÄR¡ÊW§Ì[«Ïb«Ñf«Òg©Ñg©Òf¦ÐbœÊ]”Ä]ÁW‡¶TsšI]X)8 ? e€9q³Pv²Qs±Qv´OwµLy´w{²š}°ru©Kq¦J{¬M~°O‡¸QŒ½RœÄU’ÇS˜’1ÒÏJÇÆEÉÈDÉÇFÊÈAËÈBÉÇJÈÓÉÙ¥ËÒ†ËÏmËÇSË€0ª#†/‘ƒ5„ Hz§I}±M·KˆºM޽N‘¾O¼O¼[–ǛƓ¼h‹¸R}±Mn‡;i)• –Y6’¬l½oYÕ7<É"Å É""ÃÄ!!Ç$#É" É#!È$%È#$Æ&#Á$ Â$ Â$"Å&$Á'"¾&$—pB} Q’–}·siÇ4*Å,$Æ.'Ä,%Å/'Å0)Â0(Ã//È36Ë48Ë26Ä3/¿+%»+%·'&¹*%¿0(Ã/)È0*Æ3)É4+É7-Ã3)Ã3(Ã7(À7)¾3&¾4'¼3&¼4'»2'Á6(Å;+É5'Ë;&ÇG,¸R-›P+Že4r7‡y0Ž£@•µIš¿PšÃU É^©Ím¬Ð«Ò’±Ø­¹ÝÀÀàÉÁà˺ܹ²Ö™¯ÕŒ¯Ó€³Õz·Ö{µÕs¯Ñc¥ÉU“ÀP—ÄU–ÃTŸÇ]¥ÌbªÏi­Òg¬Òi«Òh©Óc Î_“ÃWŒ¾W‚³St¤Kgr5?$@ a‘Bn³Qt²Or±Qx³Nz¶Pz´P{³T²Uy¨Pq¡Hy¨M„³Q‹ºR‘¾T¡ÇV•ËW™”1ÕÑDÊÈ@ÌÉCÉÅDÈÃ>ÈÆAÈÅCÇÅDÆÆLÈÁD˾@Ì4»; ž#™o/šA{@|©EµM†¼LмN¾O‘¼OŒ¸T˜Æ’»ÝÔÃàÚŸÇ|­Lp˜A\@Fv,Š–N“¡dÄ\NÖ05Ë!"È!"É"#Å Å !Ä "ÉÉ$#È%#É$#Å%"¾"!À#"Ä(&Æ+(È$&­Z?z¢O†ªvªÏ¸«·¿;*Â)$Â/)Â,'¿+$Á-(Ç/-É18Ë6<Í:>Ì6:É52Ã0'¿)$¿,&¾-%Â.'Ç/(È1+Æ0(Ç2)Ê3+Ç5*Ã5)½3)»2'»4'¼1%¹/%·3&·3'·6)»6(¿4'Ã7&Ê9(Ñ@*Õi0¿…9™c+Œp/˜;“®B™¼M™ÀSžÇ]¦ÌkªÐ}­Ó“²Ø§µÚ«·Û­¶Ûª°Ö“®Ó­Óx¯Óv³Ôu´Ôq¶Öy¯Òk«ÌYœÅUžÆXÆVÉX¥Ë]©ÏgªÐc­Òh­Ñg©ÓcÊ\½S„²Qy¤Li};M,( @#cŸIs²Py³Qv°Ps¯Nt±Pz·V}´S~³Wt¨Qm¡JwªQƒµT½U•ÃX¡ÆV”ÉW™Š1ÐÆ?Ç»8ÉÀ=Ì¿>Ê¿9ǽ>Ç¿@È¿BÈ¿CʺAËŒ4¿B!–“=“7œCw B}­Eƒ¸N‹½PŒ½O޽MŠ·N’À†¼ßÕÑêãÍèÕ™Àwo™?aT$=4so5†¡R”WËMHÑ*1Ê!'Ç!$Ç"%Å!#Æ"Á"à #Æ!#Ç!#à !Á" Á""Ê()È-,È)&Â30—T‚²^­Ðµ­Ì–­yCÅ' Ä.'Ã+'À)%¿*%½*&Ë30Ì6;É6;Ê4:Ê26Ä/,À-)Á.*¿,(¿,(Â0(Ç1*Æ2*Å/)Ä0'Ç2)È5+Ç8+Ä5*À7(¿5&¾2#½3'»2&º1&½5)½4'¾4%¾2#Á2$Â5'É9'ÓS,Ïq4²z3•8¨A—´Kš¿SžÅX¨ÍhªÏvªÑ€¬Ó†®Ó~±Õ¯Õ‚°Ôx°Õs®Ón±Òt³Õx¶×s¸Ø}´Ôu®Ð\›ÅXžÈZ£ËZ¢Ë\§Ë^ªÎd©ÐfªÐe«Ñd¥Ña½W}¬OsIey7G.&!!A*i¥Lt²Ry³Py¯Qy®Px¬K~´P}´S„·Vx®Up¤M{¬Q„´T‰¹SÁWŸÇY”Ë[sk+„Ž4….‰–5 £8º´;Ë¿B˼AÇ»?ɺBÉ–4¿I#œŠ“q,‚™;yŸBw©D|³Kˆ½PŠ»P…ºP„µQ‡¸u°×ÇÍéÞÐëÖ«Ét‘>fZ*C (T@‚¢Fˆ©P¡RÐ@=Î'/Ë"(Ê %È!%Å "Æ!"à #Å#"Ç%#Ã'$¿!"¼ Á"%É*0Ã..É)-£kK~«W›Â‘µÕ­ª·iÂ<*Ã&#Ä+'Å*&Â*%À*&¹'$¼+'É34Ì46Ë05Ç/.Ã/)Ã-)Â-'Â-'Ã-(Á-&Ä0*Å1)Å4)Å2*Ç2)Æ5*Ç7*È8,Æ8,Ã5)À6)Á4(À4&½4&À6'Á6'À2%Ã3&Ä5&È6&Ç2&Ç0$Ê3&ÏE)Åv1£«>“³H™¼PŸÅX§Ëd«ÐlªÐm©Ïh¨ÑbªÐ_­Óe°Õl°Öt°Öt´Õv´Õs¶×s·ØyµÖy¬Ó\šÆW™ÆZ¥Ï^¥Í_¥Ì]ªÐ^­Òg«Òe¦Ð_šË]{¬Mi‹?ac/E##!;(m¥Jo¯[x³Zv°Pw±Qr«M{´R{¶T€ºU¹\x®Uy«Q…¶WŠ»U‹½T–ÁVÇ\^d!b1g3k—7m›;xœ;™«A¹¶DŶ@Ä/¸G™uŠHŒ–;tš?s¥Bz¯F†¸MŠ»Qˆ·N‡·T–Ä­ÕÃÉæÚÊéΟÀq~2bHH *@ }Š>ƒA¥J/³/*Ð03Í&/È!(É 'É %Ç!$Ä!à Ä#!À!!À ¿!!¾! Å$(Ç21Ê/1¸XI€—V‹¶l³Ó¸¥Ì´j; !Ã*%Ä'#Å,%Å.&Á*&¼(&º+'·(%Ä--Ê23Ä-,¾+'¿,$¿+%À-'¿,(¿-(Ä/)Ç1(È4*Ê5+Ê3*Ê3)Ê6*É7,Ê6+É9*È9+É8)È8(Â3&¿5&À6'Â3%Å4'Å5'Ç4&Æ4%Æ4'Å31Æ1%Ê- ËY(¶«?š¿O›ÀU¢ÈZ§ÎY«Ð`¥Ï\£Ï]£ÏW¦ÐU«ÒX­Ôh­Õq°Öt²Õm´Ör¶×q¶×s¯Ó^¤ÌXœÈW¦Î]¨Ï_©Î\ªÑZ¬Ób©Ñc£Ï`ŽÂWh‚8SC@&-kBv±Vz²Wu²Pw²Pq«My±N{¶Q¹U‚¹[|²[|¯R„¶S¾U‘ÀUšÄVŽÇXfn#n§;y©=y¬@w®?{¬A|¨B‰ªA±A¨†2“ gy"”€6z™@lžBs©B~µM†¼Rƒ¹O€´Kˆ½m¶ßÆÌëÚÀåÂ’²mfo,W6?+'ƒV:½Z=¿ !µÆ*2Í+1Ì%.Ê")É (Ç!'Ç!'Ç !Á!Á "À "¿!º »Ç..É25ÃNB‹”]€§UšÃްנ¥§WÂ+$Ã&#Æ(#Å'$É/'Ç/(Ç,%Ç-(Ã.'½,%»)'Ä.*Ã+(À,&À,#À,'Á+(Â,&À-'Ã.*Â/(Ä1*Æ3)Ê8,Ì8,Ê6+É8-Ë8-Ê7+Ë7+Î>,Ð>+Í9)Æ4'Ã=(Ã6$È2$Æ6%Æ4&È2&Ê4&Ê2)É3"Ç6"É)ÍA ¾¦HÉYšÁS¢ÉU¢ÎYšËWŸÎX£ÐT¢ÏS¤ÐV£Ñ]¨Ôj­Ôm­Ôg°Õkµ×kµÖn¯Ób§ÐW£ËY¥Í^«Ò`­Ò`«Ñ^©Ñ`¥Ða Ð]…µPO?1+ c‰;s³Ru³Rt²St±QqªMr¥Hv­M|¶T€¸Z…¸`„±Uˆ¶R‘ÀWšÅV§ËX˜ÌXrt(m­>v¯A}³E€´A„µFºHºF޹GŽºJ…f*aY(Š™Gr˜;t¨C}±G…·Qƒ·N~³K}²Sƒ·aŸÈ‡ªÏ’~¡U_Z!N 8*$C;ÑB=¹­¿*2Ë8=Ë%-Ë%.Ê$+É!(Ç!&Å"(Ç"# "Á "Â!"Ã#À"$¾!"Ç+,Ì>:™qLqJ–¼t£È˜ Írµe:Á!¿+&Â)%Æ,'Ç.)Æ+)Æ*%È-'Å.(Â*&Ã*'¼*&½,'À-'Á*&Â,'Ä,(Å,'Á+'Ä.(Ä1*Å1)Æ3(Ë5*Ì8-Ì8,Ê6,Ë7+Ê9,É8+Ê;*É9'Î;*Î:+Ë8)Ä6&Â2%Æ5'Ç6'Ç5&É2$É3#È1"Ë5#Ë5$Ç, Ì>%®J›ÈQ–ÃQœÊV›ÌY›ÌW ÐWžÐXŸÐW¢Ò_¦Ôi¨ÓlªÒb­Ôf²Õi³Õh¯Ôb©Ñ[¨ÏY¥ÍZªÑ`­Òc±ÔjªÒa¤Ïc›Ñ`r’?% !$ax0r±Su±Qv³Qs°Us®Si¢Lj¡Iy²Q·V€¶^~²Vƒ´Q‘ÀV›ÆU©ËVÏY{|,r³?{²A„¹G¶B‡ºF޽I‘½I—ÁM•ÅO‹µG}Q"~p,r›CmŸ>x®D€¶I{±JtªIv®T„ºn†¸cw¡Aj…2]MI6,ƒ3,Ý=8¾³µ Ê:@Î7>Ï(0Ê$-É"+Ç"(Å 'Ä"'Ä#$À!$½!"º!¾#» #½#Ã'¯gKt{I}™Q¡ÃˆÉ…£«YÁ.%Á'#Â)$Ç+&È+'Ì1*Î.+Ê,(Ê-*Î.,Ì3-É1(¾,)¿,)Ã*&Ã*'Ã-)Ã/)Å/+Ã-*Á+(Á/)Â0)Á/(Ç2*Ë4+Ê9,Ê9+Ê8+Ë:,É:*Ì9(É8)Ì:*Ë6(Ì9)È6%Å6&È5(É6&Ê5&Ê4'È5%Ê3$È2#É5$Ë6$É0"ÎE$º¶F—ÉPšÇSœÍWŸÏX ÐYžÎYÏV£Ó[§Öe©Ôh¦ÒZ¬Õa±×j°Õh°Õe­Ó]©Ñ[¢ÍY§Ñ_®Ôg®Õk«Õi¤Ñ`•Ð^Zb)"&Q\$i¬Nq­Ot³Su¯Uw°Tq©LlžGx¬O·U·[´]„¶TÀUšÅVªÎX¢Ò\x0x¹C{³@‚ºH‚·EŠ»F¾I“ÁL–ÂK”ÂM‘ÀOƒ™Àº¹Æ-4ÎKMÏ·B„¹E†»E‰¼D‘ÁK”ÂL’ÂM“ÃO~ªDb2g˜=r§Br¥Dw®lœÊ°ÄçګѤ¨Qo€5U3D /'!;ÉSLÒ1/Ã!&À"Å$+Ê;@ÎKJÍ7<É",É",È#-Æ+Å (Ä&Ã!$À$À½ ·#¹ ¿'(—sLewA¦U›Àv™Ìq­ŠIÆ%$Â&$Á%"Â(!Ç)%Æ)%Ë.)Ì-)Ë-(Ì.*Ê2)É+&Ë.)Ê0)Á,'Å,'Ç.,Ã,)Å0,Æ0-Ç.,È0,Æ1-Ä2*Ã3+Ä3)Å4(É8+Ê7*Ê9*Í9)Ì9+Ì8(Ì8'Ê:(Ë9*Ë:(È8'Å5%Æ6'Â3$Å5(Ç9'É5$Ë7%Ì6%Ï7#Ï8%Í4%Ï6$Î/"È‚4™ÐSšÈVÍXšÎU—ÌUœÎS Ñ[¥Ó[§Ó_©Õ]«Õ^®Øc°×g±Ùf°Õc®Öb§Ò\¢Ö[²áe±Ûc«Øc Ö`‡´P@ ##)+-<C Q*^K'kw:k™Hl£Mo§Kv¬Ps¨QqªTdœH]Bn H€¶Y}°X€´RÀWžÊZ«ÏXžÑVix&q®:s¬;€·>€¹B„¹AŒ¾C‘ÂG—ÅH•ÃMÂL~²E]…0gš9p¤Dƒ¹†µÝÐËëÚ±Ó¢y”I_b#N! <+&%$¤UJÞTJË./Ç#)Å!'Ë/4Í9>Ë25Ê*0É#-Ê#.É"-Æ",Å"*Æ &Æ"'Á"'À"¾!¼$¼ ®VCs‚Me‚Aƒ¯`£Ë…Ÿ»e¿F6Æ%'Ã''À$$Ã'$Ä'%Å(&Ê*)Î.)Î/(Ï.)Ï1)Ñ0+Ï0*Î3*Ç,(Å,(É0+È.*É/-É3.È1.È0/Ê5.Ç5.Æ1+Ç4+Å6)Ä5+Æ3+È7,Ë9)Ì:*Î;+Ï9*Ë9)Ë:*Ë9+Ë7'Ê7'Ê6'É8'Ê3.Ê8'É6%Ê4$Í5%Î5$Í7%Í4&Ò8&Ò;'ÓA$Á¯@˜ÌP•ÇS™ÉQ˜ËS˜ËS›ÎU¢ÓY£Ó\¦Ö\«×[­Ùb²ÛgµÝe¶Þg¯Ø`ŸÎXƒ¢Dy†=s?m‘AoGqžImƒDh_4O$CS YcG$m€>j›Ho­Sj±Tg±Wj²Xj²Ui²Wl°Zo­Wk¤NaFe—C|²V}¯U„³N‘¿UÇY®ÎX£ÒWcs%j©6p¬¸@€·@‡»@¾A–ÃF‘ÀIнHµKd“9k¡7„¸l¿ãÑËéΣÆo‡8^NO :,)#SÜtaÑE@Í/3È(,Ç#*È(/É+0Â#&Ã%+Â#+Å$.Ç ,Ç#+È#*Å#(Â"&À%¾ #À#Á!À))“‹Ym“L¬PÄxÎu®{FÆ(-Ä++Ã')Ä'%Ã%#Â&%Á'&Ç+'Ê,)Ì,(Ï.)Ï2+Ð1+Ð2+Ì0*Ë/+Â-'Æ-)Ë1-É0-Ê/-É1-É40Ë4.Ì5/Ì4,Ê6.Ê5,È5+È7*É9-Ì9+Í8*Ï7*Ð:*Ð<,Í9)Ì9)É8)É6(Ê6'Ê8(Ê6'É8'Ê6%Ë5%Ì7%Ë8$Ð;'Ñ8+Ñ5%Ò9&Ñ6%ÔT)É6 ÈM’ÅP—ÈS–ÉR—ÌS›ÑV¤Õ[¦Ö^¬Ù_³àb¯Üb¢ÑX‘ÀR~¯Lg›CKT(FI$V|:UŠ?[”CbœHsµ]„Åk„·cŒMpZ2OG#Ux6a–E_¡Gb­PmµVp¶Xs¹Ys»]p¼\t¼aq¼`n¶[kª`iŸK{¬Uƒ±V„³O‘¾RœÆW­ÍX¢ÑUht'j¨7q«7x³:·=¸@‰»C¿E“ÁIŒ¾F„ºD~µJf˜9o¦=ÁqªÏ˜³hhƒ6^HI3+$#9'ÞbQÐE?Ì./É#(Æ&Æ %Ä!&Á#À$Å!(Å)È *Ä!*Æ )Ã"(Â!%¼%¼#½#½«VCz›X}£I»g¤Í‹ Åg½Q8Ç+1Ä,-Ä**È)'Å($Ã(#Ä)%É,&Ê-'Î/(Ï1)Ï1)Ò2*Ñ2+Ï0)Ï.,Æ*'Ã,&È0+Ç/+È0,Ç1.Å41È2/Ì5/Í7-Ê7.Ë7,É6,Ê7,É6+É7+Ï8*Ò:,Ñ=,Ð:*Ñ<+Î<)Ì;(Ë5'Ë8(Ì8(Ê6&Ì6%Í8$Ì5$Ë5#Î8%Ð9&ÕK5ÖA.Ó6&Ñ6&ÒF'Ö@%È}2—ÇKÀO”ÆP“ÉSšÐY¡Õ]ªÜa«Ýa–ÉW}°NoŸDgŽ;`‡:[z2Rn.Wu4\8b>i Gj§Ms°Vs°Yw¸_ÇlÂdp¦TWŒCYšEe¯Qlº[r¾`n¹^p»^v¾gu½fy¾bvÀfyÂfp¼`i²[mªV~¬Tˆ±O‘¼P–ÁS¦ÉTÐVqz-l¬Bm¦6u³:zµ;}·Aˆ½GÁGŒ¾F…ºE}µDp–6]gpš3„±H}¡y¶@¼E…¾G„¼H|¶Gv±D]U!4S;gh$ja"Z3=1-&#pk4·ŸRÌ4*ÍC<Ì12Æ")Ã!&Ã#Á"À"¾"¿"¾"Ã(à 'Á&Ã!)Á!)¿!(À%À%½²J9w’Us›J޽]ªÍ¨Ö{±IÃ-(Ç73Æ32Ä*)Æ*)Ç('È)%Æ)%Å+%Ê-%Ê-&Ì.(Ï1)Ò/(Ô71Ø=<×>CÏ68Ä+#Å0)Æ0,Ç/*Ê2,È4.È2.È3/É4/Ê5-Ê7-Ë8.Ë7,É7*Ë6*Ì3)Ì=*Ï8)Í6(Ð=+Ò<+Í:(Ì;'Ë8(Ê8&Ì8'Í8(Ê5&Ë5$Ë6#Ì6%Ñ6%Ó:'Ñ7&Ñ7%Ò8&Ñ;(Ò?%È0#Í0 ¿“5‚¿JŠÃN’ÏS{®Fi†1`p+^_$`^&ap,m‹g¡Hn®Pt·Vsº[u½`y¿^yÀcvÃjÆqyÀh{ÃfÁdi±Sh¶Xq¼\t½dÃvƒÃ{Å|…Ä|†È‚ÅryÀjw¿hxÃjp½emµ_z®V‡´QŽ»Q‹ÀTv}5k­Fh¦5s³>w´Bz¶BºE}·H}´Cw´Bq’6S *09?3+&",$$w])ªÏs¸|IÇ$"È31È(.Ä!)Ã%Â%Â# "Â!$Â#Á#Á'Æ!&à %Ä%Â%¿"#Á$Â%Á" OtœS~­O•Àm¡È~¦Õp·u@À++Ä74Ä41Ã**Å'*Æ('È(&Ã*%Å,&Ê-%Ë.'Í0*Ñ2*Õ4-ÙIBÜ^TØqh×_eÌ2/À+%Ä-*Å/+Ç3-È30É1/È3.È3.É3.Ë6/Ë7.É5,È4*È5)È3)È;+Ë9*Ì7)Í:*Ï:)Ï9(Ð;+Î9+Ë5)Í7'Ï7&Ï7'Î6#Ï6%Ñ6(Ñ7&Ò7'Ô5&×9'Ô;(ÖA(Ñ8%É4"Ç2"Ò:"®Ÿ:v®@o/Z[#W?Z6W2^G#cw.n;gŠ8\|2Z€4b“?o©IwµSz·Vw¼]{Àc}ÀbxÁewÄl„Éu€Ån|Åi‚Åi€Ábp¸Zs½]{Ákň‚Ç—‰Í‹Ë–ŠÍšÈŠ{Å{zÄs}ÆttÀkwÀhuºe±Y‰´Q‡¾Pjt+dª?h©7p°/Ò7*Õ9*Ö6(Ô8(Õ<(Ô<&Ñ5%Ì2"Ë4#Ì."ÕJ&IAJK Y+b;eM&bg*hg,eg)[~2\6Ú@8ÛM>Ù‚m×xyÆ,,¿,#Ä,)Å-+Å.,Ç/.Ç2-Å0+Ä1,Ç4,Ê5/È3*Ë3(Æ3'Æ1'Ê8)ÇK,Ì3'Ð6(Ï6'Ñ9)Ñ8+Ô?.Ò=,Ð9)Ñ4%Ñ5(Õ5+Ô=2ÕF5×D;Ô81Ø<+Õ9(Ò:'Ò9%Ð2(Ñ0&Ë3#Ê3"Í."¿1 98U d-j;"lG&n\-hQ&e\(^}1c“:e¡Be¬IhµPo»Uo»[sÀawÃh|ÅmÉp‚Êl‚Èr‡Ëw†ËqÈlƒÅk…Ét‰ÌŽÎ¦–Ó²¦×»°ÛªÙÀ¢ÖºÏ¢„ÇŽƒÊ˜‚Å’~„Åv~Àm…ºd†·Upj%i¦_~*b^#S-V [ K@AT\^b^oO •Àf›Àu”µ_„¯M™n9ÁÁ"Ä"Å(Å (Å"&Æ$Â$Â%Á$À%Ä$ %Á$À#¾!$À"²UB†•ZiˆG~ªX€±P¡Ë|µÔ§·Ó©¬Ù‹´~L¾0-Ä>6Å50Ç,.Æ..È+*Ë+(Î0(Ê/(Ì/)Î0)Ò3,Ô4,Õ1+Ö7.Õ3+Ò1*Ó3+ÔC4×zpÈ7>¾+ Ä-)Ä-*Å0-Æ/,Ê2,Ê6.Ê4-Ë4-Í60Ë4*Ï5+Ì5)É4)Ï1(Í6)Ï7(Õ:*×L9Ԁς{ÏY\Ò?=Ñ6*ÖSDÑuYÔhVÓuÑŽÓ›‡Ú^OØ:+Ó5&Ò9&Õtf×NHÑ4$Ì0$Ë2$Ð5%Ê4!F:R r,|G(m@ hK&fd-a}3]7e BfªKo²NpºVr»XxÀ[€ÄeƒÆkƒÆn„Çt‰ÉyŽÌ‘ЇÏˆËv…Çk–Ж’ЩŒÍœ‹Ì–Ä…ÉŠ‡Ë’ŠÌ›ŸÖ¹¯ÚʸÝÔ·ÛԗЬ„Åy„¿lŒ¼d™?ªËW¦¾L§ÀQµÌw³Çg­ÀQ°ÀU°ÂW¯¾P¬°L££GšŽ9‡\'g QUgdc †£LžÆw–ºn¯T‚ªH’ŒK»" Ã$Ä!(Ä'Â%Ã&Â!%À#¿#Ã!Â#Á#Á%Á#Ã$Ë"®C4˜[|žUs“M†³W…³PÇv´Ô¦¼×µ²Û˜´°hº<-Á82Á0/Ä-.Ä+-Ä*(Ê+*Ì.+Ç*(Ì,(Ï0*Î2,Ï/-Ô4.Ø71Ô4-Ò1)Ò2+Ô,&ÖeNÑgiÁ&!Â.'Ã,)Ä.*Ä2,È4+É3.É70É5.Ì6/Ê6,È6+Ê5)È3)Ì4(Ñ6*Ñ8,Ó7(ØV>Ñ¢ÍÁ²Ìøϖ”ÑIHÓcV҆ЕŠÎ± Î« ÒžˆÛoaÚ:,Ô3#ÒB+Ò–…ÚhgÖ91Î0&Ê2$Ê3!Û@%Ž.LY a"d2kL'_].]€6ZŽ:^De¨Gk±Lo¶QuºX}À^„ÅfƒÄm‚Åt‹ÌŠË–‘͑ΕŽÌ…‡Êz…Æi—ΘҺŒË¥…Ç‘y¿xyÁvv¾o{ÁœÓ²¿àÕÊâÜÍäà²ÚŌLJ‡ÀnÀi©šJÄÙe¿Î\¾Í[ºÈU»ÊW¼Ë^ºÉ^¹È_·Ç]¶Ç\²ÂW¨»J£´Dš6$_`]p]"—Âiš¼r”¹c‹«L~¥C‹¤V¶2'ÀÆ#*Ã!(Ä%Â%Â$Á#¾!Á!¿#¿ Ä$Æ&·'*‹,!s{PxœZoIx¨R½[‹¹V›Ån²Õ£½Úº·ÚŸ·Ë‚¼I6¿--À2,Ä))Å)+Æ*(Å**È-.Ê+,Ì.(Í1+Î2,Î/,Ó2-Ø71Ö60Ó3,Ò4+Ñ.(Ñ3'Ô{oÂ49»'!Ã.+Ä0*Ã3*Å1*Æ4*È9.Ê9/Í6,Î9-Ì:+Ë5)Ë6(Í7(Ñ:+Ó:,Ð7%ÖW8ÐÆ¨ÎÙÌÎÓÄÍÐÄΦÑμªÌ˽ÍʾÎËÁР”×taØ@/Ô3#ÑF3Ñ£ŽÚ…wÚZTÓ=0Ì3&Ì2!Ô=$Ä3 ?@M YenBht4`‰<]‘<^žCh¬Ji±KoµMx»X~Ác~Áf‚Ãn†Ç~‘ÍšÒ´¤Ô»”ΠŠÉ†‰Ê„Ãi”Ê„¬ÚȗεÃx¼ro·ek´_z¾z–Ϭ½áÔÍåßÎåÞ¶ÛÇȉ”Çm’Èk®˜IÂØcÀÎ^¾Î\½Í\½Î\¼Ë^»Êa»ËaºÉ_¸È^µÂXª¶Iœ¥?—•<“`,„*gY „™E™Àq“¸d’¹U‡­K~¥A‚³T¨S4·À!'Ã"(Ã'Ã%Ã"À$¿!Â"Ã#Ã%¬ Š?-mD.H+p’Kx¦Yr—S{ªO”Á\Á^’¿`«Ñ•ÀÜ·³Ó‹ªÎ}wG´43½++Á)*Â')Ä'(Æ)(È-+É-*Ê,'Ë/(Î0*Ò0)Ö4-Ø7/Û93×30Õ40Ô6,Ñ*!ÒfSË[\¾%¿/)Á.'Ã0'Â/(Å4+Å5,È6-Î6/Ì8.Ê8+Ê:)É8'Ë8(Ð6*×%o .JT dn8ki+e‡5g‘:g Bj¨Gp±Ks¹Rt·U~¿cÀeÁpŒÉ“™Îª§Ô»¬×›ЯŽË’‹ÉƒÃl’Çv©Ö¯³ÞnjǢt¸ml³]mµ^}¾yšÑªºáÍÈãÙÈçձᴔÏŒ¾d‡³X¢šKÆØgÁÍ_ÂÑ`¾Î^¾Ía¾Íb½Ìa»Ì_½ÍaºË]¶ÅYª¶H—=ƒ7‹W*†7"tn<˜ºa›»n‘¶Y³Mˆ«G¢@|¬I›‡P±¹Â")Ã(Â%Á$¿$¾!±&(£J2|>,V2&`l>hb:O5dŽDf{FJG#t¥J±O}°Q•Ám©Ê´Ô¦É‚™Ân‘¿n•£`¢R@¾+)À&'Â&'Æ*(Ê,*Í.(Ê-(Ê+(Î/+Ò1+Ó2-Ö4.ÝC:ÚJDØLL×93Ð0)Í?1ÓthÂ/+º*$Â.(Ã/&Â1(Å1+Å4+É6,Í8/Í;0Í7+Ì7(Î8(Ì7'Ð9*ØA0Ö:(ÖT=е–ÎÖÀÏÝÎÎÚÌÏÙÉÐŲÐͶÐÛÊÐßÐÐÜÑÑÓÃÚ‚lÕ:$Ö>&ÔvVךÙv_ØhUÚH7Õ>,Ð3"Ï5#ÚC&¥)1CV jp5v_)pŠ3oœ=j CjªHp²Oo¶Pt»X|ÀaÀe†Å}‘Ë¡§Ö½±ØÈ²ÙÉ©ÖÀ“Ìœ‰Åz‰Åp–Éx‰¾xˆÀ¬Ú¾r²re¬Wr·`€¿r‘ʨ٧µæ±ªÒŸ€¤ib‡EYƒ?j•EŸ™KÆØl¿ÍdÁÑg¿Ïe¾Îg½Îh¼Ìc»Ë^ºË^¸ÈX±¿N¢­B’“8l.‹G$}1"kxq,Ãm“¸fŒ³Rƒ¬D§By @xA“¸n®E;´Ã"&Ä'Â$Ã"$À¾.3¤{fj[6rHv†Kp…Cp‹Jp’Ld™Eu§UmƒIg”Fa…@ešDŠ»aÆŠ¢É‰‹³s´[¤È˜¿k–¡Tµ4/À#Â&%Å(&Ë+*Í.*Î-'Ë,'Ð,)Ñ.*Ó0+Ö2-Ý?5ÚaNÙtjÙG@Ñ5+Î-#Ó]QÀ9:·$¿-)¿-&À1(Á2(Ä7+Ç7,Í6.Ï9.Í7+Ë4)Ê5)Í6'Í9+Õ>,×?-ÙbKÒ«‘ÎDzÎÝÏÏÛÒÏͼÒĪѿ£ÎϼÐÖÅÐÕÆÓ¿§ÛkNÕ9&ØR5ÙV:ÛU<ØP8ÚJ8Ö=/Ò:)Ð3"Î7!Ò>#Â1=>S ju7zO$v}/u›:n¦Ds­Jp°Lo³Nvº]{¼^ƒÁi†Âz”Ë£«×öÚ͸Û͵ÛΘϨ„Åx†ÅrÆn•Êp¶`‹ÇŒ”̧p±rn³ex»f‡Çk‚Àbf‚HMT-Pn7]ŽEj¦O|¸Yœ™LÈÚr¿ÐjÀÒl¿Ðl¾Ïi¾Îc¼Íc¹Ë_¸ÈY´ÄP©¶Fœ¡=”†1Y%‹8!}!b Œ9Ão’·_±M„ªA}¦As˜;xžJ‘Àu£‘bªºÁ '¾ %½ ¹),©ž{š¾|„Uy‡HЦ]|ŸT{¦Ow±Rr¤Kf—C~¸V„¶`i“GpŸE™Å|¢È“¼{‘º}°f¦Ï¯¬Ç’Œ±N”žPµMH½$Â'#Ç*'Ì.)Ë/'É.(Í0)Ð/(Ò0*Õ6-Û91ÚN@×pb×XSÖ8/Ð,#Ð>3ÍGE¹# À-&À-&Ã.(Æ0&É4(Ê5+Ë7-Í7,Í8,Ë6*Ë8(Ë7'Î7)Ô=-ÚM;×mVÒ«’Ï«ÐÚÉÒäÙÑϽի‰Ó¤„ÐdzÒоÒͻ֡†ÚN5Õ=*ØU8Ó5&Ò3#Ô6&×@-ÚE3Ô4'Ò2"Ñ4!Ð:$Ö>#c 6Q gs6vHqq)p—:m¤Fi©Mn±MqµUy»]x½\ƒÂnˆÂ}šÎ¬´Ù˾ÛÔ½ÜÕ³ÚΟб„Ä|„ÃpˆÁe™ÊyŠÈ~{¹f‰Å’¥ØÀË£zÀhgŸLNd5=O,Q}?cžOi®Un´Wxº]œšRÆÛxÀÐoÀÒmÁÓqÀÐm¾Îf½Íc»Ì`ºÉZ²¿O¦¯@—”9Œg-„>${"f O…œDœÁp‘¶ZНM„«E{¢Ao‘9{ M”±fšºo«D4® à &Á!º "ª—tœ¿•«v‹¨^v‡@gr8…¤Kˆ²R‚ L”CvšCƒµP¼[iŒBd‘D•‡”»‰Œ¹p¨Ì— Ä„™À}–¾†“³ržÄ^¶Êp»I3»Å,%Ë-(Ë-'Ì-&Î0)Ï3(Ò1)Ø8-ÜG8ÚSGÔwhÓth×G=Ñ1,É/&Ñ@=»,(½+%¿,&Á/)Æ1(È3(É4+Ë9,Î5+Ë6*Í6*Ë9+Í:*Ñ7*Ô>-ÝV?Út]ÓªŽÏ¼§ÏпÐÙÈÒɰڑnÖlÓìÓδÔ§Ù{]ØF)×I0ÙL2Ñ4%Î2#Ó7&Ó:'Ö?,Ô4(Ò2%Ð5%Ð@%ßG&„3W p#y7z@zs/w—–z/ŽE#}'[>C“¬PÀoµ^ˆ²W~§Gq“;l‰9£P’°aœÃp­‘L¦» Á®wTŸÁ——°‚‰¥[}“B~“?z•B›CŠ¥G‘©IŽ˜Dƒƒ=ƒ•C›·P„¤Kz£K±Ó¡±Ì™¡Àu¶Ô•ÀÙ¦¯Ì†¤Åt¥È•¦»|²Îa½³Pµ, ½&"Å+&Ê*'Î0(Í/)Ñ/)Ñ2)×5,ÜM=Ök^Ñ…}Ôxs×GB×62Ì.%Ð<8Ä2/¼'#¿-&¿0'Å2*Å5*Ç5*Ë5,Ì5-Ë6)Ë5+È4)Ì8(Î9*Ò>-ÚZAÛx_Ô …Ò·žÒͶÒ˲֠ÛhI׈gÖ¾×±ÚŒiÚT:×@(ÛN2ØA1Ï3$Ï0"Ò3%Ò5%Ó5'Ó6(Ð1%Ð3#ÏB(ÝP-œ*2V n x3sD zt0x—Ar¢Jo«Np²Tx¸Y}¼]~¿j»iˆÂ§Õ¿¾ÞÔÆßÛÅßÛÃàܠѲ‚Áw~Ân€Ãoƒ¿f‹Å}h¤`^–RRˆCY{DKd4Nr8Qƒ?W—Oj°Yo³[lµ[v¾cz¿b››VÉÚsÂÐiÂÓjÀÐiÂÐkÀÐg¾Í`»Ì[·ÅS¬³E—2‰K"w#_ ='I, šºXš½o‘´bޱ[¥Ow”B‚žO«]š¶gŸº`­ÄO®F$¯·F/ž´yœ´‹Ž«i}™Cx?€™DŸDŠ©E‘°J—´L¹N¶J’§D¦J†£M‰œK¬Àƒ·ÐµÏƒ¹ÏºÑ„¼Ðƒ¸Ïy¸Ò}­¿t¤´^¹ÖZ¸r8¶Ä.&È.(Î0+Î3*Î2)Ñ3+Ø8.ÚUEÑ£ÏÁ¶Ï«¦Ö^`Ù=5Î0'Î71É46º(!¾.%½.%Ã.(Ç4+Ç5)Ê5*Ë5,Í6*Ë5(É?)Ë9(Í7(Õ@/ÜZCÜsZ×”xÖ¬ŒÖ¹—Ù›|ÚfJÙU;Û{XÜ€^ÝpMÜZ7ØK/×>$ÙO8×D7Í0"Í."Ñ3&Ó5+Ò1.Ò3+Ñ5%Ò2"ÓK/àW3©(:Y np%wF"wr/tŒ:r Hj¨Nn®Pw¸Zt¹b|¿o~½vÈ ®×ÄÂßÖÈàÜÇàÜÀߨ Ñ±~ÁyÄq~ÄoÃnx»cfŸ[X…IKn7Lh2Lg6Jl8M}A^–Pm®Xq´Xq¶\{¾eÂiœWÇÙqÀÏdÁÒgÁÐgÁÐh¾Ïf¼Ë]¹ÅQ°ºG “6N$x'N10-ZEœÁ_˜¼o´e‹¯c„¨Y¡V‹­_‘³f–µaœµO§ÇM´–<«¨„Fžµw—¯v‡¡Q€•@|–A›B„ E’­GœµL›³I¡¶H›²H ¹N©ÀO¸Tšµ\¨ÀZ¡¼L¤½L¦½H£¸G¨¼I®ÂN®ÅQ¯ÃP´ÅX±Í\»¯X¸+'Ä+'Ç.'Ë/(Ï1*Ñ3+Õ6.Ú:1Ù^Kк¥ÐÕÊÍÒÈÑŸœÖF;Ó5)Ì3)Ê31¶'#»1%¼0&¼.(À2(Ã3*Æ4)Ë7*Æ4(Ç2'Ç9(Å5'Í5'Õ=/ÛP;ÙgMÙy`Ù{]ÚxXÜdGÙT;ÚQ:ÝQ;ÚK5ÙK1ÚI.ØD*Õ>%ØZDÑ:,Ì0!Î/"Ø7+ØF;ÑihÑQRÎ1"Ï5$ÓR2ÝU3°(9Ply=#~T,|f+rˆ8qœEs§Ko­Mv·]u·cw»fƒÀ˜Í®²ÛÊÂàׯàÛÇáݹÜÑ Ò¯ƒÄÄux¿mwÁfm·\IzC^,KR'bs=Œ­g°ÕœÉæÈˆ¯s^ Em²Xo¶_xºex¿lžžHÄÜc»ÏV½ÑW¿ÒXÃÓX¿ÏW³¾K•5ŠN^/,5>GO€}1žÆk“¶pˆ«eƒ¤Yƒ¥XŒ¯e‘¯d’®U•¯H›³E¨½H²ÈJ°­D—•H‘¬lˆ¤[†žP…¡Jˆ¦MŒ¨N“«G˜°K—¯L¥¸J§»L¨»L­ÀM¯ÄO´Ér³Ê®Å]°ÆX°ÅV²ÉkµÍ”´Ì£·Ì”¸Êu¹ÍsºÉ^¸Ç\¿Ô†¼Z:¿$Ì0)Ò4+Ñ1*Ò4-Õ70Ù;4ØjSÓ¿¤ÑÚÌÑáØÑÕÎÖ‚yØ;0Í3*È-)½-)³*&¹*&À/'¾/(¾2(Á4)Å2(Ä7)Ç6*Ç7'Ê4$Ì6'Í9)Ñ<*ÖE1ÛL9ÙG5ÙC/ÚN7ÛT9ÛK3ÚF-ØA)Ø<(Ø8.Õ8$×@/Ì3$Í0"Ì1#Ì/!Ò6'Ï›ƒÏåØÑëçÔ{Ó/ÔsTÜhM´,<Pn{:!R*}g.tŽBw Kr¨Ou³U|ºbzºg{ºjˆÂ™Î«°ÛžßÕÇàÝÄßÜ´Ûӓ˧y¼ryÀl{ÂzÃ~e¨THr2[Y-rwCŸÄ½Þ´ÅäÆÔòÈžÄ~X™Fk®Zq·dv¸gy¿rxv)Œ£5‹ž3‘¦7’«<“¬>§<ˆž8„3€k,`18 6?QSU ‰•;œ½c‘®iˆ¦`€šO‡¥Z’³l•²a’°O˜±Fœ·G¨½H³ÆL¥«G’šHŽ«a‹©aˆ¦U…¤M„¥LŒ«Q–±O˜°K£·K°½K°ÁL¯¾L¯¿O°ÄY°Éy²Éy­ÂV¯ÃN±Æ[¶Í¿ÙůߨÂÚȻћºÍ|»Ìc¸ÉbÂÔƒ¸X3½#!Í3.Ó6-Ó3,Î4,Ó5,ÝF;ÙmZÒ´˜ÑØÇÒâ×ÐÜÔÒ —ØF?Ï3*Ã7)¼-$µ*#¸+%¾/'¾.%¾2'Á3)Á2(À4'Ä5)Æ6*È9(Ê7(Ë8(Î7'Ò>,×C2ÖC0×@1ÙH3ÛI1Ø?+Ö<(Ó:&Ò7$Ô4%×<)Ò;(È/!Ì2#Ë1!Ï/!ÔH7ΰšÏÞÒÒîæÖ«œÖ;!Ö{[ÞqR³.;Kj{;$~X0ve/uŒ?w£Mo§PnªRr²[{ºh}»nˆÁ†“Ê¢žÒ´·ÝÏÈàÛÆáÞ¶Ûѕͮ¿€{½g|¾x~Ãa‡=f[,ƒ”J®Õ”ÃâÄËéÈÆá¬«dd–Jf¤Un²^s¹fv¹hyÀvTUcƒ+b€,c„*`ˆ0`‹5m‘5t–3u;t¨A€«A{—,Ô@.×>,Ô9*Ò8(Ò:(Ð7(Ï8&Ó8%×;)Ê4#Ê/"Ð2%Í.!Ë/!Ò6(ÒnÏÑÀÒÞÑÑÓÃ×™}ÙE,Ù]8áO4‘0Nam(x=&~_/s;q‘BoJp¢Op«Xx´c€»r„½}†½†‰Á–ˬ·ÜÎÅáÛ¿ßצÖÁ“Í­xÀ|¹x}ƒDƒ Pª×“´×±ÉêÌ·Ï‘`y=P€DZ—R\¥Wd¯\l³`p¸g~¿o|Áx\v(q¦9i›7_”1d—2a“3j›7l¡0Ð7.Á/(´)$³,'¶0)º0(½1)º/(»3)½3'¿2(Â6+Ã5)Å4'Í:)Í<)Î:)Ò=+Õ?-Ô<)Ï:*Ñ9(Ð:'Ñ9&Ó?(Ô>)Ê2$Æ0!Ð3%Í2$É1!Ì- ÓF6Ϩ–ÑÛÍÓÚÊÔÍ·×wY×;%×G.Û>-p,Q ep*x7%wO,o{:mCl”Ei˜Ii¡PmªZwµl{·v€½ƒ€¿ˆ’ɨ´Û̾àÓ»ßÓ©ØÃ˜Ó¶‚ÈwŽH‡FªÒŠ¸Ú¼ÄäÉÁÚ¡`o7On9\ŒJašPi§Xh®Xo²_uºk{½qÀxbm$kŸ5u§Mu¥^aŽ9a.j–4pŸ:m£†ƒ6‚•9‹®U–ºs°^ެT‘®U–´S¡·K«¾P¯ÀW®ÁO´Ë{·ÍŽµÌ³Ì‘®È…¦Á_§ÁQ­Çf³Î´Ìr¶ÌfµÌi¼Î^»ËS¹ÈO»ÌS¿ÄQ®I,¾&$Ï4+Í1)Ï2*Í5,Ñ3)Ù<2ÝUBØrÔ¿¢ÔÓ¼ÔØÆÔÛÌצ•ÙF5Ò5+Æ0)°*$©,(³0)¶.'·.(¹1)·1)¹2'½1)¿5*Â4'Å3&É7)Î=(Ï;)Ò=+Õ@+Õ?)Ô;*Ö<*×=*Õ;'Ó<(È8$Ç0!Ð2$Ô6(Í2"Ë/!Ò.$ÓfVÎŲÑÙÉÔÕ½×®ÙN8Ô8&Õ9)Ï3'L1Q kx,t5"tC'nl5lƒBfŠBe“IhšKgžRr­az¶s‚¼}º|–̨²ÛɲÝ̳ÞÍ£Õ¼“Ó­‰§iƒ?ŸÆo¸Ù¨ÁÞÉÈá·pv>EX-\€@[JdŸPh¥Tf¨Unµ`v¼lz¼nzÁ^c"e”-„¹g¦Ö­ƒ²w`9cŒ2i–7kž9j¦?r¨@o¥EeŽ;O6-. €‡<¨¸e™ L‡–KЦX­SŠ£B?ˆ¥Cˆ¤D…¢B‹¥D‹¨G’E‡Š;‚‘:‚£B‘·f’µdޝX®U˜´U¢¸M­¾L«½I²ÅT¶Ês¹Í¶Ì€´Ë†®É~§Â^§ÁO­ÆU®ÇX³ÊS·ÌW¹Î`ºÎVºÌP¸ÊP½ÉO¿ÒT´h7¹!"É3*Ì3+Î4,Ì1*Í2)Õ:0ÛJ:Üw^ש‡ÖÀœÖÌ«Ö˯ڟŠÛN:Ö9+Í6,¹/(§&&£'&µ1(»4)º2)¸0'¶0&·/'»3&Á5&Ä6'Å7&Ë?'Ï=)Ð;*Ò?+Ó?*Ó@,Ô?,Ò<)Ê6'Ç3%Ç5%Ì7%Ó7'Ñ5#Î2!Ð4(ÖG?Ñ”†Ð˹Ôδؤ‚ÜgJ×=)Ñ3%Ù5(®&,9Piu(r3$q@&jd4bw;bC^ŠEb”HežOe¥Sp³j{·ru¶pŒÆšª×¿«ÙÄ£Ö½™Ù³‘ÃŽ†Š@˜³^¯Ó¸Ù³ÈèË– m?BSk8X€AY‘I]™Kb£Rd©Uo¶asºl{½rpÄ…cXXw&`})u¥W–Ř…¶{i;b2c•7gž=k£?e˜@]Y$9 $: mZ%”¤R’£W„›NŒ¦Qˆ£Kƒ@œB‚CœB€•>—@‚˜?Œ—C‹‘D‡=†¡A³W’µa°[­T—´Wž¶P¨¼L­ÁK©ÀP´Ç]´Êh²Én²Ê{®Èq©Â[¦ÀM°ÅQ²ÇQ¶ËS¹ÌX¹ÍWºÍS¹ÌQ¹ÍR½ÈM¼ÔT»†B¹%#Æ3)Ë1)Í2+Ì3)Ï3*Ó4,ÙJ;ÝeNÛtVÚ_Ú†cÚpÞxbÝL:Ö9.Ñ9-¿0(©'%š((•%&°1(·1'¶/'²1&²+#¸,#¿2%Ã3#È7%Ê<(Ë9'Ì9(Î<(Ï;*Ð:)Í9'È7'Ä5%Ç4#Ê4%Ï6&Ò6&Ï6$Ï5&ÔRHÔ‰~Ͻ®ÒÇ´Ø—zÙ[?ÕD.Ò6&Í0$Ù5(!9Kht)w/#m7$iP,k`2hvs=t‹5€@Œ›KŠ’<„?‰®N¯V­SŒªO¯O–±Ož¶K¨¾L«ÁN¯ÂQ­ÃT©ÅV«Çf­Èm«Æ`ªÅS²ÆR²ÉQµËS¸ÍZ·ÍV¸ÎS¸ÎT¸ËO»ÈN»ÔTº–F¬##¿/)È2*È2)Ç4*Ë4*Ï5,Ø<3ÛM<ÞYDÛP=ÛZAÝiOÞdMÝO;Ú?2Õ:.Ê7+·2*­1,“"$”"%®('°&'¬#$¨'.±75¶.&¾2$Å9'Ä8(Ã9)Å:*Å8(Å8'Æ7(Æ7&È9'Ç7%Ê6$Ë6&Ð5%Ð6%Ñ3%ÔE6Ԏо®ÐÍÀÔ°ÚnVÚI/×<*Ï3%È/#Ñ1$X 4>Ydk)"e5#bB(gD*cJ*ca3gv8_x3bƒ8a’A[“A_˜Jg•Mr§[|ž^uh@r`4†‘E“¸W³Ù‘¿Þ¿ÂßÅÀÛºœº{™»ˆ“°‰r‰kKg@Ft8XFb Qf«[i±cwºmlÂhCWd#Ve$Wm#[t'fƒ3cw2X`%Zf'Xg%UJ@%+J le.Š£LŠšJyŒ;|–;@|–=w’>t‹6rŽ9”>‰ˆ8‰q+…‰;¥M‘™?Šœ?†¥Hˆ«MŠ«N‰©O¬M˜¶MŸ¸Lª¾N¬ÁK¨¾MªÂQªÄR­Ç^±Êf¬ÉhªÆc®ÆX°ÉS¸ÎVºÐ]·ÏW¶ÏT¹ÏX¹ÍS»ÊNºÕW¹›I§"#¼.)Â1)Å3*É2*Æ1)Ç5+Ö<1ÙE6ÝO>ÛN<ÜR>ß\DÝU>ÞM9ÝF4×;0Î6,Â.*¶')³)- 2:¬OI³gU©uY´ Š Œsš91µ*#º5$¾6&Á6&¿6'À8'À7'Ã6'È9)Ë9(Ë;'Î:'Í8(Ì7%ÍE(Ô;+ØhXÒ¹¢Ð˸Ñι֡‹ÛcGØC*Ñ4%Ì/#Ë/#¼)23@O ]a"Z+[+Z( Z0 a=$Z6T=I6IJ$Wn4cC[4U0kB!wl9˜µj²[˜½a¸ÝÀÞÄÂÞÈÃß¿¾à¦¼Ý˜Àà™Æå±¯Îª{–vSFa—Nj¥Wj¬_w·nnÀ{WZL[QUHW>P/R2S/R(L!: #!6k{3‚¥C‹§I|š<~›:{”=uŒ;8’f0—N'Œ1‚s}r.¬NŽžC‰œ?‹¥HЦH¨H¨J«K•²L¸M§¾N¬ÂN­¿O¬ÂP«ÃP­ÅT¯Èa­Éo­Ès±Èp²Ë_¹ÎY¹ÎZµÍU¸ÏX¸ÍUºÏRºÉR¹ÓX·—HŸ$¸+(¿0*Ä2,É1*Ê1)Ç0)Î5-Ô6-Ú>4ÚH6ÝG8ßM:ÝO7ÝP:ÜD4Ú?3Ò6-ÈJ9¼mJ²c¨¥l˜®eš»t©Ìœ±Õ¹£¿˜­¾š¢PBŸ"¯0"³0 ¸5%¾5%Á3%Å7(Ç8'Ë5&Ì<&Ì:&Ð9'Ï7%Ò4&ÙN<׉zÒ¨“Óº¢Ô®“Û|`ÙG-Ó8$Î7'É0$Ñ2%“ -7CQ P LRPP%IC.R7––J®µi²¸f‹z9qJ*‡ŽF¨Ëi´Ø‹™À]®Ô‡¼Þ¬ÀÞ»ÀÞ½½Ý²¼Ü¦»Û§¯Ðƒ ÅrºÝ¯ÏêТ¢_RbžPf¤Us±el½sYJ$ K*H$ EDF E 5-#J ‹h-Œo,Œ`(ƒC—N$¬‚?°sA¶B1´#&•‚v d~}2Š­P…¤IƒŸCŒªE‹©IŒªI«K‰ªJ­L—´KŸ»M§½O§½N¨¿O¬ÃO­ÆW±Êh®Êv±Í¸Ó›¸Ð}¹Ï_¸ÍV²ÌU¶ÐW¸ÌQ¸ÍQ¹ÉP¸ÒU°ŽC•#´.)»/*Á2+Ä/)Ç/)Å0+Ê2+Î4,Ô90Ö9.×=/Ú@2ÛH4ÜK8ÜA0ÛA1Ý=0­e:z‰D{GlŒGdCy©P¯Ñ—´Ó²°Ñ¥³à«µŠ”!ª/ ³/!½5%¿8&Ã7&Ç6*Ç8(Æ6$Æ6%É7%Ì7'Ò9*ØC-ÙrWÔ®–Ó¸¤Õ¯•Ù}dÚO5Ö@*Ò9'Í4$Ç1"Ò3%‚EH%ld3-9;8= BF A9 S8½½PÃÒr¼Ð„­·f“ª\–´gžÄg—¹_«Î}©Îc¹Ý¥ºÜª½Þ¨ÂßȺݹ¸Û¬»Þ§¹Ü—¸Ù’ÂÞ¹ÂÞ¼ÏèÏŸ¾œUŠAa Sn¯^`¹iG=HB=650' +mDœP%£6‘p\p²F5ÁcJ´>=©(1›Žˆt‰?†¬R…£G‰¢C©E‘­I’ªJ‘«J­G±L˜¶L¸LžºMžºO¥¾P«ÂPªÄT±Ìm²ÎŒ·Ð›»Ò—¸ÐtºÏ]¹ÌU¶ÎU·ÏU¹ÎT·ËQ¹ÇK¸ÐV°ƒ@š ²+)¼+(Â0+Ä0+Å1*Ç2*Ë3+Î2,Ñ3+Ò5*Ô7+×:0Ø@0ÜC2Û?0ÙA2ÛÄÇW¸Ék¸Ès§¸^©Êv­Ïw’°OžÀl¤Æy›ÀT¹Ýœ»Ü­¹Ü¢À߯·Úªµ×²×¶ØŒÂݪÈá¿Åà¾ÂÞÂÉâËs™`TEh©Y_µ_1,+)'!" 'v^0¿€JÆL2t jo ¡&)·HA°98¯/2¡" ˆ Š‚x Ž¢Jƒ°W„¥H‰¢Aˆ¨H‹¬I¨FªM­L®M—´Lœ¶NºLŸ¸M¦½O¨ÂQ©ÃS®ÆZ±Íx¸Ò’ºÐ¸ÏeºÏZ¶ÍT¹ÐW»ÐR¹ÎR¹ÎS·ÇN¶ÏU®q;•¬'(¹*(¾-)À.*Á-)Ã-(É0+Ë3-Ï3+Ï4*Ó5*Ø8,Ú>0Û?/ÚB1ØA0Ô>.Û<.»<-qB-QO.X_6Yr;p¡C¨Ñ¶Ö¶¡Ç…¾â¸§iQ™"±3$½3'Ç9*Ç8)É7*É7(É7%Ì9&Ò@/Ò@-ÖH3Ú_JÚlTÙsVÙƒdÙz`Ù`J×F0Ñ7#Ð3#Ê0#Ì0$ÄA'‘¨O˜Ío=./0*(-''(UͼG¼ÁU»Ç`¹Å^¶ÊoµÌ²Ê‰­Æz¯Æq£»e™½]½à¨¸×”¶×“»Û§µÓžµÓ¢®Ï•»ØžÇàºÆà¾ÇáÁÃÞÁÍçΚ·‰N8d¢Q_­W{:TDG$ * ]E"º‹TÊoV¨+)Š ‚~ w ˜&¶CF¶C>²12£%މ„ ˆ„ ~%®N…³Z†©Kˆ¢AŒ¨EŒ«HŠ©HŒªJŒ­OޱS•µO¸O¢ºM¡»N¥¿N§ÁN­ÆZ¯È`¯Ìr·ÑŽºÏyºÎ[»ÎVºÎU¼ÑW»ÐW¹ÎV»ÎS¸ÈO¸ÎTªa5š!¯)(·+(½.&¾,'»*(¾,(Å.*É4,Ë5+Î6*Ñ5)Õ8+ÛB0ÝG3ÙC1×?0Õ?1Õ;/Ü>/ÜB20'aZ0XyC]‹A’Ån¸Û³¦Ëš©Ú ¹£‡™'­1"·2#À5&Å6)È9(É7'Ë6&Î;*Ð?*Ò@-×M6ÚfFÜjNÛiLÙfGØbDÕM4Ô?)Ð6#Ð6&Í4%Ð/$´G&‰­S¢Ó|D:').)%$(#,®ˆ7Ä»K»ÂWºÃY¸Æ`¹ÎtºÒˆ¼×›½Ù¡»Ô–³Ìz¯Ìy¸×ˆ¼ØŽ½Ûœ¿ÝªÁݵÁܹÁݽÂÞ»ÃߺÆà»ÆàÂÃÝÂÊåʩ’Xy4h›Na¬S’y,¦<•4‰,qU#M&(*•wEÏ—nÃZO¤ ƒ z … ƒ | ¶@A´IH±<6¦#'Œ ƒ „}| w.ްQ„³Z‡©N„ CŠ¥D¨H¥G‘¦JŽªN’²Q˜¶Sš¶O¥ºM ·J¡»N©ÁO®ÇZ¯Ëg±Ìu¶Íp»Ïa¼ÏY¼ÐU»ÏT¼ÑV½Ó[»Ð[¼ÏU·ÅO¸ËU£T/Ÿ#°('²(&¹)'½*(¿,'Á/*Ã4+Ç3*Ë3*Í1'Ð3(Ô1)Ø<,ÚE1Ù@0Ù?/ØB1ØB0Ô?0ÕB.Ë0*…A6_‘N`L|´V°Øœ²Ö°¥Ò–ÄÚ»›I4œ&¬3%µ4&¼3&Â2%Å4'È5'Ì7(Î:'Ð;+ÖA-ÙO3ÚM3×L1ÕG-Ò:'Ò6$Ò6%Ñ4&Ô7'Ñ2'Ò1$m(~¥Fªâ~SR) %$!"$)I ¾œ@ÀºI¼¿P¹ÂS¸Ç_¹Ðx»Ô‘½Ö›½×œ¾Ø¾Ø•½×½×Ž¾Ú™ÀݧÀÞ±Ãß½ÄÞÅÄ߯ÂÞÄÄßÁÅà¼ÅàÀÅÞÃËæÍ§¿ŽPq1_‘HWžM‘r*œž:—”5–”3’5˜‡3ƒb(f.­mKÊ‹n´VO¬/3›Š  uw ¥-0»KE±77¦#%˜„‰ ‰… z~K’·Q„±Zˆ²YƒªM„¦FŒªI¨I“¨HŽ«J®L”´S˜¶R·L¡·K¦¼M­ÃO°È\²Êi³Ìu·Íc¾ÐY»ÐV½ÏP»ÐS½ÒX½ÒZ¼Ó[½ÒX¶ÇP·ÃS¡>(™"«'&±*'²'&±)'·*'¹.)¿0)À2*Æ1)Ë2)Ì1)Î3*Ò5+Ó8-Õ:-Ø@0Ù?0Ø>-Ö>.Ï<*Â1+”=:k—Rc‘Kl¡L¢Ò„µØ·žÉ‡¿é¿«ƒm¡-$«/#³1$º1%½6&¿3&À4(Ç9+É8)Ì7%Î:'Ñ:*Î6&Ì5#Í5%Í6$Í4&Ó@)ÕB+Ü:+™%}/†™Bu6, !)'W(£D¼´I»ºN»¿P¹ÅW¸Ît¼Ó޽ՙ½Öš¾Ö–¼Ô»Õ‹½Ø“¿ÜŸÁÞ§ÁÞ±Ãß¾ÆßÏÇàÕÇàÓÆßÊÅàÄÅàÁÄÝÂÍèÏ£´…Oc.`HYšN–x+¦«>¡ž:œ™6˜‰2’o,˜P)¿pQÁvcµQC²62¦#&’Šˆƒ| ‘±06±17©%)”ˆ ‡ †‹ ˆ vb'бP‡¯X´_°WˆªI‹¦G£G¥H’¬I‘«K’°Qš·Tœ·Nš´Jª½M±ÅPµÊ\µÊa³Ìh»ÏaÀÐ\¼ÐX»ÏP¼ÏS»ÑU½Ò^¼Ó[»ÐR³ÆQ¶¿T—6%š!¤"$®$&³(&µ,&º*'½-(Á0'Â0'Ç3)Ì1)Í2,Ï4+Ó9,×;0Ú;0ÛD2ÙA2×?.Ð;,Ç7)¾3)œ0"pEdHg—HÅj¶Û¸ŸÈ–¦×š¼¾ ‹*œ'¦+!°/#¸1%¹4$¾4&¾8*Ã;+Ä6&Ç4$È5%Ì1$Ë2"Ì6#Î5$Ð9#Ô@)×E.Û=(»+,G Wtm/q`/- !![&Á£F¸°J¶¶K·½NµÃU·Íi»Ò½Ó‘¾Õ•½Ö’¼Õ”¼Ö•¾Ú˜¾ÛÁݧÃß´Åß¿ÇßÍÉáÖÊáÚÉáÒÆàÈÅàÀÄÞÀÏëÑ—¥zMY-ZƒER‘K›{-§¬>¡ 9žœ8›™7–^*³VE¼|f¹TK°0/©&'Œ‰ ˆ ŠŠ¥'¸.3±$*¡ŽŽ  ‡ ‡‰ …q‰‡8‰¶X‰¯Y¸f’·d‰­Q‡¤F‹¢D‘¦GŽ¥I‘¨I“­K™³Qœ¶NµL«¾N°ÄO´É^·ÎmµÏi¹Ï_¿Òc¼ÏY»ÎR¼ÏT»ÑV½Ó^¼ÒX¶ÎQ­ÇR¯µR‰-#‘" "$¦&&¬&&²(%·*&¼-'Á0)Æ0)Ë0(Ï4(Ð3)Ñ7+Ô=/Ù@1Ü>/Ù?/Ö?.Ó=+Í8-Ê7+Ã0)¤ $q„BjžPaF‚¼Y¨Ô™°Òµ”ÄrÆä½‘R8Šš+ ¤0%«1&®1#³5$¸1%¼2&¿/$Â+"Å+!Å)!Æ*É1!Î8$Í9!Ì37Ó4KÈ0$G,K!o[,j[+mg0b;"4!Y,À§G³®J°³K±¸N¶ÀQ¶Ê`¹Ïu»Ñ‚ºÐ‚ºÒ¼Ó†¹Õ‹¼Ù¿Ú˜ÂÞ¥Âß±Äß½ÇàÆÇáËÇàËÈáÉÆáÄÄà¿ÃÞÀÏìÏŠ–h@C(Qq>QŠG™{/¦¬?¡ž:¡¥= {/°L8¼u^»fQ·>;µ(-£†† … „­%,®$'œŽŠ‹‡ ‡ ˆ ‚s Œ˜@¸a‹¯Y¶c—ºe‘´WªKޤE¤E‘¥E”¤E“ªG•¯K•±KžµN«ÀN®ÃR³ÇR¶Í_¶Ïd¸Ï_½Ñ_¼ÏVºÎT»ÎS½ÏZ¼Ò\¹ÐTµÍT­ÌT°±OŽ' ‘!ž"¢"$¨$$¯$%¸&%½.&¿.'Ä/+Ë1*Î7*Ñ5)Ó5*Ò8+Ó7+Ô7+Ò8*Ê0'Á0)ÃH4·R5œ_;sDk‡Ep©VaŽKo«L™Ì»ÛÃŽ½o»å¸¨‡l„ ( £+#ª+&©/$«:%±A(´J+»Y1¼R/¾I+ÄL3ÀK=Á83À%$¾#Å*3À+>P %_yZ'ˆš=бH±J{«FrœBju5]Y*O/1T-¸ G­¬G­±I­µL®¹P°Å]³Ël·ÍvµÌu·Ït¹ÑzºÒºÕ†¿Ù“ÁÜŸÀÝ¥Âß³Åß¿ÆàÃÈáÃÅàÃÆáÁÄà¿ÂÝÁÎìÌstJD;Xt>Y„C˜{.¡¨?Ÿ¥<‡0©@-¼jW»nY¼PAº85³&*¢”‘•¤®$¢’Ž ˆ‹Œ‚ ‚ ys ¨H¹f’¸h“¸g•·b‘²U”±TެO¤K J’£F–¨I—¬H—°J¥¸O­¿M«ÁM±ÇQ·ÍYµÍ\»ÎZ¼ÎXºÍVºÍW¼ÎX»ÐZºÎS¶ÍQµÎR«ÌV°­L"‰—"˜#ž"!§&$­$$¸+'À.'ÁA+Ä1(Ç/&Ë0'Ï1)Î3)Ï4)Ç3'³'#¦4.¤_?˜u?ˆ’J£SºfršRi£Nq£VbŸJÃm¾ÞÄ•À{©Ø›»¾›'‘'*!ˆ*#‹A)X1m6–ˆ?—;œx5¦Š9®˜Dµ±d½°wÀ‹Z¿V8´)!Q.c Z)Œ©G’²FޏI‡¾Pƒ»O€¾Py¹LpªIjAab.=B ¯’@©¤Fª¯J§²M¨´Q¯Á[´Èf¶Ëo¶Ël¸ÎpºÐt»Ðu½Ô}¾×ŠÂÛ‘ÂܘÄߪÅß·Åà¾Æá¿ÆàÀÇáÀÆâ¿ÅàÄÌç¿ZS,D3\q;Z€?œy+¢©;œ†/¦D)¹^M»s\»\K¹D:´')§–Ž’™¡™’Š Œ Ž ˆ † | }+’®L“ºi—¼n™¾m”·_’³U“³S’²V”²W“¯V‘ªR’¬N—¯J—°L¤¸Nª¾M¬ÂM²ÇP·ÌR·ÍY½ÐW»ÍX¸Ì[¼Ð\½ÒbºÐZ¸ÎN¶ÏR¶ÍTªÏY¯£J|…‘ ” ž!" $'¢"#¨$#²*'¸3'¾,'¾-&¿-&¼,'¶.&¥&"Œ‰'&Œ_>ŠK†•Mƒ§Vˆ²\‹¸fŒµmf£Ix®Xq¨P‰½^¸Û¶¥Í”œË|Ã༃h?o5j0p<$xU,~p6‡†=„y7ƒc/…e.Œƒ8—¡Lœ§M™®Qœ¶]®¹`«žVR>"3\}‚4‹¯Eˆ°E†¶K…¼N‹¾NŠÁS…½Pz´Ks¨GqžAc_+<5ª“>¥¦I¤«I£¯J¤°M«·U®Á`²ÇeµÉg¶Êi·Ìm·Îk¼Ñq¼Ô}¾ÕÁÙÃÞ Äà±Äá»Æá»Æá¼Çâ»Åá¼ÉåÆ¾Ô¤?. : VG)U_4š†1¢‘6¤@+¹ZG»qY¾dS¾D;µ('¤š‘‘’˜’“𔋉 ‰ ƒ Ž † rxA¯I‘¶e—¼o—¼i–µ^”±V–±S—²U–°V”®S–¯Y–¯S—¯N™´P¥¹O¬¾L®ÃP¶ÈR·ÊU¸ÍU¼ÏS¼ÏT¼Ñ\»Ñb½Ñ[ºÐXºÐS»ÑT±ÌS«ÒY¦›Hm‹’ ” “"–"› #"Ÿ##£ !ŸšŸ Ž|…&&Žb<‰‚J~Iw¡R|²]†¸d‹ÀnœÅ€j–Ik¤MiJ~´R±×£¯Ó¨’ÃiÁäÀ ®v^H#nG(xU,zb.€}<†~:{U,W-j0Œ–F˜¯V‘©P«O°W’ºc›ÆlžËjsEW>#q1‚©B†¶J†»Mƒ¼O‹ÁRŠÁR‡¿O¼R¶Os¦Di>bQ.0%™„:ŸŸG›¤Gž¦I£­M¨´SªºX®À\°Ä_²Æb¶Èc¸Ëi¹ÍjºÐt½Ò{¾ÕÂÛ–ÃÞ¬Åà´ÄàµÅá·ÅáµÂßµË러x# 1 9K&$˜a'¬[;¸ZH¶^F·aMºO?³+*£ˆ ƒ ‹ Œ   ” ™™–““ ’’Ž Ž ‰ rb(‘´N´a—ºl–»h•¶[–´T•²R˜²S–²V‘­U’­U–°U™±Qž¶R¨½P¬¿M°ÄQ·ÊQ´ÊP·ÎV½ÐUºÎUºÑ_¹ÑZºÏTºÑU¸ÐR½ÔR«ÈR®×]™‚=_ sx~y{|so pz “Šl {%$†[6‰’JˆŸRw£Tr¨Vu²[‰¼hŽÂu—Æ}mšLh£Mi™Kk¡C¢Ï²Õ¬“Äq²Ø§ºÓ h\.nK&tV.rm5x…@zj7sV*vW,{w8†›F„ J‰©S‘¶]¹a‰¸`†ºiˆÀl‘În†´fjƒ=w˜9ˆ´I‹¼M‹ÀQŽÂS‡¿SˆÀR‚¼Q†¼T{´Mp¥Hd€=H%!ƒg.œH– F˜£HžªNŸ¯P¢³Uª¸V¬¼X²Â[´Å^¶Èc¸ËeºÍi¼Îl½Ñt¿×‹ÁÛ£ÄߪÃà«ÄߪÄß§ÀݧÌì°sxF4uL2Že7›8.¾cMºYC¹ZHºQG·2.¯ š‘ ˆ  ˆ ‹ ‡ ‰ ‘”” “‹Œ ‰ Œ Œ ‹   uŒ„7‘¶V•¹k•ºk—ºj•¶[•²U”²U˜³U”­S“®T”±T–²Sš´Q£»Uª¿Qª¿O³ÈQµÊS²ËU·ÎX»ÎU¹ÏW¸ÏW·ÍTºÏS¹ÑS·ÑXºÑVªÉT³Ù`e-H` a a a a e g m ”%!¤1'§0&qv4*^;v€G~ T€«Z‚´g{±bj¬[~¸gÃsÄylžPm¤Mn Pa•@‘Æq¯Õ¡žË†¨Ð–ÃåÀ€KX9oY.st6sw:rW.tY+rh-{ˆ=wA|ŸJˆ°Xе^ˆ¸a…¼kˆÀsÅsÂoÉtŒÄpsšE{¨C‡ºNÁQ–ÆU‘ÃWÄ\ŠÁa‹¿`‡»Tz°Nj™GYP%'k? “F˜¡F¥IœªM›¬OŸ°Q¦´T«¸W¬ºV±ÀZ²Â\¶Ç`¸È_ºÉd»Ín¼ÒÀÖ’ÂÚ“ÀÙ”ÂÚ’ÂØÁÛ‹¿Ñ€?4LG+®´gÚÈa¤f5 B3»]J¸aN»^M¹;5±"%¥“ Œ  ‡ Š „ | –——’ Ž ‹Ž Œ Š † Šz ŽB޶_˜¿s™½q–¸g“²Z’°U•²Q—²Q—®T–¯S™²Sš´S¡¸U©ÀT¯ÁN±ÃP·ÉS·ÌV¶ÌW»ÐY¼ÏU»ÏUºÍR¼ÏS¾ÒU¾ÓW½ÓW»ÒT©ÉV´Ô`mN%:N R ] ghkv8-P7„Z:ˆZ9Ž`;ša;ŸT0 o<£§]Š¢^tœRyª\‹¾l¿m€·jxµl…¿w’ȉs¥_g¤Kw®XgšI¸[ Îˆ¤Ï–©Ð–ÁâÄ ²~R@gY*gc2if5tU(rT)tx4qŠ>m=z¢J†©Q…­V‡ºfÂv‘Å|•Èz•Ëx“Èv‘ÈpÀe}¯L¸M‰ÀS’ÅU—È`–Çv—Ȇ¡Î ‹¿l·Rp©MYr61 A Šj7ŒŠ@“žG—¥K–¢K™¥Mž«O¤°T§°R¬¶S¯ºY±¿Z´ÀV¶Ä[ºÊe¼ÐpÀÑyÀÓuÀÓq¿Ñp½Îl¾ÉbžšPŽ“UÖåÓ½_ÂO.•$$£C6»eQ¸gV¸J>µ**¬ ’ ˆ … ˆ ‡ † Ž ‘•‘  Œ ˆ ‡ ˆ Œ ‡ ‰…2”«I“¶bš¿o™½l™»g•µY’±R–³S˜²U˜°Tš¯Tš²Sž¶S¥ºU¬¿Q³ÂL³ÅQ¶ÊR¸Í[·ÌZ»Ñ]¼ÐW»ÎWºÍR¼ÏQ¾ÒUÀÔY¼ÒV»ÒR©ÌX«É\€8%z€ tnI2el>dEgŽLr‘Nt“OoOlvFiR6g<)x_3‘¡Y£_p”Ry˜P‰HŒ±]˜Ë}É‘¦Ô©~¥k\˜Ct¬V]’Dr¯TšÊy¨ÐŸ¤Í‰´×¯»Û±mh7ZE}•Y‰†[eA qY'rq0hƒ:o–@rEq¡H~²Zˆ¼j‰¾p‘Å{›Ì†œÎ—Ìz‘Çl˜Ën“Äe€µNоP‘ÂR˜Êm§Ð±×¼¶ÛͧѲˆ¼m{±NeCA*1v="Œm9‰{9•D“žG” J–£J˜¥Kž§P¤¬O¦­R©²R©²Q«¶R±½U³½T¸ÃZ¸ÄZ¸ÃU·¼V±¯Q²®QÁÆnÓÍiÆ>·/%¸#š&%¥I;½iW¸XF¹94²"&­£›“  Ž    ‘ —“ ‘   ˆ † ‰ ‡ } P#’°K“·`š½o”¸e•¸a•´X”°Tš³R›³T™°Rœ±T µR£¶S¥»S¬ÀP¯ÁNµÇP¸ÌT¹Î_·ÌZ¾Ò]½ÐW¼ÐU¼ÏT½ÐS¿ÓVÀÔW¾ÓT·ÏQ£ÌXŸ²R}&ˆ‘ „j5$dv=e”Jd¡Qf£Tj¨Wp¨Yo¦Z…±m{§ajM`o?lZ4xY/•¤ZxyKGR?"n™IŽº[šÅp©Ð‹w¢YP‘Cj§S`˜Jh GŠÀa­Ö¦§Î˜®ÔªÅæÉ]]f-Œ¾gžÈdwe4hK&rz3t”>v—@q›ExªQ}´aˆ¼k’Ä~—˃œÌžËs˜Äi¼aˆ·Yˆº]ŒÀ[‹ÂS–ÈRÌs±Ø®ºÞȺÜÌ·Ụ̂е„·el¦JTR-.ZƒW1‡d2‡|:‘D‘—G”—F–›GšI¡M KŸžIœH›H£¡H©¢G«¢H© G§•C§–E²ªPÁ½_ȤY¼M/²!±"$¼''•('¦E9Ã[K¼F=º,/´ &­œ  Ž  Ž Œ ”““ • –— •   Œ Š  {…j*”´L”¹e›½p˜ºh–¸[•³T—²Q›´Sš³Vš²UµW¢¶R¦¹Q«¾O­ÀMµÅN¸ÉO¹ÍWºÎa·ÌZ½Ó`½ÑY»ÏT½ÐR¿ÔQÀÕWÀÕXÀÕT·ÏT¥Î[–—G‡…hB'b•Fj¦Of¥Pk®Xp°^n¯\q±]t¯cƒ´jz¯cm¤_dšZ]~FZF+iR+vm<4 [C#v”IcEiŸJƒ³bk–Gh¥Pv®Xv«Tq¦KÁa¬Õ™®Ò¦¤Î˜¿ßÀŸ¾vp¦X„¶p`‰3|>‚Bnl0dp.u•Bs¢Pv«W€¶jŽÁyÀp‰®X‹šI‰‹<Œ:šA¢ŸC¤E€¤H€°Oˆ»KÎw²Û¨»ÝÇÂßÒ¿ÝѽÝٛȚl°N\w:'<j<"€a3‚u8ˆ‡?‰ŽBŽAŽŽB“‘D–’F–ŽD•„A“{<–w:™y?žt<šZ4˜R1¥k8¸šFÄŸHÈ“FÂO0º%$½*'¶%%½%%™)&¢:/ÆIA¼<4»+)¶#$ªš”• ˜•’ Ž‘“–”––“‘“ŽŽ Ž x ‚p,’±L•¸eš½q˜ºk—¸]š¶Uš¶Uš´Sš²T›³W ·U¢¸S¦»R­ÀP®ÂN¶ÆO¹ËP¸ÎX·Í]¸ÍW½Ó`½ÑW¼ÏS¼ÐQÀÒOÁÔWÀÔXÁÕS´ÍT›Ç\€l7r „o;$`–Hg¥NiªRk­R|¶dŒÀvzµew¶`{¶g{·ix´gy´jz³sk¨t_sNL1S2L}R*i`3SF%@8Yu9d—Gm©U{³^t©So¤M‡»\Ë~¸Ø²¬Ó¤»ÛÁ²Õ™Ès‡®oJAbf.Š¿R„—Ere*o’?s©Sv¬a±i€¬Zu€:w[(€P%ŠP&•\+žƒ:«ŸG£F¢Gv§Nt§My¬X–Äy¼á¸ÆãÑÂßÔÄàÛ¬Ò®|¸Tg‘E0 -^"€N0h5†|<‹~<Œ|=Œu:‘x;•y=“m9‘a6’\4˜\4—X2”?,1)¦M-¾p6Ão7¿Y1³K-´'&´%%µ'%¶$'Á$&™'(ª0'Á<3¶-'±!¬¡—•–•—˜“ ••–œ˜ › ž¢›•” Œw†w,­F™¾e˜»j˜¹c˜¸\˜µUš´Uš´Sœ´VµW¡¸S§»S§¼R¬ÀO±ÂO´ÄO¸ËP¸Î[¶Í]·ÍT½ÒX½ÒX¼ÐT½ÏN¾ÑMÂÕRÀÔTÀÔS°ÍW±Uf6 egZ†Dc£Qi©Qg®Uq¯Z–½w’½t†ºm~¹h„¾m„¿q»t~¹r€º†ŒÄ¦~®ŠSQ1I {/$M2-9w’Ih¡Kq®T¸]u®Vr­Tƒº[”ÈqµÙª¸Ú·¸Úº·Ù©©Ñx…žRNK$u Cˆ¸X‚¹\x¡@r†9jŒA„±`šWbHn4w4!„=#ŒH'–c,š‹<—¡D‰¬O…µX¶[ƒ·^€´\}°Sޏb¸Ö«ÊåØÄàۨХ}¹So¥K=(%G l6$tP/‚_4„c6„^4Š_5^4‘V3Q3“I,”H0•C.’5(”.&¬9*¼I-½E+±)&¤$¨-&²$%µ%%»&&¾%'Ä%'¯*(®#¹)&° ®¯¨§¤œ•”  ’Ž—• ––š ˜ —”‘ ‹ zŠw.”¯I•¹[™¼iš¹aš¸Z›·V¶UžµVŸ´U¢¶W£·T¨¼Qª¼Q¬¿L®ÂK²ÅQ´ÉP¶ËW³Ë\·ÍU¾ÒW¿ÒU½ÏS¾ÎPÀÒQÃÕUÂÔVÂÖR¥ÇWxŒEQ SX[0^ŸMi¢Nn­Uo²Wˆ¸i¹o»r޽rŽÁy†¾t‡¾tŠÀ~ŒÀŠ’Å¥ÌºœÎ³SS8aF'oG1M F4cr5w£Mm¥I{°W³[{³W|´UŽÃgœÊ{¨Ñ˜¾Ý¾¹Û»·Ø©°Ñ†´×}‰¢]Tq*“Åf|§]V^-rg7v‘C‰½U€€D]"s0~8"‡E&Š],}6ˆ’=€žF|®T~´Z€¸^†»eˆ½eƒºb‡´Z”¹c»Ø§Óèå¬Ñª}¸Ux²QE73^ wE.‚N0‡O0†M1‡N0‹K/ŠB,…8)‰2)Š2+‡-$('¨3(²1(¶0(«$$¢"«"%±%'·%'À)'Â*(Â&'Å%&½*(ž¶""° ®­¬«¨¢š’ “•• – –Ÿœ ›˜— – •  ~ z.”­G”µV—ºf—¸a™µX™´T›´V›´SŸ´T¤·S©¼S¬¼R¬¾R®ÀN³ÆK´ÈN·ÌR·ÎX¶ÍZ¹ÎW¿ÒU¿ÑR½ÏP½ÑPÂÓRÂÔS¿ÔSÂ×V—¿Y`X0CE WCa Of§Qr¯Su²X„·a…·`Œ¼g޼k”¿o’Ãx–Ä€”ȕěœÌ«¬Ý»‹¤„[\8Š´]n‡JL28 C*t™Is£Mu¬Qo©R¶]u®T}´T‹¿bšÉz°Ö¤¼Ü¼¹Û¸ºÜ´´Õ•ªÎt±Óet;t™9†¡WlM„Äfu¡L{¡C€¯M„¸Yƒ»_ˆ¿e‹Âe‹ÁgŠÀhоg¿fŽ·[»×³®Öª~¹SzºUMI&#*N p-$<*:)9)‹?+†5)„+%ƒ%$„!#x‡ ª,(¯*%­%$­%%£ $¬!"´%%¹*'¾&&Ä)'Æ+)Ã+'È)&¹*(™»"!· !µ!°®­©¨£— ” ’ “›£¦š™ ™• • • – • ’1˜°F–¶V™ºd™¸[š¶W™´Tš´Uš³Tœ³R¢¶R«¼T¯¾S­¿Q°ÁMµÆK¸ÈN¹ÌU¹Í_¸ÌZ½ÎT¿ÐS½ÏM¾ÐP½ÑQÀÑPÀÒT¾ÓS¿ÙY…œJL:WV$h Jh¥Ml­Rv¯S~´Y…º[†¸Z‰·\‘ºe’¼h’¿n›Å{žÈ‹™ÁŽŽ¶ƒx—cg”>©Ø„«Í„Š«gN<$5 4e=w©N´Y„¶\’Äe~µW‚·V¼Y¢Ëx®Ò‘»Ü·¼Ü²®Ñ”°Ó€²ÖŒ´Õ“ƒ Y^…2 Êo†®llžNp}9pm1U%w=!zG%y\,up0t‡6y˜By£F}®n„´_Œ¾]Ãe“Åi’Äk”ÇkŽÄn‡»dŒ½c™ÁržËˆ€¼S{»SLF"#.Agv,#x0%z/%1(+'|"#x"pv"%£!#¥!"¥!¦"­#$´#$½(&Á*'Ä('Ç)%Ç*&Æ)&Ë*&½*%“½ ¹#"¹#"µ!²²°°¬£— ˜ —— ¡ª© ˜” ’ ‘ • ‘ • ˜~5–²I‘²P”·]—¸[˜¶W˜²T™µU›³Vž´S£·Tª½S¬¿R®ÃQ²ÄO´ÇK¹ËQ»Î\ºÏ`ºÍ]½ÏU¿ÑT»ÐL¼ÐP½ÏPÀÒQÀÔU½ÒU·Õ]ic061 ^|9f¡Lr­Qw²S|´SµV}­Q{¥M€§O„ªT‡«Y±_Œ´cޏm¹t‚›eF(2tœA¬Ùw£Ê‚޶qx•ZM8"?2oœIxªT˜Ær™ÉdŽÀ^޾[—ÄeœÆd¤Æn»Ø¦´Ö•¯Ï„Äf¯Õ…¿ã®­pgŒ>„µX»k~¢]‚¥L‰Ia/{U+uh0jv4e}4_6i•AiDp¥^y°V…ºX…¾^‰¾bÃi—Èn—ÈrÂnˆ¿hÂlŒ·]x´Ow²NF83D`lu%"{("x(!w"#vnrš! ¡!"ª"#§!° %¸'%¶%%º''¿'&À''Á''Å*&Â0(È)'¼0(м ³¸!!º!³³¯¬°®Ÿš— ™ ¦¯­ ¬œ˜ ˜ —˜—– ”‰7–±J”´R–¹]—¸]š¹Z™³T›´W›µZ µV©¹T«¿T¬ÀT°ÃMµÆL¶ÉM¹ËT»ÎZºÐZ»ÏV½ÏR¾ÐQ¼ÐP½ÐQ¾ÑPÁÔPÁÓV½ÕW§ÉZR3+6#Z”Gp­Qv±Su±Tv°Ry±Tr©Pu£NwžL}¡S«Y‘°`”µc‘µc¹pšÄ€’¯M4-#\t%”ÁXœÇhÇg‘µpb]4kšLˆ½f”»rt¡Jy©P‰·Y›Äo Çp¬ÐyÀÝ«¼Üž¸Ö¢¤ÎˆÊ‡xšN~¦OœÃh—Ãs’¾sŽÅ\¢Öfgb0`Dts2j|6h‚6oŽ:n‘=i•?q¢Cy¯F„¸R„ºY‡¿`‹Áe‹ÁjŽÄl“Èr—Êw‹Ämƒ¾h¾gw®Oo¤HB&$+7L _h folec ™!ž!«!$® "¶##¹%$½)&¼&'½''Â)(Á'(Å((Ç&%È+(Ï*)º,(…¿´¬¸¹! » ¶°¶²ªŸ™¤¯#«  • • —““•Œƒ”Œ;”°N•·]š¼f›º\™·VœµXŸ¶Z ¶Y¢¶W¨ºS«¿T®ÂS²ÃO·ÇN¹ÌQºÍW»ÏY¸ÎWºÍV½ÏT¿ÑP¾ÏP¿ÐS½ÐU¿ÒS¿ÓU¹Õ[ŽªPC (B4b Ky²Uy²X{´Y|´X{³Wp±Wq­Vx­W{­Z„²\Œ±^•¹c™¼ežÁr£È|¨ÔŠ¬ØœcdI">3v‚7‚™Eˆ®Z‹ÂZ–Îi•Ëo§Z]:w®X‘Ã}šÆ€œÃ{œÃu¨Ê‡°Ð„¼à¯«|[z8f”Kf—A“Â[³ß…¯Õ‡|Z4*1`q0iŽAm=jˆ7m…6o„4}™=}©H²PмZ‹¾aŒÀa”Çm•Èv‘Çx‘Ç~’ÇxÇr‹ÃlÀh…·XgŠ<5 "&/CS ]diZ W~’!˜!¨ ª "®&#µ(%µ$$·$%¸&&º#%¾%&¿"'Ã$'Ã$&Ç'(Ï+*¹-+‚·­Ÿ¤·» ¶²´ µ °¡Ÿž¨µ#¯ š ––“ ’Š … ƒ+““<’°K˜»g™ºg–´\˜µW™³WµZžµY¢¶U¨¸U¬¼U±ÂTµÅO¸ÈOºËO»ÎQºÍX¶ÎX»ÏU¿ÐT¾ÑR½ÐP½ÐT½ÐS¿ÒR»ÐUªÏ[w„?4, Oc4m©Q€·\ƒ¸a¸`¹f~¹duµ[u³Zr³Zt²Zw°[°[‰¯W®U–²^“²^‘±aœ¹r“¶qg`6V>"cR2ij?k€Bm{@td9¡M©Ïˆ˜Êk‰ÄdœÎƒ®Û²ØŸžÈ}‹¸i¼f¦Ò„©j`Œ?‡®i‹»q£ÊvNun:€~a)HFar4gi0lb+vd.ˆ~3• B†«F€µO‡¼WÁaÄh—Èp™ÊzšÌ‡˜Ì˜—Ë”“È~“ÈtŠÀjˆÀd]q4.!&0;DR V W Fr™# !¬!"¬ § ³$#µ'%¶&%»(%º''½$%¿%%Â$&Â%'Ã%&È'(Í(+»35‰¶¯¨£ªµ¶¶²³"­¤š™Ÿ«!¦˜—•” ŽŒ … zƒ>š—A‘¬J›¾iœ»e˜´Y™¶W›´UµYžµX¤µW§¸U­½U²ÃU·ÇO¹ÉN»ËO¼ÌP¸ÌTµÌV¹ÍU¾ÏU¾ÑT½ÑS½ÏT¼ÐS»ÑT³ÊW–½Va^/.;6^šLw¯V…¸a…¹hˆ¹i„·k¸hs²[m°Xp³Yt²[x¯[u§T{ŸM}”I{ŽG~ŒE‚ˆD=™PŸ²]›»b’¿i‘»mбg~žZpˆIy›P³i‰µf„³_|£TnŒD‰­Y~±PžÊ|«Ð‚œ¹rˆšTv“B¿e§¶r’˜Ivw3ws3¥²[vs=WH%bW/qu9„†B‹‹D‹—D‹¢D}¤J{¯O}²S‚¸Vˆ¾]ŽÃh—ÈqË„¢Ðš¤Ñª£Ï§˜Ë’“ÇxŒÁjÉkfp9)"%+2<@E<N %#¢"#§!#¦ ¤ © #³""µ%%¸%&¿(&À&)¿%'¿&'Â'(Ã&'Å&%Ê()Ò12¾HBˆ¦§®¤£«®µµ·µªš™¥ “‘ ‹ † }t f{K–›B‘®N›½hœº`š´Xš³UžµW ¶XžµX¤·W¨¹U¬¼S³ÃR·ÇRºÉN»ÍR»ÍV¶ÌT·ÍVºÍW½ÏT¼ÏU¼ÐS»ÎQ·ÍS³ÌV¦ÃT‚¢MN1,LX(j¥P~µcˆ¶g…µe†¹i´bs®\l¬Yq±[v±Yu°Yu±Zu«UrŸNr–Lo‘IrIvKz™N«Y¬Z~°\z®\~³`x®]w«W{°X~µ]q±[}¶b„»e‹¼t}™cYU3!0 jP{‚>l…½[U‰¥–ŸŸ›¡©ª¬²¯¥›” ™¢Ÿ”—‘ † ‚ } v f€[$–œ?•´Už¿lŸ¹]œ¶WœµS ¶WžµVžµR¤¹U©¼W°ÀS´ÄR¶ÈPºËO»ÎT¸ÍXµÌY¸Î`¾Ð_¾ÑXºÏV¹ÎS·ÎS´ÌR¬ÇT•´Rtz== /Un2q¨PŒ»m½s†µb²\tªUj¥Xo¬Xo©Xo¬Xw²Zy°Xo¦Sq«Tp«Sl¥RnªWr®[r®Zm¬[o°\u´]t³[t³_k®[k«Yo°\rµ]t¸cy¶`|´[†¼g”Êu”ÄyNO3/ch1hi4_w6W…;_šEo«Nq°R|·a„¾fwµZ}¸[¹[»]~¹]ƒ¼\ˆÀ^†¾]ºY…ºZ„¼[†»[‰½`“Ãm£Ì‰•Ç{¦Ñš­×µ±×» Ð¤“ȆÀoŒÇlwšN! &+$)%t°4/Ÿ#¢%¥$&¯#&±$%±#$·#$»('¿*(Á('Á)&Å,)Â*'Ç))È'(Ê'&Ë/1ÑZZ¿…}“©–––  ª¬ª¨¦¡š“—™’ Œ } u w c‚j)”œ@—¶\ ¿iŸ¸[ž·WµSŸµTŸµTžµR¦ºU¬½U°ÀR°ÃP·ÉNºÌPºÎT¸ÍXµÌ\·Î_¼Ð[¼ÏTºÏT¸ÍSµÌT¯ÇU¡¼P†¥OaS/5> \) &&% ##’— ž!©"$³$&¶#&´#$º)'»('½''Â*'Å+)É/(É,)Í/-Ñ;4ÑrgÊÁ´Ï×ÍÁÝÓ‰«™—£•‘ Ÿ¦¢žŸœ˜—– Ž ‰  tt b[ “Ž=’Aš»Zº`š´S›´RžµQŸ³R¢¶P¦¸Qª¼U°¾R±ÂO¶ÇM¸ÉM¹ÌR¸ÍV´ÊY³ÊZ·Ì\ºÌV¸ËQ´ÊR±ÅQ§¾O•®M|‘FcT1F 8SV,e‘DnŸMw¦Rn›KišRnžWnSq¡Sv¤VqŸSq Wr ^nœ\l›[pž\m¢_t¥^n¨bj§amªcq²bq´`l­Yj­Vp¶]uºav»cp·at¶b{¸f€»s™É¤µÙɾÜÒ°ÖǠ͵ŠÀ›gWVk3[‚?c‹EgšOl£Sm©Ui«Mp±Pw¶W¿aˆÀkŠÁpŽÃ…£Ì­¸ÙÅÀÞÒÁÞÓÂßÔÃßÕÃàÓÀÝÑµ×Æ™Èž”Ã|˜Åx¤ÎŠ¬ÒŸ¤Î–¤Î’›ÈžÉ–¾oƒ¶[C/'#gž&%Ž‘“— #¨"#¶&$½('¿(&¾'&¾%%Á('Å*%Ç+'É1(Ì/)Ò;5ÑJCÍšŽËËÂÏÞÓÃàÕ‹®š£˜‡t | ž œ˜˜ –Œ Š ‡ … ‚ x nvZc7–š?‘?›¹Yž¹bœ¶SµOŸµOŸ³O¡¶P¥¸Sª½S¯½N´ÃM·ÇO·ÈP¸ËT·ÌV³ÈX²É]·Ëd¹ËT·ÊR³ÈR­ÂQœµQ‹£Iw{q‰>s‘Hw›UxZwžVs›Ww d{£kx hv™_v™^sœ`qž`pš_q_sžar£cu§bt¨gv®jr®co«\n¬Vo±[n²\s´dx´lˆÀ‹Ì®¡Î°ªÒ·´ÙÁ¼ÞÈ¿àÌÀßÐÂà֢̹ZzFUt8_‰B\†<[Š;\‘<`™CaŸHg¨Hm«Jy³Z·f…ºrŽÁ‰™Çœ¢Ë£¬Ï¬¯Ò´­Ò´£Ë£”À‰¼y“¾t•½o“½j˜ÁlœÄqŸÆu˜Är—Äs¼kˆ»dг\<#'-hƒ‰‘•#œ#%Ÿ"%¬#&®&&¹'&Â,+Ã/,Ã.,Â+)Á*'É.(Ì.*Ï4.Õ<6Ñq`Ì· ÍнÏÖÄÕʰƉk˜«šš—Ÿ¨¤‰ pQ:o‰)„W-wR-c1k*xE'wU.h4?,3…Ž6˜?•§Bš³U ¶Y›°O ³N£µN¤¶L©¹O­»Q¯»O²¼LµÂM·ÅM¸ÆM¶ÇP²ÇS­ÃS®ÄW±ÅW¯ÀRª»Qž²R‘¦Gƒ“@wy;lG,U6T*de3l…?n‰Bt”Nt[už[u Zx a{ kz¡mwis•`s—^r™`qœ_t›_tœ`w `s¥fu¦ct¥ct¬fnª^h§Xj¨Rl±Ws´]|¸jºw×ʧœË§ Ì¨›Ê¥ Í¬§Ñ¶¯Õ¿´ÙȞκe•^Mv3T:Y†9Vƒ6ZŽ9[=^–@] Bf§Go°Rp±[q­[z³cˆ»v‰¼y“ǙǓ—ÅÀ‘½v“ºr™Àt”¼mºf”¿f–ÁkšÂl’Ál‘Àk‹ºjˆ¾hˆ­Y8 1nrv…Ž™"Ÿ#$§%&¬%&²'%»&%Æ-*Å-*Å-)Å*(Ç*'Ë2*Ð3/Ô70ÓRGÐŒzÍ»£ÎƲÑ©ØtÉA5¡© žš›œŠ{dQc €I#nL!gT'[$?E [ o=*O2*;‹•;˜>›¬DµR¡ºZ ¶P¦·N¤¶L¥¶J¬»N®¾P°¾M²¾K·ÄN¸ÅN·ÆO´ÅQ¯ÃSªÂQ¬ÁW°ÃV®½R£´O™®L£I€’Bzt;mA,O 6[-jb6i€?lˆCp’IvWz¤^w¡`¢g}¢mz mzžiwšdtšbu™ar˜`q˜^q™_s_s¤gt¥gu¥er§bk¡XbPf¥Qm°Uu·`{·m…¼y‹¿ƒ‰¾†ÃÂŒ‰½†ŽÀ“™É¥£Ï²¡Î´™Ì²p hNr,X}4Y„5U€0^‹6^9[>^š?h§Gi¨Jj©Sp«Xp¬Vw±bz´f´h‰¼t‹½r½t‘»s¹t”»q’»m¹f”½g½f’¿h¾fŒ¼e‹»iˆÁi}ŸO- =rnw ~Žš Ÿ!$¥''«&&­%$¸(&Á+*Æ-)Â.(Á-*Å-(Ì5,Î5.Õ:5Ól]ϥϵŸÏ¾©ÖœƒÙO?Ç-'¢¤£¢¡žš—Š x^ T+~H)c)CSq^1ob1T(Z6!pX4_-I>W;Œ›>Œ˜<™®Fœ³S ·X¢´N¦´M¤µL¥µN«¹R¯½Q­¼L®½NµÃM´ÄO³ÅR°ÄUªÀS¨¾P¬ÀT¯ÁV«»T¡²M–ªH‰žE}Œ@wq8oF.L<[)j_4gz=g‚@hŠEp•Pw [uŸ^wŸe|¢j{ lxžizžfx›cw™_t™bv˜]t™\sbt¢bs¤bs£`q£]h›PeŸNl«Sn¯Wq°]v³h{·n{·qy²l¹tƒ¸u‡¼{‰¼†ÁŽŠ¾“Œ¾•p bVx1Sx1S|2Q}0Xˆ4\7[;_›Be£Fh§Ji©Pm¬TkªRo«Vs¯\|²_ƒ¶cŒ»l‘¾t»sޏoºp‘ºnŒ¸e‘¼f¼d¼d‰»`‰º`†¹h…Àgu‘K'Dj k z~œ!¥$&©"%°$%´'%¾,*Â.*Å0+Â-'Å,'É-(Î0+Ñ7/ÖI=Ó‚oЪ“Ò±™Ó±—×o\Õ3-Å/)•  ›¡›’ g |h,€q2d&FR*t~8u‚:oj1nM&yz:~Š@^6>3WI”¤E‘>œ±HŸ¶W¢µX¢´R¦·O¤µM¨·M©ºQ®¾Q¯¾O°ÀK³ÄP³ÃO³ÄQ¯ÄW¨ÀS¨¾P©¾T©¾V¦¸Qž®L•¥H‰šF€ŠA{q;p=,V D_)nY1iu9kˆCl‰DmŒHq—Ps—Xu–[wšdz ixgzœeušbt™co™`r–[n–\p›bmš\jšYož]nUd’Ia—Hl¨Rm®\q¯_t±dx³ey¶ix³g|¶h}µhƒ¹p¸o„»q…»t„¸y~³xiZV9Ou.O{1R€4Sˆ4Z“;X‘=_–@b Hb Gd¦Mk¨Qk§RpªXq­Z}³_†µdЏjŒ¹k¹m¸o¹mޏh‰´^‹·]º\޼aŠ·YŠº_ƒºk…Ãit…G#"V h h wƒ’ —"¡!%¤!&¨%%´+)¿.-À0+¾+)À+(Å-(È0*Î0+Ô<3ÔXKщvЧңŒÖ†qÔC7Ï.*Ä,)‰ š—›™š“Žzx0vR(W EK,yŒAlc/Q-R#? T!_'Q=C `\ ¡C’¡> ´M¡¶X¤¸V§¸R¦µN¦¹N«¹N®½P­¿O°ÀPµÂL³ÃL´ÃP²ÄS­ÂU¨¿Q§½R¨½W¨»V ´R˜©J¡FˆœF€ŽDwm8o8(GA^'pZ2lq;k€Bgƒ?kƒAn‡Bm†Ip‰Rw‘Ty™\y›cy™_vš_z›`v˜ar–Zs–[r–Zp™Zl™Wlž\j›Sb‘I^•He PlªWq­^o¬\w±bw³gw²d{³dz³cz´dzµe{´b€·j²ks©ed–OZ‚6S{0Q}5W„5\‘9\’;^9d˜?aœAb Dg¢Ji¡Gl¥Pr©Tt­Y|²]‡¶e‹·iŒ·iŒ¶h‹´j¶i‹´c„±[„²Wˆ·]Œ»bˆ¸]ˆºd€¸g…Àekm9$'[ e m~ˆ˜œ!£!"¨#$­%&µ))¿-+Á.*¿,)À.&À,&Ç-*Í2-Ñ=5Ô`RÑ‘}Ñš‚Ò‡wÕ]RÏ4.Ë+*¾-(~ “Š ‰ † wmxQ'eR 4jh)wf1H xŒ@wq?U^: [+?RFlm&’¡A“¢A¢¸P¢¸]¡¶V¨·P¤²K¥³L¬ºN®¼Q®¼N¯¾M´ÂO³ÀL´ÂN³ÄS¬¾R¦»P¢ºO§½W§¹UŸ°Pš¨K¡Gˆ˜D„ŠAup8p5%<<RmM/nm:kx=ez>iBm|fžDeIežIl£Lo¤PvªU|¯[…±b‰µc¶g‰²dµi޶g‹´a‡±Z…°S…¶[‡¹`ˆ»^†¼c„¸_‰¾b_Z/),S d p}†Ž!•!ž ¦!$±&&º,(½*)À,)À.'Á,&Ã.'Ë0*Î3-Ó=4ÖjYÑ”€Ò…uÔ}sØ\SÐ40É-)½(&‚ ’‘ † € { uz^(tO!]M I wz5X&H$~‘?yŽDo^6oe/[+Fb+*pr,•¡C–£A¢¹U¤ºb£µU¦¶Q¦´P¦µOª¸P¯ÀR°¿L±ÀL±ÁL³ÃO³ÅS°ÃVªÀZ ¹R·Q£¹U¤¸TŸ¬N–¡JŒšE‡B‚…A{i;j'!?6G kA*pi;qx?k{?m}@pz;rr=ufAvn"~n3w;w‰Atx4j< `K .{‡2C“¢A¡·X£º_¥·T§·P¦¶Q§¶S¬»P°¾P°¾M±¿M²ÁM±ÃR±ÂP­ÁT¦¾YŸ¹UŸ¸V¤¹]¡¶Yž¬R–¡I‘žF‹•FˆŒC€o;f(!B;B g4$o[9ln=it;iz=iv9mi6ob1ug8we8vm9wzBqJmxEo{ClxBi€Gj…Ff…Ed†Hc€Cd‹GfEeGg’Gg–Ip Ou¢Ty¥X~­\‚­]{«[t¨Wsª\s§Vv¨Xt§\qžYl—Pb‘E_‰=`…7Y€2e‹:gŽ7b4_‰5d7ešh(!P=8e&"tS6rq>p@k|?ip8lf2s_3xW3{Z6yh:{s?twBnp;lp=ls?fv?fw>czAcEa~B_ƒD_ƒAeŽEk‘Fm”Hr˜Ly¥V~©\{©Z}ª[x¦Wq£Sq£Rw¨Uz«Zz©[v¢Yp˜Lj”Bf>f‰;^…4j“>k–@h”9aŠ6e5e—=g“@h“@kšApžGqŸGw£Ly§N¬P|©Q|¨Q}«W…®Yˆµ^ƒ°Z«T…±T…¶X…µW…¸\„·]‚¹_}O/ 46Rn zƒ‰š!"$¥!#®$'µ+(·)(»*)¼)'¼)'Á+'Ê3-Í:/Ð61ÖUFÙvd×k[ÖB=Ï//Ä')¿!%²((“ ¢ž™›˜ ~ o(EW n@j@!j8"\$uG&{;{„;ta1|†d‡;Lm:)q`7ru>py?ny@lo8mk8rZ6zS2{b7|o<~jAxf<7@d&qK2rj8pw;r|t}Aq‚Bp‚?nŠDs”Mp”MsœRz§Z{§Zv¤[z§]|¤Z¤Y}¡UyœTsŒIj>gz7c}4e…6c‹8f‘?h˜Be“;a;i•Bm–Am“Ap=n–BvœGyŸJy¡K|¨S~£Py¤Lv¡Iv¤K{©P­U€®WzªS~­R°R¯S~±[}¯Z†Àbht>#7@?j ‘š #™"™!" %$¬'%±&'´*(´'&¸$&º'(»%%Á*(Ä/*Ç0+É/+Ë0/Î63Ï43Ë13À)-¸ *ª&•#Zew € ƒ { z sbNZ Y BhTa+qA%f1sJ"{]'n,_v5"wg(¢C‹@‘¤B¡¹U¥¸U¤µO¦¶P¨·MªºO±¿\µÀMµÀLµÃM³ÃQ±ÃRª¿T ¶Nœ³L µL£¶O£¶P¢´Sœ¬O‘£J‹¢J‹šF…”Gz]9S<;<>VoA.oW1nh5qz=qx>ps…y=€o|†E}†G||Dwx>t}?q{=m†AoŽIp“JxœQ|¦Xw Uy§[|©^{¥[€¦^|Xx–Qq‡Ghy;`t5\t3_~3_ƒ3eŒ:d“?`’;c;i“El’An”@pAr“Du—EwžKv Lz¤N}£Nx£J{¢Hu Iy§Q¬T}¬Ty¨Q|¬U±S~°Z³\~²^…ÁfYb1!0C4[ €‡” $–$•!!%©$$±*)³('´'(µ((¹%'½"$À#%Â((Ä-*É.*Ê/*É2/Ë31Ê22½-,´$*§(”$B0JY_c^\PMg\D`v8!j5m8!m<$p8"j+U E3YX•®H¡D“¨D¤ºS¦ºR§·P§·O¦·O©ºO®¾R²¾J´ÁL´ÃN´ÄQ²ÄTªÀV ¹S™²M³L¡´OŸ²Q ±P›«N“¥K¤I‰Dƒ“EuI0R =9@@I m2'oE.mS/nn9q|>q|;ryAto?xk:ƒs<‡w?‚p<{\4x[2td5su=w„B|ŠGz‰HwEv{Bpt‡|B„r=f4vX.s_1uq9xA{‰E‡Dx}Dv}Bqs8lt9mx;o~=oˆ@q•LyŸTt™OxžSy¢W¡W V}šRy•Nr~Ckh5kb-hn/es1h{2i5r‘:n:o;u“>s’=r”>u’=s”BvšFt™Dv›Eq™AvžDy£Iv£Is¡Hv¤H{©Ox¨Q|¬T‚²Y}²W¶Z·Z‚¸b„¹[KD)7?1tˆ! $ !%ž $¢ $ª$'±%&²('¸'$º'%½('½&(½-*¿-(À)'Á'&Â)'À-,º**´%'©&$“ O=6-+8is € ‡Š‰eUn(r+ `S X VE> xƒ1“­HŽ¢@•¨A¡¸O§ºT¥¶Q¤¶N¨¸N©ºM°ÀO³¿K·ÁI¶ÃM´ÄP®ÃY®ÂW¡¸P—°J ´K§·M¦¶Q¥µQœ¬M—©M¥K‹£G„ŽGp3/H;@=?8Kn70hA(gH+kZ1ls:r€>sBtvA{q;ƒxC‚xA}l9t`6m`2os;q‚Br„Bw„Cu‚Ct~Cop;mm6hp6k}=mt—Ds™Ho•Do—Au›Cz¤Ku¤Ms Iu¢I|©Rz«V}¬S±Y³]‡º^ˆ¼a·c†»]L?$*?)U ‹Š ˜$ % !%£ %¥%ª"&­$%³$%¸%%º(&»#(¿(*½,(½''½&$¾+&½((º'(´##ª%¢%›!e[P;/'Mqu } € ‚|s0{g1~T,^!0R WN @“8“ªH‘£C”§?¢·N¨»U¥·Q¤¶O©ºN¬¼P±ÀL³ÀK¶ÂI²ÁN±ÁQ±ÃV«ÂV¡ºR›³K£¸N¤µQ©¸U§µUŸ­N–¨K‘¥I‰¤H‚‚Ch .?6;:9>D_%g>*iB*fH+kc3mwˆ@‡|>}k9u_2rk8u?v‡Dx†Ev„Bv„FwwBoo9ovr‡AuE~›P€™P}œP„ŸRQ~–M}‡E}oqh8|f6‚w<ƒ|;|l8v^6l_3rt:z…Az‰Ew‡DzŠD|„Fuw=pu;sp9uy=vAyŠC}’H‚šOƒœQ~—Lƒ˜JƒG{~Azh7vX/tU)r`+t_+jg)kl/o{2iy0mq,lp2l€5kƒ6k†6q=q’Cr”Ao˜Bu¡FuŸA}£Iy¤Iz¤I~¦Nƒ®U†°W†±X„³X‡·\„¶[ˆ½d„»i„º_G@35E M $=‡– %œ %¡!&¨#&¯#(¯&&¯$'±%%´&&¹&'¸&'¸&'½''º')¹'&´&%²$'±#$© #"’ Žz|$~(†)„!x\00\a`l ck O8Qp8za+vM&^Q:‘¬E‘¨G‹ E–¨B¢¶M¥¹T¥¹S¤¸Q©¼R¬¿O±¿I³ÁJ³ÃL±ÃP¯ÃS­ÁT§½W›¶Qš´L¡¸O©»U«¼[­ºT¡²L•¬J¨KލJ}h9W47<;C?9Ti-$l9(qA+oJ-n^3sp:uq>uh8y]2~j8„u:„t?vb:n]1sm9x}>x‡Ey„Dx‡E{‡F{„Dtw?mh7qm:ow=v…At†@{”K˜Q–O„™Oƒ–K|…D{i8xW/v[,ub-sg.pj+nr/p‚4q…5o€2js0o|2q‚2j‰5oŽ4==;9<<F]j.$m@,nT4nV4qn:v}@um;{\5z]5i7‚x?…w<}c5qS/vb3wr;z€Az…E|‡Gz†Gwx@rxp•@u›E{žEy¡Fy¤Ky§Pƒ°V„²^€°]‚³[‚µ^~´Yµ[µ`‡ºYSL##58H [ZE :(9s %­+.®*+®()©$(¬&'®%&ª &¥"'¥!' #š"!˜!˜!Ÿ"œ"ž‘!e |5€;…L"g/‹`-ŒG%…4‡1‰(vJ:B@>Ffkhee}|-’·N‹«O„ E“ªFž²K °J¡°F¤·H«¿O­ÁN°¿H´ÃK´ÅQ²Ä[°Ål®Æ§ÀrŸ¹X«Âg­Än­Ác®¿Y©»RŸ´R—¯P•°R›Kk)!;<;2697;BU f)#j2(lK/pY5mf9mx=pw@wd8xc7†m;‡w@†q;„l6|[2wW/wf8|t>{…C|‡F~ŠHz€Buz>rm7nc4nq5p‚=vŠEz“K}›P€S‚U€‘Qz€Gqk8ph2ia+hc+jn0i|3o‡8kŠ8lŽ>u“Dw•Cw”Du”EnBq‘Bs“Av›CwšCwEyDy¢H}©Oz©R~¬R‚²]~°^±Z€¶]€¹a}·Z~¶\…¸XNB !2=Vj1(e'"WH 6("@i"#¢''©%$¬""©!&¨& "˜! "—!™ ¢%ž%–!Œ e v#p$t9K€W)€X+€>02†+~U -/4?ZdhbY‚Ž4•¶P‘°TˆŸE™­E ³Iž¯KŸ°D£¶J¨¼P®ÀN¯¾J³ÁM²ÃQ²ÆZ³Éo²Ì‚¨Åv¢¿a¬Ål®Ån­Âb®ÀV©½RžµR–®Q”²R‹‰F[5;:4<>>;?O b!!j-&i?*q[4o`6kg:nl‚s:~k9wV1rK+wZ5xjso6ok5ts7sz;xˆ@|“I™P€žS‚žTƒšY|…Iri3oi3pi/kf,ek-k}5n‚4j‡8iˆ;r’Dt˜Jt™Iq–Iu—Ns™Kn’Bu›Fz¡Ew E|£Gz¤J~§N{©O}¬Qƒ±[…´]„¶_¶[„µ\¸[…¸]†·VF9"3DWn@,j>.f.%W9)!.F^ r † ƒŠ‰!‘” ”"™œ"ž#"Žt?ŠV…D~8~6t*u(y'x!sz&|#uM&+7ELWOQ‹ ?“²N±X‹žG˜­Fœ°J¢³O¡³L¥·K©¼N®ÀN¯ÁJ³ÃN²ÃN¯ÃO«ÂT£½U›¹Q¡»U­Ã_­Ä_¬Á]­ÁV«¾Q ¹R”±T’µTƒh8G-8;;9;=@?D ]l3&k;+rW5pe9sn=td9{e:€h<ƒn:†u:‡|@„m9xR.rK,qV1vg;ww@xEzxA|ƒDpx>ni3je2po2lr6r?u‹Hy”K}•K}”M~“Nxt>u[/r^+rk0lm.io.hx2l4n€4mˆ;t@z˜Gt—Bu•Gz™KwœLx›Hu›IvŸHv Hz¤Mu¤Lz¨Lt©O{«P²[†·c†ºd{³Z|³T‚·Y¶Y…µV9-+7Pj6'sO1oE/p8.D *!"$4J\ r ƒ ‡ ‹"‹"%2—'‘ •"“!”!•"™&—'sY‹w'ˆi!„]…YƒP†F‚;v(qjj e ^4#5>B<N, ”²F“°L‘°UˆDš­Fœ±Nž´QŸ·R¥¹Q§»N¬¿N°¿J±ÂL±ÃM¯ÃR«ÀU£½Xœ¸Rž¸Pª¿U¯ÃX®Â[±ÃX®ÀR¢ºT˜´S”®RqD(63:@?7<=?@<Zl2)j5)nL1l`9nn;nj9sf;€jyBz}Ez†Ew~>un7qk6q`,rj1ww9|‰B{’I}GŒG{Dxh9vW0oV,mb/jr3in3eu6h8i}6m‰>oŽ?s’Cs’Ds—Is˜KxNxNu Ny¤P|¦R~¨Sz¦L~ªP|­Q¬P†µ]ˆ¹g‹¼b´Y…¸[ƒ¹Y·Y‚ªQ5 #0G^!sD.nD*‚‰`[26''".Si} ‹Ž# ”#—%˜5– +˜˜!˜#œš"—&$yE”Z‹HŒJŽJDŒC@‹<Š1†-%uxsgiu~~m rT“³O“±V‘®U‹›>›°H µQŸ³OŸµO¦¼P§»N«¿L¯¿K°ÁJ¯ÂL°ÃP®ÂX¥À\ž¹S£ºQ«¿U¯ÄZ²ÃY¯ÀS¬¿R ¸S–¸S›J[,9::>@BADHH [r6-m8,pF-s\7tm€b9wQ1pK+oM/p^7oo?ty>z‚CyGv~Ass:op9qc2nb2ux9z‡?}’I|ŽEzˆA{{@{i:zW-kR*p\,pm1jr3iu4n€6hƒ:kŒAr•Eq”Ds—Fr™OužRu£Uw Sx¡S{¨Vx¨Wx¬VyªOy§Oy©N}¯S‡·`ˆ¹f„·]}´W€´Xƒ¹W†»W|™H+%(3M^#i*ˆX‚s$&'Fmu  ‹‘!”$“&š#™!˜"—#•!™"•”#‘$ŒN°n%ª`ªa§Z¥X ¡O ŸKžI›F›EœBŸH!¢L'C"ž= œ9"š; –5’0„"x/‘µS’²^‹ªWˆœ>š¬G›°Ož±QžµO£¹N§»Nª¾I­¾J¯ÁM°ÃK°ÃO­ÁT¥¼T£»Q¨¾R¬ÂV±Æ\³ÄV¯ÀQ«ÀT£»T›»U…p;H 084;;=BDDCF Sm.'m6+pE2sL3r\7qd8wX5x^7€q<„w>p9{[2rM,uQ/oM/rY5sc8rv>x…F{€FwBur9pi4rl3rp6r{;v…@xŠCu‡Cv‚Bz}?s[5oK)lQ-lV,l`.iq3kz9i~8h†=iBr’Fs”Er”CsœMxŸPuŸQ|¦Tx¥Py¦O{¨QzªO{ªMzªOz¬O¯Rˆ¹`ˆ¸_…¸Y}µW³Yz±Q€ºWm„@!#'"3KUU~vZ; 2R o|…’”%&ž'¡$¢$¡#›"˜$›"•"‘!’#‹"’p$³š3¬Ž-­Œ-«+©v)¥j$¤`#žV œQ!šL"•E’B–E$”C!”=“7 “5’3Ž*†*†4“¶S’²^… LŒœ<œ¯Fš¯Kž³Mž³M ¶K©¼M­¿H®ÁK®ÁM¯ÁM®ÂQ­ÀT§¿S¥¼P«¿S¯ÄV²ÇU³ÄS°ÁR©ÀR ¶U—¯PsB'5265<=;CDDGEM k'#k.)m@0qM2oQ4pU=sP4tU2}c8t>{j;tV1iF*k\2n_5jV2pl;r{?v‡EwƒEsy?rp9pe3nk1sm3vz8x:z‡BxˆBy†B|}>w^6mK(mQ,mX-oW*nj.ly7my5i7mAr‹AqBs™Hp›HrNq›Lt¢Oq¢Kp Hv§Mz©O{¬Qy«Ow©O|¯S‚³WƒµYƒ´X´V²U{«L…¾Wbg1  %/75J : 3X m ‡#Ž"•&¡!*§!)¤!'£&¡%#œ%™–““#Ž$—€)»´=´¦6´£4³ž4®0®ƒ(¬z)ªl$©e$ŸY#žX#šM ™F!—A"•@•; –9!”:+„<‡ŸB‘´S±[—A‘¡@š®F˜­JžµMž´M¢·K«¼K­¿I¯ÂI¯ÃL®ÃO­ÃS¬ÀT¥¾S§½P­ÂR¯ÅU³ÈU³ÄR±ÃOªÀRž»V’™J^!/338:=DCGHKK I Zg,'i8*qG1qM2qO8sT1}\4€b6†t<€x>wa7pR0pa3re7qj8wxAx†Eu‡Fy€Bxv?qo:ol8jj7mp5oz:t;vŒFtJs‡Gus=uU1pL(nS,nT,oZ+kf/ju5pu4l{4u‹>w‹@s@w•Bs—ErœKrIs Ms¢HoŸGw¨N{§Jw¥Jv¦Lx©L|®PƒµW‚³W„³U±U€±Tz³Q€¶UD2$""%#%,-/*7f {Š!”$'¢!)¦!*¤!*¨!%£#Ÿ#ž#–%” ’”"‘%Ž$‰.ÄÁD½µ=º´<·ª9µ¤6±œ1­–1¬‹,¬€+¥m'¦e$¢^#ŸR"žJ#›@!›A!›<›@ “-ˆT#¨D±SެR†•<˜¥Aœ«Eš­Fš³M ¸N¥ºL«¿N®ÂK±ÄJ¯ÃM¯ÄO¬ÂUªÁW¦¾R¨ÀM¯ÄS´ÆW´ÇT³ÅR³ÆR«ÀTŸ¿VŠy>E.;=<CBEKMR S R M Ug)#i1&sD0kJ0nR0oT3v[5~d8ƒn8ƒz=|m:qW3r[3sh9squAwˆC{ˆF}}@xzBHIGO U S T NWc& k-%tH.qV3rU2pN1wS3€`8ƒo<‚t<€h5uZ3rT.sc5rm;pu>pƒDt‹Hw‹IuzBps~h:tO+n=!pG$sM(lD'h@"lA!lC"pO%iS'lQ'm\+op2p}6t‹>sBp—Gn™Ct Dv Hu£Fu£Bw¥F}«OжW‹³Qˆ¯PˆªM‰¨L„¢Iy_5#)* " %"#O y‚#–#•(š)˜,œ(–#—'˜#–$š"$¦&ª'$°“;ÄÐVÁÄPÀÅLÀÃK¿ÂL¹¼L´²Cµ±A²©<¬ :«˜8¢‘6 …0œo)™^&’H!= †+yT"„š<ˆ¡A‡ž@}‘<¡A—¬B•¦@™¥AŸ¬B¡³Eª¼J¯ÂL²ÄK³ÅM²ÅL±ÅM«ÂS®ÃQ±ÆS·ÈQ¸ÉR¸ÊT·ÉS³ÈP®ÃS¬È[€g1:ELOTTSSW Y Q S X [ V Q Q_ h,&k7+oE+qF,|R/€^5‚c7‚v;z=wY3oO,o`4lp9ow@vˆGvŠIzLz‰KwƒHv~Csx?rz>p@r„>tŠEzˆD|}@€t>wR.j;#i8 o:%nA'k>"o< qB"mE$mQ'qP&o[)wm1v}7t„9w@u“Ar–=rœ@s¢Fw£Cx¡@w£C~°O…³R„²Rƒ±P‡¬M«K|„;U.<¤& ¯(!¯(!§)!Œa:  0o Š”"™"˜$š(™$–$š#›$›%Ÿ#¥(¨&®'¥!'¯”CÄÑ`¿ÆY¿ÆR¿ÄM½ÄO¼ÀS¹»O²µC±°@®§<¬¡;¤•7£‰1œw.™f(˜S%:„,{i(‰> C†™<ƒ’:—ªD›­Eœ¨AžªD ®D¡²D«»H°ÂJ°ÅK³ÆN³ÇN±ÅPªÂR¬ÂR²ÅP·ÈP¸ÊTºÊS¶ÉS³ÈR­ÇX¦½X_18ELVVWWVY\ Y U \ ] X SK Yd&!k3)k<)m=)sF+{V5€d:€q>w=u^6nP.jU1mj;mr:q„CuŒJ|˜N€“L{ŠIxAux9z~?w?x„>|†C@|@n;|O.l4#k3"l5#k6"j3l?!qC%jC"kQ)tY5q\-pi0qw5mz6m†9n=n—?j•=mœCt¥Es¡@|¨I|«I~±P‚®P¯Sƒ¯N™CP+O°+"Ì7(Ï>*Ì7(Ë3'Ó<)Ó:+Í2)Â-(ž#\' Lr €ˆ Ž"’"•$˜+™%›%œ'™&¢%­#(²%¹"&¨%'¬–OÄÔkÀÈa¿Èc¾Ã^¼Ã^»Âe¸Ân´ºT²³E±¬?«¤?¦›9£Œ4›|1™a(’M'ˆ4}1|z/…š=…™?‘8„”9—ªD˜ªF©Cž¨DŸ®D¢³GªºG°ÀJ³ÅL´ÇL±ÅN°ÅPªÁP¬ÃQ°ÆR¶ÈQµÉR·ÊT¶ÉQ³ÆU®Ë]–œJ?>JLQRWVWXX W U Y S V Q H Oe"k,#m9'l5&rB)}U5…Z7ˆk9‚p:{c5pR-qS/sb4pm9n{@xŠG}—N|”O{‘LtƒBu}?t|>v‡Ex‡CxAy€B€|?|b7{O0t8%m1#o3#p6"k5!k8!m; rK$wW,zf5u].sc-op0qƒ7u’r£Cu¥Cx©Iz«I{²Sx¯Pv­P|EY;BŸ&!·*$».&Æ<+ÊD*ÍI*ÏK*ÎK,ÌD*Í<(Ó:'Ò0*µ%$‚B  Vv ƒŒ•#™&›#% ) )¦ '®")°!(³#)¤"&®–`ÂÔˆ¾É‡ÀÏÀЩ¿ÌŸ½ËŸºÉ–¶Àe±¶I­¯C¨§?¤œ7£4 €0š^)”H#06‚‰2‰œ;†™?Ž5Š–;˜¬F”¥B˜¦Bœ¨Cœ­B¡³M©»J®¿K´ÄLµÅO³ÆP²ÇS­ÄS­ÂP³ÆRµÈOµÉU¶ÉT¶ÌR³ÈX±Í`|f28INTWTZ Z V[[ X W TS Z QML Yh("l/'j5(rA-yO1€Z3…a6„k8|a5sQ.pK,uW-qd5ut:{†F–L–O{‰Iw‚Bu@vz>y…Bx„?}€A}{A~v@}[7|D,v3$s/'q/"p1!o5$q8%q;#vF%tT+u[+pZ,rh1n|6tˆ:v“?vHqDs¢Bx¥Bx¥Bv£Cw¨Jy®Ny±Qx­NqªL\P "K”³+$Ã5(ÎS1Ñc/Òn3Ño4Ðx3Óo1Ó[-ÎG)Í=(Ï4)Ó4*Æ/*›!!\ %!Fc |‰ ”"š$¢'¥'« (®#(±"*´")º")«#(·Ÿ‰ÇâÇÄÙÂÆÞËÅÝÌÄÚÉÃ×Á¾Î¥·Ám²·N­°Aª¥>¢™8ž…2™m,“V%@!‚!yA„Œ4†’9…’:‰5š<˜¦C•¡>˜¤D›©D®D¥µO±¿L±ÁIµÅI´ÅM³ÆN²ÇR°ÅT¯ÂPµÇP·ÉQºÌZºÌV·ËT°ÉX«¿W\*;LRU[SX\ \ Z ` \ V W[ ] ] S P Ua'm,%l1'r;+yL.~[4ƒ`8„f6€`5vT1nG+nM+mW0vj5xAt†E|JxˆGs‚Dr?ux;v=|w9~}>€€Awj;uT6s<(i(u)!k!q( t,!w2 y8#u="vE'uL)uZ,uf/p€6q‹:q)ËP-Ïj1Ò‡9Ð’:Íž=Í–>Ñ|6Ðh2ÑX/ÏF+Ë?(Ê>*Ñ=,Ò:.¸1)„Z HPm ‚Œ"”%˜%£!'«#(³"'¶&+¶$+»!(§&'°¥ŽËëÐÇáÍÇâÐÇßÏÈßÏÅÛɾΤ¹ÂiµºT®­C¨Ÿ;¥—6œs.š\%“D‰1|uMƒ0€ˆ5ˆ5ƒ†4Žš>“Ÿ@Ž?“¢C•¥D—¨C¡²E®¼K²ÁH¶ÆI·ÆLµÈO²ÆQ²ÆT´ÆQ·ÈP·ËT»ÎWºÍR¶ÊV±Í_”ŽA=@KQR[[U_ ] YY Z QQW S V V L L Ze(j1$n5'v@,‚U0Šd8‡p9„f5{X0sI+mI*pS-sZ3tg6x|?{„@z„Bw~ά@έ?ʺ\ÉÇšÈʯÇȲɷœË„^ÌlCÎd:Î`1ÌU/ÉT2ÆH2ÉF1Ï@/Ò=/Ã.(¥#$‡„ˆ ™ %¢#)©#'® '¯#'¸#'¡"(ÃmÆâ©ÆÖ¨Å×§ÄצÄצÂÕ¥¿Ë†¸½Y±°E®¨<§’5¡p&˜U<…#pQc)vRuh#r^xe!ŒŒ3‹Ž8ˆ6‹’9‘›;•£>ž°D­¼H²ÀH³ÃJ´ÅL®ÂO±ÅO±ÆPµÇQºÊR¹ËR¸ËS·ÊT°ÌYšžGCFNRT___Y[^_]YYVVV PTY MO Yd"r0"w:(ƒQ1‹_6‘o:m9ƒQ0xC*r?)s@*tJ/tQ0wY2xV3uU2oM,xY2€g8€`5d4{c7^8O2x:)s-"daafhnd_$`&g0!m2%k4 h="oR'na,k{1m•;h•3Ñ5.´#&—$Ž$™'¥ %¬ %¬'³ 'ž!&µšUÆÚ|ÃÏ|ÃÐ~ÁÍv¿Êm½Èd¼ÂX¸½Q±±C¨8›t)‘G†,|n T7\ p3wBtDn<~e)~j.{q.€z.ƒ„3Œ–;–¥>¢²A®»F°ÀJ¯ÀM«¿P«¿Q®ÂQ¶ÆQ¹ÉP·ÊSµÉS±ÆV«ÈTrH 7QQTXXZZZ]^^]WXUY UQPW Q IU ^g"k( yG-†\7i7Žj9†X3zC,t@-r@*n:(tE(rG*tI,yO-zO-|Q-„[2…[3ƒ_2‹d;ƒM2|G.m0 d[ R \]cd`\VV"d,[ Z&a4e: bD\QTEVW%izB™d›¹‚²‰§x¢À… Ñz©Pg^)w{5ŠR/¸.%ÁC+¿\1Ès5΃:Ϙ>˰TËÑ¥ÊÔ¶ÌáÓËàÖÌâÙËáÙÈÝÎÇÜÎËÙÌËÔÅÇͽÄðÆÕÊÉÒÈÇ¢‘È¥–ÏeNÒ7/Í*/´$,–+–"£#«%° &›!'ª™KÉ×rÂÌjÃÌkÂÉeÀÆZ½ÃTº¼O²°E©›9¡†1 t-£t.¡v0¥~2¥ˆ6¥‹7£Œ6¬˜9´©?·²I·²L±¨F±©I°¨M«¥L£›E —Aœ—A–™=œ¥?¡­D£²Gž±CŸ´G¢¸K­¿M²ÃN·ÈS¶ÇQ³ÅO®ËV9DB?LNLMONNQTQTQSSTSQUSZ JNX cm$u2"…K/]4b6Š[7}>+q8(p4%p7&p;%i='oA)qC(wJ-wG*xJ,ƒU3ƒS/„V8…Q3?)L L HFO UXe\_^SR QP SNA 39r~6«Ô†Êî°ÅéªÅê¬Ãê«¶ÞŸ“½fƒ¨Se\-i`*{Z1¨3*¿<)¿W1Æj5Í€8Ο@Ê´TÈdžÊײÍáÏÍäØÌáÖÍäÛÉÜÐÇÙÇÊÞÎËâÔÉÝÐÉáÚÉãÝÇÙÌÉâÝÉÞÓÉ•jÍeÒ`QÑ78Á",¦&”#’!¢"“$®˜CÉØiÃÌbÂÊ]ÁÉ]¾ÅYº½S¸´K´®H·­B¾¸GÅÄLÉÎQËÒWËÐUÌÐSËÎNÍÏRÍÍOËÌMËÌQÊÎTÌÓUÉÑTÈÍUÊÐ]ÊÐYÊÍVÈËWÄÆQ¿ÂOºÂUµ½T©³J¡­J ®G£³H§·K­¼Lª»O£¹K—›BO +903:68CEHGKMHHONNPPQNST IHX ]g"w4"…N-^4ŒX49$p/!m3!q;%o5!t<'v<)s>*|C+|A(~B+J-I-y6&s4 \:,2=GI T T V US L H H =;54%J7rm.§ÊyÁᚹ؉±Î‰©É…©Ì˜Æb°Ptp6vR+[0ž>,À8(ÅF-ÊM.Îj2Ј9ϬQÍÃoËˈÍÚ´ÍÝÀÍ߯ÌäÐÊàÎËÞËËÞËÊßËÊÞÏËá×ÌâÜÈÚÐÌåáÈɹÇmHÊ•nЄ_Ïu[ÏMIÌ-,¿%+¤%’!€°—@ÆÖbÂË]¾ÈX½ÃV»¾Sº½RÀÁUÃÆQÅÉQÆÉSÆÈPÅÉUÆÉVÆÅQÇÆMÆÅLÆÆNÇÆKÅÆQÆÆQÇÉMÇÌPÇÊRÇÈPÆÊVÇÊQÇÈQÆÉPÇÉQÇÌXÈÎaÈÎgÈÌfÅÊ`ÂÆ[¼ÂW¹¾Y¶¾V²¼R­¹Nˆ@wG$tI#zK#vG&o?e2^!SF ?6/07;?CFHMQNIRV S GKP[i u0!~B)|?*m) a!^"g)f.n3"s8'v:+w<)C*H/{B*z;(n)T 53149AH J QV L K J J I >975$. h[±Øi¿Þ‹¤Çj§ÑsšÅd…;^Dmc&|n0{`+^.œ7(»;+ÅN/ÊT0Îf4Óq5Ó…9Ò¡JиTÎÇxÌÌŠÌÎ’ÌÓžËÙ¬ËØ¯Ì×­ÌÞ¸ÎåÍÌãÔÍä×ÏçÞÎæàÇÑÆÅl`Ê_FÎQ@ÏgHÒpVÏ>6Î21Ê+.¾&+…°”8ÄÒWÂÈU¾ÂM½½LÀÀNÂÆZÃÊ[ÂÈQÃÉUÅÌVÆËVÇÌVÆËUÇËSÈÌUÈÊPÇÊNÉÊMÈÊRÇËSÈÊPÈÌQÈËOÈÊMÇÉLÈÊQÈÊSÇÊRÇÊRÇËWÆÌ\ÆÌ]ÆÊ[ÆÊXÇÌ\ÈÌcÄÊfÅËhÅÊ]ÆÉWÅÍXÇÏZÇËXÈÍ[ÇÌ\ÇÉ^ÅÇ[ÂÁY¿¹X¸¬Uª–K–t9xP(Z+E 5,-8;BIFHLJJM LKQ ^ hn!g_U Za"g#n+s4&u7)y>)}<'|<'x:'o%V ?/101-2DDCH K K H D ?D?7,.- J9<& /G;ki.[EG7Z&c&`>|& ³.&ÈR/Ïb2Ói3×q6ׂ;Õ…9Ô¥AѰJѵOиXμa;dËÂmʸlÊ´jʼ~Ê̦ÊÓ¹ÊÚÅÌÜÌÉÙÉʳ¥ÎhQÌI?ÑG;Ë8,Ë;0Ò>2Ë40Õ-,°-,®Ž2ÃÊK¼»F·³>¿ÀGÄÊ^ÅÌ_ÅÌRÆÎWÆÐ]ÆÐZÇÏYÇÏUÈÐVÇÍTÈÎTÉÎSÈËOÈËKÉÌOÈËRÈËPÉÌNÉÌOÈËQÉËPÉËRÈËTÈÍVÉÍVÉÍWÉÍYÇÌYÈÊVÇÉSÇÊWÆÊ[ÆÉ[ÅÊ^ÄÊ\ÃÉZÂÆVÂÆWÀÄVÀÅ\ÀÆ_ÀÅ_¿Å_ÁÈ_ÃÊbÅÍiÅÏhÉÒeÌÑeÉÆa»¯T¢‚?|M(V@813<@JNLIMC>CO\W W KL S]g&q6$s7'x8'x8'v0!q%aO ./340-(.4;>@@?44930-$ +(0\L wÄ4,È9+ÊF-ÎO1ÎO0ÌT0ÌX1Ïp6ΈAÍžSТVЯXкZÒÂaÒÆpÑ¿nоmÏÍÎצÌÒ¦ÊÌ¥ÌÖ´ÍÀ¡ÏnWÐXGË<4Á-+Ä.+Ì2+Î2.Ó4.°4.¯ˆ1À¿Eµ©7·®8ÁÈSÃË]ÅÌUÅÌOÆÐYÆÐ\ÈÑYÇÐVÇÐUÉÐWÈÍQÈÎPÊÍLÈÊNÉÊKÉÊLÉËOÉÍLÉÍJÈËPËÌSËÎRÊÍRÉÎYÈÎXÈÎUÉÎSÉÍXÈÍ_ÈËWÇËTÇËYÆÊXÇÊZÆÌZÆÌZÅË]ÅË^ÅÌ_ÆÌbÄÊbÄÌcÂÉcÂÉfÃÊeÃÊeÁÉkÂÈkÃÈhÁÆeÂÈeÅËeÉÏcÎÎcÆ»Y±™Jœx<‚U+d,J7<DMMEB:9=IM KEBDP _j&q1%v9)x0#l&Z?463331,-(+1103/1-1'$$*H o–*"©0'³3*¾4,½1,º3+¹0+¼--»1,º3,¸+*·&(·''µ/*µ.*µ7,´I6³J9¹M6ºZ:¼dBÁtIÁ…YÄŽ_ÅšfÇ¡wÉ’iÍsTÑdJË;1Â**Â**Ã*(Æ-*Î/,®3,¨*½´<«Œ+³§5ÄÍXÃËUÅÍXÆÏXÆÐWÇÑ[ÉÒZÈÒYÉÓ[ÉÒ]ÊÑUÊÐUÈÍKÈËKÊËJËÌKËÌLËÍIÊÍGÉÌMËÎRÈÌOÇÌSÉÍWÈÎXÇÎYÆÍYÇÍ\ÈÏaÇÍ]ÇÍ[ÇË[ÆÌWÆÊ]ÆÌ^ÆËZÅË`ÄÌeÄÍfÅÌiÆÍhÅÌiÄÌnÄËrÃÌnÃÌnÄÍpÃÍwÄÍwÅËoÄËpÃÉkÂÇfÃÆcÄÉeÇÎgÉÎhÊÍfÄÂ`¶¦T‘l;c,?39ADBC?<?JE:>JXr$ o*#i* bV G ??<<76;9911+)+-*))'(H ˆ'¶A)Ì?*Ï<,É:-Ä2)Â1*½3,»1*»1*¼2,½4,½6,¼:.º6.º2-¸/-¸-+²-,±&(¨$©#­%­&ª$ª$®$%²##³&$µ'%º/*º50Ã70Ã1+À((Á(+Á%*¼"&Å!'¢+(¡]±t*œK°£2ÇÓ]ÄÌWÆÏ[ÇÑdÉÒ[ÈÓ\ÇÒbÉÓaÉÓaÊÒ]ÉÐZÉÐVÈÏPÉÍRÊÌNËÏMËÍLÊÌMÊÏKÉÎQÉÏVÉÏVÇÐZÈÏYÉÐZÈÎ]ÆÏ`ÅÏ^ÇÐbÈÏaÈÏ`ÈÎbÇÍZÆÌ\ÆÎ`ÆÍdÅÍhÆÎmÅÎpÄÍsÅÎrÃÍrÂËuÂÌ~ÄÍ}ÃÍÄ΃ÄΈÅ΃ÅÏ‚ÄÎ}ÄÍyÄËsÄËoÆËsÄËsÂÈpÁÈuÀÈoÃÌnÈÒrÄÆj¬™QU3ZC;GPIA7=EFO Q Y_ZZU R X U O KHD @8:76523722*,+*%5j—¹,#Ç;(¿2&»-%¸/%´+&µ*'µ-&³(&´)$µ+$¶*&¸+'»-'»/*¸,(»2,½7-¼0*¹1/º2.¸4-¹0-º--µ1/µ2/¶2,¶/+º.1»*+¼.+½0.Â10Ä1-Ç;-ÊE.ÊpBËvNÆV=Ä80©%+ž-œ,v'µ³:ÉÒXÆÐ[ÈÓ^ÈÓhÈÔdÈÖcÈÖjÉÖoËÖgËÕgÌÔcËÓZËÑTËÐVËÏPÌÐNÊÎOËÐSÉÑSÊÐVÈÎVÈÏWÉÑ\ÈÏ]ÈÏ_ÈÏhÈÎnÆÎZÇÏ_ÇÎaÈÎ[ÊÏ`ÈÍ`ÆÌeÆÎiÆÏvÆÏÆÏxÅÎyÆÍrÄÌkÃÍpÂÌwÂÍŽÄИÃÑ ÅÒ¨ÅÓ¨ÅКÄГÅ΋ÄÎŽÆÎÅÎ’ÄΊÅÍ„ÄÍ…ÄÏ‹ÄÌ…ÃÊ|ÂÊyÁÌ|ÅÑ{ÉÑyÁ¼k§TzC-M TYVSQLRZcnt!{!$ƒ!!ƒ#!ƒ$%…"$‡'#•+$ž,&¤3)-$”'…!|oaY KEB951-*' 4m ž³)´%²' ²*!¶,$¸/&¸,%·)&²*'¸-'´(&³"#¯*'­)'³*&µ(&µ*%«)&«*'¬**°)'±**±-,²0,²-+³2/¸60º80¼0,½/3¿-LÀ.0Â0)Ã//Ç41Ë8.ÎH.ÍvPÉ qÊ¢gˇP̃IÈzQ“–o-¸¼EÇÊHÆÑ]ÈÓ^ÈÔfÇÔiÈÕeÉ×jÉÖkËØnËÖiÊÕbËÔaËÒYÊÑYÊÑWÉÐSÈÏTÈÐWÉÑWÈÐYÉÎUÈÐYÈÐ^ÉÑ^ÈÐcÇÒÇÐ…ÆÍ[ÈÑdÈÐeÈÏdÈÎbÇÎmÆÌsÅÎwÆÒÅÑ ÆÑ“ÅÑžÄΑÃÌ~Â̈ÂΛÁϪÂÒ²ÃÕºÃÖ¾Ä׺ÄÖ¹ÆÕ·ÆÕ¹ÆÖ»ÆÔ¹ÄÒ´ÆÓ²ÆÔ²ÄÒªÃѨÅÐÅÏ‘ÅÑŠÅÏŽÂˈÁËŒÃÎŽÆÔŽÉІtI] mu{ ~ …"„%'ˆ(&‡&!ˆ%"’&&›-)›1(¢0'£./«-;³2,¼:.»9-¼>,¹;)¿=*Ä=+Ã<+Â;+¾:)¸6'´2%­/#¦-"›%ƒlnqlny’&ª.!°0#¥ ¥«!³,!µ.%¶/&».(¸*'¸,'±&$µ'$²'&³$$®%%­$&µ+'²(&§ $¦&'¥!(§#%ª%'©('¨()¬%)¯+*³+*´++µ+*¹,.¼*5À1,Ã3.Æ71Ì?1ÌC3ÌX1È£sÇÄŸÌɡų™È¤pĨnx|%¨·Q®²JÀ¼8ÇÐRÇÐYÈÒ`ÈÓdÇÓdÉÔhÉÔgÊÖoÊÕcÈÔdÈÔgÈÒ_ÉÑZÉÐ]ÈÏXÉÐTÈÑ\ÊÒ^ÈÐZÈÏWÉÐZÇÐ_ÇÏ`ÆÏlÆÒ•ÇГÆÎdÅÏcÇÎhÇÍgÈÏjÅÌ‚ÄÌÄГÆÔ§ÅÔ¯ÄÑ¢ÅÖ´ÄÕºÂÕµÄ×½ÃÚÈÅÝÎÇáÒÇáÎÇâËÆáÇÇàÃÇÞÃÊáÈËâÌÊáÎÉÞÊÇÜÄÉÞÅÈÚÁÇÛÇÆÖºÅÓ³ÃÏ¡ÃУÃÏ«ÃϧÃÓ³ÂÔ¼ÂۺĿ€„,Œ ’%"š,&Ÿ1&¤:*”*#‚ $$•,'-( -&¢-&£-.©,Aª-(©0+«1*¬5'¬5&±5&²6&±9)µ4(±4*³6(µ5(¾7'À8&¿4%Á5'»4&º/#¹.$¼2%Ç4(ÓG-Öe1Ñr5Î…2Ɖ8¿R-µ/%­'!µ2&·1)¹2+¹4-º/+³.(°)'¬%(¦$%¦#%ª('°*(­%%¢)(ª&1¤#ª#'§$%©%(¬'(¬'(°'(²-+¶-+¸/+¸+,½*)¿-*¿/+Ã6/ÊA1ÌH1ÍU5ÊOހç…®ŽaÁع®€»Ÿa…,Œ…3§·Pœ”:¯¦2ÈÍRÆÎWÈÐ^ÈÐ`ÉÓ\ÊÓaËÓaÉÔfÈÓ`ÈÑ]ÈÑ]ÈÒ\ÈÐ^ÈÏ\ÈÎSÉÎTÉÏXÈÏVÉÎVÉÏXÈÏYÈÍaÇÎiÇÐwÇÒ“ÇÓ¨ÅÍqÅÍ^ÅÍqÅÌuÅÍ{ÅÒ¨ÆÓµÆÑ¢ÅÓ¦ÄÖ²ÃÔ³Å×¹ÇÜÄÈãÍÊäÊÇßÁÃÙ²¾Ò¡¶É°Áƒ±À{³¿w³¾{·Ä‚½È‰½Ê‘¾Ì•ÀÍ—ÂКÄÕªÆÜ»ÉÞÀÈßÅÇÝÂÆÙ¶ÇÝÁÉßÅÇÞ¼ÄØ¬ÂÏ‹»¶g‘B1ˆ),…!'~!dW \ zŽ)")#•)&ž*$¢,'§-(¨3'«4)«/)¬0)¯3*­6)¯7)±8*²6&°6)°5)®2(±3'®4&±0$¬,!¬*!ª+#©*"°)!³*"¸0$Ã9(ÉO)Ís0Ëx3ˆ;É®Kȳc͉@»B(¦±/#¸5)·0(¹-)¸-+´-*²/+±+(¯))±.*³3,²&'|D.¯•u®-4©'%­))¬')¯+*¯,+³/+´0/¸5/¶5/·1.º0,¿3.¾3-Ã8/Ê<-Ê_;ËcÇ™cÆãÓÉ´–mS¦¼†¹É´À‡‹u*‡ž8­­IœŒ7­›2ÉÍQÇÍUÈÏ[ÈÏbÉÑUÊÑXÉÒ^ÈÓcÈÑ^ÈÏ[ÇÏ\ÆÐ^ÇÌ`ÈÌUÇÌPÆËPÇÌNÆÍPÇÍTÉÎYÈÌ^ÇÎiÈÏuÆÐzÆÒ–ÉÔ¤ÇÏzÅÍ_ÅÎ}Ä͆ÄÏÆÙ¶ÈÚÃÅÒ£ÄјÄÔŸÄÙ²ÇÚ°ÄÖ£½Ì‰¶Às®µb¨±`¤®b¤³e§¸o¯¾x²À{µÂ€¸ÆŒ¹ÇºÇ‘¹Æ‘¹Æ¹Äˆ¹ÇˆºÇ‡¹ÅƒºÆƒ»Æ…ºÅ·Âz·Áy¶¾n²ºe´ºe³ºi³´mµ·p³°q«£m‘„apQBIWx‚ Œ"$œ,&¦4*­8.°9/²;2®5,ª2+®4-®6*±4,¯8,°9)­6)­2'³6(³1&°1%­-#¬,"©+"«+"¯,"·0#À3%Æ;'ÉG*Í\.Íw/Ȉ<Æ«mÅÇ’ÊÐ˳gÒ•=¯<)˜¤% ¨("¬(&¬*(®-)°+*µ,*¶.,¸0.±1-|2-gM6‘¥m´‰k±)&²..µ,,¶--µ4+¶3-º4/¹80·3/·3.»7.À8/Á4.È?0ÍK1Î]2ËžgÄ”oÆÐ³ÅÆ¢´¿–£¾‘³Ëš¼Ö¬|g'ux-£¢C®©Q¹®9ÊÍNÇËTÇÏ\ÈÐZÉÐRÇÐWÈÐYÈÓdÈÒaÉÏ\ÈÐ`ÆÐaÇÌ_ÇÌWÈÍVÈÌUÈÍQÈÎRÆÍTÆÌ[ÅÌmÆÐyÈÏyÇÎ{ÅÑ“ÆÒ›ÅÏ‚ÄÍnÄÏ{ÄÍ‚Å΄ÂÑÆÕ ÄÐÃÍrÅÍuÀÊs·½d­­T¨®Y«´b®¹l¯¾w¯Â­Å…°Æ‹±ÆˆµÇ‰ºÊŽ½Í–½Î›¿Ïž¿Ð¢¾Ð§¿Ò©½Ñ§¼Ð ºË“·Äˆ·Ã€¶ÁxµÀy¶Ã¸Ç„»ÊŒ»Ì»Î¼Ð“½Ð“½Ò•ÀטÄÚœÄÚš½Ë”¤›w’eO‰;7ƒ&Œ ˜-%¤5*±8/¸>0»A0·=/³9,³8-±8-±@.²=-¯9.±5)°7'®1'©-%ª.$ª.$­-$­.%´4$½<'ÃD)ÈI(ÌT,Ìq0Ç”;Ƴoº|O„nM­¸vµ£TÀ IÒ|;¦&!Ÿ!¦$ ©%!©+&§'%ª'%±((²'(®0,q-"gR8‡g™©o¬iD¯(&°0.²1,³.,¯.*­,)µ1-¸4.¸6/º61½60»5/Á<2ÉL3ËX3Ín:ÈšQÆÒ¶Æ½¥»g¸Ò²·Ò´´Îª¸Ò¦{`%zz1Žˆ5·¹U¾¶<ÉËJÆËYÆÌ\ÇÎRÉÐMÈÎTÆÐUÈÓhÆÑiÇÏ\ÇÑeÆÐiÇÎdÈÎ_ÈÎeÈÎfÈÍYÇÎVÆÍYÅÎjÅÑ„ÄЈÄÍÄΊÂÏ‘ÂЗÂ͉ÃÌzÃÌsÃÉjÂÈbÀÅWÂÆ^ÀÅ[ÂÅW¿Â[´µU¬®Y¬³i¯¹t¯¾v°¿z±Á~±Äƒ°Æ„²Æˆ²Æ„µÉ‹ºË”¼Í–¼Í›½Î½Î ¿Ñ¦¾Ô¬¿Ö°¾Ö°¿Ö¯¿Ò¬½Ò§½Ñ¢¾Ð¤¾Ò§¿Ô¥ÀÓ¥¾Ò¥¼Ò¢½Ñ£»Ï¢»Ï¡½Ïž½Ï ½Ð ¾ÓžÃÛ¥ÅÚ ¾É®”lA8†#%‘'&™+)¦4.²9/»@.»F0»H0¹@-µ:*·>+´;+·9(·9(¶7(°4%³1%³3%´6%º6'À=)ÄN-ÇV/Ê\-Ïs0Ë—3ø[Äϵ²Ÿ p’®y ¼i¥ºdº–Jµ?*š¥' ¦$"¨(#©(&­))­&(¦-&r-%UˆlU¤´€¬zH±)$°.(³-)±*)®)(«&'±))´.*³0+¹2,¹6.¸60»61ÄG4ÆL3ÉS0Ì@ÉžFÇÓ¦ÉÖÁ¶·ƒ´Ó¬¸Ô´³Õ«²Ê —ˆ Ž ž Â)1AæS(rgb-3c-8b.tiffO>–]Ý}$œk»²Úùú@GGGGGGGG™GraphicsMagick 1.2 unreleased Q16 http://www.GraphicsMagick.org/tiff-4.0.3/test/images/palette-1c-8b.bmp0000644000212300117540000006057211246010447014572 00000000000000BMza — $+ *3< 9 4);&:8#H>HV WXL'Y0M$6Sgg xyo'g/s%8k&8v#*n!uJ9lGW)QS6yY/lSJp(Gk*Wi)Gv+Vv4Yw2Sm+gi6hk8wj+fu7hv:xu,uqg]DwXB{wEwm]ci8‡[:[9ˆh:•h:‡u<–v,…k;ªqF[E‰iF—hV›jE‡xG˜vWšvUŠud˜tJ¥iV©jY³mI¦wV©xI³zW´xM²le¦vf¸xm³tO§^hÂ{xÂz]Àz–¯z‚Ãz ‡ Šˆ •˜“#˜"‹-Ž$%š%2ާ¶§$¦"»'³&%©(5ª&)¸)4¹44´Q6¸I(šJ,RŽ8h„;w„0o‘*H¶4I¸.Q±0m®VªFuIRµNn´aežÄ$Â&Æ&,Ã*-Ä&'È*3Ä+4Ë'6É46É)8Ó3:Õ--ÍD:Ï+CÖ6GØ2OÎ4pË4SàISÔRmÔguÕXaÚ;—ˆ8=¦“5‘ª;ª°F™‡K”Žn”‹H§‰Vª†J¸‡X·†G¨–T«•Kµ™V¶˜fºˆv»‡gº•o±‘I•®n’®L¹§T¹¦IºµO°®k·¬VÂŒVƘOÆ•iÈwŇiÅ—wÆ—eÑœM­Wƪ[Ó§MĵUÊ·VѼMѽfʨwʨeÓ«fʸwʶhÖ´wÔ¶wÓªlá°8ŽÌ:¸ÈOÊqÑK³Ém¯Ê=ÃÉJÈÈWËÇXÒÇLÐÌgËÆvÍÄfÓÆuÓÇåÖˆº‘š¹´­£¤ž‡Ç˜‘ÇŽ«Î—‡É·‡Õ¸˜Ö¹Î¬¸Ô©¨Ö¹·Ùº©Ïª²âºÈÛ¸ÎÛµÏß¹‰™Ï’¬Ð¦¶Í¥žÃˆÍÅ’ÓŧØÄ¸ØÅ²ÉÎµãÆ›âÇÇÛÇÕÞÆÊ×ÑÈãÈØâÉÕæÑãèÏÄ©¥/2˜¯ËÑÒÓÔÔÒÒ××Ó×ÕÕÕÕÕÒÒÒÕññññòòñÖÖÕÕÄÕÎÒÒ°°±±±Ü±ááäÂáæáõãæææõæóçæòæóóóæóóãæÜóòæóóá¬sdaclnwxxwnnnwnnljllnˆww‘‘ʯô±Á«w^kkkkmkkÜ|mklmkkmmnnoooÊÌóôÜæçæè/2«°›ÔÒÓÓÓÓÓ××ÓÓÒÕÒÔÒÒÔÒÕÕØñÖò÷ñÕØÖññóñÖÖÕ±°°±±±Ü±ÜááááãóóóóæóòÜܱÅÅñáòáãóòóò÷ã¬daadllxxonolxwonljllljlwˆwŽ‘ÊÏ~±°Î‘kckkkkkmko+ž±}komloknooonno‘Ìçï¬ææèæv—°˜šÔÓÓ×ÔÓ××ÓÓÓ×ÕÒÔÒÔÔÒÒÒÕØØòõØÕññòôøóòóçõóñ±±±±±±Â±áÜòòÜáÜáÜñÅñîű±±±±±±±¬ž dcloooolnlollllnnljjljjjnˆŽ‘‘ÊÏáòÏÊl^kkkllkomoo+ž¬lmoomoownno‰n‰ÏÍçõÜäãæb˜­˜›ÔÓÓ×Ô×××ÔÓÓÓÕÔÒÔÔÒÔÔ×ÒÕØòõ×ÒØÖÖóôóóçõôøûûúôóäá±Å±áááãòãóôöøøôôùøóá±ddaaddclcllklllnlnlllllljljljjnˆ‘‘ÊÎÏÊwhjnnmmlmkkmom(¬ookkolmoononm„‰‰‘Ϭûï|ÜÜÜ›¯ËÓÓ××××××××ÙØÔ×ÔÔØ×ÒÒÓ×ÒÕòïÓÕÕÕÕñññõõãôôçõøùùùøøøøúùùúøúôùôõóòõóõøôîdbcdclcccclllqlllllnlnlmnnnnˆnnjjnˆŽ‘‘Ê‘ynjnnnnnkmkkkkkkkkhhkkkkmmomm„…„nŽ”íî¬ôî°__v›ÔÓ××××Ù×Ù××ÒÔ××ÓÒÒ×ÔÔÕÕ×ÕÙñÓ××ÕÕØÖÖñóñóòññãóçøêõôôõøôõçõóõóñòáññòòÙ|aadadcddllql†owwnŽnnnljc\bllejejlnmmmlmmkmkmmakkkhkkkkkmnmopm†‰ˆ±ïãî¬Ïbj›ÔÓÓ×××××××ÓÔÓÔÔÔÔÔÔ×ÔÒ×ÓÕרÔÓÒÒÕÒÕÕÖñÖÖÖÕÖÖñòòõæòòòñòòñññáñÖÖÖñÖ±«(aaabdcclcb ejjjjmnmmmmmmlknmmkkkkookooonm‰p„m‰‰‰Ž”ÏÍÌÌ”{z{š×ÒÒÕÓ××××ÓÓÓÔÒÔÒÑÔÔÒÒÒÒÒÓÓÕÕÕÒÕÕÕÒÕÕÕÕÖÖØÖÖñÖÖññññÅÖÖÄÕÖÖÖÖÕÖÕ«s    ^nˆnmnlmmmmmmmn†mn‰nmnonmoomnommnn‰n””‰kš›š›ÒÒÓÓÓÓÓÓÓÓÓÔÔÑÑÔÔÑÔÔÔÔÒÒÓÒÒÒÕÓÓÒÒÕÒÒÕÕÕÕÕÕÕÖÕÖÖÖØÕÖÕÕÏÏ×ÕÕÕ°t     bwŠŠ‡††nnnnnnwnommomhhihhhmmmm‰lo†m„mmlšÑ›ËÒÒ¿ÑÓÓÓÓÒÒÒÔÔÑÑÑÑÔÔÔÒÒÔÒÔÓÔÕÒÒÒÒÒÒÒÒÒÕÒÕÒÕÒÕÕÕÄÕÕÕÕÕÕ×Ϋvs     clm„nnoŠˆnjmmmn‰xxx~”Ì«ÍÏÍ””‹ƒ„m…ŒošÑ¯›ÎÒÕÒÒÓÓÒÒÒÔÒÒÒÑÔÒÑÑÒÑÔÒÒÒÒÒÒÒÒÒÒÒÒÒÕÒ¯Ò¾Ò±ÄÎÄÕÕÕÕ×ÕΚ)       ‰†ˆ’’‘ÌÌÌÎÒÏÖÖÏò÷õóõ‰„„Œ‰‹lšÓÕίҿÒÑÒÒÒÒÒÒÒÒÑÒÒÒÔÔÑÔÑÑÒÒÒÒÒÕÒÒÕÕÕÖÒÒÒÓÒÒÒÒÄÒ¯°«v(      ,! !n‘‘’ÊÊÊÎÎÒÏÒÕÏÏÏõôøùøï”x†‰‹‹Œk«Ó¿¿¯¯¯ÏÎÑÒÑÒÒÑÑÎÑÑÑÎÑÒÒÔÒÑÒÒÑÒÕÕÕ¿ÒÎ᝭«(%((&    sss( 3Æâ·È³˜—™—™™£­¯½½½½»¾¾¾¾¿¾¾Ä˜  *t5t(((+*0151111111((&%),<:ALNL?LLPI# &dknwÊÊÊÎÏÍÌ‘nŠˆka``hhmmmmhÛøøøùøøò±¯››˜švsr_%>—=<˜£™›£™­ºº½½Àº»º½¾¾¾¿»®   (tstt*&++6DDD5D11u555*(()/:<;=L==?LPPPP'nˆ‘ÊÊËÊÊ‘ˆŠŠ‹o\ \a``hkiipio¬âáòæïóÜį°›ššš{rb˜————££™£¥­›º½½½»»º½À¾¾À»Ä0  &**tt*((**0DœFDD51D<|0*%))'0.<=LEILLLLNNMP" ^jˆ‘‘‘‘’ŽˆŠŠ†c a```hhhhhimh«×Õı¾Õ±°¯£››˜vvrb˜————™™££™­›º½º½ººº»¾¾¾¾½»£ *st5t++/06DEGGD15DD111t)()0//2<=E?E=?ELLONME cjnnŽŽˆŠŒj \aaa``hhqhkhoc«Ó¿Òѽ¯Î¯¯›šššv{{d/—™——™¥™››¥º½ºÀÀº»»º½¾¾¾¾»®  +*t|5*(+-.DGEœDD15<1D|0)&%%&*)02.::;;BL?NL¡ N —jŽŽˆˆˆŠˆ†c \aa`````h`hkiikš¿½À½ÐÀ›››šš˜šv{rrb)—Ÿ—=™™™£›­­º½½ºº»½½½¾¾¾¾ººt  +((tt1|*&*.6DDGDD561AA<=EEEEILELNMMMO ¢ ¢MN²$a``qhhhhh````aar{{{{{{rr{r{r{wblrlb\2¦§ œ£­¥¤­­º›º½ºº¦­®®Ä®¯»®¦u   +*****t|0*+)(--6D551-021><:::A=:::A==IœLEM §§ § ¢R¢!hookhkmhhhh`a``h`harrbb   !™Ÿ™™­®­­­ºº½¯½º»®¦®®»®®­¤££*  ++0.0*tt||))15œDD501.1DDœE F5**//,.<<:.2<2<:=B=LŸLLŸ¢¢ O§§§R²"  akhookkmkhhmhhh``a``a\b\ /)™¥Ÿ£­­®­®­½½½½»»®¦¥¥®Ä°®£¤Ÿ0 +-060*tu|-,0DD5DD550-6D5EFF56))//,2><221>::=EE;LMLLLM¢§M§O§§R" ahckkhkhkhmmkihih```aa % (™£Ÿ£­®®¦®¯½½¯½»¾­­£¥®®®°££u&++-11-0uu00'1DDDDD16115DD GœE|**),),,2.20.::><<<<;EEEEELLIL M O§¢§µµ  ahhhkkkimm„mi„mmmmkkh`a Z__ >£—£­®­­®®º½½½½»¾®£­­®®°¤£Ÿ  &&+6<5611|0*-.5ADD50-..5DMF   œFœ5//,222>>>:;<;=E=BBELLEEMMOOR¢µR¢!aa`h`h`hkkimi„mmm„mmihh`  Z^^&,ŸŸ£®­°¥®®¯¯½¾®¾®­¥¥­¥¥£££œG  +.6A10||u0)*0DDD551..:8:;:9B;B:AELLMM L  ¢  ¢OO¢O§D a`ac`hkmmmmƒƒ„ŒŒ‹‹‰Œim`_eg^^^^_\ !(u99;E;IEEEŸŸLM M OMN¢ RO¢A \a\`ckkmmmmƒƒmŒŒŒ“–“omh_je^_^_Z (<'/<1/))˜™£¦®¦°¤®®¯½ºº»¾¾®©Á±¦¤0+65A--/**05566.4.444A:@AEEMQ QMEJMMQFEB::>;;;8>;;B;IEEMOMMM §   ¢¢¢¢§Fa\^chkmmmmmƒŠ‡Œ“•–Œio^j^__ZZ '—&!11<1 <£®®®®­®¯¯­¯¯¾®®®¥¦®¦¤£—œœ0*6-.-*,00056666AAAA4@ABBCCMMM§MMQMMMFCB:88:9989;;BIELMM    §¢§MO¢¢¢OO  \a^`chmmmm„ƒ„ŒŒŠ“•Í–‹Œ…i___Z/) 2DD*- /™™¦±®°¦®°»½½º¯¾»®®¦®®°£œ|06666166155GG5ADGAAAAABA@CIJQM QMMJMQMFA8$#89988B9BBIELMM ¢§ª ¤  §§¢§¢¢!\\c\kcmmmm„Œn‡Š‹”ÍÍ퓌…Z____ZZ(,/D1 /—™®©®°¥­®®®¯¾½½½º®­®®°£œœ0&-.#6.67.GGGGFGCGGCGCCABBIMKMQQMMMM Q§C@8$8$99999IBIIMMO ª§§ª§ª§ ¢¢¢§Oµ'[a``hmmm„„…ƒ‡Œ‹–íÍ•–‹Œƒ__b____bZ) <, 3™™­¦®®°®¯¯º½¯½º¾»»®®®¤£Ÿœœ0 *6AAAAAHGžQHFHHHHCFCCC@@CJQKQRRRORSRSRQC88#99999;TBIIMJ §§ª§§ª§¢¢¢µ§µ§U-\``kkkmn„nnƒ†Œ‰–ÍíÍ–ŒŒm_beee___Z/u 1<-)1—!£—£®¦­®­®®­®½¾½½»®®®»®¥£œœ0 +.AAAEFHHQžHHHHFCHHCFC@CMKKQRRRR¨¨¨¨¨¨XC8$8$8999IITPJJJR§§§©ª§§§¢¢µ¦¢µµDaa`hhko„o„ƒ„‡‡‹“Íí„eeee_e__Z)r /')!——¥­®¤°­­°¯­º½½»¯»®®¾®°£œD0(-.6ACMHQQQHQHFHHHCFQQJCIJKKS¨SQ¨S¨¨ÚßÚÚJ$#$899999PIJJPQR§©ª¨ª©ª§©©©¢§§µG a`khmim„„„…ŒŒŠ“Íîîï–‹Œ_jee^^^_Z(&'  —˜£¦®­­­­®¯½¯½½½»½º®»®®¤œœ5-6ABFMHQžQQHHHCHCSSHQJCTJJRS¶ÚßßÚÚÚààåàH$#88899TIIJJMQQR¨©¨ª¨¨©§·©©©§§§ \\`kkkkm„„„„„‡Š‰•íïïíƒ_e__^efe_Zbs+()  ˜˜£¦¦¤¥­­­®¯¯½½½À¾®»¾¯®¤£œ5&-—LN¢µ²·¸¶¸¸¹µµ¢:  \^kkkkimmimi…Œm\‚fmffffefeg]]]gfhg]]]]]]]]|¥¦¦¦©¦¤¦°®®®¯¾½¾Ò¾¿¿ÀÀ¿ÀÓ¿¿» @JNMOOLMEF ¤©ª¨Þª$³¹·ª-Bµ¨LM¢·¸ÅæãæäÞEL·¸©µÃ,2.::=BLN¡¢²µµµ¸¸¶U·NI``^kimmmmm„„…Œ…Œm^€iijefffgg]]]]gghg]]][]]]]u¥¡©¦¦¤¦¦°®®®»½½ÀĿɿ¿ÀÀÀÀÀÓ¿-#IPNOOOL   ª§ª¨H ?ÇÞªF EM¸¹©¢³¹ÁæäâÁäéª:¢ªFŸ)/..8;BMMO²§··¸µµ·¢ON a^^hhhkmmmmƒm…ƒ…n^mjfjefegg]]_[]]ee]]]]]]]]_˜¥¦©¦¦¦¦¦¦®®¾º½½½ÀÄÀ¿ÀÀÀ¿ÀÓÀÉœ"BIJM¢¢¢¢©©©¸ÞÞÚH;âÞž ;MO¢·O¢¢ÂäçéäÈâä 8§C1-()2>ELS§²µ···¶§µ¸Þ²O"ckkhhkmƒ…………Œm^kfkfeeeg_]_]]]]g^g]]]]]][Zv£¦©©¦¦¦¦¦®®°­º½½»¿¼¿¿¿ÀÀÀÓ¿Ó¦, @CJPK§§§©µ¶ÞÞßàåÚ"§GBLMJOO¢§ÂæêçéãÈá.= BµE=rdruœœN¢§§µµµµ§¦çèNW" dddddaknkkehmmm„…„…mjmffeeeg___]][]]]]]^]]]]]Zv¤¦·¦¦®®¤°®¦®»¯º½¾¿¿ÀÓ¿ÀÓÓÓ¿À³E "TIKK§ªª¨¸¨¨ÚÚàåà"+-ELOOOOµ¸äéêæäÇ $µM"0E¢<rsv—œMO¢µ§¢¢©æþè¢Osssssdddddolnkhhmi„„ƒ…mkolkfe]]]]_]]__]^]g`eg]]_ZvŸ·©©©¦¦¦¦¦®®®º½½¾¾Ä¾¿¿¿ÀÀÔ¿¿»¢@IJKM¨ª§Rµ§¨SÚàX" DIKOMJW¸æççæÂ !L¢¢?<: ž!sv˜£  ¢¢¢NµæüüèOI  (*tstvsslsddclwmhkmhm…my“oƒme]]]g__Z]]]]]]]]]][[]2¥©©©¦¦¦¦¦¦°¦®º»½À¿¾¾Ó¿¿ÀÀ¿Ó¿À³t\@IJP§¸RRRSSSSS7)-! #BJRMI²¸çèêæµª$¡œ/BJR§ <))ssš«£LLJM¸éüüüè¢A stu˜|vv||sv|yddyzzykmmmmcq“}mih^[_ZZ_Z]]]]]]]][][[Zt¥§±©¢¦¤­¤¦¦¥®ºº½¾¿Æ¿Æ¿¿¿Ñ¿¿Ó¾¼\\\&@IJJKRKQ§SCC4"&6!DBJ¢BJMKI²ãèäê¸J§:—œ-,BIM§¶µ¢œ˜˜š££ŸN²ÂæêüììßP4*u˜œ|v||zsz«ÎÊmmimc}~}nmfe]__Z]]Z_Z]]][][[ZZ[ZrŸ¦¸©©¦¥¦¦¤®®¦®ºº½¾¾¾ÆÓ¿¿¿¿¿¿¾³®\`\4@JCJJC¨QG4++¤6E¢¸äF@JBIµèäèû ,§·0&2E=EMR§ÞÞ¸¸·§¢¢²²´¸èêêêå§I"ttu˜«£««££««««£«°±Îxiimcs}~xmh^__ZZZZZ]]]][]Z[ZZ[[Zb£©Â©©¦ ¦¦¦¤¦®®­º»¾¾Ä¿¿¿¾¿¿¿¿¾¼»r\&447CGG6+*¤ GFD¦ÞÞèQ@J@P¸èäèé-F!)2:;EEO§¨ÞÞÞ¸µ¹·¡²²·èåëå§LAt˜££¤£°¤°°®¯®¾Ä¯¯°°ÕÕÊnhcx}~~oig]Z_ZZZ]]^]][[[][[Z[œ¦¨©©¦¤¦¤¤¤¥¦®»º½À¾¾¿¾¾À¿¿¿¿¿»¿&stttvy|¬ FQ§¨§S¶ÞQIOB¢Þäèûª!'-++)1™¡¡N²²²NNLB'˜«£££®°®»¾ÄÄÄÖÇØãóööööööÜv›˜l~~}“mk^\_[\]]h^]][[[[ZZb¡©©©¦¢¦¦¤¤ ¤£¥­ºº½¾¾¿¾¾ÄÆ¿»À»¼°a``ckkkmnmmƒ‚nkaatM¢§ªIMM²çäÞç|()t˜u0v˜££¤¦Á«!<™¡¡²²²²NP='  š«£°°°ÁÄÄÅÅÄÇØâò÷ööööûøûæ "$˜£›˜l~”}ole^\[_]hke[[\[[[ZZŸ§©©©¢¤Ÿ£œ£££¥­­º½¼¿¿¿¿¿¾¿À¼Àº°a\`cckkmnn„†…Œˆˆ‡mlz| §CJMB·ê¸æãbbrstvv𫱱Íxm *Ÿ¥¡¡¡¡NNA$ š°°­­±ÄÅÄÇÇÖââò÷ööôûçööûû" #8v›š£v}~~omh\Z[Z[\km^[_\[[[[Z˜©§©©¦ŸŸ£Ÿ££¥£¦º»¾¾ÄÄÄ¿¿¿¿¿À¿½°b``ckkmmƒ†‡ŠŠŠŠŠŠˆŒƒxs|AM@JÞçµé\lkkllwwxyŽx‰i„‰)—¡NLI2"«°¯°­ºÄÇÅÅÇÇâò÷æéöûûûûûçû5#4v›™ššrz~}ok`_[[[[hok`][[[[[˜¢¢¤©¢Ÿœ£ŸŸ¤¥¥¥º½ÄÅĿĿÀ¿¿¿¿¾»°dackkmmm…‚ŠŠŒŠŠ’ŽŽŽ‹Šˆ†hACAOäå¸ôsbblllljn†ƒƒ‚‚‚ˆŠˆˆ )'-!ΰ°¯½ÄÅââââââãóöôûûùùûöêþž 4@v››™˜v{~~}ok\[[Z]opk^[[[[[[)Ÿ § ŸŸ££££¥¦¦¥­½¾¾ÆÄ¿¿À¿¾Æ¿¿½¾dckkmmmnˆ……ŒŒŠŠ‹‹‹ŽŠ†ncABB¶çääæbcjjnjˆnˆ†ˆˆˆˆˆŠŠŠŽŽj 20̯¯¯¯ÅÇòòòãâ÷÷æööùùùûûûôþª 4@v™˜˜˜šs~Í}o^\Zk}lk^[[[[s¦¢¢ŸŸŸŸ£¤Ÿ¦¦­­­ºÄÃÅÄÓ¿À¿¿Ó¿¿½¾l`kmmmmnn†…ˆŠŠŠŠ‹ŽŠ‹ŽŠƒdCBIäéÞê¬_cljnnnˆˆˆˆŠŠŠˆˆˆŠŠ‹Še>œ1 ʯί¾Åããòãòâãæ÷öêùûùûûöøýÚ$@T˜›˜˜% |Í}kZZZ]p}ok\[[ ¢ŸLŸ£ŸŸŸ¥¥¥­¥´º»ÁÈÅÄ¿¿¾¿¿¿¿¾¾y`kmmnm„‡†‡ŠŒŠ‹Ž‹ŽŽŽ‰sC@Oäåäûsbnjw†ˆˆˆˆŽŽŽ’ŽŠŠŠŠŠŠ‚™È"ί¯¾¾Çòããóãââ÷æçöøøûøôûêýä$@@!&«”l[`p}oh][[[Z¤¢Ÿ™™¡Ÿ£¡¢¦¥­´®®»ÄÅãÇ¿¿¿¿¿¼À¾¿z^lmmmnmƒ‡‡‡ŠŠ‹’ŽŽŠ‹c+4@·çäèÏblnˆˆˆˆŠˆŽŽ’’””’‘’‹ŠŠˆŠ{¢Þ!šÎÒ¾±ÖâæããÇÇââ÷æéôööööûêûÞ#BK'«^Zcxoo`[[\ZŸ ŸŸŸŸŸ¤Ÿ¤¥¥¥­º»º»Åááľ¾¿¿À¾À¾~^km„„„…Œ‡Š‡‹‹‹‹‹Ž‹o("4#Bäç¸é~_jnˆˆˆˆˆˆŽŽŽ‘””Í”–’ЂЂ†¤· (ÎѱÒÄÅáÂÅ·¦éããæãèäæôööøüÚ#CT  %sl_ x“ok`[]Z˜ ŸœŸ¥Ÿ£Ÿ¥¥¥­¦¥ººÆáããÅÄ¿¼¾¾¾½¾~`kmn„††‡ŠŒŠ‹‹‹Ž‹Ž‹Ž+#44A¸æèäóbjwˆˆˆŠ{ˆŠˆˆŽŽ–ÏîÍ’’ŠŠ‚ƒˆv¹,ËÒÄÅ®ÂȤ±Â³ãéãûææãâéöøûûH@JT vvsr«~ym]2 Ÿ=ŸŸ¡£Ÿ¡¥¦­ºº»»ÁÅäãÅ¿¾¾¿ÀÀ¾¿šcnn†„Œ†Œ‡‹Š‹’’‹‹‹’DEAALäèèæÛbljnnˆˆˆˆˆˆˆŽŽÌîïîÍ’ŠŠˆˆˆ\ - ½ÖⱤª·©ÂÃãéæêéææããéöýÜ@TSK!!!! .Ÿ£=—==uvrb2Ÿ£œŸŸŸŸŸ¥¥­º®ºº»Ä¾¿¾¾¿¾¿¾¿«hm„ŒŠˆ…Š‹‹’’’’‹‰~¬ªª±äåääshljwnˆˆˆˆˆŠŠŠŠ’íîïî”’ŠŠ‚Šg ±±u(œÁâ·äæéççãæä±èùà@TTKY!33$$>.333!,Ÿœ==—==<;—˜v˜¤˜—ŸŸ¤ ¡¥­ººº­»»ÄÁÁ»¾¾Æ¼À¾ÀÀ¿«mn†Œ…ˆˆ‹’’’’‹Šƒiml}~Û¬lmn†nnˆnˆˆˆˆŠˆŠŽŠ–îõúî’ŽŠŠ‚‚ "$A&0ª¢·ãûûöéó÷éåX4CTKYY%$38O¸E#888"&œDœ=Lœ==<<<œœ—œŸ¤  ¤¥¥ººº»®Á»»¾½¾¾¿¾À¾¾¿škm‡…Š‡ŠŽ““’––“‹ŠŠnocaokkkonnˆˆˆnˆˆˆˆˆˆˆˆŠŠŠŽíïõî–’ŠŠ‚ˆ&&",.#:@@BCMQ4*œ¦ãêûçÚÚÚG44@TKTSY3$>Lߨ;8;;?;"'¤ œŸŸœœ—L=—=——Ÿ¢©¦¤¦¥­ººÄÄÅÅÁ»º½»¾¿¿¾À¾½¿Ìm†ŒŒŒ‡Š–”ÍÍÍ•’‹‹nkcclmnmlkn‚ˆŽˆˆˆŽˆˆˆˆ‚ˆŠ‚ŠŠ’ÍõõÍ’ŽŠˆŠ_ &-#6B;BJKK¶ßààßœœ¸éçû- " 4@TTSSVY3;§èU9>;;???;<±£œ ¤Ÿ—ŸŸŸ™Ÿ£˜——©§ ¤¦­½­»ÅÅáááÁ­®¾½¾Ä¿ÀÀ½¿zi‡‡ŠŒŠ‹’•Ïîõõî’ŠŠnkknonmnmn†ˆnŽŽˆŽŽŽŽŽˆˆˆŠŠŠ‚Š’íõõî–ŠŠŠj(-.4@@CISSSÚëåëàߘ©âçûª $4@@TTKSSY3??M9>>???NI=$ Ÿ°ž  —Ÿ™Ÿ™¥—<— ©¤¢¤¦¥­ººÅãáäᮺÁáÅÆÄÓ¾½¿Ñwm‡ŒŒŠŒ‹’Íïúúúî’Šƒlklmmnnnnnn†ˆŽˆŽˆŽŠŠŽŠŽ‚‚ŠŠŠŒŒ–ïúúî’ŠŠ‡ (-AABBJRS¨Yàëëëààª<·æûö4 4@TTTVSVY3?;9;>?>?PPP?:—¤¤ž Ÿ™Ÿ¥­´˜uLª¨   ¥¥­Ä¯ÄáãäáÁÁÂãæãÅÅ¿½¾¯lƒŠ‡ŒŠ‹‹–îõúúú•‹‹Œjmnmƒnn†††††ˆˆˆˆŠŽŽˆŠŠŠŽˆ‚‚ŠŠ‚’îúúõ”Ž’Ž(.=EBCJSSYYàëììëàYDŸäçû÷44@CCKTVSY3?;;;9???™??N= ™®ªªE  Ÿ™¥™ºº—˜œªª ŸŸ¦¦º¯º®Åáäá»®ÄãøùæáÖ¾ÒÕn„‡ŠŒŠŠ‹–îõúýú•‹‹…innnnn†mn†ˆˆˆŽŽŽŽŠŠŠŠˆˆŠŽˆŠ‚‚ŠŠÍúýúÍ’’’^ t1AEIMRRßÚßàëìùëàYSD äåûã44TTTKKVS!>8>>9>=;?™=,©ªªœ ª¤¡¥›­½™˜ ª  Ÿ ¦¥­¯¯¯»ÅÅ»®ÄæùùøòÇľÕwƒ‹‹ŠŠ‹’•íúýþï–Šˆnjjnnn†††n†ˆŠŠˆŽ‹ŠŽ‹ŠŠŠŠŠŠ‚ŠŠ‚Š’õýý’js);?IPWPUURXàåìàß¶¶¹åêXVKKYåìþüåÞµ¢«×ÀÀ¾¿Äľľ®º­vb)·©© L m€Œiimd6QGN¢¢·æéæÜn†„„„„Œ…ЇŒŒŒ‹‹‹‹ŠŒ•‰mn„†‡ˆˆˆ‰Š‰ˆˆˆŠŠŠ’õúöõîíïõõúí”ŽŠ’îÍ–‹ˆ‚Žˆ %.899TPPOUU¶¶ààåYÉßUßëààVUKYàìþüêÞ·¸˜¼­ºÅĺ¯­¯°°˜s Ÿ¸©¤Ÿf…iiožœF¢ ¸æçã±n‰o„„ŒŒƒ…ŒŠŒŠ‹ŒŠŒŒ–•…m„††‡‰‡‰ˆ‡ˆ‡‡ˆŠŠŠ“îõõí“–ííïðí•ŠŠŽÍ–‹ŒˆˆŠ_ &3#9TIPPWU²UVßßààßVUÞààYVVUYàììþêßµµ3???åç=>3 (³©¦ vŒif}AO ¸ææä«n‰‰„„„ŒˆŒŠŒŒŒŠŠ‹Š‹‹•‰m„„Œ„‡‡‡‰‹‡Šˆ‡…ˆŠŠí•–ŽŠ“”–Ííí–ŽŠŠ•“ŠŠŠŠˆ (%&,.9;PPPWWWµµ¶¶¶ÞYɹààYYVYYYìëìëàV§§3???¨å 83 u©¢ziiŒii…€xFM ¸èãÈx‰‰„Œ„ŒŒ‡…ŒŠŠ‹ŒŒŠ’•“…ƒŒ„Œ‡„‰ˆˆ‰‡‡†ˆŽˆŠŠ‹‹ŠŠˆ‹“““–‹ŠŠŠŠŠŠŒ‚Š_ ))&$.9IPTKWWUUU¹V¶¹VVUßààààåìàYåëàYVU²3????´??;>  °Å©zŒii~AL¢èäÅxo‰‰†Œ…Œ‡…‚ŠŠŠŠ‹••ŒjƒŒ„Œ†„††‰‡ˆ††ˆˆŠŠˆŠŽ‹ŠˆŠŠŠŽŽŽŽŠŠŠŠŠˆŠ‚ˆ%%'''89TIPKWWUVUU¶¶¶µUYYàYåìåààYYYY¶U§¢>?????´???3 (ÄÂzŒ„mixœE¢ääÃy†o‰„………ƒˆ…ŠŒŒŠ’’–í–m††„„‰†‰‡‰‡‡‡†ˆ‡Š‡ˆˆŽŠŽˆˆŠŠŠŠŽŠŠŠŠŠŽˆ‚ˆ‚Ž% &,,,89;IPKKUUUU¹VVµµµYYYìéåàYàYVVUVR¢¡?????´?????)Â~…‰Œ…iŒ|FN·¸È~…‰‰„„„…ƒ…‚ŒŒŠ‹–•–ƒƒ††‰Œ‰†‰ˆ‡ˆ‡‡ˆˆˆˆˆŠˆˆŠˆŠŠŠ‚Š‚Ž‚ŠŠŠŽŠˆˆŽ›?>3!&#=:#8;IOWWWUUV¹UUµWKUVYYààYYYVVVUR¢¢¡??????´´²??3,, 0°‡ŒiiimfxGC²äÈ«„‰‰………………Š‚…ŠŠ‹‹nŒŒ‡†‰‡‰‡‰‰ˆˆ‡‡ˆŠˆ‹ŽˆŽˆˆˆˆˆŠˆŽŠŽŠŠŠŠŽ‚‚ÊW´´N>,33,:;888IPPWWWUUVUUUPKUUVßYYßßUUUKKO ¡²>?????´?¡²N=3???2! )“ŒiiŒiG¡Þä®o‰Œm……ƒƒ……‡‚ŒŒŒŒŒ…ŒŒƒŒ‰‰‡ŠŒˆ‰ˆ‰‡ˆˆŠˆ††ŽŽˆˆˆˆˆˆˆˆŽ‚ˆŠŽŽŽŽ‚Ê¡W´´¼´?9;###888@IPKWKORUUWTTKKUUUVUUUUWKKM¡¢´´3????´´´´¡™N>?²ä§:!d–‰ŒpŒiii}HŸ©äÁxŒm……ƒƒƒ„Œ‡ŠŠŠŠŒŒŒŒ†Œ„‡‰„‰‡‰ˆ‰ˆˆ‰ˆ‹ŽˆŠŽˆˆŠˆˆˆˆŠˆŠŠŽŽŠ‚ŽŽÊ´¡´´¹¼ÉɳN?::#$##@TPKKRµUP99KKWKWUUURUKKJ ¡¦³»³>????´?´´´¡?9?§üûä??¡¡?´´´´¡¡>?IÚìüæE3}“Œ…iŒŒ„iii}6: Þ·x…m…m……ŒŠŒŠ…ŠŠŒ…ŒŒŒ‡‡Œ†‰††††ˆŽ†ŽˆˆˆŽ†ˆˆˆˆˆˆˆ‚Žˆˆ‚ŠŠŽË´´´´´´¼¼¼¼ÃÆÉƼ¼Ÿ:?N¡¡´™¡´¥´?>;LISàüè 2  “ŒŒŒŒŒ€ii…|.M±¸«…ƒ‚………Š‚Œ……Œ†ƒ„„„†„„†Œ††††ˆ†ˆˆ†ŽˆŽˆˆˆˆŽ†ˆˆˆˆˆˆŠˆŠˆÊ³´¼´´¼¼¼¼¼¼¼ÉÆÆÃ¼¼ÉÉù¡&.@IINJPB@I¢O¢³³¾¼>N™N?´¡´´´´—<=??LLÚßß§:!iŒŒfiix5G©è·z‚ƒm‚ƒ……ŒŠ“„„ƒ…Œ„„‰„„„†n†ˆˆˆ†Ž†ˆnŽˆˆˆˆnˆˆˆˆˆˆŠŠˆ‚¾´¼¼´À³´¼É¼ÉÆÆÆ¼¼¼¼ÆÃù²BLNLMMIBPO O²³¼³>??¡?¡´¡´´¥%uB?N¡NPM§§L>!d‹iiiŒŒŒ€Œiii…~DFÞÞ°mƒ…ŒˆŒŒŒ…‰ˆ„mƒƒ„†‰ƒƒ†„„†‰ˆˆŽˆŽˆˆˆˆˆ†ˆˆˆˆˆˆˆ‚ˆ‚ˆ¯´´¼´¼¹³¼¼¹¼ÃÆÆÆ¼¼¼¼ÃÃü¹$$IPKMMJBL¢OR¡¦³¼¼2??¡¡¡¡¡¥¡vs—=?N¡¡NO§ÞäM"sigpŒŒŒi„‰D©è¸~€mƒ…ˆƒ‚ƒŒƒƒmƒn…ƒ…ƒm„†„†‡‡‡†ˆ‰ˆ‰ˆŽˆˆˆn†ˆˆ‚ˆ‚ˆˆ‚ŽÎ»´³´¼´¼¼¼É¹ÃÃÆÆÃ¼¼»¼ÃÆÃ¹¹=.PONKNIIOO¢¢¢²³»¼3??™???™™š_˜=BIN²¡N§êýê§2t}ihŒŒŒŒ…€…fiiŒ‰žMßã°„ƒ‚……†……ƒmm„„ƒmnƒƒƒ†ƒ††‡‡‡‡‰ˆˆŽŽˆnnˆˆˆˆˆˆˆˆˆ‚ˆË³³¼¼³³¼´¼¹ÃÆÃÉÆÆÆ¼¼»Ã¼¼ÁüN!:NMONJINN¢¢ ¢²´¼¹3>;;;=›¯ËÊ{er—=LN¡¢¢¢ÞêüûÞ<&  ˜|ooŒŒ€……€‚€€mm…‰Œ}œªåÂz‚ƒƒƒ…ƒ…mm‰‰„mƒƒƒ†m„†‡‡‡ˆ‡ˆ‡ˆ†ˆˆˆnŽ‚nˆˆˆˆˆ‚ˆ›´³»¼¼¼¹¼¼¼ÃÆÈÇÇÆÇ¼¼³¼Á¾¼Ãó². BKOPMPOOO¢OO¢¡²³²,˜>—››ÐÐËËÊw^\v—ENN¡²¡¡¨êþýá=' ŸŸ«ŒŒŒ€…miŒoŒ Þæ±n‚ƒƒƒƒmn‰‰Œ‰„‰ƒƒ„ƒ„„†††‡ˆ‰n††nnˆˆnˆjˆ‚ˆ‚Žz›¥­³ÁÃüɹ¼ÆÈÈÇÆÇÇÇÆ³³»»Á¼ÃÃóN;$ IKONNLOO¢RMN¢¢²´²šÐÐÐÐÐÐÐÐÐËʈ^r˜œ=N¡¡²¡¡Úùþý¸B'2 ž“…‚€i…Œƒ†§åä~‚ƒƒƒmmŒ‰‰Œ„mn„m„†‡„n‡‡ˆn†nnƒnnnnjˆˆnˆ’‘š™™™´³ÁÈÂäÈÉÉÈÉÈÇÈÇÇǼ³³¼¹¼ÁÃÃù¢ E:IOOMNNN¢¢OLM¢²²³²™ÐÐÔÑËÐÐÑÑÎÐÊŠev˜=LN¡¡²¡¦ßìùäN= ž“‹€€Š€Œ€€……‚…………yMªåÛˆƒ†ƒ†ƒ„‰‰‰‰ˆƒmmƒ‡‡†‡†ˆˆnnnnjnnnnnˆˆŽ‘Êvv—£¥³³ÁÈäèééæäâÈÈÇÆÇÆ»³¼³³»ÁÃÃÃó² L. IPONPOOOOMIM¢¡¢»³˜ÔÐÐÑÐÑÔØóñ×Ô‘jb˜ŸL¡¡¡¡³¥²ßß©¡¢:]sª~€€€€Œ€…‚‚‚…‚‚‚‚‚m|FÚƒƒƒƒƒ„„†‰‰‰†mmmmn„†n‡ˆnˆˆˆnˆnnnnˆˆˆ{ssuv™¥´»¹ÂâäéçìûéãäÈÇÇÇû²³³³ÁÃÃÃÃÃó²¢E. @PPMNONOOMEL ¡³¼³šÔÔÔÑÐÐÕôøýõØËr£LL¡¡¡¡²²¦¦²²¡N•‹ŠŒ€€€€………€‚……im‚i…y}…m‚m†ƒnƒƒ…‰ŒnmmŒnˆ‡‡‡‡ˆˆˆ†nˆnˆnŽnyštsss|vœ¡¦³ÁÈÂäèìüüûçäâÇâÆ¼»¡´²³¼ÁÃÃÁÃó·²¢E':NMPNNSÚSJLNN¢¡³´šÔÔÑÔÑÑÒñõôôÕΑvŸLL¡¡¡²²²¦¦¢³ +•€€Š€€Œ‚‚………€‚jmm€‚‚‚m‚ƒƒƒ‚†ƒn„ƒƒ„ƒ‡‡‡ˆ‡‡ˆˆ†n†nŽˆˆˆnŽlªD5vs)u˜—¢³¦©ÂÈèçììëêèâââÃÁ¡¡¦´»»¼ÁÃÁù¹³³³NA$KNOOOXÿXTLN¡¢¦³²šÔÑÔÓÓÓÕÕñòÕÔÐÊ{\b —L¡¡¡¡¥´³¡¤t ž–€€€€€€€€…‚‚‚…‚‚‚‚j‚mƒƒ†‚ƒ†††ƒnƒƒŒ†‡‡ˆ‡‰ˆ‡†ˆ††ŽˆŽˆ‰n'ÚD1)/¦Ÿ=³¦NŸæãÈääèêûêãâÈûL¡¥´´³»¼Á¹ÃÃû³·¢L" PONN SXHLNM¢¡¦³²˜ÔÐÔÒÓñôôøúòÒÑÐ{^bd EL¡¡¡¡¡¡Ÿv`\\b*¬„ЀЀ€ŠŠ€…‚‚‚jmmj‚jjƒƒ††ƒƒƒƒƒƒ†ˆƒˆˆ‡‡‡‡ˆˆ††ˆ†nˆnn‡‘v¤ œ)<³Ÿ™È¦¡ÁéêæÈÈãêüûçâÁß?L¡¡´´¼»¼ÁÃüÃÁ³²O4 TNOOOJBJMLLN¢¦³²˜ÐÐÐÑÔÒññõôóÖÔÔ‘bccu¤¤=?NNŸvl^ekkysd|”…€€€€€Š€Œ‚……€‚‚…ˆ‚‚ƒ†††‚ˆƒƒ…†‡ˆ†ˆ‡ˆ‡ˆ‡‡ˆ††ˆŽŽˆˆwÎİšs0DE<)=·N³³¡Ãçäãçô©¸çùìæâûL¡¡¡¡¡´´³»¼³Ã¼¼Ãò¢A 9O¡OLBIMLLLL ¢¡WšÐËÐÎÐÑÑÑÑÒÏÒÎÔ^ckss(vssd^^`ckcysdv¤“€€€ŠŠ€Š€‚Š‚‚‚…‚‚j††‚nˆm‚ˆ†ˆ‡‡ˆˆˆˆˆ‡‡‡ˆˆ†ˆnˆnnˆ‘Öóá±®š05),¸EME¥÷çâæäÞ¦ÂçåæâÈ»Ÿ?¡¡¡¡´¥´´´¼Á¼ÃÃÃÁòC$POOIENŸNOMNNŸONšËËËËËËËËÑÑÑÎÑÎlcccdslbbcb`bckcklklr(s¤°if‚…………Š‚……m€iij‚ˆƒƒƒƒ†ˆƒ†‚†‡ˆˆˆ‡ˆˆˆ†‰ˆnŽ‚wÏöôçãáݰž2(%/ Ÿ¡Á³¦Oäç·©·Çääâ¹¼¥EŸŸ´´´´»´´¼Ã¿¼¼ÃÃÃÆ¹¢""GJLINO¡¢¡¢OŸNNN˜ÑËËËËËËÐÐËÑÑÎyclllllllllllllllnld&t˜°ÕÖ”jg€€€i€€‚z~†‚‚‚nmmnƒ†ƒˆ†‡‡‡‡ˆˆˆˆˆˆˆ‰Žnn‘òýûôôçæòű®'&˜˜Ÿ¥ÇéÇÈ;·ãâ¹»ÁÂÈÂÃ¥=LL¡¡´´´¼´¿¼Á¼ÃÃÆÇÇÃÁ²65ŸLIM¢¢²¢¢¢¢²²²rÊšÊÊËËËËËËËšylwxxlwwwywwwwwwnns˜¦»Ÿ1°ÖÖÙÏ«z‰‰Ž~š¦Èǰyenˆ†‚ˆˆ†ƒˆ†ˆˆ‡ˆˆˆˆ‡†‡ˆ†ƒwÏöûûøçççôæááŤ0˜˜Ÿ´ãææû©¡©¸Â´²Â¹ÃA—Ÿ ¡¡´´¼¼»¼»¼¼ÃÃÆÈÈÇÆ²|tEBIN¡²³³³³»³³²bw{{y{{zzš‘z{wwwyxyxwxyxxywxy˜®Çñâ©5°Åññò÷÷÷öõööó¾£ ·ÃǬy††nƒmnƒƒƒˆ††ˆ††ˆˆ‡‡†ˆ‘ñ÷÷ôêêûôøøçææòñ¤'1=Âéæçûæ²¢©·¡·¹·uv=Ÿ¡¥¡º´º¼¼¼»¼¼ÃÆÇÆÆÃ³zst˜DBL¡¢³³¼¼³³´²dyw{ywwwwynwyyxyxyxxxxxxwwlv£Çòâ⍤ÕñòòóôöúýôõõñÏ£Ÿ©ÁâÖ~mmƒn‚‚ˆˆˆ††ˆˆ†ˆ†Šw‘Ïâòóéóóçôôøôçôóææãt/œ©çæäá·¡·¹¢¢·œsbblru—™™¡´´´´»»¼¼ÆÆÇÇÆÃð}s+.5:@BP¢²²»³»³³²l‘wyy{yyywwwxywxxxxxwxwwwv®Çòá¬zv˜°ÖñòóóôôôóõôóòÖ¯£œ¦©ÇØ‘hhmnƒ‚jm……ƒmƒn†nz¾Øââæççæææççôçæææôû!Eâ㩦?O·©¤¤ylllllrs˜?¡³³¼Æ¼¼ÉÉÃÁÉîzy~~s1EJKNNR¢²³¼¼¹³²l}x}ppp“ppp“p}pppppppppp}¬Ûð¬qqqqq¬ðððððððððððîðíí¬í¬¬ÍÍÏÏÍ•ÌÍÍÍÌÍͬ̔~~“p¬íÛÛÝÝÝÝÝÝÝÝÝÝÿÿÿÿ 7ÚÝÝÝÛqqqqppqq~opdq776GHHž¤¬¬ž¨Úžžqq 77HH7HžžÛ¬±¬¬ tiff-4.0.3/test/images/minisblack-1c-16b.tiff0000644000212300117540000013516511244340171015500 00000000000000MM*¹>U•få`eudCe‡f{f«e¢d5dÇf/hbec´cãdsc a^aÃ^#_à`½_Õ[×mC“y¤Œ§ wRéCÐHžGÛKu•€ ˜"¤¼§S¨®«¯«r«ªã¬ «~¬'«ï«0¨ÿ§{£ã ‚£ •Ù~c‘Ÿ£¶«3ª†ž—H˜8ñ >¢¡¢\ £˜å”.ŠCyésiíuÂ’q¡}¢G£œ+œü²÷⟟À ¡¡+¡Ç£¬§LªN­3WDyq†—˜…¨·¦©™x]NOvWŸZ”^ébGYóOXt0tÃ\½XÂTþQé[€^g`yƒã‰LŒ·x‘ß™óže”é“ê•C“nŒ,j–Uz\@b_c¥PáSfk/s7uÓx/y¿‰?•›/š²™Ì– .`Mu£nYp³nnçkk1iŸiRiÿkkÃk€kÈn’nZmûkÎiµjjhOhe _Žc:‰Ù³ûÇTÇÜŸß_äG•;òJ4ƒ¿’,Š«gÅYÊ3ËäÏŸÑðÔ+Ó>ÑÐÏ€ÎöÎÁÌ"ÈÁƸ)«t• —c¥ÀøÅ΢Xwš_V`žcÉhykÍseznê…¯ƒÛƒÀƒMEy%nÁϪ*¼ìÂÆÅcË4ЄÒ@Ï-ÏŸÐPÐßÐjÑ,ÐÑÐÔ×µáÑËËHEM؉Ŀ»ø½°Éa¶zåig`c³`]X`PŠZ8búaôcïa©m©zi€«“¥Í®B³Þ¼ª¿Ó¿@¾\ÀÃ8ÃÒÃèùÀnªœyEq¬}by?aèoÒ…üŽŒ”ǘ0—tš*¡è©Q´»¹¶¹¶ÑµŠ­OXÏrIlm•oÝlj k,hÃh]hiªkÂkài¢mekƒlCi/iti³k;j eªbibabìyž§TÄóËt»®œ7x¤uáŠÔŒ¡פ±¾ÄÆ´ÊõΦÑUÑ;Îï̩̙ËTÊ,Ç#¿°†˜R¢”¬½µÈO|æNWK0RWÂW©V?VÚVhSÎT±!®À©&¤bÉ’1û‘¸˜>ša¡Û©p±]³¨³~®…˜õnEZ•`?dBd^s`bežg8gde¬e c1eÄcÌYbbª„ c«âàv³~Pª,¾ÄNj̶’…w)k™dŽ^MaÁt•…òĤ ½ÇÂÀ¨ÑdÍDKSî^ø[¢ZZñ\´\Å[c^†^'``}a¡a´`j`½aìb^æaŸc`a XÊh²§BÚ)܆ÖMÓWÐ$Ï5ÐQδËCÃè½u¼ ™Éd—}ø}—ƒ«Í£ËBÈتž™ ¨8µ¤»Ì¦Â©F³j³òº‘xí@¸‚ý–®›…Ÿ?§M«ˆ±ª´Æ¶‚¹?·²µ¬¸,ºð¼û¾¥¾É¿Õ¿¬¾¦®MxXEF~m͇#„Œ‹7˜4 f§n®#¯û­»¯ ®Y®Ð«A£—‚(µë«²­ì®4­E°É³ ´˜¶ú· ·hº†§ßnMRiXW6VíS´PÊTf\YBW÷XWäWXUfWuVÖUTVQVëmi{é¤0½&¼5‚“PlE~F‹N†Q-SaSÐP–N€Têlãƒ]z [S3Y XoW VëWgXm[J\[e\l\±\È_ËÔÇÀ»»æ©Ÿ “=j*V~Ofók‘)žÎ°C¬™¦ÿ–ѼbÎC±nª°ÀóÀðÀ™¿R¹tµƒžÆ„Ä“ƒœ?¤±§åªq«Ï­ ®ï¯©³¸T¹¯º»|½º¾ß½W½²á›^P®˜FT~´”+‘ûˆÝ㘭œe:œä–ø—–É•c™ œ…Œ¹Æ³ô¶q¶p¸¸ëµÃ· ¸ºUºÉ¼?º·ÑviEHŠGôl” †aCZ˜gYf†_HNJ??XBnDåIVG¬b¢gØKhlœ(z€PÞRÍTDTfYTYµX7Y¯[ÚYÛWÈXçYVìXºW•U¿Xp[Yp\ÿ]2Z‰[C\_\Ý]÷_ƒ^åa€`b]`æaaObìaìbšbÕc da©aAc¸`äYž}ÂØÐ ¿À¶¥©F•Y‡“eÙu2`Y,Öd쵺Œ²‹6‡<¤ä̚Ό É7¶ª· ¥u²œÍËÎÆ·ÂÌ»I¶z”}‰•œÄ ì¢÷¢ ¢Ÿ¥W¨Î«œ®Ø³¶ã¸Ç¼¼ºÅ¸{¶¦©=‹c:ŒÊ]Ò!šO—‰óˆï‘Ç—•¸•Ê“Y”–”ß—œ‚†$½1·!º{»ü¼h½þÅÅaÉÎðɯýj¾>…wBöA½F=z.™ª”=‰ÒŠW’G”F•ˆ•nÅSšC‘G…JŸHêi9jÌIÖy·„•X#OÐPmTVyV`XóW5V`YY­WëT‚UÝUÖXÆY’VßVÆYûXä[Î\QZQ\q]›\ú](]Q_˜_ª^}`Å_Ë_·^ôaÓ_œ`ó`¦_¢`ëa¨`WcVffcòZÃk§Þ¹“¢ åhFe«|0‚õzÂ`S­š—=­V­Ý á»-ÎîÀ’Æ=ÐÏ¢¦1±LÏ6ÕwÓÓÉÇ¿Ÿ¸ø²çŽ¢•û˜Îšòže£¦šªÚ¯H´´`µ·g¸b¸é¹ª³!«œºzË(~œx:˜ˆ›špþ„™ˆ…QH¸Q’¾•뛟žG‡ñ¿2¹™½Ð¾-ÀnÆóѪÐFÕù×ðÉ#¾ß¹¬µãzoB¦@ÅWÿ‡UŠm‘<–í›pŸ#Ÿ­Ÿ u’shI@h?£:ÈEòF;`h‹`7Q:S"PóT5V>V‹XWXÜX›X&V¶SxSÀR«S*TkRRîS§UÚXYZ,YÚXšZ ZMY“Z†Zê\¯^)^ ]í_ia`·`Úa$b5_Û`ñ^z`â_`‰cUac"`eÏŠ™iD4E>“ú—MŽdÒ]cyY®Zñ”C½¢Ÿ©—ï¹ΙÐÚÍ‚»v»ôÆèο×ÙבνÂò»ºíœ9Œ£•Áœ¸¢§/ª¤±¶’¸|¸ ¸(¸¶·Ö¹¹þ¯§–0fŠ%â‰=—Þ™Fœ¢—™Š“‚ƒŠ™‘5@=˜Äž"¤Ú¨e¥kŽþÀ¢º—¿$¿}¿É Àñ¿;Ãdƾ·œ·›fXu:ÆN`Ü׊óŽ;™¹Ÿ8£½¥¤~¦È¥YŸ[eÜK¶b($‰#…³TÙPAUÉP=QgTW@WÊWVáV?TlTVuT=R„VTÖS)R;U'XbY\’YÞYö[ÎYÛ[[‘Z´Y`[ \£\„]Šb4a5`ßcÄaÈb$`þ`­^­`ñdte]c-cãe‘l“Z«ÁU‘¬rƒÃ_xÇ^Âb¼ž\‘–ˆ!¦„¨–®•ʃő¹?½Y¾bÄÐÔQÑ]ʬÄè¿Cº8®Ï“œ¢£S¥¬ª?¯´5¸‚¹µ¹5º¹É¸Xµ¦´S«þ LpR„’@¶’`—–˜Uš'˜™Ð”ÈŒsŽM’E”±›]¡¿¨O«Áª•“Ãi¼C½½,»ú»½žÃƙЙк¾*µÒ†þ-62uTŒûŒX‘d™VœŸ­£ð¥¢¦v§¦f¦ª§Ç™f-\³bTõ“ÌtµSRÓUñUŸRæRÜWÝW9T¶TNURÎSÁSúTBTHSÂQyOmR¦TV¿U˜X›\d[(XÛZÖZz[€ZFV¢Wð[ùZ ^û`/a`¥a`ÏaI`Š_ò]i_Áac?edb}`„b’j:UYˆ›Sãyrx[“_Qp©ßN ªà©ú¥Ì¹ý».ÁIËpÒÝÕÓ7ϯÇqÃ.ÃÃÃֺ߶ë¡# ´¦‰«d°ë³?¶ ¸â»,¹y¹ ¸nµ*±â­á§n–+xè5È_¶•¥–ü–S™o˜'¢½¤+˜ËX‘e”—Öž»¤ «(©%ÈÁø¹ú»K¹¸S·ŸÀÓCÔ,×§Ôípš$æ]¬”(¾–àÈ¢M£·¥Ä¥¦¥Ž¤:¤Å¦Ä¡Þ’vEç!~7û‚2ŠÈnØSOR T[P SµUûV«U¯VVnW¿W’T“S~STQèSHm’oCQUzWòWÝZmZY¢ZÀZIZõ^³\…Z#TüVÃ[¥[E`Ð^À`zaÝaÛ`_#`—_]^—_º]__ó_y`Òb/g™u¨€^hÈc_mc“Åjè‹D N©d­e¶à½ù¼¾¼Ç?ÓåÛ/Û8ÖŠÌEÀ¿ÖÂÅV¾Ò¹ø­"¡¤§ª±×µ¹ºÚ»º`ºÔ¸X°Û«h§`ކPUTÜpÜ• –”l–ë—fœO šÀòŒj“n–äžÕ¢á¬A«+‰rÁݸκź=º^ºóºŒÇÕÏuÈGÃç¼fŽuK GhŽéº—B›³Ÿ†£Œ¤Ó££Ò¯Ç´’¥ä —iw½;s7chÁ„·g§R¦QTµP˜R¸UãTÛUUâU˜V$SœSÒTV:U[Sžw-a’ÿ‡™_gYÆ[³Yi[Â\ª[r[ò`”bfa@^áWV?RëTûZœ[ ]<^a`ibc]º]î_ï_\\€[>[úZ÷_cœ`}d™kPmcbÇl}t¦v"’Ú  ¨Š«Š±®¸Œ½¦ÀÈÛСÕ<ÕÌÏ&ÅbÂÀ ÁyÄÁs»`²!¦ÕªÆª°uµN¹¹»Á»©»xºØµ©è¤œš—ŒfhÎ%§" zÖ”'•g”y–÷™]˜“˜ƒ™®Û‰Ëc›¡N¥é¯»®‹3ÃQ¹é»Þ¸þ¶Ù¸f¸c¸¹µë´×˜¢_G8t‰|‘Mšx #¡Õ£²¤  Ü³±Ó1Ø$µð”iƒdE^ùA ‹L–òz†c TãT"U*QÌRR>R¦VJV=UÂUQbRˆWjZ$Uöp΂šÂŒ®aBVî[YxWyYn])_ëcõgQdAaª[ÔVuXXQZK\½^W\¬^}_Ü_ò^Ò\`Zâ[µZUX8Y¿Yï[¸\Ó\Ø_ÄcOi˜„ Ž×m•qÊ‹`šê¦ ©@¯ú·¼nÁ²ÇóʵÌrËgÄ4¿•¾š¾ÑÀÀÅÃ%¼ê¶q­9®Ø®&¯ö³Ù¸·¹a»ß»8ºÖ±¤š>ûph3çZ„*‚„f”ò—ƒ”Ó“•š‹™·™çžˆ¥‘º›ý£ä©ó¯Š­'…Lºº°Ë´¬µE´_²é´´åµ"²…•‹d™;\SÕ†iŠ«ŠN”:¢£¢Õ£Gža¬‰ÔÉâÃß­dƒvS#nj¹‘Œs!]tTÚS¹TœSJR@O!Q®S¥S Q…R‰R(Y![òXú^QŽ›$ѽу†VZ±XæV=VeVP`±drc¤b`[ðY°ZeXXK[]¤]ò[ú[Á^»`½b0_ˆ^ý]"Z÷[‹Z™Y¡]\G\b[U\ ^6b§v‡„‰í•€ £¨Ÿ®M·œºÛ½^À*¿ÁÕÁtÀ%¿Û½¥¾›Á”ÂüźÀ¢¹ò­w¯ù³U³`µ·ü¹1¹’º ¸¤í”|‡åln3¢ b 8.æ‰ù•m—R•/”–’™Í™¡÷”à‹É” ›” /¦î¯Î®¿fÊûyèˆ#—)©mµ_³¤±Ò²5›h´@p< tdˆ5Š Ê˜7¡¡ƒŸWœ,¢ðÊ¥à±á뺆€Xé½ÃBɕڎlk”ZœUôSÞTTR¶RãR TUðVRQbN¼Ry[U[EYöxÀ•m±ÀÇÇ«·b§U‹XÓXÅW¶WCSW&a!bž`]>[MZmY—Y‹ZYT\>]B^×]ø^‘_­a7btb^ü^—]¬]V\^Ÿ^•\"]_`ž^4\Ë_¤kœóž”¦>®Ç¶º¸º¡¹X¹L¹L¼U¿À¥À¹Á°ÀÚÂýÄqÂkºå­k­˜¶ÆµƒµE¸Ï»ÍºÙ·¼±“˜xï\å+ Üœ \+Þ‹“˜w••ãn˜Ìš[žŠž”ü’µ’¡ƒ£¨ìªW[¬wæz=˃‡,šŒªó®V“Úe9Ae(SWý‰½…‹”1À¡‚žEžž±tÈEÝ8Ýá°r…KÄ""~r„FcJVí`÷ZTjTTbTR‡P˜SjQvPœQ¹"¶•¶]µ ¶q¹]½[¾ÜÀ…¿ÙÁÑÂrÂó»õ´¯#¶¶·‡·t¸â»’¹‡¶3§€roDG à h&! Ÿbh„Y•ð—•©––}™«zžµ™–Fœ¤T¦Ð«èª«cÝŠÇ;‘’?’Hd”æŸ{‡ŒB:Ü~—†X…ߎ™Þ ã·™¾¥KÑ_àÕÖÞ¡ne×=câ Ô ùaDtþP5C¸Zh\ÞYUŠT.TPTO™Rzet6‰ ³Yµ lY˜UVWZ Zc_5^[ß\Á^ aD^ZX0XXQXZ;[7\+Z”X‡Z¾[ºZ^aa1cÁcc/d¨cícÜbÇebd*`m_Ä`aa#a_õ`G_.]×`%a†\Ùj¦«p­q­º²´eµ‚³b³u¸ »ù¼¸Œ¼”À&¾é¾›»¡¸}´@¸­½µ¾¤½J·}²Z"qQ ² `› ¤  SŽ‘!–%”X•Ž£†/“œ$œÃ› œ£¦Y¬¶î·.u˜÷–{›ŸÑ£Ý¦Ñ¨€§ù¦fˆøzd†¡Š¡•W’5Žð¤ì²Ü´R ˜tZEÆØ]&™*¦nÔKˆMJ\sAiÑ[’XTWâU©SGSÛT’Q NóM#NpLdJQdZ{ß}}¬¿±ÛvâQêTÿTSYÇW•[N]À\Ë_òtuoœ[ZYÐYs[Î\K\]#^\Z Z4\ü\]±`NbcaÐbDeb-bàcëdØ`ä`Îaê`e`©_y_¯a|`-b2` aØcce-\jwI³»­C²ï´I¶ ³)³%·§¹–»Ü¹¹¼SÁ$¿˜À!¾„º§¶¸y¿ ¼a¼¸E©¾<9 U+ œ R a ­ ~K3HƒŒ©“‡”¾y‘E…Yƒš“ÆR›¡›ü¥½¯¯¶^´^s”º“‡š9,žÙ †¦{§—§[¨j’Do¿€Œ†‹Þ—"º®Ü ’øs£:ªµ ½ 7vˆa£RÕO’U¦g;s4eU±V1VaS)RÆQ€R†P3NÈNþLžM]U}zQl’’ˆ­{³XŽ'UžUeTeV5XGX´\æ]!\7]ß_$Z¿]G]ûXÇYð\œY˜\°]'\€]£]Ú]‚^]ñ^¾bÕaücCdBcíc„c3cÛcícùaê__ì]_wað`b*a¤búcë`þbu^ŽÞ²³®V²\±Í°²<µé¸Ø¹æ»U¼"¿À.Á ¾h¾¸É¹uÆ;ÂE¾)¹²œ""™ó   R‰ã48M“m[ƒ‰ÚŒ™’‡‚•w5ˆ%›ð—ðš#¦5±2¸2´Øk“7š›žœ—¢c¦ª}©*§ —o÷€ÁŠ|¤ÐøàÒÄH„\ZÃ,°Ì º ÚlŸ}L]üU·S6_"f a [®VsWeUòTðT·S/TuRÚP/NSN«K‹oVxBrÆ™ä¸/©ØijUðVbSSVTV•WÌZ¹]½^•^˜``/_‰aZùZi^\z]·`K^î^a­`Ä]¿`_ö_u_Caêcdóe¦e=cêdPd1b>açaub1`]ba+_õa×aÎb a%d¡f˜j¨ž¯Ý«¦®8¯M¯L²|·˜¸/ºÕ½¿6ÂxÄwÅn¿L³ƒŽÜzø}…~†J‡´uÙ]å/¢/ë+áL$s©ƒŠ‘{’‘ƒ“k’Ï’é’¬‘ߊ%yŽu˜€–·š¾¦C¯(¸‡¶êfO‰ðŽ#–™ï™õž‚¢\¨»¥t¡³šŽ{ˆ† ¡!ׯÞ<¶`wûN"*—£  ¸ÿ* ’!o'_\YpUãY‹[óS’V TVaTuUÊUÉU$SLPFP¥P~N~V²ˆ¶€z•À±¶ „ëX¾Y`V–VHTÎU}UÍZ6[Ò\&^ž`ä`“a_+^bY­[_Š]ò]Ñ^ça#aZb]a9baž`¥bc«dpcÏcùf!gjd—cÙbkafaKbªa&ba)`Âb˜bvf2e~bÝehcwv¶—c®î©m­a­&¯Y³´¹”ºì¿ÅwÁÞ¶¦Õ–b‚©L°Dþjrkz‚ÿ˜m¨BŸ>—]EÙfµ~2ƒë•D—Vš›·›Mœ£—y†x”AššL¥9®·¢µÔh߉ÅQ”ЙšìŸ¯£æ¦Ñ¢R4™zŠòª?¾å CsGJ#¥ ¾ E ½ZËU]…ón„^RVHR±RçS.P‚OÑS•RóSÑS”S>S¥R˜N NmNBGçnIŠeŽ“¥ÉºU°SoS[`©cEer´lld*cemjGŒ«ô¤¸ª ¬½³´¸þÀkÁ­Õ–އUyüsµi‹_e„m/y†[‹Ü”y•9›•¨ï¤‘²u~E˜¶c™¬š¦ŸážâŸá¡¢²›Ä“‚•uš¤¤F¨­²›´Vo“ó‰–“d–Ø™; Ý¤ú¢~ʘ¥\!‚ª˜ ‹ânŒD«« æ x E¶ îXÐqês·hµZ!SPQmPÄP^N M#PÈRÕRžS¯UËT¡SlPDN­M‹O9ƒé…`œºx¿™¦]`k_eZ=VxXXxWJW°[\m\›\«^ß_¢a¤b=bE\lXv\ò\@_DaQ`2abia^`³cŽcai_ÈaLbTcÛf£cYcŠfÁdÂcec)ckbs`Þb.`ìb_ŒbºeÆfåe¾iÃn™[f%©6£œ¨d°.ºW±!Žƒy.y¤nj hûlorsC{Ÿ„ö‘È– ›2œÇŸ`žï þ¦\ŸèŒ˜ŽÄ˜Ø›°œÃ ‚§ ¨ã§a¥j¦g õó—Ü´’> ¥«©°¬Ôt ”;ˆ;“×–6—Àó XžÙ™“éR=åa/]K;Ÿ c ¡ " ˜ug žÔa7l_îTkR~QPN×MLóMsQæR•P­SR€QøOÈOÊG³h/ƒÔ‡¤Æ¼™¾Ä‘ ZSb-_±X©YAXXXùX Yf[”[ÿ]`F_–fOl,m“dÎXû\»]s\Š_S`B_˜`Pa>anb¡c‚bÙb&aù`>fJd]b~g™h2dÔe$bÕb-cLc•`Êa)a6a´cŒf¿dcÿefši\›^k–w Œ¥ñ¯ª”tXdXÌXød“z~­vtbv¢†‘<˜ìšæžŸâ¡+¢¬¨n¢(£×£è‘”È›nž_§‡¨Ô©GªI­¨|¡Ÿ Ò£B –¼•wœ~¢Ë¥s†Žt‡c“Εã˜?›Ò™ú—á– ~ö+ñ U ÈÏÇ@ 2 Ä f ƒ w½`iºæ‰U¤`YySsQP¹PQNRMNÇN#PÁS¹QýQ‡PµQÔPaQO“„TˆÍ•¯ªÈµ[¼tƒÏXb_UXMWžWµX…X.Yû[Õ]O^ÿaÕcût*ƒ7섲`ÔWJZf\w_J`m^®_Š_ò_ûb×caC_Ÿ`f_…dmcƒb¨déeÍdÈfåe aFbÿcXcLb2bÀcÝcÈd2c³f°g{k´df_+]ûe˜×’rïTúB—>S:¼J˜iU|vïj¶lö{¤Ž˜\šÔ¶¢¢}¡Û£à¬ §ã¦§¸¤˜Úœú£m«®A´C²Ù´¬€§ˆ¦§Å Ì¡œã˜ô¢…iЊF‰·¤•'—1˜Ä“¿‹™‰!Vê/] ð õ N  ý ú ¹ ÆY\¸ µÚz™R€WSæS*Q.QûPfP4OÚR/Q#MçPWPOCQêQ PRN‘eI\‰ ‡ºÇ»¸t]%d¿]ðY¹WõY,ZYYŒZÐ[¶aa×_%fÆw,O²CpIUe]§Zs[£\e_½` ^_†b!b€`ù`]ñ_Ûaˆ`wcVc!dáfjh h”g«c‰b_aûbúcFjdÌføe&fh:h b§_#`1]pTUE$Ò&O#È6ÖC½P×_~a`2këwÂÛŠ>’_˜>™sž¢Š¤{§$ª(ªS«Ñª‘©p¤o¤É¬“¸!Á÷ÆdÄÀ¼ø¶®¡§…¦Ñ¤"¡Q¦2Ÿ†,_h$—Û•µœê•´Šñæn1IÖˆ<Š›O‡®²Ë46¤âµþ«ftöQÿRQhR³SUSARtOÕOQ?PPPP3PKQXPjOëPæN–G~˜‰Ñ¡wÁ—¾“´’i@aãer`ù[aX™Z]¢]A\]7_ka,a¾g8lÕnJv³šŒ•ªZ‡W´Yî[[…]j^ó\è\õ_£a³_p_å^C]cm'`mcbôeAdâjh…eyaÛcidfiÞo¾o«gifnfe«`æ` _„_]6Z]' <*GPOh]S£Y’l{‚…\ŒU“#™ šƒŸE£¦ª¼ªùª€­ö­m©c¨$«ú±Ü¸{¾ƵÌ]ɆÄu·Š­Ô° ¬Q§©Ð¤3¡qž;d’ˆo4‰a§[ÈÁ•Àro]c/Ahq)`DBà}ßÿÎ|ıV§®œml*LENQ SsSQDQßQwPMO;M“OiPPÂOQQÒQSLdÖ휫OÂǺn_ág1e}\ÝZwYÖ[­`E^÷[á`@cQdvcËcŒ_cx+š:pkQÌY¯[‹\[\©_^s_¤bocidxaÕ`ú]§a×hÐa0aÊfiluddbáfcfhwÙz§rüZ…µmódõfbðh•eÂc ^Í^øe—:p P#4ÄHå]|_¦Nò_öm¢x†ÈûX—X›QžÉ¢;§÷ªÎªÝ¬Ö¯ ±®¯Þ¬*«°´,¶¹¶Ð¹k·.Åʆ½^¶ü¾§ÁÅ·¯§Ë£×¤N£0aë‡,†‰£Å"ÌB…­lYX5Ä+n'aº>'ɉ óT6ª?­}¢T—þuÉNO¶PIQ©SSÖQOMPNŸOSPQ¾Q&N¬Q NÜo°Šëxh”嘡¶ŒÆôÇrÄ,‰ZÎf`«[{\cZÃ[v_}]w^_bbcèbpfLc„acml•cöV8ZËZ·\þ\Ñ_…aö`åa2cb`ÂbÝa˜`l_ÊbXc˜gdts£!™a}ÊkxcÙy6Ž>‡˜¡`ª‚h^czeº8wQa“^s_0bg_P d?ÄS°J@PS_ mv„™‹Ù“o™F› @¦¨Â©OªÒ­ú±ò¶+´?®ª&¹¹óµ7³s©\®Ô±v´ïÌÝÒÐá¼ ª>¤ö¤ˆÉ´Úª÷­½·>®Å°±¦®B¤v™lˆÿcÎ,Cï‹!Ù‡+´‘±ï§ê›“¹‡‰PRQtS…QñP¿Q‚ROMøOP€OjP¯OŸPþRsbAбŒŽ‚¦œ›²‰ÆÆÌPÈ^ª&`Êa-\[uYéXÒ[V]ôYW\^_Ô`Ö_ƒc±g6cÇakaí^R…*ˆ1T§ZˆY¤[O]â`D`Fb›a]c?a™aCaM_›a&cÇeXdnzñ¯DÃÕÅs¨Brgƒ¼¡Ö¦(¸îµ«ØŽÆiFaøkf§DŠèh2_%^n^ílm?Õ Se':4?QóY-nu¯7‰“‘Í–Ÿ›:¡í§­§¬©"²G´¶Õ¶c²Ç®/¨ä·¦¿'µ7®3£¤/ ]¥t¿ÛÖ|Û…ÝíÌÆ¯J¦Ó§»–3ÆŸ½¼ï·°¹p»„¹ ¹·J¶Í²&©õ£'§>{‘c\Ȭ+ª—¥„—ÊŽÁ”|Y:KÌUS5Q)PÅOüO¢N M'N\M‘QÖRS’HtìŠÐ|æ‘¥:¡#°ÆÏÊ'¾:iÙYr\¢XsXnY Y^\[t]€_Æ`²^Âb}g/e·bÉc_aÅ•>_¹Sœ[$\¦]¹]_/cdbºdùdÒalb%cf#fûc…z8Ç"Õ§ÐñÏD²L¢0ÀÕËÊçËØ®r[llb"n-¯˜Ì€chà`_h,] Qéª&42£K¾j9tÞxÁ»Ã¤•œÍ££—§ ¬_¶<¿£Ä7¸}¯ì¯-¦ò²ýË ¼ª§ <˜Û•Ž¢ñºáÕÕÞJÞ¶Ï ±‹®¹®›–˜Åd½è½«¼_½ »*º¶»¹û¸;³;§J˜ŒojDo%"~Šq¬²¤m£x—D"š‘ivDzR S”QÁP$OÂN´MMtM%PõH*SæN2€°°…¡’ô©¨-§ÿÀÑÂZ»ˆ}}ZØW‹W(V¥W#XÐ\6[û[Ê]Š_@`ˆd.gi‚dd`dó[±…#}­RöZKZ/[ì["_—`,a\c·d5c%cÓb1bþc¹iùhÓl ºÙZÒ±ÓwÈv¸˜ÍiÖíØ¾Ù0Ë<ÊgÖd¿~”³u˜w€d×acj#- ÔR!/1xF c¬tn{D…9‹‹’å™9˜ê¢F£]¥¸±Ø»1Å4ɽÁ³¯0¦é®èÅÏ¢²&œ,”Þ–y¤½ ÔÛ(ÝÎȵ±¥üœf”Ç(¾oÀ²½ø½¸½q¼‰»ß½ º½µ¹§)‘‰beM/G¦¦„ª.¡œð–H­“A‡—C’JÙSQØQ\PpNsJ–P¤bìO;åcð_Ý:Ûy‰opDB ˜¡—#« ºšÃÅ·×­ ©Y˜nhÅW¾TÈUBYS[Ì]ª\[_,a’bldÜpêuv–hT_ÁhÅ÷[[TãZzZÙ[ë]i_/and™fc‹bjdb”eFlÆgLyºËÒÔØcÖÕaÇÌh×ÚØŒÒ2›"f»iÕšª_’ ˆ8rÍiµaaön%M& ø"K5D„`Šy‚„á†0ŒÓ“ã–4›“¢£ªõµáÆFËâÌ×Ç(¶É«¥ªi±Ú§b©#Êk˜¹Ž,™É¤Â³—Æ ÒxÁ¯“¯uoƒÙ“ Ǩ¾KÁ[¿=¾Ä¾·¼Q»ºÔ·”®Ùž‰mo\X,FÙ+•l ®é¤òr”ÑoŠ=ˆš¥dBAÖSœQkOîSGIZ~…}\Su¹{Ãx1|Í€·€›v÷~¯s\"£D´9·¡›Ø·³«!–:[MÅUWŒ[Î]”]œ\7]L_`àcmï„(’5r˜c)\Œ€JbAPZXÔX±[‡\2`~awc5ec(`íajbdEjkb„+µ(ÇÈØØÌîÆ¥ÂFÍßÓÔÓÊ]f¤w·{>{:w-s¼j4f\`«bÉh6[F y4ËG1Xr£…OŠþ‘.’ΔoœžÛ¥·©¶üȘÎïÐJÏ»_©ª©»­'²ó—ñ¯u¸‘—É–{žgªÐ£¸t N_žwÚ‹,œ]’?ÊÀ¯Â+Às¿Á¾E½º,·ó³¦s•adCO<Ì(;€$¯ ¢ó›Ð“æ!ƒ‰ðª½‘ÜBxLðQÁP»JUožI®È}”|A–|PH–‹¿Óœ‡ž’~±‡®°ë¸Ø©P¨U™¸¿éº›Ò“ l™OÍU—Yq]½]¦\•^Æ_r`êe@ivw{Žr~Ÿfà\Äi^oíPaYYRNæNÅ™¸±"ž—Ç{i9‘˜›UŽÛ…H†9›|¤zM{ú¯4ªÅ¤T¼r³N­ù¬è£Y®*ºñiLÆY¶\‹\c\Ú_­a.`ég6r÷{V’_ q‹a\êkÒW&V“X,Zº]¶_`}db·b8b‡dƈµ¨~¢¸‘†&…D‰¥Ž šO¢‹ ¤¤. A¦Z­“¦ £þ®‚¨l©•©¥¦ª¯Ù²±O´§¹©ôUTYW[~]¯_÷bee–i¿q¿‡ÓËÐH®ìp×c `z`ÛRUYpY„X¨\]š_'bt_S]õb__|aŠiåx<‡A“Ñ”Ž’–…cy©xyJt)sUr{nti}èf=]Ù^fŸq8‰ix1_Nb%v#z{PiUƒ44Lí\«fUy†)ŽYZšy›ý§Ü»0Î×0ؾÙîÑñÀ*©é§K¡|¡ª—ƒeU¯XûQDVr|Øžš£" “œ™fŸé¤[•ÛË¿ÓÀ¼ÁÈÁ¾›¸´ªn‘™^b0¼æ¿ý »]Þ°Ž¦¸Ÿ›>•˜» á¡”ŸšŸÄ«Ë¯ope‘£:”n†©ŒàŽo‹¼•sŸž¤ƒ§,§­O°i¹Ë¼²1°y²ÿµÂ·K²:·ºÎ¼Gµs¶®¼©gSëZj]H^%b˜Fž¡M•È”¼X¾S¿ýÁ̽^®–[À"_ çè0äîu˱¤~™á’¤“P„žÅœÒœa XªŽ³í£è´”µŽã “«–x™¤žLͦߩAª®e±•¹û»Ö³‘´\³l¸zÀ|ÁÀ޼C½Ú¹v·.ÆxtŠRT^Ãc a8cqfrjT‰à Öç܃ԆšÐi’`u[¼X¾SaU$Z?YÙ[¨]·]¦`Œ`…a`%b"dfg{ou:q»nCvhzBsýpPl/högie›kã_^E^Ã]1c¼¨ÆÞänš?^̈ˆÈSEÑ$4ïK[wh~v‹CŽÁ–šžsžkžæªŒ»ÌÖÕoÙ¦×ÐÏú·n â¢X¥ä¨‹’_ U2pÕ²;ÐñØâåz±¾}‘‘™†œ6¢Qnƒ”˜H˜Ó”\Œß‚jõ<—­ P5òI!ÓˆªCžy–ŠÁ”›¢< òFž¬£Dªº³™žÛ„šß˜ý”²‘ç‘¥˜õžèžG¥×­$¯Ç­¨®­³0¹•ºq°`°—´o¿íÐoØ+ÑýÅÈ¿¼“¹YÆ_q~Qiajd‘bÄaòcÚsŒº¿ÕÝ*ØÝ®´ra5`pWMS/U:Z XÊ[]J\†]m_=`ábWb/bÔc‚hånžmêl¢q­rákQhÜf/c·bËhÝg>\_%^'^>q ·Ù©æK·#g“Ä`T® „0L|_§dö}OŒÚ –Zž úªƒµëÀKшÙٹйê¥ð q£\¨;sùY³‡ñÃ;ÖàÝÓþ›ç•‰l•y›~œÁ£ŒODp)nepÑsu#|Èg‡Ž%“V… `3ÿ¢‹/’*£‘œ­›ˆ“’“£šžš›° #¥$©ð²>’o…–“G›š–Ê”'”ê˜b¡"£È«»±$°Æ¬6³÷¸!¹·.²6°ì¶Æ–ÙÜöÑwÅÑÀ‹¼Œ¼„¾ŸgV cÊf$cGd‡aÐtO“ѰéѶ܇ܗ¾0ØaÁ^ÓXøRmSEXå[ÐZl\b\é]$\à^a c;d¢fPfìhÞi^llk•ifTeùc|c]bÎgÍ[X]Ó_[S`©…ÈÚ7ÝŲ˜r Œ‡“Mˆe/2AÁVUcötE† -ŽØ”¯Z¥?«Q¯§°Ū×7ÛJÒé¼{­rš}¨ž>]Í–²¾ÿÒãߘÆw"c¾z,%™s›øŸ­¥bk„Ð}=|q{y‘Ý’!–¶”“ye8.7d“û¢Â¡|›€‡ ’ø˜šŽ”£ž]¢€©Ó®5Œ~AŒu¡Áœ””®™sŸò¨¥®s­Ö®ë­±»Û¾½Ø»y²;²›¶Ä Ö€Ø6ÊúÂè¾q¹;¼¦µ£]8ZœcádjbJdc»n”‹.°qÍÚÞŸÏ?e·_ïVîRkT†YT\[zYH]¨Z}[²`anacÄgEf¢ik=jzf›efKcíddáh®__\ç`L]\ºcü— ÏڅѦ©)nï~Ôx•™ö£º¥YfEЦyí}>y÷‚,†·Œ•”ÑKvä2hZ'+Ž¿›™é•óŒ#ލ‘.”NšüŸn¤8¨8‡{ÈŠ8£.¡ü—•U™œž˜£Ä­ë³¯ªÞµÁúÁÁ&º®²Ë±ª·ÇÂÊÎǬ½K¾1ºý·/¼±FI(WÐp§{à€áˆoâšýžÐ¥¦µµìÎÈÕcÔ)É¿­y€‰¿>ͣزÍCdä_zw“Œ×7•2M¡Ä¥“ò¡q“U?ŽD“Y”°Î”C—a—ŸœÙŸ1‰×{è…Þš¨˜ž)™Ôœv¡#¥`¬Ò°&¯P¼lÀ´¿?¾îº®Ã­Ëµ`¾g»èº·»L½B¹ï·$ºY¶Ôd«TbF_ø`¢b=bFjI|u¢eÂîÑýÖ1Ø’³¦pÂcÉ\¦R5QÏWVýWSYXÖY¡Z_]Ç]¥^bAfÕf h8jêjTgyii¾gÿgÒa‹\Q`“d _p]F^î…½ÆæÕýÒì¸JuÐeÂf~`Áx421BIFÃOagWuÎw§}¹ƒ †/“¶¥¡Ž¸åÎ9Ï<ÐLÄK½˜!‚O±}ÊåÔŠÖHnÔNon¥xU…5Š(‹£–þŸ( ¶¥VZ§{¡Ä3žWxv@~â„g‰¥ŠÔy[:w ³Ñh}8«•\‰ç–'𦑯Šä’‘‘•m“”þV$ƒ¥Ž÷£G¢­œ›·¢¦z­/«k³»S¿‡¾0½y¹w¯·­P²ä´¶¸¹1¼&»ã¹v·û¹¾óz~O_ì`™a³_Å_öht“'´Ä̫̌¯‡vÓgebÞX.MlLœXZ[ÄZÒXzXWÐZÚ]Ÿ_£`gf¦föf:i½jj¡j:gna‚^¤_¸b†d·bœ_ÔbPr¥ËËÎL±‡éipaËeµNr €D=2S>vDÛLËa kq1uñ}…‰‹—ž‰›F°ÊÈ$ÉùÄýÂί`‚¢WÁ¦ÌVܘ˜‚=W^Ñm…xø$‡‹“˜œÔ¡†¤¿UbeZ¶NŸJàGyV¼Y WFW{S\U×[C],`âdÒcÊdf)fVeåcÇar_!^å_ÑbÿcÕb~b6xÀŸkÂÉW¨k~ƒmôcì^@eœ6 ÜDZ1Ë>•D-E‰SÏ^ kéq™|ÙÆò’’$¥¶þÃ9À·¬ ŠX·ÌÍNÐ1×)^z7ÅMmRe‘vž€~ŠÃ“Ș]žî¢(UÌZ»Z¼q±—Ç«¦‡%k…t0wn¤RÌ ( €î(ŠQþ†S)†ŠiŠü‹ˆ2‚ÿ=~)~{S‚{Žy‡Œ˜­›ðš6—𜟣Á«~®’°¯°„±-µ¶µ³ž°ê³Äµš¸=ºÖº-º^º•¸>·X¿(˜{L³Zc^»^¨_‚`æc2jv£¡x‰~Á‰™†Æxl¼gäbIY¥VXDýE-PÝOÙLöN¿[¤Vò[añ`µa b~ahaR`§`¥bß`ý`Ýaƒaúc0a:nå¢NÃÍÒºŒorLi+`ê\'_þ"k 2·&x2Ö]mT3T¥¢`+J4ç88Ø6¾;UEÍ>d@ÿ90Faqqå=Â9AK¯jN¤Ñž"¨ÍÌ!ÓŠÔ½ÔRÐG̹ώ×yÁü‹mZ¼‹ICœÀ »)ÛKŒNœGQB6E907*2¦,m± £ ª go66• ‡†ˆ ƒ¾|Ùx{nS`JÒ8y&vnm˜Ò󌨓¥”––˜¾ž‹¤¸«”¯k®¯v¯½²8¶·¤·[¸o¸‡»p»Å¹¥»óº%»²¸D¾•˜½F¯U¶Z¡]ý^Æ^z]dbâdälFrårõwbw¾x¿p–m dæne®–= ì lª`½iÈd³YµÛgÿGU]V_[_] \V`ðaf`­ebcôdìc8bxv!ŸÄ³ŸÀ ·×–ip¯džbë] `¹@(LPŒ 5%c(Ø,£+0à*06 Ð;ÕŽ„«¥®x×R–„·¶zŪ#ÁoÏ-ÒqÒtÏŒÍoÍ#¾e±“΄ßí¶AzÕ„`‰\–øe'£-1Ô,È t…#Ó² Úr Ný¡(±l¾pæg‹RJ_åˆ'€écyOA4y* $Í\u›™*‘¦x–•–Y—+™ –)™q £§ªÊ«¬º°s³¸[¹ˆ¾ÝÅ€À´¼—º(¸2»~¹;º·Ò½e•BJVKX¿\ª[å\Ä\Ö_Za§gBg{jym™r†un n-l/v5}ÎÅ{J{ ‘ŒÁ¢Ç&Ù͛£BVRÝU­\Á_p_Ú`ãa_Î`&a°b›e÷nŽ’·ª¾û¸_–^v¥kWeÊ`X]5b:!CJašj ýv¯Ü ž#¡Fí‡;̱‚ÃÝÂi¬*›6£‡®ù¥¢»S·½Í@Í™ÎðÕ Ï£ÌoÎjÊÞÈkÒ«Ó/Þ°±îs … “–y1$ߦO7b L Ö ¢RƒLÇcTÅ;•"êØ"”e#}bPfA•7J6U/‹($„—h°¦—DšV™™R˜“œë¢-¤¾¦4¦j«%®þ°WºL¿¶ÃqÅý¿—¼Þ¹°¹à»n»(¸5µ¸¼N‰”BTPVà[È\“]Y^„`Oa(bYc8e“hŒl.o‹l¸mÂk*eˆY™akeFh˜z{ªàÆDÂR¼3Ç©UÏQ²[¦_*bËbuccb^c†d%cékƒs9³®¥¼Œ¥“€)pcíaÇ]]mZŠyz±U_›Z)Þ1ŒxŒ€è>Á àºBºQº˜©º·Þ¼'3­¡´© ËÐÎ7Ì2ÓõËÇoÄæÆTЃÖËÕ'ÔØúˆv‹’¬ ì c  T  ô . Så2`^ny@·+‘'G$%KÃi]CV$D4‡234â*Ã2½’䙈‘e8”˜&•‘—뙊› ½£µ¥Ì¥Hª®®A¯Ö´ ¼#Ä0Ák¼ö¼†¹•¼}¼ŸºËºÍµñ»~8<ŸOÌUvXŒYàYÂZ ^ `iaìbfdg†kÎlÇn0miæjÐaNL©Xñe8ˆ¾°Ê3µ‚Ó¢yD>W¾[ñbáaÆbb9aôcmjXj)qN‚5ŠÚ/š"”‰‚¨ocm`Ë]´^^fV˜³¯0…3Óá H  < ÿ ß\«´¸´P¸·¶Ìºý½W½·F·ªú¨dÐÇuƵ̖Å$ÅÜ¿æÉæÕyÕ”ÖÐӚݟªif‡MŒ¼IÛD},~*sƒu»G “©ˆrP«3>1ƒ1,X(¦A¬f“e–XÐGŽ5ï3å/¶0C(Æ>\›.œt”ÓŒ•˜—s•Ó—™š2¡¥3§½¨«Â­m³›µ†º"ÃÀa¼3¼»¼¾,½:»L»j¶³»s @ÐQ¼UrX·X V;Wý[Ä`žaâbÀc:fŠnIrµo kkjéhËlRo P‚X;jv¬íÍ#»ÃƧÏGÈUnX´^`1b|aa‘e³h¢jlt͆!‰öˆÊ…ûƒ4t jbµbó`â^ºd֘ͻä:Ëö  è­ Ú  y„ XLŠö±î´Æµµ·T¾ãÃ\ÉË’Æ©¼!»LÅÊÈ%Ì?ÏKÑ&ÑŠÒ€ÒÔÓ˜Õ+ÕñÓºÚí¶h„ Œxö˜´ˆ yCX'/qÁ{`¤hxìF9.î+œ0¡/Ô+&;gd?iã_Kœ7k/1.ç,$œAº›Ü›è•zŽ3’×”X–€˜žS£)¢¹¨­¤¥§ô­í´¸rºö¼ó½§½½V»÷¾À ½Ç¼h´Ä¹,hDtQ1Q®TÝVÂXQZ¶^š^é`g_walaÝi§p%läl3mËmmjqlð^¥U_{`{™ÊÆ{Çÿ¾ÂÐÌ`2HyVZY’[{\^ç`Fb€d°f lBuñu)sof c¹cbeDa%`v:©zÆÍNŽ  w Å " ÿ  “…'²œè°C²E³Ì·ñÀlÆÈÅÉšÊÓÉ«ÈÈ˲ÏbÐêÓãÔÂÕÔÔ ÔêÕ6ÔëÜV³›`¥zÄ€Zt“‹Š¿Œ ƒIeÞ;p}~›’rU„@‚6M0‚.<)j'YQøl…\HJø=‰4é.k1C0(/ˆ"qU…¡cššœp”y‘þ–Ù–—˜˜—™Î Ð¢Ð¤4¥©ð°rµã¹I»ù»€¾R¼÷¼5¼Ó¾÷¿c¿¾ÿµ´ZCNÙRžQBRTfWôZÖ\ ]Î_[_aJc”eòg‰ll jÅjif°\LW•‚Ã|‡ˆÈ¼Êà¶ب”<O¾S¿VÍYe]\?]cb1b™ef~b-afaxaüa/j|l4iáAíþuäŠ8te Ü @ }Ù  “ \4%¢Ü«'¯²]µÎ¾dÅÈÈȬÈúÆÆ:É~ͧÐ+ÑFÔÖÛØ<ØAÖ•ÕÐÕïÓÅÞ—ªòW¢xœ~áy2Þ”™£„±r—aÝ…‹‹6ù4[8)4Ð1n2•1é,ã,)‹`¢ó›¤¢Š§Ÿú—‘“n” •B•t˜òœªÿ£±­~±µ?ºÔ¼e¼ˆ¿<¼¸»Œ»z½Œ¿¼-¹{µô¦ÈF9?µEPIML]N¾RDX…Y+[«_`ccbÍd'e3dÓeÕe]Û[fkunnTvÜx$jyÓ'µtЧrÔÆŽ¼8 K0N¢Q=S2Z`Mg,rŠnÇiÕnmoa TQ8ZNZ‘# °+^‹‹zš—j’B†k³UX6IFä s6ož{¡É¥7§«ªò³õº—½¼|¾ãÁxÂìÄâÊ=ÎÏRÒ·Ô´Õô×LÖ@ÖªÕUÓrào·;f3pÃ{Þš©˜X„¼^b€üƒãoZ_XQÌBó:W7±4‡6F9>DJB€7Í3S6œ4ú64n/>1P'64ä•Τb¤v¤Ñ¤tž×žÝ™©”À’”ª˜Í›Žžq§K­z®¨´]º_º>¼s¼¯»»1¼'½»¹z¹°¶¤#>…;ŒC?D_G€MM˜UŽY£ed\v\8^B`-a-aÉ^ŽPöVwqz‡Üa¤Œ‡#‰ ŒNƒþªuÒ­¬|ĺ?@wFƒGRFjTÓdbqø„Éf{ä‰ç•óªK®Ÿ–WrðRºƒ Y%ð`e–z)  ¢)Ÿ'  šF޵|D\ê!‹tÙ$¯’_›ç¢Ü¤0¦V±·­»L»N½íÀÀÂÄsÈ-ÌÎ ÒnÔ8ÕhÖÖ+ÖÎÖÖÖ<ÛœQž5Ðeen{D›’„_xІÆw1f‡RF%=ˆ7±7H5y6¥8<>Ž; 7&7:5g3_3«3-00ï%?Aa›Æ¦©ª££ûŸ¸Ÿ­žùŸâq™fšz£ž"§<¬+¯´^¸´º[½¸»0º¬½¡À,½u¹°ºK¹’·éÄ7û<@kBvFïJmIyLRÝYôW½X XŒW?V„L;ªE8iž„þ‰”œç¢"¡±‡l•%ާ£åÍb» ´øÔÌlDL?ýIw[yn¢1vgQi~!•ƒšžA¥e­ š×A† G-¨xA™ ˜÷œ­ ;£(¥ à—ëŽW†Î[WÄa‘œ"žá î¢©x±q¶”¹)º+¼J½ÀóÃùŅʘÏ÷ÓˆÕXÖ'Ö0ÖzÕ’ÚÉ*/¿HÂXƒoŒâ\$u/…:~6h\R¤Aþ:5Ò848,:µ8‘8‚<…=•8&5æ5S1ß2a/Ï4 0Ú,Ü#MÑšâ¢ý©#¨ˆ¢ûŸcŸ{ `žöLž™ù¼¡l¨d¬¶°‰¶Œ¸ºs¼G¼Y¾g¿#¾Ó¼¥¼&½¶·L¹z•ó-à8Õ=#AzA^AC¿EsG¿HýHGDzBóF= 4ÀBèk„~äéŒO˜â ±§æ²(€Ï‰è…™ËÇÄhªýÖx¤yJØOÌ[ïd`wÃyÎ\×_k;ŠÉŸ˜Å™iN¥n°G³‚v¬C's’®œ3Ÿ¶Ÿ‰¥¥8¢¢ŸCšàŒ¤zSGÆwƒ-•þ—ˆšD  ¦´«*°k³sµ¶¸»8¼ØÀ ÂÇÅñÌàчÔ|Ô?Õ~ÕÒ“Þ£T9Ž1µkˆp]töv y~nT"?¼691C,è3L455036”:|:c87¬5~6<6Ø3¾2 11Äe'žõ £¨§È£%¡6Ÿ` g u›Íœ3ž³Ÿª¤2«­µ²[·Â¶jºh½Q»™¾X½<»´½I»º¿I²¼½Ô‚ ¯.ƒ1ë622¥63Ã0+Ö(Â.%}h~jTiG¥@M6o2Ò10-é0n0õ1ª4B6>9 7j3£3S2Ã2d1,0×2†1Ü,¡H¶š<£¬©Ç¨p¢WžY }¡ŸžŸ‰¡-¤ì©®?±4³½·‰º¹¾½º¼(ºo¼b¿Àù¾x½°µI´ŠLs0ë74ƒ1Q4`RerÑ{ž€îƒ}šnV×GÅbT•.‘ó‚°‡¦€<Õ³ç·Âh“à}j’Ãz!“]³–¿¤º@ÈÛÍéd¨G¢‡Í‚ÒHãZõj¥s§»‡n‰‡™‡¤l¦®a¶7¶÷´Q­g²i«­šÓ£M§t±q¾ÿÉÏϘ¤}— {9/y kK¶pçx‚‹‘´”•þ—´›xŸ÷¡b¥q¥G¨Ò¯¯´òµj´,¯Ü¦K¥¦»¸ÄùW"LyIcîs£_©NFøAÝ:ÿ54:1Ð3ë4ü4Ô4I48(5Q5Ì2Ó1Ÿ4{1é/¿1è1%$ÄZ6œí£Êª”¥'¤¾¡…žB¡¿¢;Ÿ«¡¤k¦&©”®k¯Xµ¹¹¼+º3¿º½¯¼þ¼C½=¿ÑÀæ¿”ºÃ³f¢d?¹;ŒA5Cîk~}†ÑˆïŒö0Ž?&’î}”eâ[Ç^+˜t)ËB8„,£b¯¥¾"Ýu•Œ}Y†N¦!ÅX½†Å4Úr’ê]»¦À±e¼Pwp#x„E…ï‘ç›V¤W®C´vµ´´æ­u¥×ŸW¡Î¦5¥Ø¬p´¬ÈæÑ­ÑLÏæÀÀŸ’‹WNÐ à/:`âiÕyˆŒì¡‘ “Ï—G–q•Γ—“˜ÊšÞ›™Ÿ‘¹’Ò£´Ç§bkK_M„T@Iea™yhûWìMÑG>R3 5.4R1Ó4î4\4d8X6Â5ì67­754Å2‘3œ2'1¯2Ä%ksŸ˜¥•«`§Í¤ |ŸÓ¢å¡ú¡S¤¥µ¨ö¬Ý®Ž³­·ºµ¼¿¹ëÀR¾è¼*¼Ò¿ýÁ²ÁøÁ)»*µØŽg5œ:Ê5¯Jú}Þ‹4‰D‘”¿“+•,•²ž—“Œ¥ƒ@nþI¡Uk`G~ƒSz…öœª!Дܒs(§Ã7ô¼“Ób­¢ë tGÔæfÅe䂞‹©’žªÃ¨È™þK‚™„‘‘³–|”é—_ŸÅ¶­ÉëÑÄÖyÔÔ7¶ ‘»h½TG…f#r±€„†Z†¥‰Ÿ‹ïˆý‚©|]z)|Í{Oic¸wlš¸¡šënrRwV}QŽS%J¢XWnbGVãP DË:–7Ê6´887å6L4M5—6ú8t8¿7”7«8ñ7ø6w7“5{5~4¿%„ny¥(ªŸ§ù¥ £X£x¢x¡A¢c¥ý¦üª.®‚°%´î¸ç»j»<ºÊÀ…¾h¼0¼Š¾™Á6ÁZÁE¸—®•l *Î4ŸH™~‰ ·œ¨î›tš­œ‘DšJšÌ›p›iR7‘9›(OZÍ^lG7@f]™ŽÒ™r€‹ž¡¶µqËlÃnÏðÅÕ±4œX@_#£p‰)cL~ô”…šÍ–ºuÛ^Z^]€hoƒ™Ù—•÷AŽø”7®‘Ò_ÙŠÖŠØÂÃÙ›Q|…m 2ñZgiêxº{ z0vqy,{›s¡k#hÐjZgVËL^d¡Ž‚Ãség¢Q„PèQðP°TIåTZcpUÖL`Ev>¢:»9Q7@7]: 8 6>9z9Æ8c<}89=Ý@&<ú:37±6U1f'xs€™Û©¤¨S¦Ã¥"¢J¢¢v¢Î¤;¦³ªvª—®;°ð³Z¸e»Sº-¹Á¿¾ú½¼q½×ÁÎÀÇÀ±¸*ØBÄ63qà‡ªŒðÒ“ª(©$¢§Ÿf¤m¥[¢ß N£°øœÙN» kE8$LŒ :$W‚b‡%’úž”’ŸÎ¯™ÊÍÍÁʤ»ôŽ H=‰ÍŸàžµŠÛxzz›X‹òKçCêFÕOàY\lχ†”´—ÑœýSž±›Q—¢rÉÜŸØ¢ÀRœ´‹Å,ˆ!FEW€e ie€gàhId“`ù\¹\ôZNOèL)Z—i;fÛR{FÀQÐO[QSÁ¦Â±c~ú"êêUÁƒMˆw‘”N¡¼¥"¦¨§Ÿªz¦ ¦4©£«Ç³½B½;P“K?QC-$!ŽglVм—)šŠ˜ö™¶©è´T¿7ѽΎÊO¿òÃÛ“Ra¬U’²V£eã€Ì¢¼z3BìKŠUâe˜z †šŒ •šô¤w¡:¥ÊáâÍÂïœp–g8û-ý25QØ[ ]$[`\;[pU¾MöKÝL G˜GU¥WzX,MKE©KìPQV°WÿU…UÙVA¦OKJhI1FC÷CþC)ÿPrMèLH®GÁE†C÷Bv>p7¸5²5P4ô6À<‹> @Œ:ë7ó8ø765×63ð4|´¤¢®§¤ÿ£Ô¢W¢m¡¯¢q¥Û¬$®Š®q¯ì´¶À¹Î»ºº%¼l¾/¼I½,½…¾Á¿œ¿wÄ Œ‹+ž xQ/†u‰ê'”4š— gŸ› G¤Ú§G©l±3µœ°%¥(‰7~+ÁÀ»œšƒ?y­xÑ‘›æž*«šÐœÂ£Ý¶fÀúÏWÎÈÁ ÀcÃÙÅ#pö´p›÷†®rVg¾1çLST_¿k&y=…é™'¥Eª£¬f¬%®|«£¥¦­o·"ŸD}ŽZ4~A‘DÃEHDÁ=×9Z1Z2/HHI1GœH¯LãO&U(W¦WgXÝYX‚Z‡VC:‡NîPWP¼MtJ@HE—EÛAï<²66Ÿ7Û6=GBxB =š8Y5ú4ï5©6¾5Þ6à<£{ÍžLØ£–¤e£ µ¢ê¢z£P¦Å¬c­Ü°§²Ã´-¸ï¼¶¼þ»ß½¾Â»á¼p¼¯¿iÀŒ¿¿‡_Ÿ°ulL†i‘ì–n™L›‰•Eä’n•â—ÍžEŸæ¤?¥ÓŽf0“Ò†—Á·•£]†Z<¯3þ†Y’°°8¦ñ¥Ü¬ì¯F²àË Å~½æ®ŸÁ–ÓBÐy,œb¦r‘w†L„<À–_ŸÉ£¤}ª–°=°Åª¾¥“ª#¡—¸•å9ݵ%,À6=&@þ?²<ƒ8/r0ˆC(D®H#KTFåLiRùQRS¥U?UŠV X¿[?Y%Y‚9LO3KINÚNpI1I[E\E€E¾BÇ;ƒ8§7Õ7ð?‡EpE÷Cß9†77ƒ8a8È9Ú5ë9žƒäž 4¤í¤ý¦¡©¢Æ¤¤÷©Ñ­Ö®Ï±/´`¶A¹%¼l½ ¼g¼Ñ½M¼ß½ ½ãÀwÀÈÀ{³:"k'vzá‘ •畟•B—|ŒÏ‰µŽ(™éžÄ£>¡Î¥!°ž¡õ9ád ¨¶°¬š£1Zå„;¤ §ÜŠž‘¿ŸA¯V²Ÿ¼ñÐ/ÌtÈÙº‰µúˆ+‘B®.­Á©|©÷»h^œHŸlœo°r\|~ ~ò‰ê”ž Ÿð¤3§>§ý«&¯=²wª£ý§€”Šœ-øì€Ñ0c5ª4½4ï3h+=&C=A?C€K KDPQÏUºSÛTZWpV.W¹WQZ\4VÉ5¾O>I`DðL OM¢IŸEÃHÅFACY>"9ü<¥A¨HpE|>S5²5h8¢6Ü7!8…0):…éy£…©¦É¤5£Æ¥ï¥ì¦zª(®°P±Íµ”¹‰»*¼è»;»¼z½ø¼m¾ ½¦¾Ê¿âÀQ˜#•25Ô„n—u—Ι˜™•™4”’)”Q•£››¢¥Ô¨ø®çµ˜¿¢Å^a4+2vâ‰Æš/§³±™”mÚ”ñ­K²)°¯o¹Ä¿ÐÿžÁið~楩/ȸÂL‚ú(€Še¾zö|Ævîu•u©‡S‘Ι5£¥a¦«®z°—¯T¯°¯R­õ©:§äžbw©¥ †›"ê(˜/g18#ñ G4Ú>·@GpIùNÌR‘PBPôR°QSÎR”TÄT“WÈ\áW©48JÈGt>øALNIáFJÌJ I?<ö<>AäKÄF~;¬8ß9S9ü6È6Ì30)xCƒ‰ñœ’§ñ§g¢¢ã¢¤£¤â¥ã¨ë¬¼±k³Í¶©¸Ï» »—º¼¼,¾T¾½½—½q¾Ä¼Á·ïypúÙX9Ž\PŸ1ž` "ž°™—–j––u˜žšªœ?¡ \Ÿr©m¥^`AÎT)e¨sÌq4dŒŽà¼Ï°ÿ¨ò·òÇßǤ´%¢†¥3¾Â˜wL›ˆ¥J¶ z¸k<|à XBµf§bµ_Ãd6y˜“=•¼šD¡m§l«X°±³U¶_·å¶.°Ú¯°§ ¥ºe: o ËäGo!#é7.CþEuK²JFGÙO¥RQÞTS¤RÎT&ThUU7X|ZÆ]6ÍIÑHC;AD¬IKÿIìIÆKmE¤@è;8ï>QGïA¨9€:ì9‡75È1ô0Ï#úO‡:™×«\©!¢?£Î¢÷¤+¤ ¦¸¨‚­Š²‘µœ·u¹º_¹“¹*ºT½“¾|½ç½½a½,·*¦×Z[æ4Ò€;•ZŸù¡±¢o fŸ]–“\––¾–5ÖŒT…g€øqxÕŽ@¤ ¨Ž©§̘zb‰ ÷ Jœ#.|&™–—®µo¼Ï©ª¶‚*¨ªýŽo©mÏ¥+oHøVImÙ~²„*‹)‘–c–˜±ñ¤ª°’¶^½À€¾‘¶^¯„¨U­pg– ” É ûönêæƒIwIIìFŒFzJ>N>PÒRU¼UƒSîTÀVˆUàV Æ S«á÷m¤D\P(L¸J“JHM‘NNPBQðUVUýWVéV(UýTúXNkxœ8jD;=A??}@§CCÇD}Hq>h89i5q1s/6)Î'Üe`oÔ é¬é§á¤¶£C¦¤^£´¨š«³°³ ¶¸ö»GºÜ¹6»ý¾Ô¾v¼#ºæº¸%²ì¡qó1â`TŽs¥0¨]žÞš÷‹Î‘( ‘—:–¢;‘‹àz“€“›‘”=˜S——Ò‘ù²”$—®›2šçš+£±2®‰Lp÷`ÈcìiHo¸£æ“bœÌ£õ˜öœÇúŸIÈ¡H¥V£9žñ t¡F¡ƒ¤¬_¹j°†¿Ǭɤ½¤±â¨õ¬+‡¤ s Ö ö < û  ÷ì5†YTFGG›KÙN2NçN}PMU WLV©VïZZW°YJW¶XG^Å~”–L:ÝDA9­;8õ<…>[<ÔC4CŠEMB­?O=g;Ë8ç9?<8ž4ò2Ï,š. 'z'ù;j¹ £ž­Œ§c¥Ž¤#¤¦¤|¤-©Z­w°±Ÿ·¹€»9ºL¹l»Ð½Ñ¼«»ô¹Õ¸†´P¨¤“S£N"ÜmÎ5¦‚¨ƒUŽÍˆAŽ[‘–0“’¿•f“ÊÈ÷à쓞3ט4–S˜ ˜ô›KŒ›ºœk™dŸ£e¡å«Ð¬€wŒOÈhduKxÔy킾‹×—«œÜ¥£Ÿ÷£÷¥:¤&¡³¥¨&¤R¢µ¤nžb¢¥°?µê¾)ÄÌÅ‘»¡°®ß§+”&˜b ï ½ ] ëí cW]J”FZGcK³O.MôRºPFP[TQ\0Z0[†YLYîZ-\nx’©âµÎ>ZC::ß:0<ž:Î8­>FB®B÷A)@F@a9#;«9Z9U:18š2[/,Ù($ tʧ,­v£¿¢¯££„£¥p§‹¬ï°b²°·²¹¡»¹ü¸ß»»õº÷ºþ¹e·J±í}È8/ ¡1xÙž£r¡Cÿˆ!‰ÖŒ¹‹?“ð”1؉D…Ú†Ú‡S†©Œ§Œ?ŠŽ–Ô–K”’›ž8£  ¢0Ÿ¢•¥š¨g©ñ¥–tW$j~zz7|dž&…ƒ·˜Ÿ/£$£§¡"¨¥‘£ï¥ßª”­”­ðª¢ªì©Å§‚¬ó¹ÛÀ>Â9Ç"»|³i·Ç¨–šn%z ' l "«ÐFFF$@ÞCüHFL…NQ~PgSëSÿTN[’^]Ñ]î\GbÉs¨ZÆîǹ=Cj9ô9«;µ?e;ü:I>b@ÕB*@‘=Ù=¹:³:K9Å7ï6®600L,é)Ä'Ó#ó|©P¦Q¬+¤ÿ¢Ù¤¡õ¥P§Kªà­‚¯µ´^·¸1»™¸©¶Á¹Õ¼0º©¹¸·"²ú¤¤ëiE)5 ´Cï}I«›c—wŒ¤‹‹æ‹eŒžŽ9Œ,Ίð„_„£Œ{‹»1B‰FC“Ô’ƒ’E““š£æœa˜ãš h¨Â¶Ó¹ ®‚¨?Ÿ2mé_Js^wÃ'‡î1•VžB¤6¨3ª«:³XµÁµPºùÁêÅÊįŹ–¬¬Ì®ð½ÁóÂn½c·[¼£¨ÿŸ -â 0  ¸ ‚9þI>¦?A‹EKzOÙOËO‹U T–TsXYw]5[”^îg˜Ž8Ã×ÔÞÔå71E}<{;¶@”<¶8Z4­6]>ÔA>…=œ<>;H9Z7ÿ5€5=3ˆ.Â*ß&¶'‹Š-̇;;§B¨+¢“¢~¤¢Õ¥2§×¬(®z± ´æ¶ç¹zºW·¸·bºIºy¸¶Ø³-«§œØƒcU¸”íQ,|‡â«…=„ZˆÁ‡tŠÕŽ;‰_Šß‹Œ‡¸†»‰P‹¨’Ž0–$—†‘q˜3œ1Z˜ô™³œ¢¤·QÍ”ÒñÊ2½Ö¬´|}_o¾xYƒŠ:ŽÞ›“Y™¢r¦ã¨u­G½PÍÊÔèÕ"Ö~×(×ÓöËÚ¶2­á¯ô»-Áܼj»ê´ô·Ç¨¼2õÑ â 3o+RJ×<5>@ÄBHFßK1Q™UHU²T”S?V|X»Z?^E^'h¹r†©ËÙ“×%:´F»=i=¾A1;ý6x3m'',‰>9>]=Q:a7ä7¬2ã1¹/Ô02.P+$~($>@©ÉަE¨X¤'£u£è¢¿¥¨/¬x­}±çµ…¶²¸æ¹¨¶¶Èºœ¹H·…µc¯ò£X’dsšBÕT¡Y\|IƒÒ‰+…o†¨‹K‰êŠÎ‰‡ˆ-Œ7‰ªˆ¢ˆ ŠŒeŒ¸ŽoŽõ”8–—’“'‘î˜"›Eš—™ ›®Ÿq¥ÑÁºÖYÚ4ÚqÔ¦Êä”caùr}x+€Í†º†¼„LR›fžg£(£ø¦#¹²ÉdÚcÝ®ÛóÛÙÖøÐ%¼p®°µâ¾Œºìµ=±²†¤Õžé6ÙÏp GÓA”?p8Î:Ö>m>£DÚI„QAUÃW.V¨T±=–<05û0Ñ";.©?¡<Ç;G;6R1Õ'¬"Ë#×ß5P}ŽÚL¥…«¤#¢¨¥¥ ¥ñ¨Ý¬t¯/±µ·çº§¹S¶·¸¸¾r·2´þ²,¨¿˜¥‡Odš3ûõ"]Gu}è€tƒùˆ×‹ÍTŠšˆìŒt‰ÕŠò…‡‰™çŒ›Ž•ަb”…˜ð–¦•–—Ø—’Üš<œ¥¡D«F¢Ö{Ú ÚÝØÝ¬æ]æu4|,‚ ƒ¨}M…w‰²“ŜƤ<©•¬á²`ÅÕkÚqÙm×JÔmÎÍŲ1¨j«t±l»‘¸c°0®.­ÊŸªŸä3(­ ÿ4À?½7Þ;Í=Z>sA4G,L RW.X¥WU„VœZ'Yî[sa †+²º¾ìØ^ÛÑÌÄ<œEé<þ;­@Ÿ?A¿0?ÒHCk3ó,ü"qN'U0ô+§$ä$l<R—Z;XjtHp@8W]jˇù”l °©¢‘£†¦¦'©6«´¬‰¬C±ë³è³Þ¶üµO³¥µ.³q¯°­Q¦#˜‰vS,*'/Èasqz€x‰‹\ŠÙˆ{¨‘úްˆîˆ‰«Š¯‡˜‰„‹Ž ‘6’‚–v”n‘:å”k”½˜®›ª‹»¾4Ä=ÌUÒzÕ%ÕT×u¾½kdºucqÞs¾xg"ƒRŠ•Ž˜`ž@¢Ì¬kµo»ÄÂÅBÄÊ»¡­Ï¨zª©$§æ¬3¯­²O®ë®0¦¿¢áå(î d*Å7 5Î;}=áBãHHÞMO S?Y½[£[VXÙW¦\x]bÉiŸŒá»¾Î|Ó‘Ë–˜½=_Eá<š=ö<Ÿ@…FhC*5é/&$ZÎS,EG`ÈY{>D;öQ[ÆAÊÑ €ª‚<Œ‹–è¡ø¥ùŸÑ¢ó¤¬¥ß©(«ù¬­[±æ´Wµ)µã´Ä°È²p³ï¯¯«¢–W…ˆr{Oå(»Ï5_¥vNy´ƒšŠs‹VŒrŽ5#<ŒÀ…؆ý‡Ž‰G‰¾ŠMCEæÚ”“HŒŒ†“P—ÊžO¢@¯?ºº@¼*¸¸½6§ÈÄÍ@¾uNbîlšp“mºuöw@|°‚ ‰¶’¢”’Й¯¥¦{¯3´H±ñ«¨²§q¬Á¨V¤u©«0­Žªi©£¤¤ñ™ §‚Ž-….R/8Ú';­;õ?{> 4¶*厰3VRUp4U;e17J°"Qo "Qˆ|Œ5›ö£¢¨¢¥%§!¥‡¥õ«“®­ú®’³È´Ø´ø³í±‡®Ó¯É²Y­v¤XÓŒ„·oÞLà!]9Ó`WrŸx–€}ŠqNŽ‘»‘ÂÿŽ‚Šm‰ˆˆ‡:‡ ‡TŠ’aœW‰Éƒd‰·’FšWp¥`©°¨ò®«­¼¨>­D·‘¿û¾}º£ŒU`j\nòjÅtÁv,wË~–Š5‹mº‘ ‘V—ušôœ{¥©§¨¶§Ñ¦]§ö¦Ñ£×¨.¦{¨¦x¤ñ¤D¦ðŒšdòl.¾,m.¤2Ê;TB»GëMCN—N&S[XZÝZOY²[aõbŸh¿Šr°<»NÁ¥«Íw[5>ÈAuA.A>¥=<*833 &c!D\ÃU»8¢d(ø_)a4]?[Ä:Š ¿Ø?錃‹#œ¿¢A¦’¤A¥g¥¥^ª­Ì«î­W²»³b³»²Æ®«ç®û°”«»¢a™öŽ„²lËPš!ì‚7U^Gn1sxɂތ‹ó$‘‹¦¹‹H‰cˆöˆGˆŠ^¾ŽâŽC9„U…®’M”©™DÖÿšk¡X¡ç¦<¦´¬´¬ûªø«~‹LfpeÔhsgîp­uVvÁï†¦Š§ŒâŽMD”ñ™Sžƒ¥%©H¦¸¤]¦V¦d¢‚¦~¥Û¥E¢\¢v¡‹¥”.Wh'¨'˜2 4Ò;ˆBçK@KcNxQ…XWZd\õY ZK\:_‘dérâ˜ô³à¹W¹GŒëcŸ[í8^AR?¢AÃ>=ù8Ó4ä+D$Ógøo’7±`4 s«vÁežSUsh~ÿ?kò |Hr•VnŸµ¥T¥ý¤ž§ ¥X§N©î­«®®Ç²ï²³-²)­i¬\¬¼¬Î§ÖŸ,–}Œº=nŸKC!~"8Ì[çklxy>{³„…ò†!Š˜%ŒøŒE‰Uˆþ‡…„¿ˆˆ†N…j‰_‡ë|ñ~æ;’”´–²™Ÿœ2™ÍœÌ¡iŸÅ£,£É¢|ć8l©brfj‘o+yFw|Ö„X„²‰6ŒóŒA;’¿šžð¢™£Î¤.¤«¥ £€ž‚ «£m¤ÃŸÐ¢d¡§dz " y!™()91h:A@@BzH±IyM?T*ZU[^WæX]Z¶]Q_éic|IU±È° œômé^‹Z63 =-<ò=”;ê=°8q8(ËDXö'Š 3,~Ä`˜6Ï1i}/z6‰&®&W˜’w’?£h¦e¨'¨T¥¢¨<ª­®8¯¥±º²²|³&°®¬Îªõ¬u«0¤še’|Z‚ujñG‰ñË6Š\ÅjsÁs–umx¤x†{çƒ(‰D‹È‰ž‰®‹ˆj…5…â…F†–…Jˆi…O{È|j†]%“>‘œ—t™e˜“šy™²š¡›cšÑž°›Æ’ænbg`hÂn­x)y xiiƒÂ‡o†Ý‹“;˜ÐŸã¡Ê¢¡ó ²¡ãŸyšÔšÖŸ££Ó i¢|Ÿe¥=g¢È v"'!+ß48îBICòHcKàNXS}YqZ[XY³XJ[È`ºi'ý£W¨¦œŠ€÷bÉ[»X .ÿ:>9ð6þ2€2é2$}4¼X¶0é ÿ ébqf0#Þ~–mé-rBr7éò*Ñâe=’ž“S¦¢¨”¥Ç§™£}¤cªÜ¬±¬§®±˜°P±Ü³`­“©E§´¬©ˆ¡~š’/Šò€ÞkøEÃC)vS‘hÜnFnsíq#p…s|p }:Ö€šù‡‚9‚Áƒ4Zƒ$†­ƒº|‘y÷~Ÿ‚‰ŒVŽÞ”p–&•““s’Ò“—ߘw–ªˆ\zšqngjújséu„rlv|ŒƒÜƒ„#‰[‹÷’ —qœBŸt¡ÁÉ¢ ¡áŸC›ú™Žž9¡?¢'¢ÓŸ³¤ÉWªPRç&û-5J7S=ã@ÙCøIãPBVÈVªXëY‹X¬ZD^¼aži¶‰y¥J›[—F€÷c\UE.æ7^5é5^/Ë.B+5™aBUL*«’*r4,å‚〕_ b´7ã™:gÒj>“ê•§²ªb¥Ø¦ˆ¥¦¦©z¯L®e¯B°%²L³²"®Ñ¦ß¤½§à§‚žŒ•+w…T}9j%;l\¢KÙføp´pirppÇlÔgLk°qýv| zey3wõxéz\|¸z€vÚy9yå|Õ}m9ƒß‹ú‘~•ˆ—H“P‘ì‘’ŽÑ’i‘²`‰Å{ÍqËjˆiÜjsÜvsrpuÒ~3‚€ƒš‡~‡ïŒÄ‘F”¥–þ™é›éžîž Ÿ™ —òŸ¡Ò¡±š_ /Dª Ù‚¤,-/õ6Å< AøB‰F&K™Q0V UVwWwZ Zû_ž`¦gˆ‡ž Ÿi£ } ^éX;S:SI2?+9ì4î2V*+H«A¨)† ˆêU…„ÏD®H"m5v5|ApLG[/ø· zH “s¦ò©Å§9§}¦À§}«À®Â­Î¯"°²±(¯œ¬„¦Ü¦^©i¦.žy”‹‘j‰ÞƒKnß:VDñ^B^3hèk€n½lYeaMf”fjøs‘v oöqÕo}s|vúu|u‰q}x\z&{å}‘€L‰#Œ·õ–«˜d•@‘¯4‘‰Ã‚°{–tÔqîl wuyLw&t$xÈ€e€A…—ˆ”‹_“’–š• –È˜Ûœœ$œŒ•ø—ÿžu¡"œŠšò–æ)ë% Ø(€-˜6ã;d=ÁC_GJøP7UûVÁVÙW Yê[‰_`¡d_|š“ú›p‹‡dÈZ±V˜R>çNF8>Ò9.=H;»/Í,¦#ÃqœR½uìW @óc®uüvÈ_†[ÿ\H$Þ,åƒÊp˜Å¨1¦¦£ë¤†¤À§Oª™­®­ó°˜°„®ø²£® §Ï©g®Õ«Ì¤öœØ•’tŒª‚bq1;"ÎÃy9>ZOlt"qh7b²`Ì]\`øh–ppþjŒj%k¿k´l”mÛroPrq«z´}Ë€ú…R–”Q“E”À‚‹ñ‹ëø”;“Gq„d~ÖyvÈq%}É€¦}ytûwÙ~þ}W}ß‚¼‡(ˆF•’‘Ä”¥™6ž ™Ù•˚ġ0žüŸŸ,‹äÛ*·4::;X<ÁD%GùIxN¦T­T/VIU¤UyXv`Rešd…z‹’éŠ9ný_{VöQÓQÏ7àA¤>Ž=><ª;µ:†3ç<Æ<<$hJÑJEU3îQæuåz3b{î^îª0á‰|ñ—^§¾¥¸¤<¢…£§;¬¨°®ò°±É±}±ƒ¬×¦§p«ž¨3¤3Ÿà•ɑÌkƒpó1¬z@Š,¸S±egqUpÓqfNe ^ï_cUl(høbÞghåfløpÐpTtDrvowWx¸~…ÇŒ´‘БÁ%Ž ŠÜŠ*ŒŸL’„|;xTtàwÉtùy„yßuswüyŠ|ë˜çƒkˆ‡I‹ŠŽ]‘ñ’Ô’Û—Š™C–W•ݘw™A˜­›Xš‹œ¸~Ð7-ß0“7 : >É?C4I¿KEPS0T'UžT¥XKVÞ]|]ôbÝrð€>rÂc3VòS™P\L%-ó68¦9™7Ÿ7±3a,¢'Õ2.&Œý9Î6ÔA9RÞ`¥usys^‰Íb˜471’Iu•º©¦î¥h¢ë¤'¨¤­Ü¯ç°°°¦±‰®Äª ¢–¥¶¦X¨c¤Ia”×’à†Æpi.'¨vÙ#åHza,np¬oôh³f™^9[ãe‘@'EGkJSNUQtQ’RªR«W X¿Zô^NchÌm¾j€aûYúSNRE+/C3¨5ß6d7ý3ž+§#8,÷4)Ñ,¨8x!äTÊj¬h/{k‡(UlIs™_ÍŒÁŠ•?¨•§Z¦9¥-¤a©d®-¯4°‹°o°9°ü®‡§e¢€¥à¦×¤Ì¢Žž}•À‰‹æ†zg'‰—·8,T˜géoroMo^ivb½iSvt9nreˆ`Ûd;iôpmw¸u8p¥tvzuÊẑ܂qˆ‘ܑ󎥒Ò‘¿ŽrŠ~rmÃn0s[v„|)#|MyxT€Ø}xN‡º‹Œ’?•Ž‹<Œñ’=—$—‹’©•´—À—r™M—Y¥k$ä›"'å3M>YE™B–E¿JpOxPSÁQçQ‘S¥RñWô[¤]º]ƒ_cÖcM`WÑO{H·>)#o,ð/20æ+é,}&ªL'a(·P3ã$K9XLÚ?#R¼`|=Ã,ÑFðeY‘Øü”‚§@¨)¥§ §¦©½°–°¨°í²I²Y²­¯¥¡¸¤¥®¥º¤ÆÓ”·’j‡½bÅ$ŽY<;,hMZádÆqpŠl÷lþf0hÆuÁv–oFcÜ`%c/jctÜ|¼|Êvqqõt–q¶w£}ÖY‰ž‘Ë‹ë‘씑0“0Œ£…ùz(mÎgUf“moòx|/yèz~Ñ~Ž€F~d€ö„(‰¢‹IŽ@Œ×#Š*<•ó•‘4•˜×˜xš’™Þ¦$Z®;v7à!™7;¯CÝBÈAkGLuSdR9R9S5RoQšS#WZš\À]ð_–a`[YPtI­?:Bšº! x÷ó˜#µ²/~HÃBãEûHÈG6<$£ð ßR8›ñ‘8—o©©*§V§3¦úª=® ®¡°´²x³ ²ä®u§w ¡ù£Ø¢C¢œÏ–D”uㆠTZ OÑQÔ }CKO¯W¶hÓrŽr|qRk½iùr¸v0p0a_®d0nÏyå~Ê~x s½m}lòrÒt{ …+‹ ‰÷cŒ±y‘ŒŽ‡ðwÁjõeëhÕmÏn™w |Ú{)}„^ƒ]€„~7‚6„ù†\‰$†/ŠF‰ÿˆ¸‹£‘“‘•˜V™ë™*œ¡N¥tI?r WXÞ5ô=sB DqEnD)K&P0RÚSYTTR!R5U`V¢Y/Z^Yi[k\¼\µUÍOeHÄ?,WËæ% õ ÁØ#T.F=’<^4Á/C&3&¯7‘EíJ*¬0#""`ÜšZB™¥Î¦Ú¥É¥“§…©:¯®ì±ë²³±ä°Q­¦Ü¢#£§?£¡Är˜Ü–nŽé…zKÖB»ÀÅ÷Ï3àH¿JßZ_iÝr!wqHk™sÂyjr¾h\ô`gmv¦~}Üu©uTlHlnärÞy„‚׋ê†ÑŠëøE6‰Ý…Wt™A•W’z{ï8(nQŽª2ý5àH®K©NNanƒytNn˜ti{¢xâkã`ýgàv´{"{@y¦zqìi›npOqøyp€uЇŠh‹yŒ+‡l}¡naa^}cíkþi'gq|r%uuÆ{-{Øxz€ž„(ƒ‡¡Š;‰æŒÃ‹=Š­Ë–ì“Ñ•à™ôŸWO¥¾¢E¢à9ÔaÉ ì. é/£=)EºG¢LRJ‹KRM‘ORïQÂT’UR{U©SŸT1TôS²OäM›F•@ ;³+œ/Z-¬, × pò#Ñ$•$-b(¸4ãOŸ-.J1S BÎ2 /WŽ™¸’ –¥œªL§I¥©°®¯%°n±Ä±'±¿²'¬ç¤^Ÿk¥¤¨ù«hªÔ¢r—Ÿ“yv¸/ÏÏç#0Ø_'5G)K©O¤T"d+tpŸf:h$tmwJk¨a€_ mˆzê}º{Ä~/{op«mÌkƒqèwL}¤„"‹wC‡ë‰Ó„Îvúh•]mZ*`†`,aÈeap*lýhÚhôr=sØuð|G€€þƒ@Šsˆ¦ŽRµŽ(‘˜všy››¾ŸGŸ¤¢Q Ë>ÚÝmZ Rh9ŸD`FÇH›KÏNhOyOO¼QSSRäR±TÅTMSeQnOYNbJnB;Ð9:5á=f@qD™>Q1=âcŽ;9O%¿"#&L0Fic)Ut.¡<‹™ –Õ—û¤Ñ¨¸¨T§>«%­Ö®W°”±«±þ± ¯¬,£ä¡K¥Ù«Y­«g¢?›-–å–[iç&-àš¨ÿ„#¨>µGM†R˜^³kšm g a k\ts¿dK]êjuw|&zj|}zÄpùdÉiHnçy–y}…‰™‡ù‹•ˆÚ{äiÖ]R^ub˜dÊeˆjtnvªs,i–p–t–vø| ~õƒ;‡=„´‡œ‘¯Ž¼r‘—zšišo™PžG¡( ¢UHp•=~( ìG `<§IiJGM8M3O^MNL“NuKéKO´PÿNNNJ…F1By>M:L8D1ÃAaKvNrPK°?- ÐX¶ Ç# E8€+'µ ŠDœE—&¸˜E£¦6¦e¤ý¨õ­×¯)±²±ï±”¯¢¨Á¤©ƒ¬e­h®«»¥ œ»™–º\Uaå¿ £ù„1oCJrS4Y¬fønTfobÛj†m&vDq\$_|kÞy~~ö~Ð}t>kzl3n tDxº~—„`†N“¨ƒ+oóc6_uaJdofžo8væxudmÚp?t qËuz©~þ‚A‚Ál•-²<”™Ë™ ›Ì›.¬ŸƒŸ†ž¥ ÞN²¡G´$,s¬ 1>€IMÐR+OÇN”M•NZNLŸLÔMñK|IøE‰C™> <,=e:‘9®0¯HÞMdK [ZTöIF@°9$qÉÍ4¬žp\Ú"L%*óa`Þ¡2˜Ë™å¡ £=¢˜¦«è­à®©±ù²*°ä° ­¡¦ø¡Éª»±¯®‰­U¬¨¦ÛŸë›1“bMHßÈX|Ý©8(ï?2KÍYZ"iŸtïjXaa jñueuCf0X·cœmýx={&}W|rIp…lUir`{;€„‚TЉ’s‹8z¥m)eV`­\ff=qF{>—C/A[>U=1bGÄLpY@m@hXçJHñD¡3Òz´;_ª?"7%Ñ# ǘt"¡?˜JŽZ˜´¡n Ö ®¦-­y®ß®t²V³Â´µ¡·Ä°Á§m±î´c±¯t«3£ÓÀžrŽU<ÕºÞ ^VÅÙì½#K;EBÀR´\cænöo®eše4oavhr1mæ`ä\Þf•q1{X|ù€wÚrŸi(aìjdu`|Ø„‡Š©Œù±…Jxñg¤dÃ]ñ^ýf–n½w‘x£{ÀڃЃF‚Î}—€ê†ò†ÔˆÔˆíŒT’™‘à•šÍ˜Õ™*žþœ œžäBÜmðþ*êA¸9â*µ º UC,üCwL§MfK®JëH$Dw@;$:N<=ø>ºF•DôJ ^/`TcÚgÊmák mÄu8r+°Ñ R q ¥ ^Î…!»*Ô3·5œ6¸9œ:â;ˆ<1;þ?AøB€@ 9#Jô_ÝS£JGí>y=¤>:7b>H=2A ö Ñ{lLü[$¡žhžfq›¼Ÿœ£È£9¦‹« ¯¯²Q±‡°Ì¯Øª|¥%¨Ë±û²Ç°Œ¯ô­7¦©žÃ ik§ü ë ”MžÄà‘ž`.%C=H\Jd)jdÆg1kMo*tqy¤n²ZVTZ£g_q wmsXz×p dÍa±i\j`u}ì„ã†r†J…ºoÎ^›^îfûf‹frlrêrÿwþ¢†§„ƒ‹‡Íˆ«‡ÿ†þ‰ùŠ}Ž€&­“IšÕŸÈ¡à™b˜Àvœ—œý.}Tr[$ÝD?WhOÎH 4 H ¬ ýí>Y-]6Ó79µBƒ=?&=ù=ñ=N;æ<6A!BZÉtçjàbQ`ZTTÑMx=Ž2…."-‹&¥l Êã& £ý¿ œ2ºÝœöU?œ¹ ­£H¥>¨\©°­ç®y°í±%±¬®Õª¥¥c­ú±Ù±N²m¯l¨w¡e0OIéƒÌm“WÛ¸Î%L+!BÓD8SÝ`ihfÄeæl lyq1y]n[,TêZ•cÜow{v®{Ôuxjg‹_õfqp÷}σ¯‚Ü*xþha\ÁY¨`EiXfej7rcoŸy|š€ñ€÷„¥…n‰òŠEŠïŽsØ“ ò“v”À• žH¢[£éšÀŸ:žÜO•# dJ ;HZ3¦PMNŸƒ.?[ï  °V½$‘/Q:o>Q:¢?¿@@2E@>ÿ>¸?O=®@D5>¯?½BÒ@<@í?Ó>À@E;$<¥=U9~[Úz˜oªp%k ibbê`B^R[;Z»YŒ^\b[$WAUUP‡L?Ws sŸÞ˜Œ^œ†Ÿì¡¢£h§<©z«²¬Â¯V°Ð±G¯µªÑ©¬ °.´õ³ ¯_®¹©?¦Ðqv+ììû15•_±M}'ý@{E¼PƒU•^êcŽ^b1piuˆo{`ãU…XˆTj]Ic§o¢{yvFmHe¡hfjÇqùyÞ}§z§wÑu¶^ëRãUßX†^Ïh6o!pÔuÃz\€þùևɋNŠ|‘JŽÑã‘Â’ ’r’ˆ“’—M¡} —žôšùšP–‰ž¼v#  æ  ¶é…%R,wv }Z—(00¾4õ;Ú@ÕDjEãE'FnC¼Aö@i@>Ð;±\}_]Xìh¶re{"ycqÎk9cfHhÿqñw…|G|{[vLaËQÿUÉZY”eEnLnWrº{­|P~Ä…-……ˆF†ž‹Š”ˆ¼ˆ‘¡”)’Ñ –,šÕœ9› ™[“ ¢?`MÊ P ž Ý  Kƒ bÏö¬ð¢*õ4r:„>%B HõK/IaGyE CŽA~<¡<²:Ž=k=~$©ƒž·œš˜ö~†r€®w[sh9gÎ_ú[bX\V|TSJR†H`O!Ž&Ÿ~ž%‡i‘Ð,œ‚£:£$¥O«?­m¯¼°W°ã°”®Ñ«€«/°B³µì³±q­÷§¾Ž°2± kùlb´~ý`ƒ|ê1>E¸QóUFWjZVaÞfºsßtücùW´a d×gr{k{ x5q=jXgÚdÍip¹tæ~T€zn#[=…´Àªr©t¢Æ–á’¡‹„Wvár!lFdË_²XDXãUÔXlJ|^î–L™Õ‡x–’›Ïœ‹ å¥t¨œ­J¯×±¼°ß±°®î«Ò¬±±þµ#µ‹³T³ü®ƒªàxKã ˆ67•«ß²x”´(˜;ÂAhP¶QàWmY_]g¼ov—l[m^/g$ln5wt|q}[v¿siàlnÙs¨xÿ‡zv³e·bÏXý_n^½Xf^#bâckËsuÁx•}N|ä‚É…ì‹Í‹âŠ‹¦‘Ž)Š[á”6¿kø%‡86?‹R¸[$Z»UÖZÒe¶p*ríj*^ÈY#c¨iˆnywB}V~«s6m n,lÊpVvQ}¦}È|¹s¥fh_ÙXc^È_Y^•b´dól.ibjAqÓwŠ|ƒ ƒÔˆ:‰Úˆ–ŒDŽ·Š$‰¹‹î–ÍŸÁž5œ…˜¶•q—uv¾â o „ ø r ×  s Ü ø  S ‹$Ž4I:úAÁO7QKÑKwF DeA·@•{Ksksr¶w,xä~_yÔl _´PèGxRkW˜OJPßPÏU5^Zxa³gkkúuB}„¤ˆ·ˆCŠ ‹^E‹ãÜ‘ï/¡mœN›f—F’©~5Àë Ò Á ÿ V º … ¤ † S 8 & Ÿ ¯#á4”;‹CGÜHqJMÅHÉBJA8>é>J>ªACóHŽGo’þնNµ™²ú±,©b£ŠŸÐœ†“}ŽÃŒÞ}nlaõT+P…DIª†Ý—e†RŒÇšû™~˜áh£c©p¯t°ï°«²-²Z°q­"±x´—¶¬¸œ¸‹´p¯›°„Œ+¥ ŒÍÚwKÅ_‡ö!#’&\(Ô96A¸OÇZVÊZ¡aáh‚s†m Zk[dškpqŸuÞ~°uzñwšt3oÞp.wð{[~ä|sjjVûI>P;TØMWIXKHL©TàU@U\*iáqä{õƃ\ƒ8‰ŠE‹½‹xR“¨žáœ ™£– •8ác ~  ‹‹§  µ É Ù c „ 1Ø5÷>èBºDD&CaD@1B[@‡?5@êAÅGÑJ%Dǒտ̶¼¶“µäµ¯­§Y¦Ä •™<”(„“u¨j3Z7SEZ‰Èq‚‘Óšz–=—`¢1ªá¯Ê²²ê³²¯½°Ú³Ð¶v·â¸·¨µ]±´xiN F%îÓNo‰–™Q/"€#f³!{#È2d=×E¼O¯P[bdŽhs¬vƒ^¸UB_ôi¡oX|}Ø‚ž~¡y~uÔqqásúwq|m|ðvqr?Y›FøDÐH?LhHØHwMMòU V>\Liôsçw¼~Yë‚7†)ЉŒ ŠËŒ—F›0š:™—\”rz8æ7¦KóP1P‚NÇ?¾*1@ëˆ ! ‡«(ò2Y9@àB\@†DaAê?QBYC¥CNC G-H€KJ “ùÁV¸¡¸¶µ¥³¢¯—¨¤‰ž™§Ý‡z²oBcP…D¹h†ë‰’„t™³œ±™›ÆžÏ¡¹ª…¯÷²&´/´M²á®û¯Ä³Y¶B¸+¸¼·µx³à«Õ< Æ2“Ë1O’Ë ÛH#{"Ú"f#Ä Ç+C8ãCHËJHPÝ^ h5pûsÝawV Xf0jòx?~þ‡û†RvçpÒvzvyyƒ|‡yvÅn‚Y C¥BÚC÷D7A½IÉMÛK€Ua]û]Øeon®oƒvŸ{ˆgJ„òŒ5‰+‘5’ˆ—–ï—î——ˆÇ4¤RÀb²h bø`Cg”fÖ`^ZHS% ë…ó FÓ+O5z;D=o=æ>äA¬C”C—E×BÜF¬MKUP)M”•0Ć»»·¶b¶Ã¶ ­ §g¢[›Ê”r‰Æ}Þkç]øKwF#rĉõ‰´ƒ!…ô™÷š›$šÐž½¢Â©I®²²ß´K²ª²1®Š°i³0¶-¶®·¹¶ö´ä·‘Éóöò1‡ôB4‚6Í!ß d ZQ$*6>IG¤D,NI^WcnûpseÜWbXòb¼iq;~-ˆQ…ôƒ¯x‚t³sb{2{óv§wßwPeïY¼HžBhCÖEÃCqEžG¯Sy\Og_Ùb¼i8uÝ€™€ç…M‡r†©Š¨ŒvÝ’C—ꔳ’Ô‰ÁAlJmTX-d;j#noÐo†j•e¼f`ËP¥7¥è hq,ä6Â;];³@A‰CEGBG]IzMÂMFOlJ…˜ƒÇe¿lÅõÈLÄ3Ã=À³¡©r£hœâ“é‹ÇÑjñ[ f@SŸ^Ìt½~؆H†é‹š†zzmf>aöc_\#E÷% ƒó"1Ï9»=ò?CGeG;KEN*NAO{QIL¿¤ÉØiÑJÕÔþÓϧőµªªÿ£R›ù‘¶ƒ×tcŠT÷=ŒND€¥„è„Ë~%—¹“ –˜š—Â¥®¥°³³S³À´P²â°Rµ·º®º…¸²¶®R7q SxQ ûÐsÚ !!Ê Û"é"%G/#(C8?†BˆJ¯VaÀf·jfeÛ[]P;SïYÄh~våz-‚ó|Îwªt³púuêr@vßy_i[cK;h?«7=­@þEQIœK,QQU]ŽdÂs|zá}¡„ˋNj-‰ÑŒpŽ„’Æ“ ‘[Õ}¾±.YYdµq‹‚•Y›¬¢O„Ž‘½xŸlÒfÎf§hMfüY;­#>š)_4 =A=C,IRLÍN—RZQP’M즒ßÅØ%Øûײ׶ӗÅ̶>®¢F—j‘RxKi@XIS5ûTPxÿ}[|Ð|¹(‘­Žµ“z– ˜D¡¸¬¯û³ã´Ìµw´*³ß´I¶§¸K¼º²·Ò¹Z‡ð*–ÅF­.Bø”QÂ=ú-õ ¬ÜÐÎ,:A]ECN´_,jýq&j[^ˆRóPÄXE]ÿfZuz‰zun²tjpÓt4s¹o´V[OfGV9_5ß0ÿ28œ;B_BF”N‘Q™T‡eOvjw’~EŒ—”¤Á‰®Œq“W”%¡gª¯D$dQ÷E×Rÿ\}n?‹"œ´©‰¯Ô°ï¥c›«ŠŽyÔpr+l-g.hehf"S+8£#²%–5â@fD_IL0M€P]P4Q»J¡hÚÒÔ_ØU×TØDÕPÆbµ0ªO _–?†ájZ[èM;==)]Gyj¤wÅuw‹»Žˆ{Ž–“0–ì U¬—¯ì²#³º´v³o´Z´O¸Iº?¹«¹a¸µ1Jä ÃÉÚ^À„!ážm8Äz[Æÿ c%ü 1>EýIh\JhjqëoiZOuE)I¼LcFΖ Èk¿b¿¼è¹(µ˜°N¥W•…Uyùzå{ݤˆZŠdŠ?”W¡P¨·¨Þ ü¡c¡z¦”qülŽÏ—„žs¢uŸÚ¢g¦­º±Ä¶Öµº³iµ×†!ÒoB-¹ïDÆ1)etñ2ZG²ÝM· RÄ$²089DðY©gºkuf.O­G»DÚFÜHñHØLýNŸTøR·U&_¸^DaH]ºPZ Uç± #Û' 0ñ,·/ƒ.c'¼'¦$Ê$m(Ù%ƒ"iŒrÏÀ:Ý*ØÙ0ØJÌD§›”ªZ{]M`UËaàrð€«Ý£@°¬Á†ÐYÚQÜêÚÙÝTÖ‰Ò׫ÚÖÖéÚgÜ/Ó}Û¶×û x”µwfUS²GÄ=ä;ŽBµAK–JÈB¾€¼L»j·±°ûª¬¥3¤Ø­Ë¸8¿ÆÃeÁºÁéÀÁh¿è¾¾ØÀ^ÃmÁŠ¿@Â6Á²¿¾4¹µL´7°¥ŸgŸl¢ý§«ëªå§‘&¢Ò |Þ† ` Ú ²uÔ20Úнúo5ÒŒŽ×åÏõ#7,.6zFß[ h~dL×AtBôI8D¾J«KóLQéP`RgWlW:HöE,/¡mÃrQŠÿ$y"`&(m%#.­î¬¢ý$:Ah"·ÙЗÇn¾Ü¸ÿºT­Ë›ÐkãYgaàYl_ðjo‚œ•œ­N½ØÄcÓ:ÖGØ(ۨض׿×'×Ù×yÚYÜÔ¦Þ‹Çù„С‹—ÊŽ>t±]oTtF;³5B•WÄû½'¹pµÜ²V°êµn¸Ï»c»úºž¼ ¼$¹r¹É¸©¹¹]¹—º»g½¼Ì»u½¼¯»;»¨»ä¾fÀÝÁàÀs½´¹Ïµ„²€°­­Äªd†áR RµUQÄJv?2œ'ìÔ5 ;ëéÒ v2UW¬†“ "uÙ¼)>5ÎCQçOj=)3Ñ3Á;;=pCyH$J¾KøRìV‚QQLl<Ñ%À ¤œú~%âÖ!åWjÞâ ƒY ÁÌZ³ ºù®†{€G¦` lGb·dT`nÆt[€hˆ”¹¦ËµPÁÅëÈ?ËåÐûÑÐHÕ9ܺÜ'ÜÁàßtÍφ}du‚ƒ«‹¨iad[ßT¤6¯’ÙÁºe´â±M´¹î¼™¹»H½z½~½Ü½ƒ½.¾­½¼)¼¸½$½¼½å½]¼„»É¼Ö½W¼¥¼½½r¾w¿½½S¾èÀ?¾¿ ½L¼¾oÀ±¾¿Z¾Ø½”ºó¶>±C§4”LxX*7tç œj §³Ö§^ï`ÍÕ!Ôsˆ*0 7µ3‡-'$L-446ð>ÖEÛH¢N"M¿M«Jø:Ë%çÔÊW:ÿ3€•IºG€¶~! :S^&:¬*›»:‹cÓHûü4²7]E*?êUxr}ïƒQ‰¾”V”þ¨Þ¯d²˜µQ¸m¹?¼µÙ³NºbÈÎkÔ?Ö½Óÿ¹¨„µpo¥c&eúiÜa¬`0Uåºú¯+¨g³R½ ¾Ä½¦¿ ÀêÀ®À"ÀZÀ¨¾å¿¡¿½1¼Õ½ã½Ä½"¾.¾ ½a½á½±½¾ÿ¿g¿žÀ¾¾½h¼3½P½M¼ø½1¼Ž»Ò¹q¹W·ž¹¹å¸ò¹»#½9À–ÁÁÄvÄz¼¤©#„Võ,´. t ¹ù<Q%?}¿b¢c%í&7#{Rƒ'g/û8æEôG£J7JcD/;ƒ.j„·'ÚÀ9 G‹íùÄ” ²Lâ*< ƒ ã :Jøí›i = ¥&©2¾^ÝbákEr r¯uw†ª–¤²¨b°t¶Á¼Á¼w»!ǽÐÌvÈcЇÁN‰|{fÛYñ[7_ÿa_c¨YJй²„ ß¤~¹Ç½W½œ½:À\À·Á­ÀÉÀ£Á¿¿e¾·¼¼j¼Ä½&¾T½ì½U¿UÀ5¿qÀCÀ?¿×¿y¿ãÀ½ý½w¾¼ò½q¾˜¾–½÷½Û¾Ö¿-½ˆ¾É¼S¼ñ½ú½ž¼Á¼”¼áºÅ¼ ¾òÂ/Âø´Q˜‚}^§:ÁÝ ¢ ĉ8Žy¾N¥Nê‰#Ü0Ò:%CyIëD¦:š+é¤ÝQü*¿ ç ø Žeæ!¦F Û á æ —À_ Å O¬x`Ó4JSåXþ]t[[%YFXÍZÏ[µU RR¶W.Vî\g¶h‹kËt{‡)’è™×¢ ¨¨Ÿ‹ˆ‚âeÚX{XTXBZè^¼Wü‚‰ª‹3žq¾r»ú¾›À<ÀbÁÞºÂeÉÂîÁ´ÁR½Ò¼ã½\½û¾_¾¾)½®À¾½ï¿“¿â¿¢¾¿”Á‡¿¹¿H¾C½Ó½ó¾é½î¾!¿E¿ëÀ1ÀÕÀ'¿ãÀ ¿­¿ªÀ°ÁÞÁøÀ À½Ä»Kº¡½BÁSÁêÁu¸ý¢mqá:¯dB ÙIfnŸEAnÞF&)#;6>ð ^CbgÙfºcí]„\¯\'ZZ•[6\¾^`d]_ZÀX„WIUMPÕIRGÑIÓK:F J MâN…P­QýX’]#a4]VW8U?Q8SAOk~«^K›ZÚ½%ÀEÃ*ÃÃ)ÃvÄFÄ-ÃiÁ¾Áœ¿³¿V¾šÀ¾ì¾b¿³¿¹ÀíÀÌÁHÀÂÁ‹À›ÀÎÀxÁéÁÁmÁ=¿¾ÄÀÀbÀJÁÊÂÁEÁéÀÉ¿ÍÁJÂtÂëÄkÄăÿð¿SÀÝÀu½‹½¡¼–¿ãż†—º_).I §b8`ÿ]™k ½*<.&*×(Ã#!‡#ò#“»kµq”Ô¶û¦¾5@ 'F _ Ÿ H ¨ Æ Ë?©+û?„Vc£[nW‘XTSíU—R:RÏT#TxUBW¸XîV5[S^ÛZZ“[[qYmXGXùYaY”W´XÿV>Y2Z—]]“djk<†ðŒ u6a™NM8L“<–¦åÂÑÀ‘ÃtÄÞľÆ>ÆêÇ­ÇÆ¼ÅÆÃ¾Â. À˜Á%¿pÁÁÍÁj¿ÃÀ¶ÂæÁwÁ6·Âu¿¨ÁgÀÄÀ À€¿ Á¤Ã„ĉÙÃ3Áª¿÷À½À9Ä)Ç3ÈXʾÊþÇûÆ{ÅÅ?ÅlÅöÄÆÃ]ÃnÄëÃÀ\¿xÀçÅŵ;/QŸ.VnÞaü–# &²+ 4ö9F=J? @QA@ÁCàJN TNNQG™>¹7‰1(«"íÆ!ƒ°Ó ` ¶ L x›÷a×**BšQRPP–RJUWmV0SÏS3VÊR½NRR{PæSƒRSòP1QQ™QìRÏU|W2UŸY\»^ŸZLZ¸\ðZ–[_\R`McŸnŒ¡¨2¨I–{“-Ž;á:†r®…»qÁšÃ¢ÅZÄéÅiÇTÇ[ÉǤÅâÅ2Ã"–Â9ÀÃÀlÀ¾ÂÁx¿ÊÁOÁ¹Â—ÂÂÆÝÆ<¿”à ÂZÁÍÁnÁùÁxÂÎÇôÉ*ǻȾÅ@Á€Â½Å£ÇÌËÍÞÏ(ÎõÎjÎpÎÏ{Î&˯ÌÈÍXÊOÉÈ]Æ Æ9Å×ÁÅÂ/ĸÉ/Ƴ|¥$ö-Z2®;‚;€>|BªE;C6BåG!N0P’RRU@Xí`k_wbŽ_‚bTd crb>`[§X}SòPÞH€;Î0=-è10U/p7©EåRžUÐH`DþJÈTVJWIX€UcV3PoRQ“OfN±MãTªQó8sIËLüJHKLMÙO6ON…STlT»TýWSWú\G^Laðh§k/w©äÁúÆ]¶¨©’ªÔ"†<ê¨*¦7¯À>Á Ã:ÄÃèňÅÒÇþÅëÄÇÅÃ' Â/À6À¼Â'çÁ`À‘ÂÁÁr‡ÈÏǰÀ¾Á6Á'Àˆ³ÃäÆsÌ:Ì»ÈÁÎVÍàÌêϺÒ9ÕÙ0Øp؆×cÖkծظٽÙV×!Ô†ÕùÓÔRϘ̻ÇOÈ;È—ÈWËÞÍdÑZºE^7ö@þEÕMQoXœIæ=‡EhK³NæO.OçQ4T¾R¹TU\WîW‰YPZ+\ZYZ¹Zô^…_…\°^.[DX3WVZj_Uo(Àˆ©’(“CoOVlO,X|XªZz[·XÅVQÈNlKïJïOšRÆNUMöOG~L“LM«OµO¤PãUHVŽX1UöVóY)Z1`ui)mZvJ·§¬›“µÎñ°"¡mD¼~®§Ž.œ˜¾÷¿)Á£ÁýÃCÄ™ÄÝőÈÂ:…£ÁšÁg¿ž¿ÊÁ4À{À*Á9ÀþÀ¶Á]ĢȭÌÁP¿#Á(ÁÂYÊ̳ɪËgÍæÌ^ÏyÔpÙíÚ†ÕçÏQÇ`¾µ¿´±´´2¹å¾«À¡ÂžÄ„ƬÌ<ÒòÕÏÖžÔæÐƒÔƒÖÅÔ}ΛÄn¯¡XQFF@Ž6‡%{$ 7æGGÛIøLžOpQ­UnW>T‹U@WÌYZŒ[vZJZ Y?V XAW“UÿRAPÉPúOÂQDS5Xda p ‡M‰Â“M«±S•Äd6HU[fX›WOVþUÀVhS>R"UZY8PùS8š"UN€QWPSUT4VõXT\‹[äYnY¢\Ê\ta¤ee{°®¡ÐÙÌòw4°t¾ò·Gs²Œ¢¹‡Ë•ξé¾ÍÁ!ÂÁßÂÃ&ÄŒÂSÀÚÁÁB¿«¾–¾¼Ú½H¾&¾ßÀ^¿fÁTÃÕÄ®ÈÍÌÄ¿sÃaÃvÅÊУÓ]É÷È Ê‡Ï¢Ð§ÌCÁ µuª^¦<£¦µ«²„µc¸¼“½¢¾ ½X½ »¼Ý½L»j¼D¼L»·§·F³t®ô¯µ¯¶¬Ä¯_ªÑ „ÐYb*#!^2A;CM›U§Zt\^ X³UÑXqY;Y\ZÄ[…Y>VšZÉW[V™RèQ PÊPÌRÑWl\Bc,kOy‰t“x­FÁŠÉ¦²»þ]%A×KNPQFT>S^UtWYŒWŒHRø™¼“šQôV3UÅV¨ZcZL\z^HZõ[ ^G`I^_gRoë{'¦-žçʺÂ×·þ±“¿fÊ fèo˜À¡Ð¥R¾”½ÝÀùÁlÀ¸ÀæÁaÄnÃzÁ…Á­Á{¿¾h¾à¾k¾b¿y¾Y¾¢ÀŠÄJÄ2ÕÇyÉ^ÄTÀ•Ã2ÃÃþÆkË{ÆÀØÁѾz²[£ô£{© ®²j¶*·º¹¦º<¼¿–ÃRÃóÆÆyÇfȾLjśÀuºt¸å¶„¶¸¨¼7¿ÕÁ  ÄÄÝÅÚÉÛ͔͌ š°pµR¸>S@‹LùUƒ\&bdOa,](\\`j_[½Y…YòUýR R›RûSSªY†`²g¹lht—…Ý™ÿ² Šqõ®h A ½iLFñKzL~PÊMN•Q®QV@½Uî†UžñzP¼WWøUòUS Xð[Œ] ]®^D\ùc¸oPw'…X ~̸½ö¡ÇèÈÃlÆ3brŽt®™«½½Û¾Ù¿?À¿5À Ä ÃÁÂÈÂ/ÁEÀ×ÁMÁj¿Ë¿³¿ÁLÅËÅX®ÄLÅ3ÆÂÃYÁSÀT½Ç¼"¸zºP¸°¸¥¶3ª—¥©Ç¯f²5´¶ ¸¸êº.º½IÁ5ÂèÃÀÄ¡ÄÿÇèÊ%ËÝ˓˯ɘÇëÆêÇ2ȨÉjÉÇþÇÇUÄôÄòÅ-Å“ÅèÈÎçÎe¿ê—êW\AŒG9LXUð\ìc¾g•h c$^`§^]©]{\LX WXÂZ;\·b¬nt5xƇ͜5±¼Ê;´›" ì«~«8˜ð`ÃC LÉKQN`ORQEO PüA6-´rcªk„=QñTãU¨RØQYNrR˜VuWNZŽ]k]t]ÿjønbsMÔ¡‰Ë‰Ñ²Æpɢǰ¿k— ¹ìºº)1Aº4Sminisblack-1c-16b.tiffì?Ð_´˜Ÿ|äääääÂGraphicsMagick 1.2 unreleased Q16 http://www.GraphicsMagick.org/tiff-4.0.3/test/images/minisblack-1c-8b.pgm0000644000212300117540000005625211246011415015251 00000000000000P5 157 151 255 Uf_eceffecdegdccdc`a]_`_[l’£¦ŒRCHGJt—¤¦¨«ªªª«ª««ª¨¦£Ÿ¢•}ž£ª©–—Ÿ¡¡Ÿ˜“‰€yriu‘ ¡¢›œžŸ  ¡£¦©¬VDq–—¨¦˜\OWZ^aYOst\XTQ[]fyƒˆŒŽ‘™”“”’‹jU[acPSjruwy~ˆ”šœš™•Ž_umpmnjjihijkkknmmkijggd_b‰³ÆÇŸ_G;Iƒ‘‰ªÄÉËÎÑÓÒÐÏÎÎÍËÇÁ·ª•–¤ÀÅ¡w^`chkry…ƒƒ‚~xn©¼ÂÄÊÏÑÎÎÏÐÏÐÏÐÓÖàËGMˆÃ»¼Èµzhfc_\`PYbacamy€“¥­³»¿¾½¿ÂÃÿ©xq|xao…”—–™¡¨´¸¸¶´¬Xqkmokijhghikkilkkhiijiebaby¦Äʺ›xuŠŒ¤½ÃÅÊÍÐÐÎËËÊÉÆ¾¯—¡«¼Ç|NJQWWUVVSSXXUZa`r³Ã½ÁÆÍÌÇÆÈËËÌÌÉÉÊÊØŒE?„ÄÁ­¦…š© ™–jQW[TZZj}𤩮³´µ·¹¼»½½»¹¡url]lz…ˆŠ‹”¥­¯±¯¯¨Vofjifefdg`ekigljjimiikihgeamÀÉÉĵ˜†ƒ¢¹ÂÇÊÎÐÔØÙÖÎËij•¥³ÃÀ|QUWZXZ\]`__a`^^_`c†³ÌÌÉÏÍËÌÏÎÏÑÏËËËËÈjd~¦ÍÆÀ¼³˜²³œœ­Š^IQUTu…‘𡧬­³³¶¸º¼½¿¿¿½·”rcWjyxy›¡¨°²±©¨¥Qiglnntz„ud_afigikhjnlmkjief„«ÂÇÆ¦‡£»ÃÅÍÕÕÔÒÏÐÕг•–¬º¾žqa\YXXY[Z\_^^_^_bcaa[b‰Æ×ÎÎÒÑÒÏÐÒÏÊÆÃÉbpŒ³ÏÇÊÒͦ™ª©©µ¬x(5j†“œŸ¥ª¬±²µ¶µ·¹¼¾À¿¾½ª|WNj{›£©°³²°®¨£b‘‘—™¡¨°²²­˜mZ_cc^_aeffceebecYbƒŸ«v}©¾ÆËµ‘vkd]at…£½Á¨dDS^[YZ\\[^]_`aa``aa^ab`Xh¦ÙÛÕÒÏÎÏÍÊü»™d}}ªÌÊÇש˜§´»¦¨²³¹x@‚–šž¦ª°´µ¸¶´·º¼½¾¿¾½­wEFm†„Š—Ÿ¦­¯­®­®ª¢µ«­­¬°²³¶¶¶¹§mRWVVSPT[XWWWVWUWVTTPVl{£¼»‚PEFNPSSPNTl‚y[RXXVVWXZ[[\\\^a`aaaaabbbb`[‚ÈãÖÏÎÊÇÄ»¯¢]Uyw–¤ÂÒÀ»¨È¾³²´¹¹¶¹£„‹”œ¡§«±±³¶¶·¹¹º½¿¿¾¹¦h0GuŽŒˆ“› £¤¤¢¡¡£¡ƒ´­°¯°²²´¶··¸»žWHILN\YLGJHEEJKILPOSSOg›¨uKPSUXXXYXWWSLMSTVYZYXZ]\\[\^`aa`_`cbbbcbddYc¥ÙÕËÆ¿»¨ž’iVNfœž¯«¦–»Í°©¯ÀÀ¿¾¸´ž„’›¤§©«¬®®²·¸¹º¼¾¼¼²šPF~“‘ˆ˜›œœ–––”˜›…¹³µµ·¸µ¶·¹º»¹·uDHGk“…`Zff^M>?BDIGbgKk›zPRSTXYWY[YWXXVXWUXZY\\ZZ\\]_^a`a```babbbca`c`Y|ÂÏ¿µ¨”‡et_,dµŒŠ†¤ËÍÁȵ¶¤±ÌËźµ“‰œ ¢¡¡¤¨ª®²¶¸»»º·µ¨Š:]™–‰ˆ‘–••’“•”–›…¼¶¹»»½ÄÄÈÎȼ½„BAEy™“‰‰‘“”ˆnSCGJHhjIy„WOPSVVXVVXYWTUUXYVVYX[[Y\]\\\__^`__^a_``_`a_bfcZj§¸¡ge{‚z_~¬–¬­ ºÎ¿ÅÏÎ¥°ÎÔÓȾ¸²Ž•˜š¢¥ª®³³´¶·¸¸²ªz(w—𙄇ޒ•šž‡¾¸½½¿ÆÐÏÕ×Ⱦ¸µyB@W†‰–šžŸžŸ‘g@?:EE`Š_PRPSUVWXXWVSSRRTQRSUXYYXYYYZZ\]]]_a```a_`^`_`b`b`eŠhCD“–]x­“¼Ÿ—¸ÍÐ̺»ÆÍ×Öͺº›Œ•œ¡¦©°µ·····¸¹®¦•f%ˆ—˜œ—Š‚Š˜¤§¤Ž¿¹¾¾¿ÁÀ¾Â޶¶šX:NŠ˜ž£¤£¦¤že'ˆ…TOUOQSVWVVUTTVSRUTRQTXX\YY[YZ[ZYZ\\]a``caa``^`ddbcelZU«ƒ~x^b‘‡¥§–”Éĸ¼½ÃÏÓÐÉľ¹®’œ¢¥©®³·¸¸¹¹·´³«ŸŒR@‘–—™—™”‹‘”š¡§«©’»¼¼»º¼ÂÅÏϽµ†-1tŒ‹˜›Ÿ£¤¥¦¥¦§˜-T“tSRUURRWVTSTRSSSSSQORTVUX\ZXZZ[YVW[Y^_``a```_]_`bdb`biU‡šxw[^pŽŸª©¥¹ºÀÊÒÔÒÎÆÂÃú¶  ¥ª°²µ¸º¸¸·´±­¦•x4_•–•˜—¢£˜Œ“—ž£ª¨Á¹º¸·¶¿ÒÓÖÓ¬p$]“Œ–¡£¥¥¤£¤¦¡‘E!7ŠnRQTOSUVUVVWWTSRSQRmnPUWWZYYZYZ^\YTV[Z`^`aa_^`^^_]__`aguhb_cjŠŸ¨¬¶½¼»ÆÓÚÚÕË¿Áľ¹¬¡¦©±´¸ºº¹º·°ª¦œ…Tp”•“––›Ÿš‹’–ž¢«ªˆÁ¸º¹¹º¹ÇÎÇûJG~Ž–›ž¢¤¢£¯³¥Ÿ–w;7g„gRPTPRUTTUUUSSSUUSvŒ’‡_Y[Y[\[[`b`^WURTZZ\^`b]]_^[\Z[Z^c`djlbltu’ §ª°·¼¿ÈÏÔÔÎÄÁ¿ÀÃÀº±¦ª©¯´¹»ººº´©£™‹h%!z“”“–˜——™‰š ¥¯­ŠÂ¹»¸¶···¸µ´˜^FtŒˆ™Ÿ¡££ ²Ò×µ“‚E@Š–zbTSTQQQRUUUTQRWYUpŒ™Á­`VZYWY\_cfca[VWWY\]\^__^\Z[YWYY[\\_biƒŽmqŠš¥¨¯¶»ÀÇÉËÊþ½¾¿À¼µ¬®­¯³·¸»ºº°£™o3*ƒ”–”’”™™™ˆ‘›£©®¬„º°³´³²³´´±”d;S…Љ“œ¢¢¢«ÓáÞ¬‚Rj‹r]TSTRQNQSSQRQX[X]šÂ½ƒVZXUVU`dca`[YZWW[]][[^`a_^\Z[ZY\[\Z[]bu‡ƒ‰” §­¶º¼¿¾ÁÀ¿¿¼½ÀÂÄ¿¹¬¯²²´·¸¸¹·¤“‡l3 .‰”–””‘™™”‹“šŸ¦¯®fy‡–¨´²±±šh@;s‡‰—  ž›¢Éßá¹XBŽ•kZUSTRRQSUUQNRZZYx”±Ç«bUXXWVRV`b_\ZZYYYX[\^]^_`ba^^]\\^^[]^`]\_k…œ¥®µ¹¹¸¸¸»¾¿¿ÀÀÂÃÁº¬¬¶´´¸»º·°“x\+  +Š“—”•˜™”’œ ¢¨©[wy‚†™ª­“dA(W‰„‹“ ž°ÇÜݯrK!}ƒbV`YTSTSRPSQPPPU^^s‰¡Ç·{QWUYZVTURZ`ZWWWXXX[]_a__ababbba\]^\^^_^^_\[v¢§©°µ¸µµ´µ¸¼¾¿¿ÁÁ»³®¶¶¶¸º¸µ¦qD  ƒ•—•••™œž˜•œ£¦«ªcŠŽ‘‘”ž‡A:~……™ ™¤ÐßÖ e= `tOCZ\XUSSSROQPNKM\_p‹’±ÅžWUWV\\YZZVT[XWWXXXYZZ\^bcabcbbghd^c^]_^^_^^_Xg£¯©°³¯²´´µ¶»¼¼¾ÀÀ»¶²µ¹º¹¸¶µ›? u•–•”Ž‹’šœŸ™¦«³¯k’–—š  Ÿ id‹‚•œ›—˜žµ½ŽU, ZmHBXeXXVTSSTQPQPQPZhy~©¸µxPWVZ[YX[ZWWUWXWXYYWZ\\^accabcbcbedb_\_`_^^]``Yf©­¨¯°°´³³·º»¹»¾¿¼·¶´¹º½¹¶´ i””•“’‡‡–›œ˜š¦¬³²s’”œ™¢¢§©œYm……’™•“¡Ÿ‰sL#JlJGJfe[WUTRSSQPLONOQysˆ²´ŸYUVYZ^][\]`]WWWXYZ[ZXZ[Z^`ccbdccbdac`_```__^]_a\jª¬­±³´²²·»»·»¿¾½º·³·¼½¼¶±Y   R•“”Ž…’›œšœ¥«¶¶t˜•œšŸ£¦§§¥ˆy†Š”‘ޤ²³ŸsE*nKLI[ri[WWURSTPNLNLJc{}«¾±vQTSYWZ]\_toZYY[[[\]\YY\\]_baadabcd``a``__a_a`acd\v³¬²³µ²²¶¸»¹»À¾¿½¹µ·¾»»·©;  3ƒ’”„ƒ“œ››¥¯µ³r”’™œžŸ¥¦¦§‘o‹‹–¹ÛÁ’s: vaROUfreUUVRRQRONNLMUyl‘¬²UUTUWX\\[]^Z\]XY\Y\\\]]]]]^babcccbccca^_\_a_aabc`b]޲­±±¯±µ¸¹º»¾¿À½½¸¸ÅÁ½¸›" 4Ml‚‰Œ‘Ž‚v‡›—™¥°·´jŽ™››¡¥©¨¦–o€‰£ÐßÃZ, l|]UR^f`[VWUTTRTRONNKnwr™·©iUVSUVWZ]^^___`ZZ]\]_^]a`]___^acdedcccaaaa_b`_aab`dfi§¯ª­®®±¶·º¼¾ÁÃľ²Žz}}…‡u]/+Ksƒ‘’’’’‘‰y~—–𥮷¶e‰•™™¡¨¤¡™{… ÖݵwM* )‘n^YUY[SUTVTUUTROPPNVˆ•°µ„XYVUTUUY[[^```^^YZ_]]^``a`aa`acdccegdcba`b`a``bbeebecv–®¨¬¬®³¸º¾ÄÁµ¦•‚LDiqz—§ž\Ef}ƒŒ”–™›šœœ–Ž…“™™¤­¶µh‰Œ”˜šŸ£¦¡œ˜~Š©¾ŸrI# U…n]URRRPOSRSSRSRMNMGm‰Ž¥¹¯nZZXYWVWZ[]__aa_^YX]\]^__bbbbabaadfgefed`bbaab``bdrlccli‹«¤©¬³¸¿À­•†ysi^ely…‹“”š¨£t}Ž˜œ™šŸžŸ ¢›’ޔ𣍱³o‰’–˜ ¤¡˜€[‚˜‹nD  XqshYRQPPMLPRRSUTSONMNƒ„›¹¾¥`_YVWXVW[\\\^_aaa\X\[^`_`b``cba_`acfbcfdbdbcb`a`a_befein[¨¢§¯¹°xymihlqr{„‘•šœžž ¥ŸŒŽ˜›œŸ¦¨¦¤¥ —‘Ÿ¥©¬s“‡“•—Ÿž˜“Q=`\; gž`k_TRQONLLMQRPRRQOOGgƒ†¤»¾Ya_XXXXWY[[\__ekmdX\]\^___`abcbaa_ecbggddbabc```acfccdfh\^•Ÿ¥®“scXXdy~usv…˜šŸ ¢§¡££”𦍍©¬§  ¢œ–”›¢¤s†“•—›™—•~+  `ºˆU_YSPPOPQNMPSQQPQPPOƒˆ•ª´»ƒWa^WWWXWY[\^acs‚„`VZ\^`^___bb`_`_dcbdedfd`bbbabccccfgkd^]e˜‘rTB>:Jh|vjl{—š¡¡¡£«§¥§£˜œ¢ª­³²³«¦¥§  œ˜œ¡i‰‰”–˜“‹ˆV  Y·µzRVSRPQPOOQPMPONQPPNd~ˆŸºº·s\d]YWXYYZ[aa^fv~œoU]Z[\_`^_ab`_]_a`bbdfghgcaabbidfdeggb^_\oT$CP_`_kw‰‘—˜¡£¦©©«©¨£¤«·ÁÅüµ­¦¦£ ¥žœœgŽ•œ•Šm14¤µªtQQQRSRRONPPPOOQPOPN€~‰ À½³hae`[XY]\[\_`aflmv™•ZWYZ[]^\\_a__]\bl`cbddjheacdioofiffe`__^\Z&;GO\SYk{„‹’™™ž¢¥ªª©­¬¨§«±·½ÅËÈö­¯«¦©£ d‡Žˆ¦Ç•q]/|°§›kKMPSRPQQONMOOPOQQKdŒ›ªÁƹm_fe\ZY[_^[_bdcc^bw™oQY[[\^^_bcda`]ah`aehldbecgwzr~…mdfbheb^^e: 4H]_N_mw†Ž–šž¡§ªª¬®°¯««³¶¶¸¶Äɼ¶½Á¶§££¢a†…‰ÄË…kX5+' S©¬¡—uMOOQRSPNONOOQPNPNoŠw”˜µÆÆÃ‰Ze`[\Z[_]]_bcbec`bl”cUZZ\\_a``b`ba`_acfs¢˜}kcx†— ©‚gceva^^b_ ?SIP^lu„‹’˜šŸ¥¨¨ª­±µ³­©¸¹´²¨®°³ÂÌÑ멤£ˆ´ª¬¼¶®¯°­£˜ˆc,!+±§›“‡PQSQPQQNMNPOPOPRaŠŒ‚›š±ÆËÇ©``[[YXZ]X\_`_cfcaa]„‡TZYZ]__b`ba``_`cddz®Ãħqƒ¡¥¸´«Žhaj¦Šg^^^l? '3>QXmu€‰‘–š¡§§¨±³¶µ²­¨¶¾´­¢£Ÿ¤¿ÕÚÝË®¦§•ż¼¶¸º¸¸¶¶±©¢>\«©¤—Ž“XKTRPPOOMLNMQRSGtŠ|¤ ¯ÅÎɽiY\XXXY[[]_`^bfebb^a”_SZ\]\^bcbddaabefcyÆÔÐα¡ÀÊÊË­lam®h_^g\&2Kitx”œ¢¢¦«µ¾Ã·¯®¦²Ê»©Ÿ˜”¢ºÕÝÝΰ®­–Ľ¼»¼º¹º¹·²¦—‹jD$"‰¬£¢–Ž™iDQSQOONMMLPGSN1€…’¨§§¿ÐÁº}ZWVVVX[[[]^`cfidcd[„}RYY[Z__`ccbcabcihk¹ØÑÒÇ·ÌÖרÊgd~²—wdabi, !1Ecsz„‹’˜˜¡¢¥±ºÄȽ²®¦®Äα›”•£¼ÓÚÜÍ´¥›“ƽ¿½¼¼»»¼ºµ¦~bL.G¥© œ•’‡CJRQQPNJPbN;c_:yoCŒ˜–ª¹Ã·¬¨—hWTTX[][Z^abdpuvg_h[TZZ[]^adecbcbdlfxºÒ×ÕÔÆËÖÙ×Ñšfi©‘‡ri`amL "4D`y„…Œ“•š¡¢ªµÅËÌÆ¶ª©±¦¨É˜™¤²ÅÑÀ“to’ƽÀ¾¾½»ºº¶®ˆnWF+k®¤œ”‰ˆ¤cASQORIZ„[u{w|€€v~r€¢³¶ ›¶ª•ZMUW[]][\^`bmƒ‘rb\aPXX[[`abeb`aacijƒ´Ç××ÌÅÁÍÓÒ‰fwzzvsie`bgZ4FWr„Š’“›ž¥¨¶ÇÎÏκ©©¬²—®·—•ª£sM_wŠ›‘É¿Á¿¿½¼¹·²¥”€cN<(®¢›“Ž‚‰ª‘BLQPJU®}{•Œ•‹›~‡°¸¨§™¿¹›’lOUY]]\^_`diw~f\hoPXYZ\_abccabbchuŠ´ÃÕÝγ®ÇÏÌ®uhycackob`aeh' 1FQi‰Œ‘–¦©»ÍÒÒ;©§¥²­®Æµ¡…XEiƒ”œ’ÉÀÁÂÀ¾¼»¸® ‹kP<&!‹¬¡™”‹}‹ ¨a>QNN™°—zh‘šŽ„…š£y{®ª£»²­¬¢­ºhLY\\\_``frz‘q`\kVVWZ]^`cbabcddi|³¿ÎÔÉ£ŸÅÌÄ”npsb_dfjbabhq7 !9GMmƒ‰’•¡¡¤¬¾ÑÖÕÑ¿¨¥¢­«›‰¶È}V_r…”˜š•ËÁÁÂÁ¾¼»·«™zW?!"𬠛wž®‘=LIƒ²£”ƒƒ„ˆ’—Œ{†£‘þ®ÄÌ»²¸­¹«SSYZ^]_`dv‰›“qf\h]SXZ]__aaaa_cdh~“¬½Ìʬ‡œÁ¸Ÿyjul`^abbc_`ivJ !6ENn„‰Ž“šž¢ «ÅÓ××׿¦¤¥£«Š}pjWal|‘••ž “ÉÀÂÀÀÀ¼º³¤~Y;"1¥ª ‚𥍰a;e§¨›‡ˆŒ”› ¤¢••‘³¿¿¿ÂÁ¾À±¦¿€KZ[_``ag{¯Äµ‚k^caSXWZ__`ab`fcbk~¥µ¾ª…z”˜}rivn]\`caab`q|M!4:Ql|ˆ‹š›¢¢³ÉÕØØÕ¿¥¦¥¥†q]YY\h}‘–— ¤”ȾÀ¿À¾º´ªŒ\= F«© ›”š ¢¢°•>ˆ§¢…„‰™¡ £Ÿ¥¬¥£­§¨¨¥©¯±°³¸©TX[]_bei€¾ÒÏ®pc``RYYX[]^b^]a_aiw†““’„ywxsrrnh}e]]fpˆw^auzP4L\ex…™š§ºÍÖ×ÙÑ¿©¦ ¡–dUXPV|¢Œ“˜Ÿ£•Ê¿¿ÁÀ½·©‘^0 ]¯¦žš”˜  žŸ«®o¢“†Œ‹”ž£¦¦¬¯¹»±¯²µ¶±¶º»´µ»fSZ\]aej…ÂØÚÈ{d_^XVXYY^^`b_]]`ipyzrwwvrnmkhmp[^^gŒË½l_€~S7JXcy„Œ’˜› ©½ÎÖØ×礤¦¢’jPKh›ÃÚœ‚“— ”Ç»½¿Á¼­[" u°£™’’œžœ›Ÿ©³¢”Ž“•™¦¨©­°¹»²³²·¿À¿»½¸¶ÅtR^b`cfiˆÂÖÛÓši`[XSTYY[]]```_adgntqmuysokhgek_]^\c¨Ýã™^ŒˆR4K[g}ŠŽ–ž©ºÌÔØÖ϶ ¡¥§‹^Tp±ÐØä±|‘˜›¡nŒ“—˜“Œj< !‡©•Š”¡ œž¢ª²žŽš˜”‘‘˜ž¥¬¯¬­²¸¹¯¯³¿Ï×Ñž»¸ÅqQadbacr‹ºÔÜØ®q``VRTYXZ\\]^`aabchnmlqrjhecbhf[^]]p¶Øå¶f“ŽT0L_d|ŒŒŽ• ©µ¿ÐØØÏ¹¥Ÿ¢§sY‡ÂÖÜÓ›ˆ”šœ¢Nomprt|€†’„_3.‘¢œšˆ’¢›Ÿ¤©±‘…’š–“”— £«°°«³·¸¶±°µÅØÜÐÅ¿»»½gUcebdas“°ÐÛÛ½a^XRRX[Z\\\\]`bdefhhlkieecbbgZ]^Z`„ÂÙܱq‹‡M/AUcs…ŒŽ”œ¤ª®¯ÄÖÚÒ»¬™§]–¾ÒÞÅvcyŒ˜›Ÿ¤b„|{{y‡‘‘–“x77“¢ š†’˜”¡©­‹}‹¡›“”˜Ÿ§­­®­»½½º±±µÃÕ×ʽ¸»´\ZcdaccnНÌÙÝÎŽe_VRTX[[X]Z[_a`cffhjjfdeccdh_\_\\c–ÎÙШn~w? -;Lcu~†‰™¡¤¦«·ÏØÕŸ£ zŽÂÈÝÁkk}‡”™£¤eŠy|y†‹”“Žv2'Žš•‹“šž£§‡{‰¢¡—”™£­²ª´ÁÀÀ¹²°·ÁÊÆ¼½º¶»°TYca`abi„¨ÅÕÙÔžicZRTWXZXZ[[^^^dedgjgededhi^[`_\[n±ÖÖÌgok/ .>HWp{‡šž¤¦µÍÔÓȾ¬Œ¾Ì×Ìd_vŒ”œ¡¤bƒŽwu~†‡“Œ…Y“ ’’”“–—œž‰{…™§™› ¤¬¯®»¿¾¾¹®­´½»¹º¼¹¶¹¶dSa_`aai{¡ÂÑÕײpc\QQVVVYXYZ]]]afegjighigga[`c_\^…ÆÕÒ·uef`1BFOfuw}‚…’¤ ¸ÍÎÏü—°ÊÓÕnNnw„‰‹–ž ¤Zz Ãwu~ƒ‰ŒŠx: |ª”‰•š‘Š‘‘Ž’”€ƒŽ¢¢››¡¥¬ª²º¾½¼¸¯¬²³¶¸»»¸·¸¾zN_`a__gt’³ÃËË®vfbWMLX[ZXWWZ]_`ffeiijiga^_bdb_aq¥ÊͰ‡iaeN 2>DL`jpu|„‰—š°ÇÉÄ®¡ÀËÛ—=^mx~†‹—œ ¤Udk޲¡{v|ƒ‡T Z–•‹•‘Љ‹Š…†‡Š†„Žž¡œš¡£©­¬µ¸¸º¶¯«²³·¹ºº¹¹·¾ŽQ^^_`acs†–›¢”ugeZNJGVXVWSUZ\`dcceeeca^^_bcbaxžÁȧ~mc]e51>CES^kq|€‘‘¤¶Â¿«‰Œ·ÌÏÖ^7MQevŠ“—ž¡UZZq—ª†ksvnQ (Q……‰ŠŠ‡‚~}~z†‹˜›™—›ž£ª­¯¯°´µ²°³´·º¹¹¹·¶¾—LZ^^_`bjvx~‰†xlgaYVDDPOLN[VZa``ba```b``aab`n¡Â͹‹qh`[_"&2@8Eaq=9Ki¤¨ËÒÓÓÏËÎÖÁŠlŠœ )KNGA6862, n”†‡ƒ|xm_J8&m˜Œ““••˜¤ª®­®¯±µ¶¶··º»¸»¹º·½˜FUZ]^^]bdkrrvwxpldm• Ÿ©¼Ç²µgFUV[\[`a`dcdbbuŸ²¿·•pdb\`? %(,+0* ;ª­xR„µÄ©ÀÎÑÑÎÌ̽°Íßµzƒˆ–œ',1, "  (lpgQ_‡€cN4)$u˜‘Œ••–˜•˜ ¦ªª¬¯²·¸¾Ä¿»¹·º¸¹·¼BUX\[\\^afgjmrtmmku}zzÀÆÂÌ¢BRU\__`a__abem޶¾·•vje_\a9Ca  #;°ÃÁ«š¢®¤º·ÌÌÎÔÎËÍÊÇÑÒݱr„’•$ LbT;""d|aPA76/'ƒ––™˜˜—œ¡¤¥¥ª®¯¹¾Âž¼¸¹ºº·µ»‰ASV[\\^_`abehkolmjeYadhzªÅÁ»ÆUQ[^bbbbaccckr­»¤oca\]Zy°_ ¹¹¹©·»œ¬³¨ËÍËÓÊÆÄÅÏÕÔÓØ‡uŒ’  _Œn@+'#$Kh\UC424*2’˜“—”—˜š £¥¤ª­¯³»ÃÀ¼»¸»»ººµº}š›”•–•–™œ ¤§§«¬²´¹Â¿»»»½¼ººµºr@QUXWUW[`abbfmrnkjhknPWiu¬Ì»Å§GUX]_baaehjt…‰ˆ…‚sibb`^d˜»:   б´µ¶¾ÂÈÊÅ»ºÅÇËÎÐÐÑÒÒÔÕÒÚµgƒŒx˜‡xW/z£xE.+0/*;ci^K7/0.+$A››”’–“•—¢¢¨¤§­³·º¼¼¼¼»½¿½»´¸gDPQTVWZ^^`_aaiolkmmjl^Uzz™ÅǾÏ_HVY[\^_bdfkutsneccad``:ŽÆN 'œ¯±³·¿ÅÇÈÊÈÇÇÊÎÐÓÓÔÓÓÔÔÔÛ²`zs’ŠŠ‹‚e;}šqU@60.)'Ql[J=4.1//"U š›“‘––——™ ¢£¤©¯µ¸»º½¼»¼¾¾¾¾´³YBNRPQTWZ[]^_`ceglkjif[W‚|ˆ»Êµ×;OSVY][]babdfaaaa`jkiAu‰s  3¢ª®±µ½ÅÇÇÈÅÅÈÌÏÐÓÖ××ÕÔÕÒݪWx~x”„ra…Šm[J;431/8WXM=11/30,dš™Ÿœ•“’”™˜œ££ «²·¸¹¼¾¼»»¼¾¾¼³°QBIMQUUXZZ^_`bfhiomkfa[N}{€«Ì¶ÂºEIOTXZ\_b_^_]^`acjnjU*h`  4¡§ª®²»ÁÅÇÇÆÇÊËÏÒÔÖÙÙØÕÔÓàœQpv|ž•’ŽipqVMA52244FXOB623231-$žš¢£˜‘‘•”–š ¢¢«±·¼¼¼À¼º»½¿¾¸²¨G?HLNQTWZ\]aadilkkjhcb[Hw…yŸÀŬÖb=KRTUXXZYWXWW]bbaf\ +\ZcD 7¤¤§ª°¸¾ÁÁÂÄÄÈËÏÑÓÕ×Ö×ÖÔÒà?aq|ž”˜}h‡}bSF:31028NN>6474121,+Š¢›¡¦Ÿ–’“””˜œ£¬°´º»»¾»ºº¼¾»¸µ¦E?EILNQXX[_cbcddee][kmmvwŽyŽ´Ï¦ÓŽ7JNPRY_frnimm`SPYZ *^Š™–‘…kU6 6¡¤§ª³¹¼»¾ÀÂÄÉÍÎÑÓÕÖÕÕÔÒßo:ep{š—„^€ƒn^QB:7469CIB736454/1'4•££¤£žž™”‘”˜š¦¬­³¹¹»»ºº»¼º¸¸µ£>;BDGLMUYd\[]_`a^PVpy‡£†ˆ‹ƒ©Ñ«Ã¹@FGFTcq„~{‰•©­•rR %`•œŸ¡žŸ™Ž{\!$‘›¢£¥°¶ºº½¿ÀÃÇËÍÑÓÔÕÕÕÖÕÚQ5emzšƒ^x†vfQE=77568;>:67533200%A›¥¨©£ŸŸžŸœ˜™¦«®³·¹¼º¹¼¿¼¸¹¸·7;@BFJIKRYWXXVVK;Di„ˆ“œ¡¡†”Ž£Ìº´ÓlD?I[n~ufh}”™¤¬šA -w˜˜œŸ¢¤ —†Z›ž ¡¨°µ¸¹»¼ÀÃÄÉÏÒÔÕÕÕÔÙÈ/HW‚Œ[t„}gRA9577:88<=75512/30,M𢍧¢žžŸžœ §¬¯µ·¹»»½¾¾»»¼¶¸•-82441444865576423112$kž¤ª§£ŸŸ¢¡ £¥¨¬­²¶¹¼¹¿¾»¼¿ÀÁÀºµ5:5J}Šˆ”’”•–Œ‚nITjG‚y…œ€‰”‘Œ¦Â»ҬŸsfe‚‹‘ª¨™Œ‚„‘•“–ŸµÉÐÕÓÓµ‘hGer„…†‰‹ˆ‚{y|zicvš šnRVQRJWmaVOD:7687645688778767554%nœ¤©§¤¢¢¡ ¡¥¦©­¯´¸ººº¿½»»½ÀÀÀ·­l*4H}‰œ¨šš›œ™ššh79(Z^F7eŽ˜‹¡´ÊÂÏŰ›?^¢ˆb~“š–u^Z]hƒ™–ŽŽ“­ÑØÕ×Ú| 2Zixzyux{sjhifVLd‚sgQPQPSITcULE>:977976998<78=?<9761's™¨§¦¤¡¡¡¢£¦©©­°²·º¹¹¾¾¼»½ÁÀ¿·B2q‡Œ’©¨¢ž£¤¢Ÿ¢°œN D$ $†’“‘Ÿ®ÉÌÌÉ»ŽG‰ŸžŠwzš‹KCFOYl†”—œœžš–¡ÈÛ׿œ‹,DWdheggd`\\YOKZhfRFQOPRSURLTIFFBB?:6547665:789879731(t›£¨¦¤£¤££¥¦ª«¬®²µ¸·¹¾¾¼»¾ÁÀÁ°~"U‚‡“¡¤¦¦©¥¥¨«²¼¼PJP,#gŒŠ–™˜™©³¾ÐÍɿÒ`«’Ve€¢y2BKUez†‹”š¡£ œ¤Êᛕ82QZ\[[[UMKKGFUWWLEKOQVWUUVANJHECCB<8476668<9;9777332+w𠦤¢¡¢¡£¦ª«¬­²´¸º¹º¾½»¼¿À¿Â§V)t„Š’–žž¤¥©¬®®±ºË™Xžy7/…‹‘Ž›“™¥²ÅÏÍÍĹÀiƒ‘}¦Š€2ALOYu„–ž ¥§§¦¥¦ ËÅœ›F!@NMLSLEA?5=QQNNHKPUTWYXXU>PMKHGECB>75546<=@:78755533|¢¦¤£¡¡¡¡¥«­­¯³¶¹º¹»½»¼¼¾¾¾Ã‹+ P…‰“™ŸžŸ¤¦¨°´¯¤ˆ}Àº™?x›ªšœ£µÀÎÍÀ¿ÃÄp³›†qg1KS_jx…Œ˜œ¤©««­ª¢¥¬¶žœD4ADDGD=911GHHGHLNTWWXYXZU:NPPMIGEEA<5675=BA=8545656<{¢£¢ ¢¡¢¦«­¯²³¸»¼»¼¾»»»¾¿¾¾_k…‘•˜š”‘•—Ÿ£¥0†À¶¢…<3…‘¯¯¦¥¬®²ÊĽ­ÀÒx›¥…;[fkmn~ƒ•Ÿ¢£©¯°ª¤© —•9,5<@?<8/0BDGKFLRQSTUUXZXY9NJNNHIEEEB;877?EEC96788959ƒŸ¤¤¥¡¢£¤©­®°³µ¸»¼»¼¼¼¼½¿À¿²9'z••”–ŽŒ‰™ž¢¡¤¯¡9c¨¯«¢Zƒ£§Š‘ž®±¼ÏËȹµ‡­­¨©º^Hloq{}~‰“Ÿ£¦§ª®±©£¦“Š,05443+&<@CKJOQUSTWUWVY[V5NIDKNMIEHEC=9558668/9…œ¢¨¦££¥¥¥©­¯±´¸º¼ºº»½»½¼¾¿¿—#5ƒ–—˜˜˜“‘“•›¥¨®´¾Ä`1v‰™¦²°“m”¬±¯®¹¾Ðži~¨ÇÁ‚(ez|vuu†‘˜¢¤¦­¯®¯®­¨§w "(/1# 4>?GINROPRPSRTTW\W4JG>@LMIEJIH><GA9:96510#OŽ™ª¨¡£¢££¦§¬±´¶¸¹¸¸¹¼½½¼¼¼¶¦Z4”Ÿ¡¡Ÿž•’•–•‹„€€~x£§¨¦yˆ Ÿ›Ž{˜—´¼©§ªom¤nHUm~ƒŠ‘Ž•˜£©¯µ¼¿½µ®§¬g IHIFFIMPQUUSTVUUXbj6BCHBADEHIJIB:8;A=86422+'T›©¦¢¡¤¤¤¦©«±µ·ºº¸¹º»¼¼º¹·­7OŠ›Ÿž¡›“”–••‘ˆƒ~‡••—•š•’–š”›¡¥‹RRxuwyyŠšž• ©¢ŸŸ¡˜—›œŸ¡ª¯¸ÀÆÂ¶°§®u DOLJIMNOQTUUVVUUTWjx8C;@>?@BCDGF@:7:>>7951/)'` ¬§¤¢¥££§«¯²µ¸ºº¸»¾½»º¹·² q_¤§ž™‹Ž––Œ‹Ž’““—–—‘“—šš™¢°­L`cho’œ£˜œž ¤¢žŸ  £«¸¯¾ÆÈ¼±¨«‡ 5XFGKMNNOTVVVZWXWW^~•:C9:8<>B9:9<:8>BB@@@8;99982.,'#t¦¬£¢¢¢¢¤¦¬¯±¶¸º¹¸º»ºº¸¶°}7 0x¢ ‡‰ŒŠ““ˆ…†††Œ‹Š–•“š¢Ÿ œž¡¤§©¤•Vjyy|…„—ž¢£ §¤£¥©¬­©ª©¦¬¹¿Áƺ²·§™% FE@CGLNQPSSS[]]][br§ÆÆ@A@==::97650,)'#|¥«¤¢£¡¤¦ª¬¯³¶·º·¶¹»¹¸¶²¤h) C|š–ŒŠ‹ŠŒ‹Šƒ„‹‹ŒŒˆŒ“‘‘“š›˜™Ÿ¨¶¸­§žm^rw€‡Ž”£§©ª²µ´ºÁÅÃĸ«¬®¼ÁÁ¼¶»¨ž, 9H>>ADKOOOTTTWY\[^gÃÔÔ6E<;@<846>@>=<;97553.*&'-†¦§¡¡£¢¤§«­°´¶¸¹·¶¹¹·¶²ªœ‚UP{‡„ƒˆ†ŠˆŠ‹‡†ˆ‹Ž•–—›œ˜™œ¢¶ÌÒɽ¬|^ow‚‰Ž’˜¡¦§¬¼ÌÔÔÕÖÖÓ˵­¯ºÁ»»´·§2 +J;=@BFJQTUTRVXY]]hr¨ÊØÖ:F==@;63',=>=:7721/0.*$'@Ž¥§£¢£¢¤§«¬±´µ¸¸µ¶¹¸¶´¯¢‘sBY{ƒˆ„†Š‰Šˆ‡‹‰ˆ‡Š‹ŒŽ“•–’‘—š™™›ž¥ÀÕÙÙÓÊ“arw€††ƒŽš¢£¥¸ÈÙÜÛÚØÖÏ»­¯µ½º´°±¤ž6 A?8:>>DIPUVVSXXZ\]x·ÎÚÔ8D=;50".?<;;61'"#Pޤª£¢¤¤¥¨«®°´·¹¸¶¸½¶´±¨˜†d3"\uƒˆ‹ŒŠˆ‹‰Š…‰ŒŽŽŽ“˜–••—–’™œ ªÁÕÙÚ×ܬ]t{ƒ|„‰“œ£¨¬±ÄÔÙØÖÓÍı§ª°º·¯­­ŸŸ2 4?7;=>@FKQVXVUVYY[`…²¾×ÚËG?@=?HC3,"'0+$$;RYXso8j‡“ ¨¡¢¥¥¨«««±³³¶´²´²¯¬¥—ˆvR)/`rzˆŠŠ‡‘Žˆˆ‰Š‡ˆŠ‘•““”˜š©º½ÃËÑÔÔÖ½jdtqsw~‚Š—¢«´»ÁÄĺ­§©¨§«®±®­¦¢(*65;=BGHLNRY[ZXW\]biŒ»ÍÒʘ=E<=<@FB5.$,E`Y>;Q[A ‹–¡¥Ÿ¢¤¥¨««¬±³´µ´°±³¯ª¡•…rO(5_uyƒ‰Š‹Œ…†‡ˆ‰‰Œ“Œ‹’—¡®¹¹»¸¼ÁÇ̽€blpmuv|‰’”’™¤¥®³±ª¨¦¬§£¨ª¬©¨£¤˜ -..8A@@><;72&!\U8(^a4>[: ?‹Šœ¡¥£¤¤¤©­«¬²²³²­«®¯«¡™lP!7]mrx‚Œ‹ŒŠˆˆ‡‡‰ŽŒƒ…Ž‘”˜™ ¡¥¦¬¬ªªŠfehgptv†ŠŒ”˜¤¨¦£¥¥¡¥¥¤¡¡ ¤''14;BJKNQWZ\YY[_dr˜³¸¸Œc[8A?A==84+$go73sveSr~? H”ŽŸ¤¥£¦¤¦©¬­®²±²±¬«¬¬§ž•Œ~nJ!8[kwx{„……ŠŽŒ‹ˆˆ†…„ˆ…„ˆ‡|~Œ‘”–™›™œœ Ÿ¢£¡†lbejnxv|ƒ„ˆŒ‹’™ž¡££¤¤¢ ¢¤Ÿ¡ ¦y !')1:@BHILSY[WXZ\_h{œ±¯œm^Y2<<=;=87(CX'2~`61/6%W‘‘¢¥§§¤§©¬­®±±±²¯¬ª«ª£™‘ŒjG6\isstxx{‚ˆ‹‰‰Š‡„…„†„‡„{{…Ž’‘–˜—™™šššž›‘mfhnwxw~€ƒ††Š’˜Ÿ¡¡¡ ¡žššŸ£Ÿ¡ž¤g !&+38BCHKNSYZXYW[`h¢§›€b[X.:96221$4X0 be#~m-B7*d’’¥§¥¦¢£ª¬«­°¯±²¬¨§«¨ ™‘Š€kE)Shmmsppso|€†‚‚€‚†ƒ|y~‚‹“•”’’’’——–‡zpgjisuqu|ƒƒƒˆ‹‘–›ž¡¡¡ž›˜ ¡¢Ÿ¤W&,57=@CIOVVXYXY^aiˆ¤š–€b[T.755/.*5`T*)q3,‚€_b7:i“”§©¥¥¥¥¨®­®¯±²±®¦¤§¦”Œ„|i;Kfpoqplfkqu{yxwxy|zvxy||~ƒ‹”–’‘‘Ž‘‘މ{qjiisuqu}~ƒ†‡Œ”–™›žž˜—ž¡¡™ŸD ,/6;ABEKPUTVWYZ_`g†ž¢|^WR:H>942*HA) U„DGlu{oG/y’¦©¦¦¦¦«®­®¯±°®«¦¥¨¥“‰‚n:A]hknkd`fejsuoqosvuuqwy{}ˆŒ–—”‘މ‚{tqkvxvsx€€…ˆŠ’–•–˜œœ›•— œ›š–)(-6;=CFJOUVVVY[^`c|“šŠdZVQ>ME>8=;/,#RuV@cuv_[[$,ƒ˜§¦££¤¦©­­¯¯®±­§¨®«¤œ”‘Œp:9Ykspgb`\`hppjikklmqnqqz}€„“’”‹‹“’Œƒ~xvp}€|tw~|}‚†‡Œ”’‘”˜ž™•šœžžž‹*49;=<;:3<<$JIE3Quya{^0ˆ–§¥£¡¢¦«¯®¯±°°¬¥¦ª§£Ÿ•‘‹‚p1,Seppped^_bkhbghflposquvx}…Œ‘‘ЉŒŽƒ{wtwtyytwy|‚‡†Š’’–˜••—˜˜š™œ~079>>BIJORSUTWV]]brrbVSPK-589773,'1&96@R`tsr‰b40‘Ž•¨¦¤¢£§­¯¯¯¯°®©¡¥¥§£œ”’Œ†o-#H`npohf][dmkgdabhpsrpury~‚‡“’މ‚wurtsw}yz{|x}‡ŠŠ‹’’•˜–—™˜˜››• u *3<>?EGJNQQRRWXZ]chmjaYRNE*/35673+#,3),8!Tjgz†UHs_ŒŒ”§¦¥¤£¨­®¯¯¯°­¦¡¥¦¤¡•‹…f&7Tgnrnnibhusne`ciowtpsvuz‚‡‘‘Ž‘‘‰}qmmrv{€{x~€~|€‡Š‹‘ŠŒ‘––’•—–˜–¤j'3>EBEJOPSQQSRW[]]^cb_WOH>#,/0+,&'(3$9L>R`=,Fd‘“¦§¤¦¦©¯¯°±±±­¤¡£¥¥¤”‘Œ‡b$,LZdppllehuvnc_bit||uqtqw}€‰‘‹‘“’Œ…ymfflow{yy~~}€ƒ‰ŠŽŽŒŒ‰•””˜—™™¥Z!6;CBAFLSQQRRQRVZ\]_`_XPI? #/HBEHF;$ Q›–¨¨¦¦¦©­­°±²²­¦Ÿ¡£¡¡œ•“†T COWhrrpkiruoa_cny~}wsmlrsz„Š‰ŽŒ‡wjehmnv|z}ƒ‚€}„…ˆ…‰‰Œˆ‹’‘—™˜› ¤H 5=ADECJORSTQQUVXZY[\\UOH> #.=<4/&&7EI*/"`™Ž˜¥¦¥¤¦¨®®±²±¯¬¦¡¢¦¢¡œ˜•Ž„K3HJZiqvpksxrh\`lv}}utkknry‚‹†ŠŽŽ‰„sc_egmq~||€€€†„†ƒˆŒŒ‰Œ‘”š˜›œžŸB 0=?EHFGMOQRSTSXXVUWYUPHB<!)0356+%;?.#)'v𗥍¥¥§©®®°²²±°¦¢¦¦¥œ™”‘ƒE"FJNZjuuonuuka_kvwywtjggpr‹‘“Œ‰wdcbikltxwy||z~ƒ…†ŽŒˆŠ‘“”™š ¢¡?  = 9DFHKNONOQRRRTSSQONJA;95=@D>1%"%FbU.<˜–—¤¨§¦ª­­¯°±°®«£ ¥ª¬ª¡š–•i&#>FMR^klf`jssc]iu{y{|zpdhnyy„‰‡‹ˆ{i\^bdeisvriptv|~‚†„‡‘ŽŒ–™™˜œ Ÿ¡H  :81AKNOK>,  "' Dœ–—¢¥¥¤¨­®°±±°®¨£¨«¬­«¤œ˜–[1BJRYfmfbjlup[_kx}~~}skkmsx~ƒ…“Œ‚ob_`dfnvxtmosquz~‚Œ”“™˜›šžžž N$ >HMQONMNMLLMKIEC=;=:90HMJZTH@8$"$*` —™ ¢¡¥«­­±±°¯¬¦¡ª°­¬«¦Ÿš’L(>KXYitiaajtteXcmwz|{qpkhqz€Šˆ‘Šzld`\epzwuv|yvrsx{€†‰‹˜›˜šœ™›œ I.+ .FRQPLNNJJIEA;>>BA><1GLXlgXIHD3"%" s —˜   ¥¬®­±³³´·°¦±³°®ª£<#;BR\cnoednuqm`\fpz|wrhait|„ŠŒ„xgd]^fnwx{ƒ‚‚}€††ˆˆ‹’‘”š˜˜œž››žB*A9) ,CLMKJGD?::<=>FC<;099GU^_NFHE8 !€ œŽ›¡ŸŸ¤©®­°°´¸¼³«³´±®«£œž‚(5>I]_cgmjmtqk\S^ivzyuojflp{„‰ŒŒ|eeeabosuv€„…‚……~†‹‰Œ‘‘“šœœœž:.LI=+ !*3569:;;;>AB?8J_SIG>==97><2 $Ž›ž£¢¥ª®®±°°¯©¤¨±²¯¯¬¦žŸk -BG[cjdfjnsynYSZfqvrzodahit}„………o^^fffkrrw†ƒƒ‡ˆ‡†‰‰Œ’šŸ¡˜˜œ›œ.$CWOG -669B<>===;;@AZtja_YTM=2--&   2œœŒœ ¢¤§©­­°°°®©¤¤­±°±®§ œN*BCS_hfeklpxnZTZcnwv{ujg_fp}ƒ‚€xg\Y_heiqox|€€„„‰‰Š’’””¡£šžžœ”  3ON‚? $/:>:?@?D>>?=?C=OeWXXUTSPIE?565127:9&Wžž›Œž£¢£©¨«­®¯°°­¥§­±²¯­¥¢Ž/ /GGP_igalrspfYRT_iqxxuljb`p{„€|ui\U\ghjrryƒ…‰Œ‹Œ‘’‘–Ÿ¡ž™šžŸ‡ "4<€ ',1:=>?B?@?>@:<=9[zoojhb_]ZZY]bZVTUPK?sŸŸ—‹›Ÿ¡¢¦¨«¬®°°¯ª¨«¯´²®®¨¦q'@EPU^c]aouo`UXT\cozxulegjqy}zwu^RUX^gnpuy€‡Š‰Ž‘’‘‘’– Ÿžš™•žu %,u(04;@DEDFCA@@>;<;r–Œ‹ƒ|tnfb^XVYWTPNMFC¡ŸŽŒ¡¡£ª¬®®¯¯®«©­±³²¯¬¤M ;@KUWZWZfqj[M\^Xhqzxqjcehqw{{zuaQUYYdmmr{{~„…‡†‹ŠˆŽ‘“’•šœ›š˜’¡_  *4:=AHJIGDCA<<:=<}¨ž›˜Ž…€vrgg_[XVSRRHNž†‘œ›¢¢¤ª¬¯¯°¯®ªª¯²µ²°­§Ž2 0=EQTWYafstcW`dgqzzwpigdhpt}zmZSVW[ajln|}~‚ƒ†‡‰‰†”œšš˜——›4  &38>DHJIJDCC@<9==<…´©¨¡–’Šƒvqkd_WXUXJ^•œ™†•›› ¤§¬¯±°°¯®«¬±´´²³­ªw (;APQWX^gnvl[]fkmv{|vriknsxzvebX_^X]bbkrux||‚…‹‹‰‹‰“œš™˜”‰  %47AKNLGEFCC?<;>>@CHG’¾µ´²°¨¢Ÿ›’ŽŒ|kaSPDI…–…Œš˜˜œ¢¨®°¯±±¯¬°³µ··³®¯‹ #&(8AOYVZahslZZdkqu~~zwsoowz~{rjVHOTMIJLTTT[iq{‚‚ˆ‰‹ŠŒ“žœ™•”b  15>BCCCD?B@>@AGID’¿¶µµ´®¦¦Ÿ˜“Œ„uiYSDY‰ŽŒ‘™•–œ¡ª¯±²²±¯°³µ··¶´°³h "#!#2=EOP[dgsv^T_in|}‚~yupqsv{|uqYFDGLHHMMTU[isw}…‰‹Š‹–š™˜–“y77KOPN?* (29@B@DA?BCCBFHJI“À··µ´²®§£™†znbPDgŒ‰ƒ™œ˜›ž¡©¯±³³²®¯²µ·¸¶´³«<  #""# +8BHIP]gpsaUWejw~‡…~vpvvy|xvnYCBCCAIMKU]]enov{€~„‹ˆ‘––——ˆ4Rbgb_gf_YH%  +5;==>ACCEBFMKOM”úº¶µ¶µ¬¦¡›“‰}k]KEr‰‰‚…™™ššž¢¨®²³±±­¯²µµ·¶´¶‘! $5>GCM]cnpeWXbhp}‡…ƒxtrz{vwveYHBCECEGS[f_bhu€€„††Š‹‘—”’‰@JSWcimoojef`P6 ,6;;?ACDFGIMLOJ—ƾÅÇÿ²¨¢œ“‹jZJI}‹‰€ˆ›•–™›¢©­±³³³°¯³´¶¶·µ¸g !+:@CNXagmdWS\cn{†‡~xvrzyxuraREBABDGHQY][dpyˆ†‰ŒŒ‹“–’ŽN@S^t~…†‹…zleab[E$ "19=>CGFJMMOPL¤×ÐÔÔÒÎÄ´ª¢›‘ƒscT=M€„„}Œ—’–™¤­¯²²³³²¯´¶¹¹·µ­7   ""%(7?BJVafie[OSYhvy‚|wtpuqvxi[J;?6=@EIJQT]dsz}„‹Š‰Œ‹’’[-Ydq”›¡œŽxlffgfX;#)4<@BILNRPPM¥ÞרÖÖÒŵ­¡–whWI5Sx|||Œ‘Ž’•—¡«¯³´´³³³µ·»¹·¸‡+9ADN^jpi^RPW]etzytnspssoVOG95018:BAFNQTduw}Œ”‰‹’“g$QER\mŠœ¨¯°¤›ŠypqkfggeR8#%5@DHKMPOQI ÙÓ×Ö×ÔÅ´©Ÿ•†i[L=)Gjwtv‹‡Ž’–Ÿ«¯±³³²³³·¹¸¸·´J  0=EI[hqnYNHOY_iid_fjroig]UJ=206247<@FELRen{„ˆŽ‘ކ\j`=PZxªª´ÃÆÅ¹•„|tskjihZJ96;EJKKMPI£ÓÌÌÌÌÊ¿°¤žŽvcR?,7Wd]c‚ƒ†“Ÿª®°²¯²²´¸¸···“ &4BJ\hsq\PLMSX]\[S^ieged[K@.-*146246?BBGV_n}xqjfJ?rtWHPb—œ¢¸ÊÐÛÝÒ½±›Œœ“ІmicOADILF•Ǿ¾¼¸´¯¤”„yz{‡‰‰“ ¨¨   “ŽŽ–¡Ÿ¡¥­±¶µ²µ… $08DYgkeOGDFHHLNTRT_]`]P #&0,/.''$$(%r¿Üר×˦”Z\_Uar€¢¯ÀÏÙÜÙÜÕÑÖÙÖÙÛÒÚן”€eSG=;BA•ǽ»º¶°ª¤¤­·¿ÂÀÁ¿À¿½¾¿ÂÀ¾ÁÀ¾½¸´³¯¤žž¢¦«ª¦&  #,6F[hcLABHDJKLQPRWVHD/$"&($#:g·Ïƾ¸¹­›kYaY_io‚•¬½ÃÒÕ×Ú×ÖÖ×ÖÙÛÓÝÇ„ —t]TE;5”±°´¸º»¹»»¸¹·¸¸¸¹º¼¼º¼»ºº»½ÀÁ¿¼¹´±¯­©†QRTQJ?2'  ")5CQO<33;=CGJKRVQL<%%  XÀ˲º­{G_kbcS`ns‡”¦´ÀÅÇËÐÐÏÔÛÛÛßÞÍ…|uƒ‹ia[T6’À¹´°³¹»¸º¼¼½¼¼½¼»»¼¼»½¼»»¼¼»¼¼½¾¼¼¾¿½¾¼»½¿½¾¾¼ºµ°¦“wW7  )073,$-46>EHMMMJ:% :*:cG47D?Uq}‚‰“”¨®±´·¸»µ²¹ÇÍÓÕÓ¸„oobeia_Tº®§²¼¾¼¾À¿¿¿¿¾¾¾¼¼½½¼½½¼½¼¼¾¾¾¿¾¼»¼¼¼¼»»¸¸¶¸¹¸¸º¼¿ÁÃû¨„V,  %&#'/8EGIJC;.   &2^bjrrtv†•¤§¯¶»À»ºÆÏËÇÏÀˆzfYZ_`cXб £¹¼¼¼¿¿ÀÀ¿À¾¾½»»¼¼½½¼¾¿¾¿¿¿¾¿¿½¼½¼¼½½½½¾¾¼¾»¼½¼¼»¼º»¾Á³—|^: #09CID:+    3ISX]ZZXXZ[UQRVV[ghks{†’™¡¨žŠ‚eXWWZ^W‚©Š½»½¿¿ÁÁÁÂÂÀÀ½¼¼½½½½¼¿½½¾¿¾½¾À¾¾½½½¾½½¾¿¿À¿¿¿¾¾¿ÁÁ¿¿½º¹¼ÀÁÀ¸¡q: (:><1#   Bagfc]\[YZZ\]`]ZXVTPIGIJEIMNPQX\`\UVTPRNj~]šÂ¼¿ÂÂÂÂÃÃÂÀÀ¾¾½¿¾½¾¾ÀÀÀÀÀ¿À¿ÁÀÀÀ¾¾¿¿¿ÁÁÀÁÀ¿ÀÁÁÂÃÃÃÂÁ¿¾À¿¼¼»¿Ä»—^.  *-*("!##  +?Uc[WWTSUQRSTTWXUZ^YZZ[YWXYYWXUXZ\]dj†‹taMLL<¦Â¿ÂÄÃÅÆÆÆÅÅÂÁÁ¿À¾ÀÁÀ¿¿ÂÀÀÁÁ¾ÀÀ¿Á¿¾ÀÂÃÂÂÀ¿¿¿ÃÆÇÉÊÇÅÄÄÄÅÄÂÂÄ¿¾ÀÄÄ´ŽQ"&*49=>@@@CJMSNG>70(" *BQOPQTWUSRVRNRPSRSOPQQRUVUX\^YZ\Z[[_cmŒ§§•’;:q­ºÀÂÄÄÄÆÆÈÆÅÄÂÁÁÀ¿¿ÁÀ¿ÀÀÁÂÆÅ¾ÂÁÁÀÁÀÂÇÈÆÇÄÀÁÄÇÊÍÎÎÍÍÍÎÍÊËÌÉÈÇÅÅÅÁÁÃÈÅ|$-2;;>BDBBFMPQQTX`_b_acca_[XSPH;0-00/7ERUHDJSUVXUUPQQONMTQ8ILIKMNONRTTTVW[]ahjv©Áŵ¨ª"<§¥®¿ÀÂÃÃÄÅÇÅÄÄÂÁÁ¿¿ÁÂÀ¿ÁÀÀÁÈÆ¿ÀÀÀÁÁÃÅËËÇÍÍÌÎÑÔØ××ÖÕÔרØÖÓÕÒÓÎËÆÇÇÇËÌйE7@ELQXI=EKNNOPTRSUWWXY[YXZZ^_\]ZWVZ^nˆ‘’nVNXXZ[XUQNKJORNMOGLKMOOPTVWUVXY`hlu¦«“ί D~¦Œ›¾¾ÀÁÂÃÄÄÂÁÁÁÀÀ¾¿À¿¿ÀÀ¿ÀÃÇËÀ¾ÀÀÁÉËÈÊÍËÎÓÙÙÕÎÆ½µ³³³¹½¿ÁÃÅËÒÔÕÔÏÓÕÓÍîWF@6%#7FGILOQUVTTWXZ[YYXVWWUQPPOPRX`o†‰’ª°•cGT[XVVUVRQUXPR™TNQOSSVW\[YY\\ae{¡ØÂv¯¾¶sŒ¢‡•¾¾ÀÁÁÁÂÃÁÀÀÀ¾½½¼¼½¾¿¾ÀÃÃÈËþÂÂÅÏÒÉÇÉÎÏËÀ´©¥¢¦ª±´·»¼½¼¼º¼¼º»»º¶¶²®¯¯¬®ªŸ„Y)!2;BMUZ[^XUXXYZ[XVZWVRQPPRW[bjyˆ’¬ÀȲ\AJMOPSSUVYWHR™“QUUVZY\]ZZ]_^foz¥žÉ·°¾Éfn˜¡¤½½ÀÀ¿ÀÀÃÂÀÀÀ¾½¾½½¾½½¿ÃÃÂÆÈÿÂÂÃÅÊÅÀÁ½±£¢¨­±µ·¸¹»¾ÂÃÅÅÆÇÆÄ¿¹¸µµ·»¿ÀÁÃÄÅÉÌÌÁšpR>@LU[ac`\[[`^[YYUQRRRSY`gkt…™±‰q­Ÿ ŽLFKLPMNQQU@U…žyPVWUTRX[\]]\cnv„ŸË½ ÇÇÂÅbr€­ª¼½¾¾¿¾¿ÃÂÀÂÁÀÀÀÀ¿¾¾ÀÅÄÁÃÄÅÂÀ¿½»·¹··µ©¤©®±³µ·¸¹¹¼ÀÂÂÃÄÇÉËÊÊÈÇÆÆÇÈÈÇÆÆÄÄÄÄÅÇÎÍ¿—WAFLU\cghb]`]]][WWXY\bnsx‡›±É³š ªª˜`CLKNOPOP@-q©ƒQTURQNRVVZ]]]jmr ÊбÅÈÆ¾tiff-4.0.3/test/images/rgb-3c-8b.ppm0000644000212300117540000021274011246011152013714 00000000000000P6 157 151 255 ¢45±EK¬=F¶@N¸;R¾;Q¿²#"¯!¶'#¼-&¾,&¿)%À*%À)%¾%%¾&&Ä+'Ã+)Á('Á0(¿;,»<+´^1ºÁX¾ÓzºÊ„»ÏŒ»Óž¿Ø¹¾×¸¼Ô¤»Ó¤¼Ô­½Ö³¼×¶ÀÖ·Àس¾Õ«½Õ«¾Ö¯½Õ³Èå×[\BZ7~•A²Ø²ÐœšÄf—½Vv›@€µV—¾g‘³b‘«SŸžUŸY8œ5"¤:#§@$¤5 ¦=&¤@#˜^)ˆ„7|‘;y¦E…µJ‘¿M—ÄRœÈS¦ÌW¦ÌZ¦Î[©Ï_¬Ñd°Òg­Òl­Ôm¯Ôl­Ñj¦Òh¢¯V¬d;µ[9¨W8wX7dy>o‹Cq›Gr Ks¡Ku£H}­N‡·P‘¿UœÇYŸÇX¢ÊYŸÈX ÇXÄTš=#ºV+³K'´Q&³N1°L'±K$³J(³H&³M(³@)³I(¸P-·M,µK/¹P3¸N4µO5µM3¹R2¹J3¹J2ºN1¹J2ºI0·J.·F-²C+œb/ž¬JµÖrÀÙ¿Ú¹Ö‚¬Çt’¨X†“DˆD§¯P½ÇiÃÏ„ÆÒÉÔ—ËÖ¬ËØ¶ÌÜÁÍáÉÎáÉÌàÃÈÕ¼ÇÒ°ÄЉ»À_œ¡I†¢N•»_¥Él³ØÅÌy¼fE¶&!¶,$»-$¾1$¿.%Â0%Å1&Ç1'Æ7(Ç6)Ç5'È8)Ç7*Ç3(È3'È4'Ë5)Ç<)Ät=ûaÂ߇ÁÛ™ÀÕ£ÂÛ³ÁÙ®¿×ª¾Øµ¿Û¹ÀÙ»ÁÙ¿ÂÜ¿ÀÚ¹¿×®Àת¿×©ÀשÁÕ~j6we*y<˜¸oºÜ±³Ö¬°ÒªÐ†¡Èr‚³H›ÌjŸÌi„·K¸P›Âk•‘I“L,-ž4¡9’> ƒ{2•>‚¨E†´GŽ»K”ÃM™ÆQÈP¤ÍS¥ÌTªÏX­ÑX®Ó\°Ób¯Ôi°×p°Öl±Öi°Ôk¥Ðc¤šK¶[5¢M0nS.kt7y…>dŽ?`’@h™Dx©J¶Q‰½R“ÃV ÉY¤ËY¢ÊZ–ÃV•ÂUŒÃR“9¶O)³L&°W%±W1³Y*´b&¶j,·v-ºy.¸t2µb1¯I*¯A'±C(µI-²N5³J2·L/¹N0·J1¹M.½Q0½N0¼Q0ºN/¸M1ºK0¹E,¤Q,™ˆ;¤¿Y´Øv»Ú‡»Ù„›¸aƒŒ?‡“J¥±X½ÈnÄÏ„ÇЇÊÚÎäœÍãœÍá§ÍÛ²ÏÕµÍÙªËá³ÇÞ ´Â_™¢IŒ¨UÁiªÑoµÒs¹›d¼U9Â:/Á2)¿0'À-%¿.&Á/&Ã1'Ä/&Ä2(Æ5)Ç3)Æ3(Æ4(Ç3'Ç4'Ê7)Ë9+È7*É6+Ç-&Æ;&Ãz@ÊÑ‚Èç©ÃÚ­ÁÚ¶ÁÝÂÁÜÃÁÞÀÀÚ¼ÁÚÂÂÝÂÁÚ¸¾Ö«¼Ó¡ºÒÂÚŠ¤¥^tc/{v5€ BŸÊm½Ý¶µÖ¬¶Ù®¿Þ˾ݢ“¿X‚²S•Âf–Á^‰¸I‘Ã\œÑk™Åb‹z=_ tŒe)‚–=‡¨I‰µMŒ¹I’¿O™ÅM›ÇR£ÊS¤ËV§ÍWªÏ[©ÍXªÐ[«Ñ^°Ôe±Õj²×p²Öo²Ôm­Õi›Á[ªp<–@.nE)~j3†ˆ?nŽ?h—Bv¨J„¶O‹¾V”ÄXœË[£Ì\¤ÊZ ÉX›ÇY—ÁR‹¿QW,»Œ@¸‰2º-¿˜-Àš/ä3Ű6Ç»:Ⱦ<Ⱦ?ƵCÁ•=µV+ª;'¯A+´E/¶C-±=,¯A)±C+³H-³J.¶I,µD*µG.´G/²D.´G/·C.¬8'šP(—‡;œ°R¢¾]ŸH|~8ˆ„>­¶ZÁËrÇÔ€ÉÛ}Ľg¹‹Kµb9·O0¹A8º4>¼<,ÀX;¾uB§?—¹R§Ör¯Út³±Z¬J-§¶*#Á5,Á0'Â-&Ã/%Ä1&Ä1'Å.'Ç2(Ç2(Ë3)Ë3)Ê6+Ë6)Ê4*É5'É8'Ê6+Æ3*Ç7*È:+Ä7+À-"¿H(Ä¥`Ëé¬ÉèÉÅßËÁÝÄÀÛ¹½Ú»¾Û½¾Ú¶¼×«¹Ð˜¶Ë¶Ëqž¤Rsf/„‡:‚‡7…£EœÂQ¼Þ¹Ø¯´ØŸÆäž¼g±Q‘ÀdŸÊ|©Î„“ÀP’Â\ŸÉoÌk Öhu…;Q?ƒ9„¢G‚­P‡´J‹¹H’ÁO—ÆP ËS¥ÍU¨ÎW¬Ï^¨Ï]¥Í\©Ð]­Ò`®Ôd¯Õj®Ôs±Ôs²Õm°Õh”É]‡z?x1%k9%…k4…”Cl›Ep¤H~²L‡ºSÁX˜ÈY›ÊY™ÇXÇY›ÇWšÈY–ÅV‡ÀR’†?ʾKô:Æ·5Ç·3ȵ5ɺ7Ⱦ9ÇÀ<ÈÄ?ÇÃEÇÃGÈÈGƪA²W.¡2%©7(­3'©5&§1#¥.#¤3%¨>'ª9%ª6%¨8&¨8$«5%¨7)©3&¯3(¯2'¦3&˜9&@'tP(n0‰9­®R¿ËfÁÇkÁn?µ&´¼ÆÊË Ë ÌÈÃ%!¾N.µuB·e<¾2&Á$ Â-$Á,"¾+%¾+%½,&¾-'Á0&Ã0(Ã/'Ä1&Å1(Ç/)Ê2)Ë6(Ê5(Ê6)Ê7'Ê6)Ë6)É7)Ë8)Ê8+È9+Æ:+Ç6)Á2!Áo@ËÑ•ÎñÍÇàÈÂÚºÁÚ·¼×¯»Ô¢»Ò‘·Êy°¾a£°[k^2iT&‰~7„~6©J™»I³ÙwÂ⮲Ô~«Ðwl–8’¿i¹Øš¯Òƒ£Êk¢Ê]¥Ëg¨Îz¨Í{¥Ìp¨Óg™¸Q}•={ H¬N†¶JŒ¼M”ÂP™ÅQ¡ËT¤ÊV¥ÌU©ÏZ¨Ï]©Ïc¬Ñ^«Ñ^­Òc®Õi±Õr²Õr±ÔmªÑfŽÁZomƸ6ȼ7Ç»6ȼ9Ⱦ8ǽ<ÆÁ@ÇÄBÆÄHÆÄJÇÆIÊÉKÆ@¦9$™&"›'!+˜0$–H-ž?+›, ˜'š)!—'–#–"ž'!£' ¢#"¢)"§,&¬(%ž5(‚C(ƒ>$‹`0¤¦Oµ±]ÆV<ÀÀ!!Å#!É$!Ì'#É($Ì'#Ì)$Ê(#Ê'#Ç'$Ã$!½¾¿&!Á'!Á) Ä-"Å.&Ã,'À.%Â0&Æ2'Æ0'Å0&Å/%Ç0&È2(Ê5)Ì5)Ë6*É6'É4(É5)Ë9)É9+Ê8+Ç:+Æ:.Ç:,È<)Æ>-À0#½B$Å¡iËç³Å⽿֯ºÓ ¸Î‰¹Êr¬¶V¡¬N‘žYso3qQ&rEwi*ޱYˆ£E‘µI¢Äf›ÄZ‘¾a~®X§Ð„»Úº¢Æg–ÀdœÇa±Ô{®Ñ’­Ñ‘®Ò„§Îv¥Í]•²Lv˜BªLˆµF‘¾M”ÁO—ÄO›ÄPÅQžÈQŸÈR¢ËX©Ïa¬Ð_¬Ò_­Òb°Ôe±Ôj¯Òl¯ÓiŸË_µTRU.0 UD(h”Fu°Pv«Qn¡Jx©K€²Oƒ¶R„·R‚·R}°S~°P€¯L­O„±N€·Ož‰*ÏÅ<ÆÀ:ÈÃ<ÇÃ>ÈÅBÈÆCÆÁFÆÂMÅÃRÅÅ`ÅÅaÈÇYÈÅRËÁM¹a-š $›%•a3‘¡P–ˆIŒT+|R)€d/ˆ_.O,•1%˜–šš  #"ž""¤J/”Z3ˆ4!’c1¥£ZÈ[HÈÃ"Ã$!Ç# Ï'!Ï("Ì&"Î("Î+%Í)"Ë&"É)#Ä,"Â)"Â,$Á+"¿)!Á,"Ã/$Â-&Â3'Â3(Ã.%Ä/%Å0&Å1(Ç1'Ê2(Ç3(Ê6)Ê5(Ê7*Ê5'Ì4(Í4*Í7(Ì5+Ê7*È9)Ç9*Æ<+Ã:(Ã9)Å<*Å7(Â/Àf;ÅˈÁß¡¹Ì‡´Äk«·U Ÿ@•Arg8x}Žª[‹¤T{žAt¢B{«E­F‡«FŽ’B”e5›7&Ÿ¡!¦"#¤!#¯O1 Y3‡1"xF¾oUÏ$&Á ÂÆ#!È%#Ê$"Î'"Î$!Ë$"Ë("Ë)#Ç(#Ã% Å& Æ%!Å+#Æ,"Ã)Ã) Æ,&Ä+&Ã0&Ã1'Ä-%Æ0%Ä3&Ä1&Ç0'Æ1'È3*È3)Æ3(È5*È4)È4(É2*Ë6*Ê2)Ê5)Æ7(Ä5)Æ7)Å9)Å7(Ê9*Ë=*È:*Å."ÅI%ħ[·Èkª­K§’=‘^+tf5z†HJ€‚=s_*{>–Æf„®KšÅZšÅ`¸J«Ñl½Ü®±Ï–³Õ ¼Ü½ÀÚ¶˜¸bžÄ{ºÜºÂÞÒ¿Ýͷת°Ó}ªÏe¦È_}¤D‚®C‚²Hˆ³IЏH½K’ÁM–ÅQœÈW¥ÌZ¤ÌZ£Í]¦Ï_©Ð^ªÏa©ÐeŸËc“ÆZ‚¸UhG;!)^@wµS~¶R|¶Ts¦PkœGn¡Hv§M{¦M{¦Lx¨L|ªM®N…³Q‹¶R€ºSšŽ/ÍÍGÅÈGÇÌRÈËVÈÎ]ÉÑ€ÊÙ²È×¶ÉÞÄÊßËÉÑ•ÊÊ\ÌÅFξC¾e/™C)ŽQ„ŸS{žDz«D~±G…µIЏM‰¹N‰¸N‹¹N¡G™Y2“‰)…-X6ªbË12Å Æ!"Á!Ç# Ì#!Î# Î&"Í'!Ë'#Ë'"É& Â$!Á% À$¿%"¾'"¼%»'½'¾)#Â+'Ä-&Â.&Â,%Ã.%Ã.&Ã-&Å-%Å.'Å0(Æ3'È2%Ç2&Æ4(Ë5)Ë4)É5)Ê5,Ë6,È4)È6*Ä4*Å7*Ã6(Å7*É9*Æ7)Ä;)Æ7'Ê>%Ã|9`.w3n7ŽŸ`§Y‡Nƒ‰@|W)y…6•É^„¤H‡ª>¯Óm´U‡°A©Íq»Ü³½Ý½¾Û¨®Í{­Ïw¶×˜ºÛ¾ÅàÔÄàÒ¼Û´´Õƒ®Ïj¯ÐaŒ²Nw¤A~¯H‰µK޼J’ÁN˜ÄQ ÊU§Î^©Ïb©Ïa¦Ðb¨Ða©Ï\¨Ñ`ªÑd›È^ÂZz°R_r9,)'h¥Jx´R{µQ}¹Tz²To£Mi™Iq¢Nw©Oy¨Lx¨L±O†·Q½U–ÀUˆÂS©’4ËÐLÄÉKÇÎSÇÎVÇÎZÉÐ`ÈÍdÅÊlÄÍ…ÆÎ“ÈÇmÈÃIÌÂDÌ”6¨9!‰6!…G„ S|ŸAz¦A„³F‰·G‹¸J‘¼N“½P’½P’ÀTÁP¶O`5L 8*HŒŽ]Ìh]É"$ÁË"#ÂÅÊ! Ë%!Í% Í$!Ì$"Ê$"Æ# Ã%!Á)"À& ½%À) À'½&º&¿( Â+%Ä+'Æ0(Ä,'Ã-%Ä/(À.&Á0&Â0(À0'Á-&Â0%Å0&Å0(Ç1(Ê6+Ë5)Ë4+Í8,Ê6*É7+È5,Ç6)Ä4&Æ7)Ê;+Í;*Ë9'È;)È=+ÕB,°8%3_W0ž»~‚ŽM~ŠB€€;xZ-rd/‹¶N„¦E|›=—¼V—¾Z†­H‡ªG¸ØªµÕ–¨Ì{ªÏŠªÏ‘®Ó¨¹ÜÆÀÞË»ÝÁ¹Ù¤¸Ö…²Òu¬ÐbŸÅ[~«E„·M޽O‘ÀM—ÄOÈT¤ÌX©Ïa©Ðg¨Ðf©ÑeªÑc§Ða¢Î_ Í_–Å[‰¹Uv¤LUW.*@F!r¯N{²O{³O|¶S}³Ny°uq¥–m¢hu¦Ly«M{®MƒµP‹»S”ÁW›ÃV‘ÆT°”8ËÓQÈÊLÈËMÈËMÇÊMÇÈKÇÉ^ÄËŽÄÍ¢È×½ÌÖ¹ÊÆl;EÊt/r dr7…Hz¢C{ªC‚³I…¶IйK½O‘¿Q’¾U“¿W¿VÁTÂUŒ­QQ'-fR/ªhÖIMÉ Æ!Ì"$Ì"#É Ê"Ë&"Ê&"È""È"!Æ$"Ã"!Â$#¼(!¿&!Á& À&¾#À À# ¾' Â)#À("Á,%Æ/)Æ-&Ä+%Ã/(Â.'Ä/'Á.&¿*%À+&Ã0(Á.&Ç3*È4+Ë4)Ë4)Ë5+É5*È6*É4,Å5+Á3)Â7*Å7+Ç:*Ê<,È9)Å8%Æ:)ÐA-¥6ŒP‹«l‰J‚=“v6‰M(x[.s3‡‰7žA‘µQšÀ]™¿`—º^«Ì|©Ï{«Ò𳨾½ÝÍ¿ßÔ½Ýѹܱץ±ÕŒ¶Ö~·Ö€¬Ðh©Í_޹M‹ºM‘ÀR—ÅR ÊS¢ÌW§Í]©Ïd«Òf§Ðh§Òf¥Ñc¢Î`Ë]•È[ÁZ~®QjŠ@G06Xk1p´Qx³Pu³Oy¶Qy´R|´¦~³³sª™s¦H{©K|­N°P‰·P½TšÂWÅSŸ”8ÎÐNÇÇHÉÉGÆÇFÇÆAÇÅ=ÇËjÉÚ¿ÊÚÅÍßÄÍÛ·ËÌs̱?ÂT%l …T – I}¢Hz¨D±G‡¸J¼L½P‘¿Q¿S¾X޼[޾VÁU‡½S|ªKi:"n †ˆT³}bÖ@IÅ"#Æ É!$Ä É !Ë##Ë$"Ë#!Ê$%Ê%"É'#È(!Ã%!Á$!¿$ À%!¾$¹'$ªW:¾NEÀ&À'#Á+#À+&Á/'Ã-(À.(Â.)Ã-(Ä-*Ê00Ç.-¿/(»)#»,%Ã/)Â/)Æ6+È2*Ë3*Ì5+Ê6+É4)Æ4(Æ6*Ä5(Â5(Â7)Á3(Â7(À7'Â9(Ä:)Ì?+½\5{H‚d6]0‡T+‡Z0Œ†HŠe.Ž—@”µO•Á\™Åb¤Ím¬ÒzªÐ©Ï…±Ö©¾ßËÉãÙÉâÚÂàѶڴ¯Ô–°Ò‚´Ô}¸×‚²Óo¯Ð]ŸÄSŒ»M’ÁR–ÄR¡ÊW§Ì[«Ïb«Ñf«Òg©Ñg©Òf¦ÐbœÊ]”Ä]ÁW‡¶TsšI]X)8 ? e€9q³Pv²Qs±Qv´OwµLy´w{²š}°ru©Kq¦J{¬M~°O‡¸QŒ½RœÄU’ÇS˜’1ÒÏJÇÆEÉÈDÉÇFÊÈAËÈBÉÇJÈÓÉÙ¥ËÒ†ËÏmËÇSË€0ª#†/‘ƒ5„ Hz§I}±M·KˆºM޽N‘¾O¼O¼[–ǛƓ¼h‹¸R}±Mn‡;i)• –Y6’¬l½oYÕ7<É"Å É""ÃÄ!!Ç$#É" É#!È$%È#$Æ&#Á$ Â$ Â$"Å&$Á'"¾&$—pB} Q’–}·siÇ4*Å,$Æ.'Ä,%Å/'Å0)Â0(Ã//È36Ë48Ë26Ä3/¿+%»+%·'&¹*%¿0(Ã/)È0*Æ3)É4+É7-Ã3)Ã3(Ã7(À7)¾3&¾4'¼3&¼4'»2'Á6(Å;+É5'Ë;&ÇG,¸R-›P+Že4r7‡y0Ž£@•µIš¿PšÃU É^©Ím¬Ð«Ò’±Ø­¹ÝÀÀàÉÁà˺ܹ²Ö™¯ÕŒ¯Ó€³Õz·Ö{µÕs¯Ñc¥ÉU“ÀP—ÄU–ÃTŸÇ]¥ÌbªÏi­Òg¬Òi«Òh©Óc Î_“ÃWŒ¾W‚³St¤Kgr5?$@ a‘Bn³Qt²Or±Qx³Nz¶Pz´P{³T²Uy¨Pq¡Hy¨M„³Q‹ºR‘¾T¡ÇV•ËW™”1ÕÑDÊÈ@ÌÉCÉÅDÈÃ>ÈÆAÈÅCÇÅDÆÆLÈÁD˾@Ì4»; ž#™o/šA{@|©EµM†¼LмN¾O‘¼OŒ¸T˜Æ’»ÝÔÃàÚŸÇ|­Lp˜A\@Fv,Š–N“¡dÄ\NÖ05Ë!"È!"É"#Å Å !Ä "ÉÉ$#È%#É$#Å%"¾"!À#"Ä(&Æ+(È$&­Z?z¢O†ªvªÏ¸«·¿;*Â)$Â/)Â,'¿+$Á-(Ç/-É18Ë6<Í:>Ì6:É52Ã0'¿)$¿,&¾-%Â.'Ç/(È1+Æ0(Ç2)Ê3+Ç5*Ã5)½3)»2'»4'¼1%¹/%·3&·3'·6)»6(¿4'Ã7&Ê9(Ñ@*Õi0¿…9™c+Œp/˜;“®B™¼M™ÀSžÇ]¦ÌkªÐ}­Ó“²Ø§µÚ«·Û­¶Ûª°Ö“®Ó­Óx¯Óv³Ôu´Ôq¶Öy¯Òk«ÌYœÅUžÆXÆVÉX¥Ë]©ÏgªÐc­Òh­Ñg©ÓcÊ\½S„²Qy¤Li};M,( @#cŸIs²Py³Qv°Ps¯Nt±Pz·V}´S~³Wt¨Qm¡JwªQƒµT½U•ÃX¡ÆV”ÉW™Š1ÐÆ?Ç»8ÉÀ=Ì¿>Ê¿9ǽ>Ç¿@È¿BÈ¿CʺAËŒ4¿B!–“=“7œCw B}­Eƒ¸N‹½PŒ½O޽MŠ·N’À†¼ßÕÑêãÍèÕ™Àwo™?aT$=4so5†¡R”WËMHÑ*1Ê!'Ç!$Ç"%Å!#Æ"Á"à #Æ!#Ç!#à !Á" Á""Ê()È-,È)&Â30—T‚²^­Ðµ­Ì–­yCÅ' Ä.'Ã+'À)%¿*%½*&Ë30Ì6;É6;Ê4:Ê26Ä/,À-)Á.*¿,(¿,(Â0(Ç1*Æ2*Å/)Ä0'Ç2)È5+Ç8+Ä5*À7(¿5&¾2#½3'»2&º1&½5)½4'¾4%¾2#Á2$Â5'É9'ÓS,Ïq4²z3•8¨A—´Kš¿SžÅX¨ÍhªÏvªÑ€¬Ó†®Ó~±Õ¯Õ‚°Ôx°Õs®Ón±Òt³Õx¶×s¸Ø}´Ôu®Ð\›ÅXžÈZ£ËZ¢Ë\§Ë^ªÎd©ÐfªÐe«Ñd¥Ña½W}¬OsIey7G.&!!A*i¥Lt²Ry³Py¯Qy®Px¬K~´P}´S„·Vx®Up¤M{¬Q„´T‰¹SÁWŸÇY”Ë[sk+„Ž4….‰–5 £8º´;Ë¿B˼AÇ»?ɺBÉ–4¿I#œŠ“q,‚™;yŸBw©D|³Kˆ½PŠ»P…ºP„µQ‡¸u°×ÇÍéÞÐëÖ«Ét‘>fZ*C (T@‚¢Fˆ©P¡RÐ@=Î'/Ë"(Ê %È!%Å "Æ!"à #Å#"Ç%#Ã'$¿!"¼ Á"%É*0Ã..É)-£kK~«W›Â‘µÕ­ª·iÂ<*Ã&#Ä+'Å*&Â*%À*&¹'$¼+'É34Ì46Ë05Ç/.Ã/)Ã-)Â-'Â-'Ã-(Á-&Ä0*Å1)Å4)Å2*Ç2)Æ5*Ç7*È8,Æ8,Ã5)À6)Á4(À4&½4&À6'Á6'À2%Ã3&Ä5&È6&Ç2&Ç0$Ê3&ÏE)Åv1£«>“³H™¼PŸÅX§Ëd«ÐlªÐm©Ïh¨ÑbªÐ_­Óe°Õl°Öt°Öt´Õv´Õs¶×s·ØyµÖy¬Ó\šÆW™ÆZ¥Ï^¥Í_¥Ì]ªÐ^­Òg«Òe¦Ð_šË]{¬Mi‹?ac/E##!;(m¥Jo¯[x³Zv°Pw±Qr«M{´R{¶T€ºU¹\x®Uy«Q…¶WŠ»U‹½T–ÁVÇ\^d!b1g3k—7m›;xœ;™«A¹¶DŶ@Ä/¸G™uŠHŒ–;tš?s¥Bz¯F†¸MŠ»Qˆ·N‡·T–Ä­ÕÃÉæÚÊéΟÀq~2bHH *@ }Š>ƒA¥J/³/*Ð03Í&/È!(É 'É %Ç!$Ä!à Ä#!À!!À ¿!!¾! Å$(Ç21Ê/1¸XI€—V‹¶l³Ó¸¥Ì´j; !Ã*%Ä'#Å,%Å.&Á*&¼(&º+'·(%Ä--Ê23Ä-,¾+'¿,$¿+%À-'¿,(¿-(Ä/)Ç1(È4*Ê5+Ê3*Ê3)Ê6*É7,Ê6+É9*È9+É8)È8(Â3&¿5&À6'Â3%Å4'Å5'Ç4&Æ4%Æ4'Å31Æ1%Ê- ËY(¶«?š¿O›ÀU¢ÈZ§ÎY«Ð`¥Ï\£Ï]£ÏW¦ÐU«ÒX­Ôh­Õq°Öt²Õm´Ör¶×q¶×s¯Ó^¤ÌXœÈW¦Î]¨Ï_©Î\ªÑZ¬Ób©Ñc£Ï`ŽÂWh‚8SC@&-kBv±Vz²Wu²Pw²Pq«My±N{¶Q¹U‚¹[|²[|¯R„¶S¾U‘ÀUšÄVŽÇXfn#n§;y©=y¬@w®?{¬A|¨B‰ªA±A¨†2“ gy"”€6z™@lžBs©B~µM†¼Rƒ¹O€´Kˆ½m¶ßÆÌëÚÀåÂ’²mfo,W6?+'ƒV:½Z=¿ !µÆ*2Í+1Ì%.Ê")É (Ç!'Ç!'Ç !Á!Á "À "¿!º »Ç..É25ÃNB‹”]€§UšÃްנ¥§WÂ+$Ã&#Æ(#Å'$É/'Ç/(Ç,%Ç-(Ã.'½,%»)'Ä.*Ã+(À,&À,#À,'Á+(Â,&À-'Ã.*Â/(Ä1*Æ3)Ê8,Ì8,Ê6+É8-Ë8-Ê7+Ë7+Î>,Ð>+Í9)Æ4'Ã=(Ã6$È2$Æ6%Æ4&È2&Ê4&Ê2)É3"Ç6"É)ÍA ¾¦HÉYšÁS¢ÉU¢ÎYšËWŸÎX£ÐT¢ÏS¤ÐV£Ñ]¨Ôj­Ôm­Ôg°Õkµ×kµÖn¯Ób§ÐW£ËY¥Í^«Ò`­Ò`«Ñ^©Ñ`¥Ða Ð]…µPO?1+ c‰;s³Ru³Rt²St±QqªMr¥Hv­M|¶T€¸Z…¸`„±Uˆ¶R‘ÀWšÅV§ËX˜ÌXrt(m­>v¯A}³E€´A„µFºHºF޹GŽºJ…f*aY(Š™Gr˜;t¨C}±G…·Qƒ·N~³K}²Sƒ·aŸÈ‡ªÏ’~¡U_Z!N 8*$C;ÑB=¹­¿*2Ë8=Ë%-Ë%.Ê$+É!(Ç!&Å"(Ç"# "Á "Â!"Ã#À"$¾!"Ç+,Ì>:™qLqJ–¼t£È˜ Írµe:Á!¿+&Â)%Æ,'Ç.)Æ+)Æ*%È-'Å.(Â*&Ã*'¼*&½,'À-'Á*&Â,'Ä,(Å,'Á+'Ä.(Ä1*Å1)Æ3(Ë5*Ì8-Ì8,Ê6,Ë7+Ê9,É8+Ê;*É9'Î;*Î:+Ë8)Ä6&Â2%Æ5'Ç6'Ç5&É2$É3#È1"Ë5#Ë5$Ç, Ì>%®J›ÈQ–ÃQœÊV›ÌY›ÌW ÐWžÐXŸÐW¢Ò_¦Ôi¨ÓlªÒb­Ôf²Õi³Õh¯Ôb©Ñ[¨ÏY¥ÍZªÑ`­Òc±ÔjªÒa¤Ïc›Ñ`r’?% !$ax0r±Su±Qv³Qs°Us®Si¢Lj¡Iy²Q·V€¶^~²Vƒ´Q‘ÀV›ÆU©ËVÏY{|,r³?{²A„¹G¶B‡ºF޽I‘½I—ÁM•ÅO‹µG}Q"~p,r›CmŸ>x®D€¶I{±JtªIv®T„ºn†¸cw¡Aj…2]MI6,ƒ3,Ý=8¾³µ Ê:@Î7>Ï(0Ê$-É"+Ç"(Å 'Ä"'Ä#$À!$½!"º!¾#» #½#Ã'¯gKt{I}™Q¡ÃˆÉ…£«YÁ.%Á'#Â)$Ç+&È+'Ì1*Î.+Ê,(Ê-*Î.,Ì3-É1(¾,)¿,)Ã*&Ã*'Ã-)Ã/)Å/+Ã-*Á+(Á/)Â0)Á/(Ç2*Ë4+Ê9,Ê9+Ê8+Ë:,É:*Ì9(É8)Ì:*Ë6(Ì9)È6%Å6&È5(É6&Ê5&Ê4'È5%Ê3$È2#É5$Ë6$É0"ÎE$º¶F—ÉPšÇSœÍWŸÏX ÐYžÎYÏV£Ó[§Öe©Ôh¦ÒZ¬Õa±×j°Õh°Õe­Ó]©Ñ[¢ÍY§Ñ_®Ôg®Õk«Õi¤Ñ`•Ð^Zb)"&Q\$i¬Nq­Ot³Su¯Uw°Tq©LlžGx¬O·U·[´]„¶TÀUšÅVªÎX¢Ò\x0x¹C{³@‚ºH‚·EŠ»F¾I“ÁL–ÂK”ÂM‘ÀOƒ™Àº¹Æ-4ÎKMÏ·B„¹E†»E‰¼D‘ÁK”ÂL’ÂM“ÃO~ªDb2g˜=r§Br¥Dw®lœÊ°ÄçګѤ¨Qo€5U3D /'!;ÉSLÒ1/Ã!&À"Å$+Ê;@ÎKJÍ7<É",É",È#-Æ+Å (Ä&Ã!$À$À½ ·#¹ ¿'(—sLewA¦U›Àv™Ìq­ŠIÆ%$Â&$Á%"Â(!Ç)%Æ)%Ë.)Ì-)Ë-(Ì.*Ê2)É+&Ë.)Ê0)Á,'Å,'Ç.,Ã,)Å0,Æ0-Ç.,È0,Æ1-Ä2*Ã3+Ä3)Å4(É8+Ê7*Ê9*Í9)Ì9+Ì8(Ì8'Ê:(Ë9*Ë:(È8'Å5%Æ6'Â3$Å5(Ç9'É5$Ë7%Ì6%Ï7#Ï8%Í4%Ï6$Î/"È‚4™ÐSšÈVÍXšÎU—ÌUœÎS Ñ[¥Ó[§Ó_©Õ]«Õ^®Øc°×g±Ùf°Õc®Öb§Ò\¢Ö[²áe±Ûc«Øc Ö`‡´P@ ##)+-<C Q*^K'kw:k™Hl£Mo§Kv¬Ps¨QqªTdœH]Bn H€¶Y}°X€´RÀWžÊZ«ÏXžÑVix&q®:s¬;€·>€¹B„¹AŒ¾C‘ÂG—ÅH•ÃMÂL~²E]…0gš9p¤Dƒ¹†µÝÐËëÚ±Ó¢y”I_b#N! <+&%$¤UJÞTJË./Ç#)Å!'Ë/4Í9>Ë25Ê*0É#-Ê#.É"-Æ",Å"*Æ &Æ"'Á"'À"¾!¼$¼ ®VCs‚Me‚Aƒ¯`£Ë…Ÿ»e¿F6Æ%'Ã''À$$Ã'$Ä'%Å(&Ê*)Î.)Î/(Ï.)Ï1)Ñ0+Ï0*Î3*Ç,(Å,(É0+È.*É/-É3.È1.È0/Ê5.Ç5.Æ1+Ç4+Å6)Ä5+Æ3+È7,Ë9)Ì:*Î;+Ï9*Ë9)Ë:*Ë9+Ë7'Ê7'Ê6'É8'Ê3.Ê8'É6%Ê4$Í5%Î5$Í7%Í4&Ò8&Ò;'ÓA$Á¯@˜ÌP•ÇS™ÉQ˜ËS˜ËS›ÎU¢ÓY£Ó\¦Ö\«×[­Ùb²ÛgµÝe¶Þg¯Ø`ŸÎXƒ¢Dy†=s?m‘AoGqžImƒDh_4O$CS YcG$m€>j›Ho­Sj±Tg±Wj²Xj²Ui²Wl°Zo­Wk¤NaFe—C|²V}¯U„³N‘¿UÇY®ÎX£ÒWcs%j©6p¬¸@€·@‡»@¾A–ÃF‘ÀIнHµKd“9k¡7„¸l¿ãÑËéΣÆo‡8^NO :,)#SÜtaÑE@Í/3È(,Ç#*È(/É+0Â#&Ã%+Â#+Å$.Ç ,Ç#+È#*Å#(Â"&À%¾ #À#Á!À))“‹Ym“L¬PÄxÎu®{FÆ(-Ä++Ã')Ä'%Ã%#Â&%Á'&Ç+'Ê,)Ì,(Ï.)Ï2+Ð1+Ð2+Ì0*Ë/+Â-'Æ-)Ë1-É0-Ê/-É1-É40Ë4.Ì5/Ì4,Ê6.Ê5,È5+È7*É9-Ì9+Í8*Ï7*Ð:*Ð<,Í9)Ì9)É8)É6(Ê6'Ê8(Ê6'É8'Ê6%Ë5%Ì7%Ë8$Ð;'Ñ8+Ñ5%Ò9&Ñ6%ÔT)É6 ÈM’ÅP—ÈS–ÉR—ÌS›ÑV¤Õ[¦Ö^¬Ù_³àb¯Üb¢ÑX‘ÀR~¯Lg›CKT(FI$V|:UŠ?[”CbœHsµ]„Åk„·cŒMpZ2OG#Ux6a–E_¡Gb­PmµVp¶Xs¹Ys»]p¼\t¼aq¼`n¶[kª`iŸK{¬Uƒ±V„³O‘¾RœÆW­ÍX¢ÑUht'j¨7q«7x³:·=¸@‰»C¿E“ÁIŒ¾F„ºD~µJf˜9o¦=ÁqªÏ˜³hhƒ6^HI3+$#9'ÞbQÐE?Ì./É#(Æ&Æ %Ä!&Á#À$Å!(Å)È *Ä!*Æ )Ã"(Â!%¼%¼#½#½«VCz›X}£I»g¤Í‹ Åg½Q8Ç+1Ä,-Ä**È)'Å($Ã(#Ä)%É,&Ê-'Î/(Ï1)Ï1)Ò2*Ñ2+Ï0)Ï.,Æ*'Ã,&È0+Ç/+È0,Ç1.Å41È2/Ì5/Í7-Ê7.Ë7,É6,Ê7,É6+É7+Ï8*Ò:,Ñ=,Ð:*Ñ<+Î<)Ì;(Ë5'Ë8(Ì8(Ê6&Ì6%Í8$Ì5$Ë5#Î8%Ð9&ÕK5ÖA.Ó6&Ñ6&ÒF'Ö@%È}2—ÇKÀO”ÆP“ÉSšÐY¡Õ]ªÜa«Ýa–ÉW}°NoŸDgŽ;`‡:[z2Rn.Wu4\8b>i Gj§Ms°Vs°Yw¸_ÇlÂdp¦TWŒCYšEe¯Qlº[r¾`n¹^p»^v¾gu½fy¾bvÀfyÂfp¼`i²[mªV~¬Tˆ±O‘¼P–ÁS¦ÉTÐVqz-l¬Bm¦6u³:zµ;}·Aˆ½GÁGŒ¾F…ºE}µDp–6]gpš3„±H}¡y¶@¼E…¾G„¼H|¶Gv±D]U!4S;gh$ja"Z3=1-&#pk4·ŸRÌ4*ÍC<Ì12Æ")Ã!&Ã#Á"À"¾"¿"¾"Ã(à 'Á&Ã!)Á!)¿!(À%À%½²J9w’Us›J޽]ªÍ¨Ö{±IÃ-(Ç73Æ32Ä*)Æ*)Ç('È)%Æ)%Å+%Ê-%Ê-&Ì.(Ï1)Ò/(Ô71Ø=<×>CÏ68Ä+#Å0)Æ0,Ç/*Ê2,È4.È2.È3/É4/Ê5-Ê7-Ë8.Ë7,É7*Ë6*Ì3)Ì=*Ï8)Í6(Ð=+Ò<+Í:(Ì;'Ë8(Ê8&Ì8'Í8(Ê5&Ë5$Ë6#Ì6%Ñ6%Ó:'Ñ7&Ñ7%Ò8&Ñ;(Ò?%È0#Í0 ¿“5‚¿JŠÃN’ÏS{®Fi†1`p+^_$`^&ap,m‹g¡Hn®Pt·Vsº[u½`y¿^yÀcvÃjÆqyÀh{ÃfÁdi±Sh¶Xq¼\t½dÃvƒÃ{Å|…Ä|†È‚ÅryÀjw¿hxÃjp½emµ_z®V‡´QŽ»Q‹ÀTv}5k­Fh¦5s³>w´Bz¶BºE}·H}´Cw´Bq’6S *09?3+&",$$w])ªÏs¸|IÇ$"È31È(.Ä!)Ã%Â%Â# "Â!$Â#Á#Á'Æ!&à %Ä%Â%¿"#Á$Â%Á" OtœS~­O•Àm¡È~¦Õp·u@À++Ä74Ä41Ã**Å'*Æ('È(&Ã*%Å,&Ê-%Ë.'Í0*Ñ2*Õ4-ÙIBÜ^TØqh×_eÌ2/À+%Ä-*Å/+Ç3-È30É1/È3.È3.É3.Ë6/Ë7.É5,È4*È5)È3)È;+Ë9*Ì7)Í:*Ï:)Ï9(Ð;+Î9+Ë5)Í7'Ï7&Ï7'Î6#Ï6%Ñ6(Ñ7&Ò7'Ô5&×9'Ô;(ÖA(Ñ8%É4"Ç2"Ò:"®Ÿ:v®@o/Z[#W?Z6W2^G#cw.n;gŠ8\|2Z€4b“?o©IwµSz·Vw¼]{Àc}ÀbxÁewÄl„Éu€Ån|Åi‚Åi€Ábp¸Zs½]{Ákň‚Ç—‰Í‹Ë–ŠÍšÈŠ{Å{zÄs}ÆttÀkwÀhuºe±Y‰´Q‡¾Pjt+dª?h©7p°/Ò7*Õ9*Ö6(Ô8(Õ<(Ô<&Ñ5%Ì2"Ë4#Ì."ÕJ&IAJK Y+b;eM&bg*hg,eg)[~2\6Ú@8ÛM>Ù‚m×xyÆ,,¿,#Ä,)Å-+Å.,Ç/.Ç2-Å0+Ä1,Ç4,Ê5/È3*Ë3(Æ3'Æ1'Ê8)ÇK,Ì3'Ð6(Ï6'Ñ9)Ñ8+Ô?.Ò=,Ð9)Ñ4%Ñ5(Õ5+Ô=2ÕF5×D;Ô81Ø<+Õ9(Ò:'Ò9%Ð2(Ñ0&Ë3#Ê3"Í."¿1 98U d-j;"lG&n\-hQ&e\(^}1c“:e¡Be¬IhµPo»Uo»[sÀawÃh|ÅmÉp‚Êl‚Èr‡Ëw†ËqÈlƒÅk…Ét‰ÌŽÎ¦–Ó²¦×»°ÛªÙÀ¢ÖºÏ¢„ÇŽƒÊ˜‚Å’~„Åv~Àm…ºd†·Upj%i¦_~*b^#S-V [ K@AT\^b^oO •Àf›Àu”µ_„¯M™n9ÁÁ"Ä"Å(Å (Å"&Æ$Â$Â%Á$À%Ä$ %Á$À#¾!$À"²UB†•ZiˆG~ªX€±P¡Ë|µÔ§·Ó©¬Ù‹´~L¾0-Ä>6Å50Ç,.Æ..È+*Ë+(Î0(Ê/(Ì/)Î0)Ò3,Ô4,Õ1+Ö7.Õ3+Ò1*Ó3+ÔC4×zpÈ7>¾+ Ä-)Ä-*Å0-Æ/,Ê2,Ê6.Ê4-Ë4-Í60Ë4*Ï5+Ì5)É4)Ï1(Í6)Ï7(Õ:*×L9Ԁς{ÏY\Ò?=Ñ6*ÖSDÑuYÔhVÓuÑŽÓ›‡Ú^OØ:+Ó5&Ò9&Õtf×NHÑ4$Ì0$Ë2$Ð5%Ê4!F:R r,|G(m@ hK&fd-a}3]7e BfªKo²NpºVr»XxÀ[€ÄeƒÆkƒÆn„Çt‰ÉyŽÌ‘ЇÏˆËv…Çk–Ж’ЩŒÍœ‹Ì–Ä…ÉŠ‡Ë’ŠÌ›ŸÖ¹¯ÚʸÝÔ·ÛԗЬ„Åy„¿lŒ¼d™?ªËW¦¾L§ÀQµÌw³Çg­ÀQ°ÀU°ÂW¯¾P¬°L££GšŽ9‡\'g QUgdc †£LžÆw–ºn¯T‚ªH’ŒK»" Ã$Ä!(Ä'Â%Ã&Â!%À#¿#Ã!Â#Á#Á%Á#Ã$Ë"®C4˜[|žUs“M†³W…³PÇv´Ô¦¼×µ²Û˜´°hº<-Á82Á0/Ä-.Ä+-Ä*(Ê+*Ì.+Ç*(Ì,(Ï0*Î2,Ï/-Ô4.Ø71Ô4-Ò1)Ò2+Ô,&ÖeNÑgiÁ&!Â.'Ã,)Ä.*Ä2,È4+É3.É70É5.Ì6/Ê6,È6+Ê5)È3)Ì4(Ñ6*Ñ8,Ó7(ØV>Ñ¢ÍÁ²Ìøϖ”ÑIHÓcV҆ЕŠÎ± Î« ÒžˆÛoaÚ:,Ô3#ÒB+Ò–…ÚhgÖ91Î0&Ê2$Ê3!Û@%Ž.LY a"d2kL'_].]€6ZŽ:^De¨Gk±Lo¶QuºX}À^„ÅfƒÄm‚Åt‹ÌŠË–‘͑ΕŽÌ…‡Êz…Æi—ΘҺŒË¥…Ç‘y¿xyÁvv¾o{ÁœÓ²¿àÕÊâÜÍäà²ÚŌLJ‡ÀnÀi©šJÄÙe¿Î\¾Í[ºÈU»ÊW¼Ë^ºÉ^¹È_·Ç]¶Ç\²ÂW¨»J£´Dš6$_`]p]"—Âiš¼r”¹c‹«L~¥C‹¤V¶2'ÀÆ#*Ã!(Ä%Â%Â$Á#¾!Á!¿#¿ Ä$Æ&·'*‹,!s{PxœZoIx¨R½[‹¹V›Ån²Õ£½Úº·ÚŸ·Ë‚¼I6¿--À2,Ä))Å)+Æ*(Å**È-.Ê+,Ì.(Í1+Î2,Î/,Ó2-Ø71Ö60Ó3,Ò4+Ñ.(Ñ3'Ô{oÂ49»'!Ã.+Ä0*Ã3*Å1*Æ4*È9.Ê9/Í6,Î9-Ì:+Ë5)Ë6(Í7(Ñ:+Ó:,Ð7%ÖW8ÐÆ¨ÎÙÌÎÓÄÍÐÄΦÑμªÌ˽ÍʾÎËÁР”×taØ@/Ô3#ÑF3Ñ£ŽÚ…wÚZTÓ=0Ì3&Ì2!Ô=$Ä3 ?@M YenBht4`‰<]‘<^žCh¬Ji±KoµMx»X~Ác~Áf‚Ãn†Ç~‘ÍšÒ´¤Ô»”ΠŠÉ†‰Ê„Ãi”Ê„¬ÚȗεÃx¼ro·ek´_z¾z–Ϭ½áÔÍåßÎåÞ¶ÛÇȉ”Çm’Èk®˜IÂØcÀÎ^¾Î\½Í\½Î\¼Ë^»Êa»ËaºÉ_¸È^µÂXª¶Iœ¥?—•<“`,„*gY „™E™Àq“¸d’¹U‡­K~¥A‚³T¨S4·À!'Ã"(Ã'Ã%Ã"À$¿!Â"Ã#Ã%¬ Š?-mD.H+p’Kx¦Yr—S{ªO”Á\Á^’¿`«Ñ•ÀÜ·³Ó‹ªÎ}wG´43½++Á)*Â')Ä'(Æ)(È-+É-*Ê,'Ë/(Î0*Ò0)Ö4-Ø7/Û93×30Õ40Ô6,Ñ*!ÒfSË[\¾%¿/)Á.'Ã0'Â/(Å4+Å5,È6-Î6/Ì8.Ê8+Ê:)É8'Ë8(Ð6*×%o .JT dn8ki+e‡5g‘:g Bj¨Gp±Ks¹Rt·U~¿cÀeÁpŒÉ“™Îª§Ô»¬×›ЯŽË’‹ÉƒÃl’Çv©Ö¯³ÞnjǢt¸ml³]mµ^}¾yšÑªºáÍÈãÙÈçձᴔÏŒ¾d‡³X¢šKÆØgÁÍ_ÂÑ`¾Î^¾Ía¾Íb½Ìa»Ì_½ÍaºË]¶ÅYª¶H—=ƒ7‹W*†7"tn<˜ºa›»n‘¶Y³Mˆ«G¢@|¬I›‡P±¹Â")Ã(Â%Á$¿$¾!±&(£J2|>,V2&`l>hb:O5dŽDf{FJG#t¥J±O}°Q•Ám©Ê´Ô¦É‚™Ân‘¿n•£`¢R@¾+)À&'Â&'Æ*(Ê,*Í.(Ê-(Ê+(Î/+Ò1+Ó2-Ö4.ÝC:ÚJDØLL×93Ð0)Í?1ÓthÂ/+º*$Â.(Ã/&Â1(Å1+Å4+É6,Í8/Í;0Í7+Ì7(Î8(Ì7'Ð9*ØA0Ö:(ÖT=е–ÎÖÀÏÝÎÎÚÌÏÙÉÐŲÐͶÐÛÊÐßÐÐÜÑÑÓÃÚ‚lÕ:$Ö>&ÔvVךÙv_ØhUÚH7Õ>,Ð3"Ï5#ÚC&¥)1CV jp5v_)pŠ3oœ=j CjªHp²Oo¶Pt»X|ÀaÀe†Å}‘Ë¡§Ö½±ØÈ²ÙÉ©ÖÀ“Ìœ‰Åz‰Åp–Éx‰¾xˆÀ¬Ú¾r²re¬Wr·`€¿r‘ʨ٧µæ±ªÒŸ€¤ib‡EYƒ?j•EŸ™KÆØl¿ÍdÁÑg¿Ïe¾Îg½Îh¼Ìc»Ë^ºË^¸ÈX±¿N¢­B’“8l.‹G$}1"kxq,Ãm“¸fŒ³Rƒ¬D§By @xA“¸n®E;´Ã"&Ä'Â$Ã"$À¾.3¤{fj[6rHv†Kp…Cp‹Jp’Ld™Eu§UmƒIg”Fa…@ešDŠ»aÆŠ¢É‰‹³s´[¤È˜¿k–¡Tµ4/À#Â&%Å(&Ë+*Í.*Î-'Ë,'Ð,)Ñ.*Ó0+Ö2-Ý?5ÚaNÙtjÙG@Ñ5+Î-#Ó]QÀ9:·$¿-)¿-&À1(Á2(Ä7+Ç7,Í6.Ï9.Í7+Ë4)Ê5)Í6'Í9+Õ>,×?-ÙbKÒ«‘ÎDzÎÝÏÏÛÒÏͼÒĪѿ£ÎϼÐÖÅÐÕÆÓ¿§ÛkNÕ9&ØR5ÙV:ÛU<ØP8ÚJ8Ö=/Ò:)Ð3"Î7!Ò>#Â1=>S ju7zO$v}/u›:n¦Ds­Jp°Lo³Nvº]{¼^ƒÁi†Âz”Ë£«×öÚ͸Û͵ÛΘϨ„Åx†ÅrÆn•Êp¶`‹ÇŒ”̧p±rn³ex»f‡Çk‚Àbf‚HMT-Pn7]ŽEj¦O|¸Yœ™LÈÚr¿ÐjÀÒl¿Ðl¾Ïi¾Îc¼Íc¹Ë_¸ÈY´ÄP©¶Fœ¡=”†1Y%‹8!}!b Œ9Ão’·_±M„ªA}¦As˜;xžJ‘Àu£‘bªºÁ '¾ %½ ¹),©ž{š¾|„Uy‡HЦ]|ŸT{¦Ow±Rr¤Kf—C~¸V„¶`i“GpŸE™Å|¢È“¼{‘º}°f¦Ï¯¬Ç’Œ±N”žPµMH½$Â'#Ç*'Ì.)Ë/'É.(Í0)Ð/(Ò0*Õ6-Û91ÚN@×pb×XSÖ8/Ð,#Ð>3ÍGE¹# À-&À-&Ã.(Æ0&É4(Ê5+Ë7-Í7,Í8,Ë6*Ë8(Ë7'Î7)Ô=-ÚM;×mVÒ«’Ï«ÐÚÉÒäÙÑϽի‰Ó¤„ÐdzÒоÒͻ֡†ÚN5Õ=*ØU8Ó5&Ò3#Ô6&×@-ÚE3Ô4'Ò2"Ñ4!Ð:$Ö>#c 6Q gs6vHqq)p—:m¤Fi©Mn±MqµUy»]x½\ƒÂnˆÂ}šÎ¬´Ù˾ÛÔ½ÜÕ³ÚΟб„Ä|„ÃpˆÁe™ÊyŠÈ~{¹f‰Å’¥ØÀË£zÀhgŸLNd5=O,Q}?cžOi®Un´Wxº]œšRÆÛxÀÐoÀÒmÁÓqÀÐm¾Îf½Íc»Ì`ºÉZ²¿O¦¯@—”9Œg-„>${"f O…œDœÁp‘¶ZНM„«E{¢Ao‘9{ M”±fšºo«D4® à &Á!º "ª—tœ¿•«v‹¨^v‡@gr8…¤Kˆ²R‚ L”CvšCƒµP¼[iŒBd‘D•‡”»‰Œ¹p¨Ì— Ä„™À}–¾†“³ržÄ^¶Êp»I3»Å,%Ë-(Ë-'Ì-&Î0)Ï3(Ò1)Ø8-ÜG8ÚSGÔwhÓth×G=Ñ1,É/&Ñ@=»,(½+%¿,&Á/)Æ1(È3(É4+Ë9,Î5+Ë6*Í6*Ë9+Í:*Ñ7*Ô>-ÝV?Út]ÓªŽÏ¼§ÏпÐÙÈÒɰڑnÖlÓìÓδÔ§Ù{]ØF)×I0ÙL2Ñ4%Î2#Ó7&Ó:'Ö?,Ô4(Ò2%Ð5%Ð@%ßG&„3W p#y7z@zs/w—–z/ŽE#}'[>C“¬PÀoµ^ˆ²W~§Gq“;l‰9£P’°aœÃp­‘L¦» Á®wTŸÁ——°‚‰¥[}“B~“?z•B›CŠ¥G‘©IŽ˜Dƒƒ=ƒ•C›·P„¤Kz£K±Ó¡±Ì™¡Àu¶Ô•ÀÙ¦¯Ì†¤Åt¥È•¦»|²Îa½³Pµ, ½&"Å+&Ê*'Î0(Í/)Ñ/)Ñ2)×5,ÜM=Ök^Ñ…}Ôxs×GB×62Ì.%Ð<8Ä2/¼'#¿-&¿0'Å2*Å5*Ç5*Ë5,Ì5-Ë6)Ë5+È4)Ì8(Î9*Ò>-ÚZAÛx_Ô …Ò·žÒͶÒ˲֠ÛhI׈gÖ¾×±ÚŒiÚT:×@(ÛN2ØA1Ï3$Ï0"Ò3%Ò5%Ó5'Ó6(Ð1%Ð3#ÏB(ÝP-œ*2V n x3sD zt0x—Ar¢Jo«Np²Tx¸Y}¼]~¿j»iˆÂ§Õ¿¾ÞÔÆßÛÅßÛÃàܠѲ‚Áw~Ân€Ãoƒ¿f‹Å}h¤`^–RRˆCY{DKd4Nr8Qƒ?W—Oj°Yo³[lµ[v¾cz¿b››VÉÚsÂÐiÂÓjÀÐiÂÐkÀÐg¾Í`»Ì[·ÅS¬³E—2‰K"w#_ ='I, šºXš½o‘´bޱ[¥Ow”B‚žO«]š¶gŸº`­ÄO®F$¯·F/ž´yœ´‹Ž«i}™Cx?€™DŸDŠ©E‘°J—´L¹N¶J’§D¦J†£M‰œK¬Àƒ·ÐµÏƒ¹ÏºÑ„¼Ðƒ¸Ïy¸Ò}­¿t¤´^¹ÖZ¸r8¶Ä.&È.(Î0+Î3*Î2)Ñ3+Ø8.ÚUEÑ£ÏÁ¶Ï«¦Ö^`Ù=5Î0'Î71É46º(!¾.%½.%Ã.(Ç4+Ç5)Ê5*Ë5,Í6*Ë5(É?)Ë9(Í7(Õ@/ÜZCÜsZ×”xÖ¬ŒÖ¹—Ù›|ÚfJÙU;Û{XÜ€^ÝpMÜZ7ØK/×>$ÙO8×D7Í0"Í."Ñ3&Ó5+Ò1.Ò3+Ñ5%Ò2"ÓK/àW3©(:Y np%wF"wr/tŒ:r Hj¨Nn®Pw¸Zt¹b|¿o~½vÈ ®×ÄÂßÖÈàÜÇàÜÀߨ Ñ±~ÁyÄq~ÄoÃnx»cfŸ[X…IKn7Lh2Lg6Jl8M}A^–Pm®Xq´Xq¶\{¾eÂiœWÇÙqÀÏdÁÒgÁÐgÁÐh¾Ïf¼Ë]¹ÅQ°ºG “6N$x'N10-ZEœÁ_˜¼o´e‹¯c„¨Y¡V‹­_‘³f–µaœµO§ÇM´–<«¨„Fžµw—¯v‡¡Q€•@|–A›B„ E’­GœµL›³I¡¶H›²H ¹N©ÀO¸Tšµ\¨ÀZ¡¼L¤½L¦½H£¸G¨¼I®ÂN®ÅQ¯ÃP´ÅX±Í\»¯X¸+'Ä+'Ç.'Ë/(Ï1*Ñ3+Õ6.Ú:1Ù^Kк¥ÐÕÊÍÒÈÑŸœÖF;Ó5)Ì3)Ê31¶'#»1%¼0&¼.(À2(Ã3*Æ4)Ë7*Æ4(Ç2'Ç9(Å5'Í5'Õ=/ÛP;ÙgMÙy`Ù{]ÚxXÜdGÙT;ÚQ:ÝQ;ÚK5ÙK1ÚI.ØD*Õ>%ØZDÑ:,Ì0!Î/"Ø7+ØF;ÑihÑQRÎ1"Ï5$ÓR2ÝU3°(9Ply=#~T,|f+rˆ8qœEs§Ko­Mv·]u·cw»fƒÀ˜Í®²ÛÊÂàׯàÛÇáݹÜÑ Ò¯ƒÄÄux¿mwÁfm·\IzC^,KR'bs=Œ­g°ÕœÉæÈˆ¯s^ Em²Xo¶_xºex¿lžžHÄÜc»ÏV½ÑW¿ÒXÃÓX¿ÏW³¾K•5ŠN^/,5>GO€}1žÆk“¶pˆ«eƒ¤Yƒ¥XŒ¯e‘¯d’®U•¯H›³E¨½H²ÈJ°­D—•H‘¬lˆ¤[†žP…¡Jˆ¦MŒ¨N“«G˜°K—¯L¥¸J§»L¨»L­ÀM¯ÄO´Ér³Ê®Å]°ÆX°ÅV²ÉkµÍ”´Ì£·Ì”¸Êu¹ÍsºÉ^¸Ç\¿Ô†¼Z:¿$Ì0)Ò4+Ñ1*Ò4-Õ70Ù;4ØjSÓ¿¤ÑÚÌÑáØÑÕÎÖ‚yØ;0Í3*È-)½-)³*&¹*&À/'¾/(¾2(Á4)Å2(Ä7)Ç6*Ç7'Ê4$Ì6'Í9)Ñ<*ÖE1ÛL9ÙG5ÙC/ÚN7ÛT9ÛK3ÚF-ØA)Ø<(Ø8.Õ8$×@/Ì3$Í0"Ì1#Ì/!Ò6'Ï›ƒÏåØÑëçÔ{Ó/ÔsTÜhM´,<Pn{:!R*}g.tŽBw Kr¨Ou³U|ºbzºg{ºjˆÂ™Î«°ÛžßÕÇàÝÄßÜ´Ûӓ˧y¼ryÀl{ÂzÃ~e¨THr2[Y-rwCŸÄ½Þ´ÅäÆÔòÈžÄ~X™Fk®Zq·dv¸gy¿rxv)Œ£5‹ž3‘¦7’«<“¬>§<ˆž8„3€k,`18 6?QSU ‰•;œ½c‘®iˆ¦`€šO‡¥Z’³l•²a’°O˜±Fœ·G¨½H³ÆL¥«G’šHŽ«a‹©aˆ¦U…¤M„¥LŒ«Q–±O˜°K£·K°½K°ÁL¯¾L¯¿O°ÄY°Éy²Éy­ÂV¯ÃN±Æ[¶Í¿ÙůߨÂÚȻћºÍ|»Ìc¸ÉbÂÔƒ¸X3½#!Í3.Ó6-Ó3,Î4,Ó5,ÝF;ÙmZÒ´˜ÑØÇÒâ×ÐÜÔÒ —ØF?Ï3*Ã7)¼-$µ*#¸+%¾/'¾.%¾2'Á3)Á2(À4'Ä5)Æ6*È9(Ê7(Ë8(Î7'Ò>,×C2ÖC0×@1ÙH3ÛI1Ø?+Ö<(Ó:&Ò7$Ô4%×<)Ò;(È/!Ì2#Ë1!Ï/!ÔH7ΰšÏÞÒÒîæÖ«œÖ;!Ö{[ÞqR³.;Kj{;$~X0ve/uŒ?w£Mo§PnªRr²[{ºh}»nˆÁ†“Ê¢žÒ´·ÝÏÈàÛÆáÞ¶Ûѕͮ¿€{½g|¾x~Ãa‡=f[,ƒ”J®Õ”ÃâÄËéÈÆá¬«dd–Jf¤Un²^s¹fv¹hyÀvTUcƒ+b€,c„*`ˆ0`‹5m‘5t–3u;t¨A€«A{—,Ô@.×>,Ô9*Ò8(Ò:(Ð7(Ï8&Ó8%×;)Ê4#Ê/"Ð2%Í.!Ë/!Ò6(ÒnÏÑÀÒÞÑÑÓÃ×™}ÙE,Ù]8áO4‘0Nam(x=&~_/s;q‘BoJp¢Op«Xx´c€»r„½}†½†‰Á–ˬ·ÜÎÅáÛ¿ßצÖÁ“Í­xÀ|¹x}ƒDƒ Pª×“´×±ÉêÌ·Ï‘`y=P€DZ—R\¥Wd¯\l³`p¸g~¿o|Áx\v(q¦9i›7_”1d—2a“3j›7l¡0Ð7.Á/(´)$³,'¶0)º0(½1)º/(»3)½3'¿2(Â6+Ã5)Å4'Í:)Í<)Î:)Ò=+Õ?-Ô<)Ï:*Ñ9(Ð:'Ñ9&Ó?(Ô>)Ê2$Æ0!Ð3%Í2$É1!Ì- ÓF6Ϩ–ÑÛÍÓÚÊÔÍ·×wY×;%×G.Û>-p,Q ep*x7%wO,o{:mCl”Ei˜Ii¡PmªZwµl{·v€½ƒ€¿ˆ’ɨ´Û̾àÓ»ßÓ©ØÃ˜Ó¶‚ÈwŽH‡FªÒŠ¸Ú¼ÄäÉÁÚ¡`o7On9\ŒJašPi§Xh®Xo²_uºk{½qÀxbm$kŸ5u§Mu¥^aŽ9a.j–4pŸ:m£†ƒ6‚•9‹®U–ºs°^ެT‘®U–´S¡·K«¾P¯ÀW®ÁO´Ë{·ÍŽµÌ³Ì‘®È…¦Á_§ÁQ­Çf³Î´Ìr¶ÌfµÌi¼Î^»ËS¹ÈO»ÌS¿ÄQ®I,¾&$Ï4+Í1)Ï2*Í5,Ñ3)Ù<2ÝUBØrÔ¿¢ÔÓ¼ÔØÆÔÛÌצ•ÙF5Ò5+Æ0)°*$©,(³0)¶.'·.(¹1)·1)¹2'½1)¿5*Â4'Å3&É7)Î=(Ï;)Ò=+Õ@+Õ?)Ô;*Ö<*×=*Õ;'Ó<(È8$Ç0!Ð2$Ô6(Í2"Ë/!Ò.$ÓfVÎŲÑÙÉÔÕ½×®ÙN8Ô8&Õ9)Ï3'L1Q kx,t5"tC'nl5lƒBfŠBe“IhšKgžRr­az¶s‚¼}º|–̨²ÛɲÝ̳ÞÍ£Õ¼“Ó­‰§iƒ?ŸÆo¸Ù¨ÁÞÉÈá·pv>EX-\€@[JdŸPh¥Tf¨Unµ`v¼lz¼nzÁ^c"e”-„¹g¦Ö­ƒ²w`9cŒ2i–7kž9j¦?r¨@o¥EeŽ;O6-. €‡<¨¸e™ L‡–KЦX­SŠ£B?ˆ¥Cˆ¤D…¢B‹¥D‹¨G’E‡Š;‚‘:‚£B‘·f’µdޝX®U˜´U¢¸M­¾L«½I²ÅT¶Ês¹Í¶Ì€´Ë†®É~§Â^§ÁO­ÆU®ÇX³ÊS·ÌW¹Î`ºÎVºÌP¸ÊP½ÉO¿ÒT´h7¹!"É3*Ì3+Î4,Ì1*Í2)Õ:0ÛJ:Üw^ש‡ÖÀœÖÌ«Ö˯ڟŠÛN:Ö9+Í6,¹/(§&&£'&µ1(»4)º2)¸0'¶0&·/'»3&Á5&Ä6'Å7&Ë?'Ï=)Ð;*Ò?+Ó?*Ó@,Ô?,Ò<)Ê6'Ç3%Ç5%Ì7%Ó7'Ñ5#Î2!Ð4(ÖG?Ñ”†Ð˹Ôδؤ‚ÜgJ×=)Ñ3%Ù5(®&,9Piu(r3$q@&jd4bw;bC^ŠEb”HežOe¥Sp³j{·ru¶pŒÆšª×¿«ÙÄ£Ö½™Ù³‘ÃŽ†Š@˜³^¯Ó¸Ù³ÈèË– m?BSk8X€AY‘I]™Kb£Rd©Uo¶asºl{½rpÄ…cXXw&`})u¥W–Ř…¶{i;b2c•7gž=k£?e˜@]Y$9 $: mZ%”¤R’£W„›NŒ¦Qˆ£Kƒ@œB‚CœB€•>—@‚˜?Œ—C‹‘D‡=†¡A³W’µa°[­T—´Wž¶P¨¼L­ÁK©ÀP´Ç]´Êh²Én²Ê{®Èq©Â[¦ÀM°ÅQ²ÇQ¶ËS¹ÌX¹ÍWºÍS¹ÌQ¹ÍR½ÈM¼ÔT»†B¹%#Æ3)Ë1)Í2+Ì3)Ï3*Ó4,ÙJ;ÝeNÛtVÚ_Ú†cÚpÞxbÝL:Ö9.Ñ9-¿0(©'%š((•%&°1(·1'¶/'²1&²+#¸,#¿2%Ã3#È7%Ê<(Ë9'Ì9(Î<(Ï;*Ð:)Í9'È7'Ä5%Ç4#Ê4%Ï6&Ò6&Ï6$Ï5&ÔRHÔ‰~Ͻ®ÒÇ´Ø—zÙ[?ÕD.Ò6&Í0$Ù5(!9Kht)w/#m7$iP,k`2hvs=t‹5€@Œ›KŠ’<„?‰®N¯V­SŒªO¯O–±Ož¶K¨¾L«ÁN¯ÂQ­ÃT©ÅV«Çf­Èm«Æ`ªÅS²ÆR²ÉQµËS¸ÍZ·ÍV¸ÎS¸ÎT¸ËO»ÈN»ÔTº–F¬##¿/)È2*È2)Ç4*Ë4*Ï5,Ø<3ÛM<ÞYDÛP=ÛZAÝiOÞdMÝO;Ú?2Õ:.Ê7+·2*­1,“"$”"%®('°&'¬#$¨'.±75¶.&¾2$Å9'Ä8(Ã9)Å:*Å8(Å8'Æ7(Æ7&È9'Ç7%Ê6$Ë6&Ð5%Ð6%Ñ3%ÔE6Ԏо®ÐÍÀÔ°ÚnVÚI/×<*Ï3%È/#Ñ1$X 4>Ydk)"e5#bB(gD*cJ*ca3gv8_x3bƒ8a’A[“A_˜Jg•Mr§[|ž^uh@r`4†‘E“¸W³Ù‘¿Þ¿ÂßÅÀÛºœº{™»ˆ“°‰r‰kKg@Ft8XFb Qf«[i±cwºmlÂhCWd#Ve$Wm#[t'fƒ3cw2X`%Zf'Xg%UJ@%+J le.Š£LŠšJyŒ;|–;@|–=w’>t‹6rŽ9”>‰ˆ8‰q+…‰;¥M‘™?Šœ?†¥Hˆ«MŠ«N‰©O¬M˜¶MŸ¸Lª¾N¬ÁK¨¾MªÂQªÄR­Ç^±Êf¬ÉhªÆc®ÆX°ÉS¸ÎVºÐ]·ÏW¶ÏT¹ÏX¹ÍS»ÊNºÕW¹›I§"#¼.)Â1)Å3*É2*Æ1)Ç5+Ö<1ÙE6ÝO>ÛN<ÜR>ß\DÝU>ÞM9ÝF4×;0Î6,Â.*¶')³)- 2:¬OI³gU©uY´ Š Œsš91µ*#º5$¾6&Á6&¿6'À8'À7'Ã6'È9)Ë9(Ë;'Î:'Í8(Ì7%ÍE(Ô;+ØhXÒ¹¢Ð˸Ñι֡‹ÛcGØC*Ñ4%Ì/#Ë/#¼)23@O ]a"Z+[+Z( Z0 a=$Z6T=I6IJ$Wn4cC[4U0kB!wl9˜µj²[˜½a¸ÝÀÞÄÂÞÈÃß¿¾à¦¼Ý˜Àà™Æå±¯Îª{–vSFa—Nj¥Wj¬_w·nnÀ{WZL[QUHW>P/R2S/R(L!: #!6k{3‚¥C‹§I|š<~›:{”=uŒ;8’f0—N'Œ1‚s}r.¬NŽžC‰œ?‹¥HЦH¨H¨J«K•²L¸M§¾N¬ÂN­¿O¬ÂP«ÃP­ÅT¯Èa­Éo­Ès±Èp²Ë_¹ÎY¹ÎZµÍU¸ÏX¸ÍUºÏRºÉR¹ÓX·—HŸ$¸+(¿0*Ä2,É1*Ê1)Ç0)Î5-Ô6-Ú>4ÚH6ÝG8ßM:ÝO7ÝP:ÜD4Ú?3Ò6-ÈJ9¼mJ²c¨¥l˜®eš»t©Ìœ±Õ¹£¿˜­¾š¢PBŸ"¯0"³0 ¸5%¾5%Á3%Å7(Ç8'Ë5&Ì<&Ì:&Ð9'Ï7%Ò4&ÙN<׉zÒ¨“Óº¢Ô®“Û|`ÙG-Ó8$Î7'É0$Ñ2%“ -7CQ P LRPP%IC.R7––J®µi²¸f‹z9qJ*‡ŽF¨Ëi´Ø‹™À]®Ô‡¼Þ¬ÀÞ»ÀÞ½½Ý²¼Ü¦»Û§¯Ðƒ ÅrºÝ¯ÏêТ¢_RbžPf¤Us±el½sYJ$ K*H$ EDF E 5-#J ‹h-Œo,Œ`(ƒC—N$¬‚?°sA¶B1´#&•‚v d~}2Š­P…¤IƒŸCŒªE‹©IŒªI«K‰ªJ­L—´KŸ»M§½O§½N¨¿O¬ÃO­ÆW±Êh®Êv±Í¸Ó›¸Ð}¹Ï_¸ÍV²ÌU¶ÐW¸ÌQ¸ÍQ¹ÉP¸ÒU°ŽC•#´.)»/*Á2+Ä/)Ç/)Å0+Ê2+Î4,Ô90Ö9.×=/Ú@2ÛH4ÜK8ÜA0ÛA1Ý=0­e:z‰D{GlŒGdCy©P¯Ñ—´Ó²°Ñ¥³à«µŠ”!ª/ ³/!½5%¿8&Ã7&Ç6*Ç8(Æ6$Æ6%É7%Ì7'Ò9*ØC-ÙrWÔ®–Ó¸¤Õ¯•Ù}dÚO5Ö@*Ò9'Í4$Ç1"Ò3%‚EH%ld3-9;8= BF A9 S8½½PÃÒr¼Ð„­·f“ª\–´gžÄg—¹_«Î}©Îc¹Ý¥ºÜª½Þ¨ÂßȺݹ¸Û¬»Þ§¹Ü—¸Ù’ÂÞ¹ÂÞ¼ÏèÏŸ¾œUŠAa Sn¯^`¹iG=HB=650' +mDœP%£6‘p\p²F5ÁcJ´>=©(1›Žˆt‰?†¬R…£G‰¢C©E‘­I’ªJ‘«J­G±L˜¶L¸LžºMžºO¥¾P«ÂPªÄT±Ìm²ÎŒ·Ð›»Ò—¸ÐtºÏ]¹ÌU¶ÎU·ÏU¹ÎT·ËQ¹ÇK¸ÐV°ƒ@š ²+)¼+(Â0+Ä0+Å1*Ç2*Ë3+Î2,Ñ3+Ò5*Ô7+×:0Ø@0ÜC2Û?0ÙA2ÛÄÇW¸Ék¸Ès§¸^©Êv­Ïw’°OžÀl¤Æy›ÀT¹Ýœ»Ü­¹Ü¢À߯·Úªµ×²×¶ØŒÂݪÈá¿Åà¾ÂÞÂÉâËs™`TEh©Y_µ_1,+)'!" 'v^0¿€JÆL2t jo ¡&)·HA°98¯/2¡" ˆ Š‚x Ž¢Jƒ°W„¥H‰¢Aˆ¨H‹¬I¨FªM­L®M—´Lœ¶NºLŸ¸M¦½O¨ÂQ©ÃS®ÆZ±Íx¸Ò’ºÐ¸ÏeºÏZ¶ÍT¹ÐW»ÐR¹ÎR¹ÎS·ÇN¶ÏU®q;•¬'(¹*(¾-)À.*Á-)Ã-(É0+Ë3-Ï3+Ï4*Ó5*Ø8,Ú>0Û?/ÚB1ØA0Ô>.Û<.»<-qB-QO.X_6Yr;p¡C¨Ñ¶Ö¶¡Ç…¾â¸§iQ™"±3$½3'Ç9*Ç8)É7*É7(É7%Ì9&Ò@/Ò@-ÖH3Ú_JÚlTÙsVÙƒdÙz`Ù`J×F0Ñ7#Ð3#Ê0#Ì0$ÄA'‘¨O˜Ío=./0*(-''(UͼG¼ÁU»Ç`¹Å^¶ÊoµÌ²Ê‰­Æz¯Æq£»e™½]½à¨¸×”¶×“»Û§µÓžµÓ¢®Ï•»ØžÇàºÆà¾ÇáÁÃÞÁÍçΚ·‰N8d¢Q_­W{:TDG$ * ]E"º‹TÊoV¨+)Š ‚~ w ˜&¶CF¶C>²12£%މ„ ˆ„ ~%®N…³Z†©Kˆ¢AŒ¨EŒ«HŠ©HŒªJŒ­OޱS•µO¸O¢ºM¡»N¥¿N§ÁN­ÆZ¯È`¯Ìr·ÑŽºÏyºÎ[»ÎVºÎU¼ÑW»ÐW¹ÎV»ÎS¸ÈO¸ÎTªa5š!¯)(·+(½.&¾,'»*(¾,(Å.*É4,Ë5+Î6*Ñ5)Õ8+ÛB0ÝG3ÙC1×?0Õ?1Õ;/Ü>/ÜB20'aZ0XyC]‹A’Ån¸Û³¦Ëš©Ú ¹£‡™'­1"·2#À5&Å6)È9(É7'Ë6&Î;*Ð?*Ò@-×M6ÚfFÜjNÛiLÙfGØbDÕM4Ô?)Ð6#Ð6&Í4%Ð/$´G&‰­S¢Ó|D:').)%$(#,®ˆ7Ä»K»ÂWºÃY¸Æ`¹ÎtºÒˆ¼×›½Ù¡»Ô–³Ìz¯Ìy¸×ˆ¼ØŽ½Ûœ¿ÝªÁݵÁܹÁݽÂÞ»ÃߺÆà»ÆàÂÃÝÂÊåʩ’Xy4h›Na¬S’y,¦<•4‰,qU#M&(*•wEÏ—nÃZO¤ ƒ z … ƒ | ¶@A´IH±<6¦#'Œ ƒ „}| w.ްQ„³Z‡©N„ CŠ¥D¨H¥G‘¦JŽªN’²Q˜¶Sš¶O¥ºM ·J¡»N©ÁO®ÇZ¯Ëg±Ìu¶Íp»Ïa¼ÏY¼ÐU»ÏT¼ÑV½Ó[»Ð[¼ÏU·ÅO¸ËU£T/Ÿ#°('²(&¹)'½*(¿,'Á/*Ã4+Ç3*Ë3*Í1'Ð3(Ô1)Ø<,ÚE1Ù@0Ù?/ØB1ØB0Ô?0ÕB.Ë0*…A6_‘N`L|´V°Øœ²Ö°¥Ò–ÄÚ»›I4œ&¬3%µ4&¼3&Â2%Å4'È5'Ì7(Î:'Ð;+ÖA-ÙO3ÚM3×L1ÕG-Ò:'Ò6$Ò6%Ñ4&Ô7'Ñ2'Ò1$m(~¥Fªâ~SR) %$!"$)I ¾œ@ÀºI¼¿P¹ÂS¸Ç_¹Ðx»Ô‘½Ö›½×œ¾Ø¾Ø•½×½×Ž¾Ú™ÀݧÀÞ±Ãß½ÄÞÅÄ߯ÂÞÄÄßÁÅà¼ÅàÀÅÞÃËæÍ§¿ŽPq1_‘HWžM‘r*œž:—”5–”3’5˜‡3ƒb(f.­mKÊ‹n´VO¬/3›Š  uw ¥-0»KE±77¦#%˜„‰ ‰… z~K’·Q„±Zˆ²YƒªM„¦FŒªI¨I“¨HŽ«J®L”´S˜¶R·L¡·K¦¼M­ÃO°È\²Êi³Ìu·Íc¾ÐY»ÐV½ÏP»ÐS½ÒX½ÒZ¼Ó[½ÒX¶ÇP·ÃS¡>(™"«'&±*'²'&±)'·*'¹.)¿0)À2*Æ1)Ë2)Ì1)Î3*Ò5+Ó8-Õ:-Ø@0Ù?0Ø>-Ö>.Ï<*Â1+”=:k—Rc‘Kl¡L¢Ò„µØ·žÉ‡¿é¿«ƒm¡-$«/#³1$º1%½6&¿3&À4(Ç9+É8)Ì7%Î:'Ñ:*Î6&Ì5#Í5%Í6$Í4&Ó@)ÕB+Ü:+™%}/†™Bu6, !)'W(£D¼´I»ºN»¿P¹ÅW¸Ît¼Ó޽ՙ½Öš¾Ö–¼Ô»Õ‹½Ø“¿ÜŸÁÞ§ÁÞ±Ãß¾ÆßÏÇàÕÇàÓÆßÊÅàÄÅàÁÄÝÂÍèÏ£´…Oc.`HYšN–x+¦«>¡ž:œ™6˜‰2’o,˜P)¿pQÁvcµQC²62¦#&’Šˆƒ| ‘±06±17©%)”ˆ ‡ †‹ ˆ vb'бP‡¯X´_°WˆªI‹¦G£G¥H’¬I‘«K’°Qš·Tœ·Nš´Jª½M±ÅPµÊ\µÊa³Ìh»ÏaÀÐ\¼ÐX»ÏP¼ÏS»ÑU½Ò^¼Ó[»ÐR³ÆQ¶¿T—6%š!¤"$®$&³(&µ,&º*'½-(Á0'Â0'Ç3)Ì1)Í2,Ï4+Ó9,×;0Ú;0ÛD2ÙA2×?.Ð;,Ç7)¾3)œ0"pEdHg—HÅj¶Û¸ŸÈ–¦×š¼¾ ‹*œ'¦+!°/#¸1%¹4$¾4&¾8*Ã;+Ä6&Ç4$È5%Ì1$Ë2"Ì6#Î5$Ð9#Ô@)×E.Û=(»+,G Wtm/q`/- !![&Á£F¸°J¶¶K·½NµÃU·Íi»Ò½Ó‘¾Õ•½Ö’¼Õ”¼Ö•¾Ú˜¾ÛÁݧÃß´Åß¿ÇßÍÉáÖÊáÚÉáÒÆàÈÅàÀÄÞÀÏëÑ—¥zMY-ZƒER‘K›{-§¬>¡ 9žœ8›™7–^*³VE¼|f¹TK°0/©&'Œ‰ ˆ ŠŠ¥'¸.3±$*¡ŽŽ  ‡ ‡‰ …q‰‡8‰¶X‰¯Y¸f’·d‰­Q‡¤F‹¢D‘¦GŽ¥I‘¨I“­K™³Qœ¶NµL«¾N°ÄO´É^·ÎmµÏi¹Ï_¿Òc¼ÏY»ÎR¼ÏT»ÑV½Ó^¼ÒX¶ÎQ­ÇR¯µR‰-#‘" "$¦&&¬&&²(%·*&¼-'Á0)Æ0)Ë0(Ï4(Ð3)Ñ7+Ô=/Ù@1Ü>/Ù?/Ö?.Ó=+Í8-Ê7+Ã0)¤ $q„BjžPaF‚¼Y¨Ô™°Òµ”ÄrÆä½‘R8Šš+ ¤0%«1&®1#³5$¸1%¼2&¿/$Â+"Å+!Å)!Æ*É1!Î8$Í9!Ì37Ó4KÈ0$G,K!o[,j[+mg0b;"4!Y,À§G³®J°³K±¸N¶ÀQ¶Ê`¹Ïu»Ñ‚ºÐ‚ºÒ¼Ó†¹Õ‹¼Ù¿Ú˜ÂÞ¥Âß±Äß½ÇàÆÇáËÇàËÈáÉÆáÄÄà¿ÃÞÀÏìÏŠ–h@C(Qq>QŠG™{/¦¬?¡ž:¡¥= {/°L8¼u^»fQ·>;µ(-£†† … „­%,®$'œŽŠ‹‡ ‡ ˆ ‚s Œ˜@¸a‹¯Y¶c—ºe‘´WªKޤE¤E‘¥E”¤E“ªG•¯K•±KžµN«ÀN®ÃR³ÇR¶Í_¶Ïd¸Ï_½Ñ_¼ÏVºÎT»ÎS½ÏZ¼Ò\¹ÐTµÍT­ÌT°±OŽ' ‘!ž"¢"$¨$$¯$%¸&%½.&¿.'Ä/+Ë1*Î7*Ñ5)Ó5*Ò8+Ó7+Ô7+Ò8*Ê0'Á0)ÃH4·R5œ_;sDk‡Ep©VaŽKo«L™Ì»ÛÃŽ½o»å¸¨‡l„ ( £+#ª+&©/$«:%±A(´J+»Y1¼R/¾I+ÄL3ÀK=Á83À%$¾#Å*3À+>P %_yZ'ˆš=бH±J{«FrœBju5]Y*O/1T-¸ G­¬G­±I­µL®¹P°Å]³Ël·ÍvµÌu·Ït¹ÑzºÒºÕ†¿Ù“ÁÜŸÀÝ¥Âß³Åß¿ÆàÃÈáÃÅàÃÆáÁÄà¿ÂÝÁÎìÌstJD;Xt>Y„C˜{.¡¨?Ÿ¥<‡0©@-¼jW»nY¼PAº85³&*¢”‘•¤®$¢’Ž ˆ‹Œ‚ ‚ ys ¨H¹f’¸h“¸g•·b‘²U”±TެO¤K J’£F–¨I—¬H—°J¥¸O­¿M«ÁM±ÇQ·ÍYµÍ\»ÎZ¼ÎXºÍVºÍW¼ÎX»ÐZºÎS¶ÍQµÎR«ÌV°­L"‰—"˜#ž"!§&$­$$¸+'À.'ÁA+Ä1(Ç/&Ë0'Ï1)Î3)Ï4)Ç3'³'#¦4.¤_?˜u?ˆ’J£SºfršRi£Nq£VbŸJÃm¾ÞÄ•À{©Ø›»¾›'‘'*!ˆ*#‹A)X1m6–ˆ?—;œx5¦Š9®˜Dµ±d½°wÀ‹Z¿V8´)!Q.c Z)Œ©G’²FޏI‡¾Pƒ»O€¾Py¹LpªIjAab.=B ¯’@©¤Fª¯J§²M¨´Q¯Á[´Èf¶Ëo¶Ël¸ÎpºÐt»Ðu½Ô}¾×ŠÂÛ‘ÂܘÄߪÅß·Åà¾Æá¿ÆàÀÇáÀÆâ¿ÅàÄÌç¿ZS,D3\q;Z€?œy+¢©;œ†/¦D)¹^M»s\»\K¹D:´')§–Ž’™¡™’Š Œ Ž ˆ † | }+’®L“ºi—¼n™¾m”·_’³U“³S’²V”²W“¯V‘ªR’¬N—¯J—°L¤¸Nª¾M¬ÂM²ÇP·ÌR·ÍY½ÐW»ÍX¸Ì[¼Ð\½ÒbºÐZ¸ÎN¶ÏR¶ÍTªÏY¯£J|…‘ ” ž!" $'¢"#¨$#²*'¸3'¾,'¾-&¿-&¼,'¶.&¥&"Œ‰'&Œ_>ŠK†•Mƒ§Vˆ²\‹¸fŒµmf£Ix®Xq¨P‰½^¸Û¶¥Í”œË|Ã༃h?o5j0p<$xU,~p6‡†=„y7ƒc/…e.Œƒ8—¡Lœ§M™®Qœ¶]®¹`«žVR>"3\}‚4‹¯Eˆ°E†¶K…¼N‹¾NŠÁS…½Pz´Ks¨GqžAc_+<5ª“>¥¦I¤«I£¯J¤°M«·U®Á`²ÇeµÉg¶Êi·Ìm·Îk¼Ñq¼Ô}¾ÕÁÙÃÞ Äà±Äá»Æá»Æá¼Çâ»Åá¼ÉåÆ¾Ô¤?. : VG)U_4š†1¢‘6¤@+¹ZG»qY¾dS¾D;µ('¤š‘‘’˜’“𔋉 ‰ ƒ Ž † rxA¯I‘¶e—¼o—¼i–µ^”±V–±S—²U–°V”®S–¯Y–¯S—¯N™´P¥¹O¬¾L®ÃP¶ÈR·ÊU¸ÍU¼ÏS¼ÏT¼Ñ\»Ñb½Ñ[ºÐXºÐS»ÑT±ÌS«ÒY¦›Hm‹’ ” “"–"› #"Ÿ##£ !ŸšŸ Ž|…&&Žb<‰‚J~Iw¡R|²]†¸d‹ÀnœÅ€j–Ik¤MiJ~´R±×£¯Ó¨’ÃiÁäÀ ®v^H#nG(xU,zb.€}<†~:{U,W-j0Œ–F˜¯V‘©P«O°W’ºc›ÆlžËjsEW>#q1‚©B†¶J†»Mƒ¼O‹ÁRŠÁR‡¿O¼R¶Os¦Di>bQ.0%™„:ŸŸG›¤Gž¦I£­M¨´SªºX®À\°Ä_²Æb¶Èc¸Ëi¹ÍjºÐt½Ò{¾ÕÂÛ–ÃÞ¬Åà´ÄàµÅá·ÅáµÂßµË러x# 1 9K&$˜a'¬[;¸ZH¶^F·aMºO?³+*£ˆ ƒ ‹ Œ   ” ™™–““ ’’Ž Ž ‰ rb(‘´N´a—ºl–»h•¶[–´T•²R˜²S–²V‘­U’­U–°U™±Qž¶R¨½P¬¿M°ÄQ·ÊQ´ÊP·ÎV½ÐUºÎUºÑ_¹ÑZºÏTºÑU¸ÐR½ÔR«ÈR®×]™‚=_ sx~y{|so pz “Šl {%$†[6‰’JˆŸRw£Tr¨Vu²[‰¼hŽÂu—Æ}mšLh£Mi™Kk¡C¢Ï²Õ¬“Äq²Ø§ºÓ h\.nK&tV.rm5x…@zj7sV*vW,{w8†›F„ J‰©S‘¶]¹a‰¸`†ºiˆÀl‘În†´fjƒ=w˜9ˆ´I‹¼M‹ÀQŽÂS‡¿SˆÀR‚¼Q†¼T{´Mp¥Hd€=H%!ƒg.œH– F˜£HžªNŸ¯P¢³Uª¸V¬¼X²Â[´Å^¶Èc¸ËeºÍi¼Îl½Ñt¿×‹ÁÛ£ÄߪÃà«ÄߪÄß§ÀݧÌì°sxF4uL2Že7›8.¾cMºYC¹ZHºQG·2.¯ š‘ ˆ  ˆ ‹ ‡ ‰ ‘”” “‹Œ ‰ Œ Œ ‹   uŒ„7‘¶V•¹k•ºk—ºj•¶[•²U”²U˜³U”­S“®T”±T–²Sš´Q£»Uª¿Qª¿O³ÈQµÊS²ËU·ÎX»ÎU¹ÏW¸ÏW·ÍTºÏS¹ÑS·ÑXºÑVªÉT³Ù`e-H` a a a a e g m ”%!¤1'§0&qv4*^;v€G~ T€«Z‚´g{±bj¬[~¸gÃsÄylžPm¤Mn Pa•@‘Æq¯Õ¡žË†¨Ð–ÃåÀ€KX9oY.st6sw:rW.tY+rh-{ˆ=wA|ŸJˆ°Xе^ˆ¸a…¼kˆÀsÅsÂoÉtŒÄpsšE{¨C‡ºNÁQ–ÆU‘ÃWÄ\ŠÁa‹¿`‡»Tz°Nj™GYP%'k? “F˜¡F¥IœªM›¬OŸ°Q¦´T«¸W¬ºV±ÀZ²Â\¶Ç`¸È_ºÉd»Ín¼ÒÀÖ’ÂÚ“ÀÙ”ÂÚ’ÂØÁÛ‹¿Ñ€?4LG+®´gÚÈa¤f5 B3»]J¸aN»^M¹;5±"%¥“ Œ  ‡ Š „ | –——’ Ž ‹Ž Œ Š † Šz ŽB޶_˜¿s™½q–¸g“²Z’°U•²Q—²Q—®T–¯S™²Sš´S¡¸U©ÀT¯ÁN±ÃP·ÉS·ÌV¶ÌW»ÐY¼ÏU»ÏUºÍR¼ÏS¾ÒU¾ÓW½ÓW»ÒT©ÉV´Ô`mN%:N R ] ghkv8-P7„Z:ˆZ9Ž`;ša;ŸT0 o<£§]Š¢^tœRyª\‹¾l¿m€·jxµl…¿w’ȉs¥_g¤Kw®XgšI¸[ Îˆ¤Ï–©Ð–ÁâÄ ²~R@gY*gc2if5tU(rT)tx4qŠ>m=z¢J†©Q…­V‡ºfÂv‘Å|•Èz•Ëx“Èv‘ÈpÀe}¯L¸M‰ÀS’ÅU—È`–Çv—Ȇ¡Î ‹¿l·Rp©MYr61 A Šj7ŒŠ@“žG—¥K–¢K™¥Mž«O¤°T§°R¬¶S¯ºY±¿Z´ÀV¶Ä[ºÊe¼ÐpÀÑyÀÓuÀÓq¿Ñp½Îl¾ÉbžšPŽ“UÖåÓ½_ÂO.•$$£C6»eQ¸gV¸J>µ**¬ ’ ˆ … ˆ ‡ † Ž ‘•‘  Œ ˆ ‡ ˆ Œ ‡ ‰…2”«I“¶bš¿o™½l™»g•µY’±R–³S˜²U˜°Tš¯Tš²Sž¶S¥ºU¬¿Q³ÂL³ÅQ¶ÊR¸Í[·ÌZ»Ñ]¼ÐW»ÎWºÍR¼ÏQ¾ÒUÀÔY¼ÒV»ÒR©ÌX«É\€8%z€ tnI2el>dEgŽLr‘Nt“OoOlvFiR6g<)x_3‘¡Y£_p”Ry˜P‰HŒ±]˜Ë}É‘¦Ô©~¥k\˜Ct¬V]’Dr¯TšÊy¨ÐŸ¤Í‰´×¯»Û±mh7ZE}•Y‰†[eA qY'rq0hƒ:o–@rEq¡H~²Zˆ¼j‰¾p‘Å{›Ì†œÎ—Ìz‘Çl˜Ën“Äe€µNоP‘ÂR˜Êm§Ð±×¼¶ÛͧѲˆ¼m{±NeCA*1v="Œm9‰{9•D“žG” J–£J˜¥Kž§P¤¬O¦­R©²R©²Q«¶R±½U³½T¸ÃZ¸ÄZ¸ÃU·¼V±¯Q²®QÁÆnÓÍiÆ>·/%¸#š&%¥I;½iW¸XF¹94²"&­£›“  Ž    ‘ —“ ‘   ˆ † ‰ ‡ } P#’°K“·`š½o”¸e•¸a•´X”°Tš³R›³T™°Rœ±T µR£¶S¥»S¬ÀP¯ÁNµÇP¸ÌT¹Î_·ÌZ¾Ò]½ÐW¼ÐU¼ÏT½ÐS¿ÓVÀÔW¾ÓT·ÏQ£ÌXŸ²R}&ˆ‘ „j5$dv=e”Jd¡Qf£Tj¨Wp¨Yo¦Z…±m{§ajM`o?lZ4xY/•¤ZxyKGR?"n™IŽº[šÅp©Ð‹w¢YP‘Cj§S`˜Jh GŠÀa­Ö¦§Î˜®ÔªÅæÉ]]f-Œ¾gžÈdwe4hK&rz3t”>v—@q›ExªQ}´aˆ¼k’Ä~—˃œÌžËs˜Äi¼aˆ·Yˆº]ŒÀ[‹ÂS–ÈRÌs±Ø®ºÞȺÜÌ·Ụ̂е„·el¦JTR-.ZƒW1‡d2‡|:‘D‘—G”—F–›GšI¡M KŸžIœH›H£¡H©¢G«¢H© G§•C§–E²ªPÁ½_ȤY¼M/²!±"$¼''•('¦E9Ã[K¼F=º,/´ &­œ  Ž  Ž Œ ”““ • –— •   Œ Š  {…j*”´L”¹e›½p˜ºh–¸[•³T—²Q›´Sš³Vš²UµW¢¶R¦¹Q«¾O­ÀMµÅN¸ÉO¹ÍWºÎa·ÌZ½Ó`½ÑY»ÏT½ÐR¿ÔQÀÕWÀÕXÀÕT·ÏT¥Î[–—G‡…hB'b•Fj¦Of¥Pk®Xp°^n¯\q±]t¯cƒ´jz¯cm¤_dšZ]~FZF+iR+vm<4 [C#v”IcEiŸJƒ³bk–Gh¥Pv®Xv«Tq¦KÁa¬Õ™®Ò¦¤Î˜¿ßÀŸ¾vp¦X„¶p`‰3|>‚Bnl0dp.u•Bs¢Pv«W€¶jŽÁyÀp‰®X‹šI‰‹<Œ:šA¢ŸC¤E€¤H€°Oˆ»KÎw²Û¨»ÝÇÂßÒ¿ÝѽÝٛȚl°N\w:'<j<"€a3‚u8ˆ‡?‰ŽBŽAŽŽB“‘D–’F–ŽD•„A“{<–w:™y?žt<šZ4˜R1¥k8¸šFÄŸHÈ“FÂO0º%$½*'¶%%½%%™)&¢:/ÆIA¼<4»+)¶#$ªš”• ˜•’ Ž‘“–”––“‘“ŽŽ Ž x ‚p,’±L•¸eš½q˜ºk—¸]š¶Uš¶Uš´Sš²T›³W ·U¢¸S¦»R­ÀP®ÂN¶ÆO¹ËP¸ÎX·Í]¸ÍW½Ó`½ÑW¼ÏS¼ÐQÀÒOÁÔWÀÔXÁÕS´ÍT›Ç\€l7r „o;$`–Hg¥NiªRk­R|¶dŒÀvzµew¶`{¶g{·ix´gy´jz³sk¨t_sNL1S2L}R*i`3SF%@8Yu9d—Gm©U{³^t©So¤M‡»\Ë~¸Ø²¬Ó¤»ÛÁ²Õ™Ès‡®oJAbf.Š¿R„—Ere*o’?s©Sv¬a±i€¬Zu€:w[(€P%ŠP&•\+žƒ:«ŸG£F¢Gv§Nt§My¬X–Äy¼á¸ÆãÑÂßÔÄàÛ¬Ò®|¸Tg‘E0 -^"€N0h5†|<‹~<Œ|=Œu:‘x;•y=“m9‘a6’\4˜\4—X2”?,1)¦M-¾p6Ão7¿Y1³K-´'&´%%µ'%¶$'Á$&™'(ª0'Á<3¶-'±!¬¡—•–•—˜“ ••–œ˜ › ž¢›•” Œw†w,­F™¾e˜»j˜¹c˜¸\˜µUš´Uš´Sœ´VµW¡¸S§»S§¼R¬ÀO±ÂO´ÄO¸ËP¸Î[¶Í]·ÍT½ÒX½ÒX¼ÐT½ÏN¾ÑMÂÕRÀÔTÀÔS°ÍW±Uf6 egZ†Dc£Qi©Qg®Uq¯Z–½w’½t†ºm~¹h„¾m„¿q»t~¹r€º†ŒÄ¦~®ŠSQ1I {/$M2-9w’Ih¡Kq®T¸]u®Vr­Tƒº[”ÈqµÙª¸Ú·¸Úº·Ù©©Ñx…žRNK$u Cˆ¸X‚¹\x¡@r†9jŒA„±`šWbHn4w4!„=#ŒH'–c,š‹<—¡D‰¬O…µX¶[ƒ·^€´\}°Sޏb¸Ö«ÊåØÄàۨХ}¹So¥K=(%G l6$tP/‚_4„c6„^4Š_5^4‘V3Q3“I,”H0•C.’5(”.&¬9*¼I-½E+±)&¤$¨-&²$%µ%%»&&¾%'Ä%'¯*(®#¹)&° ®¯¨§¤œ•”  ’Ž—• ––š ˜ —”‘ ‹ zŠw.”¯I•¹[™¼iš¹aš¸Z›·V¶UžµVŸ´U¢¶W£·T¨¼Qª¼Q¬¿L®ÂK²ÅQ´ÉP¶ËW³Ë\·ÍU¾ÒW¿ÒU½ÏS¾ÎPÀÒQÃÕUÂÔVÂÖR¥ÇWxŒEQ SX[0^ŸMi¢Nn­Uo²Wˆ¸i¹o»r޽rŽÁy†¾t‡¾tŠÀ~ŒÀŠ’Å¥ÌºœÎ³SS8aF'oG1M F4cr5w£Mm¥I{°W³[{³W|´UŽÃgœÊ{¨Ñ˜¾Ý¾¹Û»·Ø©°Ñ†´×}‰¢]Tq*“Åf|§]V^-rg7v‘C‰½U€€D]"s0~8"‡E&Š],}6ˆ’=€žF|®T~´Z€¸^†»eˆ½eƒºb‡´Z”¹c»Ø§Óèå¬Ñª}¸Ux²QE73^ wE.‚N0‡O0†M1‡N0‹K/ŠB,…8)‰2)Š2+‡-$('¨3(²1(¶0(«$$¢"«"%±%'·%'À)'Â*(Â&'Å%&½*(ž¶""° ®­¬«¨¢š’ “•• – –Ÿœ ›˜— – •  ~ z.”­G”µV—ºf—¸a™µX™´T›´V›´SŸ´T¤·S©¼S¬¼R¬¾R®ÀN³ÆK´ÈN·ÌR·ÎX¶ÍZ¹ÎW¿ÒU¿ÑR½ÏP½ÑPÂÓRÂÔS¿ÔSÂ×V—¿Y`X0CE WCa Of§Qr¯Su²X„·a…·`Œ¼g޼k”¿o’Ãx–Ä€”ȕěœÌ«¬Ý»‹¤„[\8Š´]n‡JL28 C*t™Is£Mu¬Qo©R¶]u®T}´T‹¿bšÉz°Ö¤¼Ü¼¹Û¸ºÜ´´Õ•ªÎt±Óet;t™9†¡WlM„Äfu¡L{¡C€¯M„¸Yƒ»_ˆ¿e‹Âe‹ÁgŠÀhоg¿fŽ·[»×³®Öª~¹SzºUMI&#*N p-$<*:)9)‹?+†5)„+%ƒ%$„!#x‡ ª,(¯*%­%$­%%£ $¬!"´%%¹*'¾&&Ä)'Æ+)Ã+'È)&¹*(™»"!· !µ!°®­©¨£— ” ’ “›£¦š™ ™• • • – • ’1˜°F–¶V™ºd™¸[š¶W™´Tš´Uš³Tœ³R¢¶R«¼T¯¾S­¿Q°ÁMµÆK¸ÈN¹ÌU¹Í_¸ÌZ½ÎT¿ÐS½ÏM¾ÐP½ÑQÀÑPÀÒT¾ÓS¿ÙY…œJL:WV$h Jh¥Ml­Rv¯S~´Y…º[†¸Z‰·\‘ºe’¼h’¿n›Å{žÈ‹™ÁŽŽ¶ƒx—cg”>©Ø„«Í„Š«gN<$5 4e=w©N´Y„¶\’Äe~µW‚·V¼Y¢Ëx®Ò‘»Ü·¼Ü²®Ñ”°Ó€²ÖŒ´Õ“ƒ Y^…2 Êo†®llžNp}9pm1U%w=!zG%y\,up0t‡6y˜By£F}®n„´_Œ¾]Ãe“Åi’Äk”ÇkŽÄn‡»dŒ½c™ÁržËˆ€¼S{»SLF"#.Agv,#x0%z/%1(+'|"#x"pv"%£!#¥!"¥!¦"­#$´#$½(&Á*'Ä('Ç)%Ç*&Æ)&Ë*&½*%“½ ¹#"¹#"µ!²²°°¬£— ˜ —— ¡ª© ˜” ’ ‘ • ‘ • ˜~5–²I‘²P”·]—¸[˜¶W˜²T™µU›³Vž´S£·Tª½S¬¿R®ÃQ²ÄO´ÇK¹ËQ»Î\ºÏ`ºÍ]½ÏU¿ÑT»ÐL¼ÐP½ÏPÀÒQÀÔU½ÒU·Õ]ic061 ^|9f¡Lr­Qw²S|´SµV}­Q{¥M€§O„ªT‡«Y±_Œ´cޏm¹t‚›eF(2tœA¬Ùw£Ê‚޶qx•ZM8"?2oœIxªT˜Ær™ÉdŽÀ^޾[—ÄeœÆd¤Æn»Ø¦´Ö•¯Ï„Äf¯Õ…¿ã®­pgŒ>„µX»k~¢]‚¥L‰Ia/{U+uh0jv4e}4_6i•AiDp¥^y°V…ºX…¾^‰¾bÃi—Èn—ÈrÂnˆ¿hÂlŒ·]x´Ow²NF83D`lu%"{("x(!w"#vnrš! ¡!"ª"#§!° %¸'%¶%%º''¿'&À''Á''Å*&Â0(È)'¼0(м ³¸!!º!³³¯¬°®Ÿš— ™ ¦¯­ ¬œ˜ ˜ —˜—– ”‰7–±J”´R–¹]—¸]š¹Z™³T›´W›µZ µV©¹T«¿T¬ÀT°ÃMµÆL¶ÉM¹ËT»ÎZºÐZ»ÏV½ÏR¾ÐQ¼ÐP½ÐQ¾ÑPÁÔPÁÓV½ÕW§ÉZR3+6#Z”Gp­Qv±Su±Tv°Ry±Tr©Pu£NwžL}¡S«Y‘°`”µc‘µc¹pšÄ€’¯M4-#\t%”ÁXœÇhÇg‘µpb]4kšLˆ½f”»rt¡Jy©P‰·Y›Äo Çp¬ÐyÀÝ«¼Üž¸Ö¢¤ÎˆÊ‡xšN~¦OœÃh—Ãs’¾sŽÅ\¢Öfgb0`Dts2j|6h‚6oŽ:n‘=i•?q¢Cy¯F„¸R„ºY‡¿`‹Áe‹ÁjŽÄl“Èr—Êw‹Ämƒ¾h¾gw®Oo¤HB&$+7L _h folec ™!ž!«!$® "¶##¹%$½)&¼&'½''Â)(Á'(Å((Ç&%È+(Ï*)º,(…¿´¬¸¹! » ¶°¶²ªŸ™¤¯#«  • • —““•Œƒ”Œ;”°N•·]š¼f›º\™·VœµXŸ¶Z ¶Y¢¶W¨ºS«¿T®ÂS²ÃO·ÇN¹ÌQºÍW»ÏY¸ÎWºÍV½ÏT¿ÑP¾ÏP¿ÐS½ÐU¿ÒS¿ÓU¹Õ[ŽªPC (B4b Ky²Uy²X{´Y|´X{³Wp±Wq­Vx­W{­Z„²\Œ±^•¹c™¼ežÁr£È|¨ÔŠ¬ØœcdI">3v‚7‚™Eˆ®Z‹ÂZ–Îi•Ëo§Z]:w®X‘Ã}šÆ€œÃ{œÃu¨Ê‡°Ð„¼à¯«|[z8f”Kf—A“Â[³ß…¯Õ‡|Z4*1`q0iŽAm=jˆ7m…6o„4}™=}©H²PмZ‹¾aŒÀa”Çm•Èv‘Çx‘Ç~’ÇxÇr‹ÃlÀh…·XgŠ<5 "&/CS ]diZ W~’!˜!¨ ª "®&#µ(%µ$$·$%¸&&º#%¾%&¿"'Ã$'Ã$&Ç'(Ï+*¹-+‚·­Ÿ¤·» ¶²´ µ °¡Ÿž¨µ#¯ š ––“ ’Š … ƒ+““<’°K˜»g™ºg–´\˜µW™³WµZžµY¢¶U¨¸U¬¼U±ÂTµÅO¸ÈOºËO»ÎQºÍX¶ÎX»ÏU¿ÐT¾ÑR½ÐP½ÐT½ÐS¿ÒR»ÐUªÏ[w„?4, Oc4m©Q€·\ƒ¸a¸`¹f~¹duµ[u³Zr³Zt²Zw°[°[‰¯W®U–²^“²^‘±aœ¹r“¶qg`6V>"cR2ij?k€Bm{@td9¡M©Ïˆ˜Êk‰ÄdœÎƒ®Û²ØŸžÈ}‹¸i¼f¦Ò„©j`Œ?‡®i‹»q£ÊvNun:€~a)HFar4gi0lb+vd.ˆ~3• B†«F€µO‡¼WÁaÄh—Èp™ÊzšÌ‡˜Ì˜—Ë”“È~“ÈtŠÀjˆÀd]q4.!&0;DR V W Fr™# !¬!"¬ § ³$#µ'%¶&%»(%º''½$%¿%%Â$&Â%'Ã%&È'(Í(+»35‰¶¯¨£ªµ¶¶²³"­¤š™Ÿ«!¦˜—•” ŽŒ … zƒ>š—A‘¬J›¾iœ»e˜´Y™¶W›´UµYžµX¤µW§¸U­½U²ÃU·ÇO¹ÉN»ËO¼ÌP¸ÌTµÌV¹ÍU¾ÏU¾ÑT½ÑS½ÏT¼ÐS»ÑT³ÊW–½Va^/.;6^šLw¯V…¸a…¹hˆ¹i„·k¸hs²[m°Xp³Yt²[x¯[u§T{ŸM}”I{ŽG~ŒE‚ˆD=™PŸ²]›»b’¿i‘»mбg~žZpˆIy›P³i‰µf„³_|£TnŒD‰­Y~±PžÊ|«Ð‚œ¹rˆšTv“B¿e§¶r’˜Ivw3ws3¥²[vs=WH%bW/qu9„†B‹‹D‹—D‹¢D}¤J{¯O}²S‚¸Vˆ¾]ŽÃh—ÈqË„¢Ðš¤Ñª£Ï§˜Ë’“ÇxŒÁjÉkfp9)"%+2<@E<N %#¢"#§!#¦ ¤ © #³""µ%%¸%&¿(&À&)¿%'¿&'Â'(Ã&'Å&%Ê()Ò12¾HBˆ¦§®¤£«®µµ·µªš™¥ “‘ ‹ † }t f{K–›B‘®N›½hœº`š´Xš³UžµW ¶XžµX¤·W¨¹U¬¼S³ÃR·ÇRºÉN»ÍR»ÍV¶ÌT·ÍVºÍW½ÏT¼ÏU¼ÐS»ÎQ·ÍS³ÌV¦ÃT‚¢MN1,LX(j¥P~µcˆ¶g…µe†¹i´bs®\l¬Yq±[v±Yu°Yu±Zu«UrŸNr–Lo‘IrIvKz™N«Y¬Z~°\z®\~³`x®]w«W{°X~µ]q±[}¶b„»e‹¼t}™cYU3!0 jP{‚>l…½[U‰¥–ŸŸ›¡©ª¬²¯¥›” ™¢Ÿ”—‘ † ‚ } v f€[$–œ?•´Už¿lŸ¹]œ¶WœµS ¶WžµVžµR¤¹U©¼W°ÀS´ÄR¶ÈPºËO»ÎT¸ÍXµÌY¸Î`¾Ð_¾ÑXºÏV¹ÎS·ÎS´ÌR¬ÇT•´Rtz== /Un2q¨PŒ»m½s†µb²\tªUj¥Xo¬Xo©Xo¬Xw²Zy°Xo¦Sq«Tp«Sl¥RnªWr®[r®Zm¬[o°\u´]t³[t³_k®[k«Yo°\rµ]t¸cy¶`|´[†¼g”Êu”ÄyNO3/ch1hi4_w6W…;_šEo«Nq°R|·a„¾fwµZ}¸[¹[»]~¹]ƒ¼\ˆÀ^†¾]ºY…ºZ„¼[†»[‰½`“Ãm£Ì‰•Ç{¦Ñš­×µ±×» Ð¤“ȆÀoŒÇlwšN! &+$)%t°4/Ÿ#¢%¥$&¯#&±$%±#$·#$»('¿*(Á('Á)&Å,)Â*'Ç))È'(Ê'&Ë/1ÑZZ¿…}“©–––  ª¬ª¨¦¡š“—™’ Œ } u w c‚j)”œ@—¶\ ¿iŸ¸[ž·WµSŸµTŸµTžµR¦ºU¬½U°ÀR°ÃP·ÉNºÌPºÎT¸ÍXµÌ\·Î_¼Ð[¼ÏTºÏT¸ÍSµÌT¯ÇU¡¼P†¥OaS/5> \) &&% ##’— ž!©"$³$&¶#&´#$º)'»('½''Â*'Å+)É/(É,)Í/-Ñ;4ÑrgÊÁ´Ï×ÍÁÝÓ‰«™—£•‘ Ÿ¦¢žŸœ˜—– Ž ‰  tt b[ “Ž=’Aš»Zº`š´S›´RžµQŸ³R¢¶P¦¸Qª¼U°¾R±ÂO¶ÇM¸ÉM¹ÌR¸ÍV´ÊY³ÊZ·Ì\ºÌV¸ËQ´ÊR±ÅQ§¾O•®M|‘FcT1F 8SV,e‘DnŸMw¦Rn›KišRnžWnSq¡Sv¤VqŸSq Wr ^nœ\l›[pž\m¢_t¥^n¨bj§amªcq²bq´`l­Yj­Vp¶]uºav»cp·at¶b{¸f€»s™É¤µÙɾÜÒ°ÖǠ͵ŠÀ›gWVk3[‚?c‹EgšOl£Sm©Ui«Mp±Pw¶W¿aˆÀkŠÁpŽÃ…£Ì­¸ÙÅÀÞÒÁÞÓÂßÔÃßÕÃàÓÀÝÑµ×Æ™Èž”Ã|˜Åx¤ÎŠ¬ÒŸ¤Î–¤Î’›ÈžÉ–¾oƒ¶[C/'#gž&%Ž‘“— #¨"#¶&$½('¿(&¾'&¾%%Á('Å*%Ç+'É1(Ì/)Ò;5ÑJCÍšŽËËÂÏÞÓÃàÕ‹®š£˜‡t | ž œ˜˜ –Œ Š ‡ … ‚ x nvZc7–š?‘?›¹Yž¹bœ¶SµOŸµOŸ³O¡¶P¥¸Sª½S¯½N´ÃM·ÇO·ÈP¸ËT·ÌV³ÈX²É]·Ëd¹ËT·ÊR³ÈR­ÂQœµQ‹£Iw{q‰>s‘Hw›UxZwžVs›Ww d{£kx hv™_v™^sœ`qž`pš_q_sžar£cu§bt¨gv®jr®co«\n¬Vo±[n²\s´dx´lˆÀ‹Ì®¡Î°ªÒ·´ÙÁ¼ÞÈ¿àÌÀßÐÂà֢̹ZzFUt8_‰B\†<[Š;\‘<`™CaŸHg¨Hm«Jy³Z·f…ºrŽÁ‰™Çœ¢Ë£¬Ï¬¯Ò´­Ò´£Ë£”À‰¼y“¾t•½o“½j˜ÁlœÄqŸÆu˜Är—Äs¼kˆ»dг\<#'-hƒ‰‘•#œ#%Ÿ"%¬#&®&&¹'&Â,+Ã/,Ã.,Â+)Á*'É.(Ì.*Ï4.Õ<6Ñq`Ì· ÍнÏÖÄÕʰƉk˜«šš—Ÿ¨¤‰ pQ:o‰)„W-wR-c1k*xE'wU.h4?,3…Ž6˜?•§Bš³U ¶Y›°O ³N£µN¤¶L©¹O­»Q¯»O²¼LµÂM·ÅM¸ÆM¶ÇP²ÇS­ÃS®ÄW±ÅW¯ÀRª»Qž²R‘¦Gƒ“@wy;lG,U6T*de3l…?n‰Bt”Nt[už[u Zx a{ kz¡mwis•`s—^r™`qœ_t›_tœ`w `s¥fu¦ct¥ct¬fnª^h§Xj¨Rl±Ws´]|¸jºw×ʧœË§ Ì¨›Ê¥ Í¬§Ñ¶¯Õ¿´ÙȞκe•^Mv3T:Y†9Vƒ6ZŽ9[=^–@] Bf§Go°Rp±[q­[z³cˆ»v‰¼y“ǙǓ—ÅÀ‘½v“ºr™Àt”¼mºf”¿f–ÁkšÂl’Ál‘Àk‹ºjˆ¾hˆ­Y8 1nrv…Ž™"Ÿ#$§%&¬%&²'%»&%Æ-*Å-*Å-)Å*(Ç*'Ë2*Ð3/Ô70ÓRGÐŒzÍ»£ÎƲÑ©ØtÉA5¡© žš›œŠ{dQc €I#nL!gT'[$?E [ o=*O2*;‹•;˜>›¬DµR¡ºZ ¶P¦·N¤¶L¥¶J¬»N®¾P°¾M²¾K·ÄN¸ÅN·ÆO´ÅQ¯ÃSªÂQ¬ÁW°ÃV®½R£´O™®L£I€’Bzt;mA,O 6[-jb6i€?lˆCp’IvWz¤^w¡`¢g}¢mz mzžiwšdtšbu™ar˜`q˜^q™_s_s¤gt¥gu¥er§bk¡XbPf¥Qm°Uu·`{·m…¼y‹¿ƒ‰¾†ÃÂŒ‰½†ŽÀ“™É¥£Ï²¡Î´™Ì²p hNr,X}4Y„5U€0^‹6^9[>^š?h§Gi¨Jj©Sp«Xp¬Vw±bz´f´h‰¼t‹½r½t‘»s¹t”»q’»m¹f”½g½f’¿h¾fŒ¼e‹»iˆÁi}ŸO- =rnw ~Žš Ÿ!$¥''«&&­%$¸(&Á+*Æ-)Â.(Á-*Å-(Ì5,Î5.Õ:5Ól]ϥϵŸÏ¾©ÖœƒÙO?Ç-'¢¤£¢¡žš—Š x^ T+~H)c)CSq^1ob1T(Z6!pX4_-I>W;Œ›>Œ˜<™®Fœ³S ·X¢´N¦´M¤µL¥µN«¹R¯½Q­¼L®½NµÃM´ÄO³ÅR°ÄUªÀS¨¾P¬ÀT¯ÁV«»T¡²M–ªH‰žE}Œ@wq8oF.L<[)j_4gz=g‚@hŠEp•Pw [uŸ^wŸe|¢j{ lxžizžfx›cw™_t™bv˜]t™\sbt¢bs¤bs£`q£]h›PeŸNl«Sn¯Wq°]v³h{·n{·qy²l¹tƒ¸u‡¼{‰¼†ÁŽŠ¾“Œ¾•p bVx1Sx1S|2Q}0Xˆ4\7[;_›Be£Fh§Ji©Pm¬TkªRo«Vs¯\|²_ƒ¶cŒ»l‘¾t»sޏoºp‘ºnŒ¸e‘¼f¼d¼d‰»`‰º`†¹h…Àgu‘K'Dj k z~œ!¥$&©"%°$%´'%¾,*Â.*Å0+Â-'Å,'É-(Î0+Ñ7/ÖI=Ó‚oЪ“Ò±™Ó±—×o\Õ3-Å/)•  ›¡›’ g |h,€q2d&FR*t~8u‚:oj1nM&yz:~Š@^6>3WI”¤E‘>œ±HŸ¶W¢µX¢´R¦·O¤µM¨·M©ºQ®¾Q¯¾O°ÀK³ÄP³ÃO³ÄQ¯ÄW¨ÀS¨¾P©¾T©¾V¦¸Qž®L•¥H‰šF€ŠA{q;p=,V D_)nY1iu9kˆCl‰DmŒHq—Ps—Xu–[wšdz ixgzœeušbt™co™`r–[n–\p›bmš\jšYož]nUd’Ia—Hl¨Rm®\q¯_t±dx³ey¶ix³g|¶h}µhƒ¹p¸o„»q…»t„¸y~³xiZV9Ou.O{1R€4Sˆ4Z“;X‘=_–@b Hb Gd¦Mk¨Qk§RpªXq­Z}³_†µdЏjŒ¹k¹m¸o¹mޏh‰´^‹·]º\޼aŠ·YŠº_ƒºk…Ãit…G#"V h h wƒ’ —"¡!%¤!&¨%%´+)¿.-À0+¾+)À+(Å-(È0*Î0+Ô<3ÔXKщvЧңŒÖ†qÔC7Ï.*Ä,)‰ š—›™š“Žzx0vR(W EK,yŒAlc/Q-R#? T!_'Q=C `\ ¡C’¡> ´M¡¶X¤¸V§¸R¦µN¦¹N«¹N®½P­¿O°ÀPµÂL³ÃL´ÃP²ÄS­ÂU¨¿Q§½R¨½W¨»V ´R˜©J¡FˆœF€ŽDwm8o8(GA^'pZ2lq;k€Bgƒ?kƒAn‡Bm†Ip‰Rw‘Ty™\y›cy™_vš_z›`v˜ar–Zs–[r–Zp™Zl™Wlž\j›Sb‘I^•He PlªWq­^o¬\w±bw³gw²d{³dz³cz´dzµe{´b€·j²ks©ed–OZ‚6S{0Q}5W„5\‘9\’;^9d˜?aœAb Dg¢Ji¡Gl¥Pr©Tt­Y|²]‡¶e‹·iŒ·iŒ¶h‹´j¶i‹´c„±[„²Wˆ·]Œ»bˆ¸]ˆºd€¸g…Àekm9$'[ e m~ˆ˜œ!£!"¨#$­%&µ))¿-+Á.*¿,)À.&À,&Ç-*Í2-Ñ=5Ô`RÑ‘}Ñš‚Ò‡wÕ]RÏ4.Ë+*¾-(~ “Š ‰ † wmxQ'eR 4jh)wf1H xŒ@wq?U^: [+?RFlm&’¡A“¢A¢¸P¢¸]¡¶V¨·P¤²K¥³L¬ºN®¼Q®¼N¯¾M´ÂO³ÀL´ÂN³ÄS¬¾R¦»P¢ºO§½W§¹UŸ°Pš¨K¡Gˆ˜D„ŠAup8p5%<<RmM/nm:kx=ez>iBm|fžDeIežIl£Lo¤PvªU|¯[…±b‰µc¶g‰²dµi޶g‹´a‡±Z…°S…¶[‡¹`ˆ»^†¼c„¸_‰¾b_Z/),S d p}†Ž!•!ž ¦!$±&&º,(½*)À,)À.'Á,&Ã.'Ë0*Î3-Ó=4ÖjYÑ”€Ò…uÔ}sØ\SÐ40É-)½(&‚ ’‘ † € { uz^(tO!]M I wz5X&H$~‘?yŽDo^6oe/[+Fb+*pr,•¡C–£A¢¹U¤ºb£µU¦¶Q¦´P¦µOª¸P¯ÀR°¿L±ÀL±ÁL³ÃO³ÅS°ÃVªÀZ ¹R·Q£¹U¤¸TŸ¬N–¡JŒšE‡B‚…A{i;j'!?6G kA*pi;qx?k{?m}@pz;rr=ufAvn"~n3w;w‰Atx4j< `K .{‡2C“¢A¡·X£º_¥·T§·P¦¶Q§¶S¬»P°¾P°¾M±¿M²ÁM±ÃR±ÂP­ÁT¦¾YŸ¹UŸ¸V¤¹]¡¶Yž¬R–¡I‘žF‹•FˆŒC€o;f(!B;B g4$o[9ln=it;iz=iv9mi6ob1ug8we8vm9wzBqJmxEo{ClxBi€Gj…Ff…Ed†Hc€Cd‹GfEeGg’Gg–Ip Ou¢Ty¥X~­\‚­]{«[t¨Wsª\s§Vv¨Xt§\qžYl—Pb‘E_‰=`…7Y€2e‹:gŽ7b4_‰5d7ešh(!P=8e&"tS6rq>p@k|?ip8lf2s_3xW3{Z6yh:{s?twBnp;lp=ls?fv?fw>czAcEa~B_ƒD_ƒAeŽEk‘Fm”Hr˜Ly¥V~©\{©Z}ª[x¦Wq£Sq£Rw¨Uz«Zz©[v¢Yp˜Lj”Bf>f‰;^…4j“>k–@h”9aŠ6e5e—=g“@h“@kšApžGqŸGw£Ly§N¬P|©Q|¨Q}«W…®Yˆµ^ƒ°Z«T…±T…¶X…µW…¸\„·]‚¹_}O/ 46Rn zƒ‰š!"$¥!#®$'µ+(·)(»*)¼)'¼)'Á+'Ê3-Í:/Ð61ÖUFÙvd×k[ÖB=Ï//Ä')¿!%²((“ ¢ž™›˜ ~ o(EW n@j@!j8"\$uG&{;{„;ta1|†d‡;Lm:)q`7ru>py?ny@lo8mk8rZ6zS2{b7|o<~jAxf<7@d&qK2rj8pw;r|t}Aq‚Bp‚?nŠDs”Mp”MsœRz§Z{§Zv¤[z§]|¤Z¤Y}¡UyœTsŒIj>gz7c}4e…6c‹8f‘?h˜Be“;a;i•Bm–Am“Ap=n–BvœGyŸJy¡K|¨S~£Py¤Lv¡Iv¤K{©P­U€®WzªS~­R°R¯S~±[}¯Z†Àbht>#7@?j ‘š #™"™!" %$¬'%±&'´*(´'&¸$&º'(»%%Á*(Ä/*Ç0+É/+Ë0/Î63Ï43Ë13À)-¸ *ª&•#Zew € ƒ { z sbNZ Y BhTa+qA%f1sJ"{]'n,_v5"wg(¢C‹@‘¤B¡¹U¥¸U¤µO¦¶P¨·MªºO±¿\µÀMµÀLµÃM³ÃQ±ÃRª¿T ¶Nœ³L µL£¶O£¶P¢´Sœ¬O‘£J‹¢J‹šF…”Gz]9S<;<>VoA.oW1nh5qz=qx>ps…y=€o|†E}†G||Dwx>t}?q{=m†AoŽIp“JxœQ|¦Xw Uy§[|©^{¥[€¦^|Xx–Qq‡Ghy;`t5\t3_~3_ƒ3eŒ:d“?`’;c;i“El’An”@pAr“Du—EwžKv Lz¤N}£Nx£J{¢Hu Iy§Q¬T}¬Ty¨Q|¬U±S~°Z³\~²^…ÁfYb1!0C4[ €‡” $–$•!!%©$$±*)³('´'(µ((¹%'½"$À#%Â((Ä-*É.*Ê/*É2/Ë31Ê22½-,´$*§(”$B0JY_c^\PMg\D`v8!j5m8!m<$p8"j+U E3YX•®H¡D“¨D¤ºS¦ºR§·P§·O¦·O©ºO®¾R²¾J´ÁL´ÃN´ÄQ²ÄTªÀV ¹S™²M³L¡´OŸ²Q ±P›«N“¥K¤I‰Dƒ“EuI0R =9@@I m2'oE.mS/nn9q|>q|;ryAto?xk:ƒs<‡w?‚p<{\4x[2td5su=w„B|ŠGz‰HwEv{Bpt‡|B„r=f4vX.s_1uq9xA{‰E‡Dx}Dv}Bqs8lt9mx;o~=oˆ@q•LyŸTt™OxžSy¢W¡W V}šRy•Nr~Ckh5kb-hn/es1h{2i5r‘:n:o;u“>s’=r”>u’=s”BvšFt™Dv›Eq™AvžDy£Iv£Is¡Hv¤H{©Ox¨Q|¬T‚²Y}²W¶Z·Z‚¸b„¹[KD)7?1tˆ! $ !%ž $¢ $ª$'±%&²('¸'$º'%½('½&(½-*¿-(À)'Á'&Â)'À-,º**´%'©&$“ O=6-+8is € ‡Š‰eUn(r+ `S X VE> xƒ1“­HŽ¢@•¨A¡¸O§ºT¥¶Q¤¶N¨¸N©ºM°ÀO³¿K·ÁI¶ÃM´ÄP®ÃY®ÂW¡¸P—°J ´K§·M¦¶Q¥µQœ¬M—©M¥K‹£G„ŽGp3/H;@=?8Kn70hA(gH+kZ1ls:r€>sBtvA{q;ƒxC‚xA}l9t`6m`2os;q‚Br„Bw„Cu‚Ct~Cop;mm6hp6k}=mt—Ds™Ho•Do—Au›Cz¤Ku¤Ms Iu¢I|©Rz«V}¬S±Y³]‡º^ˆ¼a·c†»]L?$*?)U ‹Š ˜$ % !%£ %¥%ª"&­$%³$%¸%%º(&»#(¿(*½,(½''½&$¾+&½((º'(´##ª%¢%›!e[P;/'Mqu } € ‚|s0{g1~T,^!0R WN @“8“ªH‘£C”§?¢·N¨»U¥·Q¤¶O©ºN¬¼P±ÀL³ÀK¶ÂI²ÁN±ÁQ±ÃV«ÂV¡ºR›³K£¸N¤µQ©¸U§µUŸ­N–¨K‘¥I‰¤H‚‚Ch .?6;:9>D_%g>*iB*fH+kc3mwˆ@‡|>}k9u_2rk8u?v‡Dx†Ev„Bv„FwwBoo9ovr‡AuE~›P€™P}œP„ŸRQ~–M}‡E}oqh8|f6‚w<ƒ|;|l8v^6l_3rt:z…Az‰Ew‡DzŠD|„Fuw=pu;sp9uy=vAyŠC}’H‚šOƒœQ~—Lƒ˜JƒG{~Azh7vX/tU)r`+t_+jg)kl/o{2iy0mq,lp2l€5kƒ6k†6q=q’Cr”Ao˜Bu¡FuŸA}£Iy¤Iz¤I~¦Nƒ®U†°W†±X„³X‡·\„¶[ˆ½d„»i„º_G@35E M $=‡– %œ %¡!&¨#&¯#(¯&&¯$'±%%´&&¹&'¸&'¸&'½''º')¹'&´&%²$'±#$© #"’ Žz|$~(†)„!x\00\a`l ck O8Qp8za+vM&^Q:‘¬E‘¨G‹ E–¨B¢¶M¥¹T¥¹S¤¸Q©¼R¬¿O±¿I³ÁJ³ÃL±ÃP¯ÃS­ÁT§½W›¶Qš´L¡¸O©»U«¼[­ºT¡²L•¬J¨KލJ}h9W47<;C?9Ti-$l9(qA+oJ-n^3sp:uq>uh8y]2~j8„u:„t?vb:n]1sm9x}>x‡Ey„Dx‡E{‡F{„Dtw?mh7qm:ow=v…At†@{”K˜Q–O„™Oƒ–K|…D{i8xW/v[,ub-sg.pj+nr/p‚4q…5o€2js0o|2q‚2j‰5oŽ4==;9<<F]j.$m@,nT4nV4qn:v}@um;{\5z]5i7‚x?…w<}c5qS/vb3wr;z€Az…E|‡Gz†Gwx@rxp•@u›E{žEy¡Fy¤Ky§Pƒ°V„²^€°]‚³[‚µ^~´Yµ[µ`‡ºYSL##58H [ZE :(9s %­+.®*+®()©$(¬&'®%&ª &¥"'¥!' #š"!˜!˜!Ÿ"œ"ž‘!e |5€;…L"g/‹`-ŒG%…4‡1‰(vJ:B@>Ffkhee}|-’·N‹«O„ E“ªFž²K °J¡°F¤·H«¿O­ÁN°¿H´ÃK´ÅQ²Ä[°Ål®Æ§ÀrŸ¹X«Âg­Än­Ác®¿Y©»RŸ´R—¯P•°R›Kk)!;<;2697;BU f)#j2(lK/pY5mf9mx=pw@wd8xc7†m;‡w@†q;„l6|[2wW/wf8|t>{…C|‡F~ŠHz€Buz>rm7nc4nq5p‚=vŠEz“K}›P€S‚U€‘Qz€Gqk8ph2ia+hc+jn0i|3o‡8kŠ8lŽ>u“Dw•Cw”Du”EnBq‘Bs“Av›CwšCwEyDy¢H}©Oz©R~¬R‚²]~°^±Z€¶]€¹a}·Z~¶\…¸XNB !2=Vj1(e'"WH 6("@i"#¢''©%$¬""©!&¨& "˜! "—!™ ¢%ž%–!Œ e v#p$t9K€W)€X+€>02†+~U -/4?ZdhbY‚Ž4•¶P‘°TˆŸE™­E ³Iž¯KŸ°D£¶J¨¼P®ÀN¯¾J³ÁM²ÃQ²ÆZ³Éo²Ì‚¨Åv¢¿a¬Ål®Ån­Âb®ÀV©½RžµR–®Q”²R‹‰F[5;:4<>>;?O b!!j-&i?*q[4o`6kg:nl‚s:~k9wV1rK+wZ5xjso6ok5ts7sz;xˆ@|“I™P€žS‚žTƒšY|…Iri3oi3pi/kf,ek-k}5n‚4j‡8iˆ;r’Dt˜Jt™Iq–Iu—Ns™Kn’Bu›Fz¡Ew E|£Gz¤J~§N{©O}¬Qƒ±[…´]„¶_¶[„µ\¸[…¸]†·VF9"3DWn@,j>.f.%W9)!.F^ r † ƒŠ‰!‘” ”"™œ"ž#"Žt?ŠV…D~8~6t*u(y'x!sz&|#uM&+7ELWOQ‹ ?“²N±X‹žG˜­Fœ°J¢³O¡³L¥·K©¼N®ÀN¯ÁJ³ÃN²ÃN¯ÃO«ÂT£½U›¹Q¡»U­Ã_­Ä_¬Á]­ÁV«¾Q ¹R”±T’µTƒh8G-8;;9;=@?D ]l3&k;+rW5pe9sn=td9{e:€h<ƒn:†u:‡|@„m9xR.rK,qV1vg;ww@xEzxA|ƒDpx>ni3je2po2lr6r?u‹Hy”K}•K}”M~“Nxt>u[/r^+rk0lm.io.hx2l4n€4mˆ;t@z˜Gt—Bu•Gz™KwœLx›Hu›IvŸHv Hz¤Mu¤Lz¨Lt©O{«P²[†·c†ºd{³Z|³T‚·Y¶Y…µV9-+7Pj6'sO1oE/p8.D *!"$4J\ r ƒ ‡ ‹"‹"%2—'‘ •"“!”!•"™&—'sY‹w'ˆi!„]…YƒP†F‚;v(qjj e ^4#5>B<N, ”²F“°L‘°UˆDš­Fœ±Nž´QŸ·R¥¹Q§»N¬¿N°¿J±ÂL±ÃM¯ÃR«ÀU£½Xœ¸Rž¸Pª¿U¯ÃX®Â[±ÃX®ÀR¢ºT˜´S”®RqD(63:@?7<=?@<Zl2)j5)nL1l`9nn;nj9sf;€jyBz}Ez†Ew~>un7qk6q`,rj1ww9|‰B{’I}GŒG{Dxh9vW0oV,mb/jr3in3eu6h8i}6m‰>oŽ?s’Cs’Ds—Is˜KxNxNu Ny¤P|¦R~¨Sz¦L~ªP|­Q¬P†µ]ˆ¹g‹¼b´Y…¸[ƒ¹Y·Y‚ªQ5 #0G^!sD.nD*‚‰`[26''".Si} ‹Ž# ”#—%˜5– +˜˜!˜#œš"—&$yE”Z‹HŒJŽJDŒC@‹<Š1†-%uxsgiu~~m rT“³O“±V‘®U‹›>›°H µQŸ³OŸµO¦¼P§»N«¿L¯¿K°ÁJ¯ÂL°ÃP®ÂX¥À\ž¹S£ºQ«¿U¯ÄZ²ÃY¯ÀS¬¿R ¸S–¸S›J[,9::>@BADHH [r6-m8,pF-s\7tm€b9wQ1pK+oM/p^7oo?ty>z‚CyGv~Ass:op9qc2nb2ux9z‡?}’I|ŽEzˆA{{@{i:zW-kR*p\,pm1jr3iu4n€6hƒ:kŒAr•Eq”Ds—Fr™OužRu£Uw Sx¡S{¨Vx¨Wx¬VyªOy§Oy©N}¯S‡·`ˆ¹f„·]}´W€´Xƒ¹W†»W|™H+%(3M^#i*ˆX‚s$&'Fmu  ‹‘!”$“&š#™!˜"—#•!™"•”#‘$ŒN°n%ª`ªa§Z¥X ¡O ŸKžI›F›EœBŸH!¢L'C"ž= œ9"š; –5’0„"x/‘µS’²^‹ªWˆœ>š¬G›°Ož±QžµO£¹N§»Nª¾I­¾J¯ÁM°ÃK°ÃO­ÁT¥¼T£»Q¨¾R¬ÂV±Æ\³ÄV¯ÀQ«ÀT£»T›»U…p;H 084;;=BDDCF Sm.'m6+pE2sL3r\7qd8wX5x^7€q<„w>p9{[2rM,uQ/oM/rY5sc8rv>x…F{€FwBur9pi4rl3rp6r{;v…@xŠCu‡Cv‚Bz}?s[5oK)lQ-lV,l`.iq3kz9i~8h†=iBr’Fs”Er”CsœMxŸPuŸQ|¦Tx¥Py¦O{¨QzªO{ªMzªOz¬O¯Rˆ¹`ˆ¸_…¸Y}µW³Yz±Q€ºWm„@!#'"3KUU~vZ; 2R o|…’”%&ž'¡$¢$¡#›"˜$›"•"‘!’#‹"’p$³š3¬Ž-­Œ-«+©v)¥j$¤`#žV œQ!šL"•E’B–E$”C!”=“7 “5’3Ž*†*†4“¶S’²^… LŒœ<œ¯Fš¯Kž³Mž³M ¶K©¼M­¿H®ÁK®ÁM¯ÁM®ÂQ­ÀT§¿S¥¼P«¿S¯ÄV²ÇU³ÄS°ÁR©ÀR ¶U—¯PsB'5265<=;CDDGEM k'#k.)m@0qM2oQ4pU=sP4tU2}c8t>{j;tV1iF*k\2n_5jV2pl;r{?v‡EwƒEsy?rp9pe3nk1sm3vz8x:z‡BxˆBy†B|}>w^6mK(mQ,mX-oW*nj.ly7my5i7mAr‹AqBs™Hp›HrNq›Lt¢Oq¢Kp Hv§Mz©O{¬Qy«Ow©O|¯S‚³WƒµYƒ´X´V²U{«L…¾Wbg1  %/75J : 3X m ‡#Ž"•&¡!*§!)¤!'£&¡%#œ%™–““#Ž$—€)»´=´¦6´£4³ž4®0®ƒ(¬z)ªl$©e$ŸY#žX#šM ™F!—A"•@•; –9!”:+„<‡ŸB‘´S±[—A‘¡@š®F˜­JžµMž´M¢·K«¼K­¿I¯ÂI¯ÃL®ÃO­ÃS¬ÀT¥¾S§½P­ÂR¯ÅU³ÈU³ÄR±ÃOªÀRž»V’™J^!/338:=DCGHKK I Zg,'i8*qG1qM2qO8sT1}\4€b6†t<€x>wa7pR0pa3re7qj8wxAx†Eu‡Fy€Bxv?qo:ol8jj7mp5oz:t;vŒFtJs‡Gus=uU1pL(nS,nT,oZ+kf/ju5pu4l{4u‹>w‹@s@w•Bs—ErœKrIs Ms¢HoŸGw¨N{§Jw¥Jv¦Lx©L|®PƒµW‚³W„³U±U€±Tz³Q€¶UD2$""%#%,-/*7f {Š!”$'¢!)¦!*¤!*¨!%£#Ÿ#ž#–%” ’”"‘%Ž$‰.ÄÁD½µ=º´<·ª9µ¤6±œ1­–1¬‹,¬€+¥m'¦e$¢^#ŸR"žJ#›@!›A!›<›@ “-ˆT#¨D±SެR†•<˜¥Aœ«Eš­Fš³M ¸N¥ºL«¿N®ÂK±ÄJ¯ÃM¯ÄO¬ÂUªÁW¦¾R¨ÀM¯ÄS´ÆW´ÇT³ÅR³ÆR«ÀTŸ¿VŠy>E.;=<CBEKMR S R M Ug)#i1&sD0kJ0nR0oT3v[5~d8ƒn8ƒz=|m:qW3r[3sh9squAwˆC{ˆF}}@xzBHIGO U S T NWc& k-%tH.qV3rU2pN1wS3€`8ƒo<‚t<€h5uZ3rT.sc5rm;pu>pƒDt‹Hw‹IuzBps~h:tO+n=!pG$sM(lD'h@"lA!lC"pO%iS'lQ'm\+op2p}6t‹>sBp—Gn™Ct Dv Hu£Fu£Bw¥F}«OжW‹³Qˆ¯PˆªM‰¨L„¢Iy_5#)* " %"#O y‚#–#•(š)˜,œ(–#—'˜#–$š"$¦&ª'$°“;ÄÐVÁÄPÀÅLÀÃK¿ÂL¹¼L´²Cµ±A²©<¬ :«˜8¢‘6 …0œo)™^&’H!= †+yT"„š<ˆ¡A‡ž@}‘<¡A—¬B•¦@™¥AŸ¬B¡³Eª¼J¯ÂL²ÄK³ÅM²ÅL±ÅM«ÂS®ÃQ±ÆS·ÈQ¸ÉR¸ÊT·ÉS³ÈP®ÃS¬È[€g1:ELOTTSSW Y Q S X [ V Q Q_ h,&k7+oE+qF,|R/€^5‚c7‚v;z=wY3oO,o`4lp9ow@vˆGvŠIzLz‰KwƒHv~Csx?rz>p@r„>tŠEzˆD|}@€t>wR.j;#i8 o:%nA'k>"o< qB"mE$mQ'qP&o[)wm1v}7t„9w@u“Ar–=rœ@s¢Fw£Cx¡@w£C~°O…³R„²Rƒ±P‡¬M«K|„;U.<¤& ¯(!¯(!§)!Œa:  0o Š”"™"˜$š(™$–$š#›$›%Ÿ#¥(¨&®'¥!'¯”CÄÑ`¿ÆY¿ÆR¿ÄM½ÄO¼ÀS¹»O²µC±°@®§<¬¡;¤•7£‰1œw.™f(˜S%:„,{i(‰> C†™<ƒ’:—ªD›­Eœ¨AžªD ®D¡²D«»H°ÂJ°ÅK³ÆN³ÇN±ÅPªÂR¬ÂR²ÅP·ÈP¸ÊTºÊS¶ÉS³ÈR­ÇX¦½X_18ELVVWWVY\ Y U \ ] X SK Yd&!k3)k<)m=)sF+{V5€d:€q>w=u^6nP.jU1mj;mr:q„CuŒJ|˜N€“L{ŠIxAux9z~?w?x„>|†C@|@n;|O.l4#k3"l5#k6"j3l?!qC%jC"kQ)tY5q\-pi0qw5mz6m†9n=n—?j•=mœCt¥Es¡@|¨I|«I~±P‚®P¯Sƒ¯N™CP+O°+"Ì7(Ï>*Ì7(Ë3'Ó<)Ó:+Í2)Â-(ž#\' Lr €ˆ Ž"’"•$˜+™%›%œ'™&¢%­#(²%¹"&¨%'¬–OÄÔkÀÈa¿Èc¾Ã^¼Ã^»Âe¸Ân´ºT²³E±¬?«¤?¦›9£Œ4›|1™a(’M'ˆ4}1|z/…š=…™?‘8„”9—ªD˜ªF©Cž¨DŸ®D¢³GªºG°ÀJ³ÅL´ÇL±ÅN°ÅPªÁP¬ÃQ°ÆR¶ÈQµÉR·ÊT¶ÉQ³ÆU®Ë]–œJ?>JLQRWVWXX W U Y S V Q H Oe"k,#m9'l5&rB)}U5…Z7ˆk9‚p:{c5pR-qS/sb4pm9n{@xŠG}—N|”O{‘LtƒBu}?t|>v‡Ex‡CxAy€B€|?|b7{O0t8%m1#o3#p6"k5!k8!m; rK$wW,zf5u].sc-op0qƒ7u’r£Cu¥Cx©Iz«I{²Sx¯Pv­P|EY;BŸ&!·*$».&Æ<+ÊD*ÍI*ÏK*ÎK,ÌD*Í<(Ó:'Ò0*µ%$‚B  Vv ƒŒ•#™&›#% ) )¦ '®")°!(³#)¤"&®–`ÂÔˆ¾É‡ÀÏÀЩ¿ÌŸ½ËŸºÉ–¶Àe±¶I­¯C¨§?¤œ7£4 €0š^)”H#06‚‰2‰œ;†™?Ž5Š–;˜¬F”¥B˜¦Bœ¨Cœ­B¡³M©»J®¿K´ÄLµÅO³ÆP²ÇS­ÄS­ÂP³ÆRµÈOµÉU¶ÉT¶ÌR³ÈX±Í`|f28INTWTZ Z V[[ X W TS Z QML Yh("l/'j5(rA-yO1€Z3…a6„k8|a5sQ.pK,uW-qd5ut:{†F–L–O{‰Iw‚Bu@vz>y…Bx„?}€A}{A~v@}[7|D,v3$s/'q/"p1!o5$q8%q;#vF%tT+u[+pZ,rh1n|6tˆ:v“?vHqDs¢Bx¥Bx¥Bv£Cw¨Jy®Ny±Qx­NqªL\P "K”³+$Ã5(ÎS1Ñc/Òn3Ño4Ðx3Óo1Ó[-ÎG)Í=(Ï4)Ó4*Æ/*›!!\ %!Fc |‰ ”"š$¢'¥'« (®#(±"*´")º")«#(·Ÿ‰ÇâÇÄÙÂÆÞËÅÝÌÄÚÉÃ×Á¾Î¥·Ám²·N­°Aª¥>¢™8ž…2™m,“V%@!‚!yA„Œ4†’9…’:‰5š<˜¦C•¡>˜¤D›©D®D¥µO±¿L±ÁIµÅI´ÅM³ÆN²ÇR°ÅT¯ÂPµÇP·ÉQºÌZºÌV·ËT°ÉX«¿W\*;LRU[SX\ \ Z ` \ V W[ ] ] S P Ua'm,%l1'r;+yL.~[4ƒ`8„f6€`5vT1nG+nM+mW0vj5xAt†E|JxˆGs‚Dr?ux;v=|w9~}>€€Awj;uT6s<(i(u)!k!q( t,!w2 y8#u="vE'uL)uZ,uf/p€6q‹:q)ËP-Ïj1Ò‡9Ð’:Íž=Í–>Ñ|6Ðh2ÑX/ÏF+Ë?(Ê>*Ñ=,Ò:.¸1)„Z HPm ‚Œ"”%˜%£!'«#(³"'¶&+¶$+»!(§&'°¥ŽËëÐÇáÍÇâÐÇßÏÈßÏÅÛɾΤ¹ÂiµºT®­C¨Ÿ;¥—6œs.š\%“D‰1|uMƒ0€ˆ5ˆ5ƒ†4Žš>“Ÿ@Ž?“¢C•¥D—¨C¡²E®¼K²ÁH¶ÆI·ÆLµÈO²ÆQ²ÆT´ÆQ·ÈP·ËT»ÎWºÍR¶ÊV±Í_”ŽA=@KQR[[U_ ] YY Z QQW S V V L L Ze(j1$n5'v@,‚U0Šd8‡p9„f5{X0sI+mI*pS-sZ3tg6x|?{„@z„Bw~ά@έ?ʺ\ÉÇšÈʯÇȲɷœË„^ÌlCÎd:Î`1ÌU/ÉT2ÆH2ÉF1Ï@/Ò=/Ã.(¥#$‡„ˆ ™ %¢#)©#'® '¯#'¸#'¡"(ÃmÆâ©ÆÖ¨Å×§ÄצÄצÂÕ¥¿Ë†¸½Y±°E®¨<§’5¡p&˜U<…#pQc)vRuh#r^xe!ŒŒ3‹Ž8ˆ6‹’9‘›;•£>ž°D­¼H²ÀH³ÃJ´ÅL®ÂO±ÅO±ÆPµÇQºÊR¹ËR¸ËS·ÊT°ÌYšžGCFNRT___Y[^_]YYVVV PTY MO Yd"r0"w:(ƒQ1‹_6‘o:m9ƒQ0xC*r?)s@*tJ/tQ0wY2xV3uU2oM,xY2€g8€`5d4{c7^8O2x:)s-"daafhnd_$`&g0!m2%k4 h="oR'na,k{1m•;h•3Ñ5.´#&—$Ž$™'¥ %¬ %¬'³ 'ž!&µšUÆÚ|ÃÏ|ÃÐ~ÁÍv¿Êm½Èd¼ÂX¸½Q±±C¨8›t)‘G†,|n T7\ p3wBtDn<~e)~j.{q.€z.ƒ„3Œ–;–¥>¢²A®»F°ÀJ¯ÀM«¿P«¿Q®ÂQ¶ÆQ¹ÉP·ÊSµÉS±ÆV«ÈTrH 7QQTXXZZZ]^^]WXUY UQPW Q IU ^g"k( yG-†\7i7Žj9†X3zC,t@-r@*n:(tE(rG*tI,yO-zO-|Q-„[2…[3ƒ_2‹d;ƒM2|G.m0 d[ R \]cd`\VV"d,[ Z&a4e: bD\QTEVW%izB™d›¹‚²‰§x¢À… Ñz©Pg^)w{5ŠR/¸.%ÁC+¿\1Ès5΃:Ϙ>˰TËÑ¥ÊÔ¶ÌáÓËàÖÌâÙËáÙÈÝÎÇÜÎËÙÌËÔÅÇͽÄðÆÕÊÉÒÈÇ¢‘È¥–ÏeNÒ7/Í*/´$,–+–"£#«%° &›!'ª™KÉ×rÂÌjÃÌkÂÉeÀÆZ½ÃTº¼O²°E©›9¡†1 t-£t.¡v0¥~2¥ˆ6¥‹7£Œ6¬˜9´©?·²I·²L±¨F±©I°¨M«¥L£›E —Aœ—A–™=œ¥?¡­D£²Gž±CŸ´G¢¸K­¿M²ÃN·ÈS¶ÇQ³ÅO®ËV9DB?LNLMONNQTQTQSSTSQUSZ JNX cm$u2"…K/]4b6Š[7}>+q8(p4%p7&p;%i='oA)qC(wJ-wG*xJ,ƒU3ƒS/„V8…Q3?)L L HFO UXe\_^SR QP SNA 39r~6«Ô†Êî°ÅéªÅê¬Ãê«¶ÞŸ“½fƒ¨Se\-i`*{Z1¨3*¿<)¿W1Æj5Í€8Ο@Ê´TÈdžÊײÍáÏÍäØÌáÖÍäÛÉÜÐÇÙÇÊÞÎËâÔÉÝÐÉáÚÉãÝÇÙÌÉâÝÉÞÓÉ•jÍeÒ`QÑ78Á",¦&”#’!¢"“$®˜CÉØiÃÌbÂÊ]ÁÉ]¾ÅYº½S¸´K´®H·­B¾¸GÅÄLÉÎQËÒWËÐUÌÐSËÎNÍÏRÍÍOËÌMËÌQÊÎTÌÓUÉÑTÈÍUÊÐ]ÊÐYÊÍVÈËWÄÆQ¿ÂOºÂUµ½T©³J¡­J ®G£³H§·K­¼Lª»O£¹K—›BO +903:68CEHGKMHHONNPPQNST IHX ]g"w4"…N-^4ŒX49$p/!m3!q;%o5!t<'v<)s>*|C+|A(~B+J-I-y6&s4 \:,2=GI T T V US L H H =;54%J7rm.§ÊyÁᚹ؉±Î‰©É…©Ì˜Æb°Ptp6vR+[0ž>,À8(ÅF-ÊM.Îj2Ј9ϬQÍÃoËˈÍÚ´ÍÝÀÍ߯ÌäÐÊàÎËÞËËÞËÊßËÊÞÏËá×ÌâÜÈÚÐÌåáÈɹÇmHÊ•nЄ_Ïu[ÏMIÌ-,¿%+¤%’!€°—@ÆÖbÂË]¾ÈX½ÃV»¾Sº½RÀÁUÃÆQÅÉQÆÉSÆÈPÅÉUÆÉVÆÅQÇÆMÆÅLÆÆNÇÆKÅÆQÆÆQÇÉMÇÌPÇÊRÇÈPÆÊVÇÊQÇÈQÆÉPÇÉQÇÌXÈÎaÈÎgÈÌfÅÊ`ÂÆ[¼ÂW¹¾Y¶¾V²¼R­¹Nˆ@wG$tI#zK#vG&o?e2^!SF ?6/07;?CFHMQNIRV S GKP[i u0!~B)|?*m) a!^"g)f.n3"s8'v:+w<)C*H/{B*z;(n)T 53149AH J QV L K J J I >975$. h[±Øi¿Þ‹¤Çj§ÑsšÅd…;^Dmc&|n0{`+^.œ7(»;+ÅN/ÊT0Îf4Óq5Ó…9Ò¡JиTÎÇxÌÌŠÌÎ’ÌÓžËÙ¬ËØ¯Ì×­ÌÞ¸ÎåÍÌãÔÍä×ÏçÞÎæàÇÑÆÅl`Ê_FÎQ@ÏgHÒpVÏ>6Î21Ê+.¾&+…°”8ÄÒWÂÈU¾ÂM½½LÀÀNÂÆZÃÊ[ÂÈQÃÉUÅÌVÆËVÇÌVÆËUÇËSÈÌUÈÊPÇÊNÉÊMÈÊRÇËSÈÊPÈÌQÈËOÈÊMÇÉLÈÊQÈÊSÇÊRÇÊRÇËWÆÌ\ÆÌ]ÆÊ[ÆÊXÇÌ\ÈÌcÄÊfÅËhÅÊ]ÆÉWÅÍXÇÏZÇËXÈÍ[ÇÌ\ÇÉ^ÅÇ[ÂÁY¿¹X¸¬Uª–K–t9xP(Z+E 5,-8;BIFHLJJM LKQ ^ hn!g_U Za"g#n+s4&u7)y>)}<'|<'x:'o%V ?/101-2DDCH K K H D ?D?7,.- J9<& /G;ki.[EG7Z&c&`>|& ³.&ÈR/Ïb2Ói3×q6ׂ;Õ…9Ô¥AѰJѵOиXμa;dËÂmʸlÊ´jʼ~Ê̦ÊÓ¹ÊÚÅÌÜÌÉÙÉʳ¥ÎhQÌI?ÑG;Ë8,Ë;0Ò>2Ë40Õ-,°-,®Ž2ÃÊK¼»F·³>¿ÀGÄÊ^ÅÌ_ÅÌRÆÎWÆÐ]ÆÐZÇÏYÇÏUÈÐVÇÍTÈÎTÉÎSÈËOÈËKÉÌOÈËRÈËPÉÌNÉÌOÈËQÉËPÉËRÈËTÈÍVÉÍVÉÍWÉÍYÇÌYÈÊVÇÉSÇÊWÆÊ[ÆÉ[ÅÊ^ÄÊ\ÃÉZÂÆVÂÆWÀÄVÀÅ\ÀÆ_ÀÅ_¿Å_ÁÈ_ÃÊbÅÍiÅÏhÉÒeÌÑeÉÆa»¯T¢‚?|M(V@813<@JNLIMC>CO\W W KL S]g&q6$s7'x8'x8'v0!q%aO ./340-(.4;>@@?44930-$ +(0\L wÄ4,È9+ÊF-ÎO1ÎO0ÌT0ÌX1Ïp6ΈAÍžSТVЯXкZÒÂaÒÆpÑ¿nоmÏÍÎצÌÒ¦ÊÌ¥ÌÖ´ÍÀ¡ÏnWÐXGË<4Á-+Ä.+Ì2+Î2.Ó4.°4.¯ˆ1À¿Eµ©7·®8ÁÈSÃË]ÅÌUÅÌOÆÐYÆÐ\ÈÑYÇÐVÇÐUÉÐWÈÍQÈÎPÊÍLÈÊNÉÊKÉÊLÉËOÉÍLÉÍJÈËPËÌSËÎRÊÍRÉÎYÈÎXÈÎUÉÎSÉÍXÈÍ_ÈËWÇËTÇËYÆÊXÇÊZÆÌZÆÌZÅË]ÅË^ÅÌ_ÆÌbÄÊbÄÌcÂÉcÂÉfÃÊeÃÊeÁÉkÂÈkÃÈhÁÆeÂÈeÅËeÉÏcÎÎcÆ»Y±™Jœx<‚U+d,J7<DMMEB:9=IM KEBDP _j&q1%v9)x0#l&Z?463331,-(+1103/1-1'$$*H o–*"©0'³3*¾4,½1,º3+¹0+¼--»1,º3,¸+*·&(·''µ/*µ.*µ7,´I6³J9¹M6ºZ:¼dBÁtIÁ…YÄŽ_ÅšfÇ¡wÉ’iÍsTÑdJË;1Â**Â**Ã*(Æ-*Î/,®3,¨*½´<«Œ+³§5ÄÍXÃËUÅÍXÆÏXÆÐWÇÑ[ÉÒZÈÒYÉÓ[ÉÒ]ÊÑUÊÐUÈÍKÈËKÊËJËÌKËÌLËÍIÊÍGÉÌMËÎRÈÌOÇÌSÉÍWÈÎXÇÎYÆÍYÇÍ\ÈÏaÇÍ]ÇÍ[ÇË[ÆÌWÆÊ]ÆÌ^ÆËZÅË`ÄÌeÄÍfÅÌiÆÍhÅÌiÄÌnÄËrÃÌnÃÌnÄÍpÃÍwÄÍwÅËoÄËpÃÉkÂÇfÃÆcÄÉeÇÎgÉÎhÊÍfÄÂ`¶¦T‘l;c,?39ADBC?<?JE:>JXr$ o*#i* bV G ??<<76;9911+)+-*))'(H ˆ'¶A)Ì?*Ï<,É:-Ä2)Â1*½3,»1*»1*¼2,½4,½6,¼:.º6.º2-¸/-¸-+²-,±&(¨$©#­%­&ª$ª$®$%²##³&$µ'%º/*º50Ã70Ã1+À((Á(+Á%*¼"&Å!'¢+(¡]±t*œK°£2ÇÓ]ÄÌWÆÏ[ÇÑdÉÒ[ÈÓ\ÇÒbÉÓaÉÓaÊÒ]ÉÐZÉÐVÈÏPÉÍRÊÌNËÏMËÍLÊÌMÊÏKÉÎQÉÏVÉÏVÇÐZÈÏYÉÐZÈÎ]ÆÏ`ÅÏ^ÇÐbÈÏaÈÏ`ÈÎbÇÍZÆÌ\ÆÎ`ÆÍdÅÍhÆÎmÅÎpÄÍsÅÎrÃÍrÂËuÂÌ~ÄÍ}ÃÍÄ΃ÄΈÅ΃ÅÏ‚ÄÎ}ÄÍyÄËsÄËoÆËsÄËsÂÈpÁÈuÀÈoÃÌnÈÒrÄÆj¬™QU3ZC;GPIA7=EFO Q Y_ZZU R X U O KHD @8:76523722*,+*%5j—¹,#Ç;(¿2&»-%¸/%´+&µ*'µ-&³(&´)$µ+$¶*&¸+'»-'»/*¸,(»2,½7-¼0*¹1/º2.¸4-¹0-º--µ1/µ2/¶2,¶/+º.1»*+¼.+½0.Â10Ä1-Ç;-ÊE.ÊpBËvNÆV=Ä80©%+ž-œ,v'µ³:ÉÒXÆÐ[ÈÓ^ÈÓhÈÔdÈÖcÈÖjÉÖoËÖgËÕgÌÔcËÓZËÑTËÐVËÏPÌÐNÊÎOËÐSÉÑSÊÐVÈÎVÈÏWÉÑ\ÈÏ]ÈÏ_ÈÏhÈÎnÆÎZÇÏ_ÇÎaÈÎ[ÊÏ`ÈÍ`ÆÌeÆÎiÆÏvÆÏÆÏxÅÎyÆÍrÄÌkÃÍpÂÌwÂÍŽÄИÃÑ ÅÒ¨ÅÓ¨ÅКÄГÅ΋ÄÎŽÆÎÅÎ’ÄΊÅÍ„ÄÍ…ÄÏ‹ÄÌ…ÃÊ|ÂÊyÁÌ|ÅÑ{ÉÑyÁ¼k§TzC-M TYVSQLRZcnt!{!$ƒ!!ƒ#!ƒ$%…"$‡'#•+$ž,&¤3)-$”'…!|oaY KEB951-*' 4m ž³)´%²' ²*!¶,$¸/&¸,%·)&²*'¸-'´(&³"#¯*'­)'³*&µ(&µ*%«)&«*'¬**°)'±**±-,²0,²-+³2/¸60º80¼0,½/3¿-LÀ.0Â0)Ã//Ç41Ë8.ÎH.ÍvPÉ qÊ¢gˇP̃IÈzQ“–o-¸¼EÇÊHÆÑ]ÈÓ^ÈÔfÇÔiÈÕeÉ×jÉÖkËØnËÖiÊÕbËÔaËÒYÊÑYÊÑWÉÐSÈÏTÈÐWÉÑWÈÐYÉÎUÈÐYÈÐ^ÉÑ^ÈÐcÇÒÇÐ…ÆÍ[ÈÑdÈÐeÈÏdÈÎbÇÎmÆÌsÅÎwÆÒÅÑ ÆÑ“ÅÑžÄΑÃÌ~Â̈ÂΛÁϪÂÒ²ÃÕºÃÖ¾Ä׺ÄÖ¹ÆÕ·ÆÕ¹ÆÖ»ÆÔ¹ÄÒ´ÆÓ²ÆÔ²ÄÒªÃѨÅÐÅÏ‘ÅÑŠÅÏŽÂˈÁËŒÃÎŽÆÔŽÉІtI] mu{ ~ …"„%'ˆ(&‡&!ˆ%"’&&›-)›1(¢0'£./«-;³2,¼:.»9-¼>,¹;)¿=*Ä=+Ã<+Â;+¾:)¸6'´2%­/#¦-"›%ƒlnqlny’&ª.!°0#¥ ¥«!³,!µ.%¶/&».(¸*'¸,'±&$µ'$²'&³$$®%%­$&µ+'²(&§ $¦&'¥!(§#%ª%'©('¨()¬%)¯+*³+*´++µ+*¹,.¼*5À1,Ã3.Æ71Ì?1ÌC3ÌX1È£sÇÄŸÌɡų™È¤pĨnx|%¨·Q®²JÀ¼8ÇÐRÇÐYÈÒ`ÈÓdÇÓdÉÔhÉÔgÊÖoÊÕcÈÔdÈÔgÈÒ_ÉÑZÉÐ]ÈÏXÉÐTÈÑ\ÊÒ^ÈÐZÈÏWÉÐZÇÐ_ÇÏ`ÆÏlÆÒ•ÇГÆÎdÅÏcÇÎhÇÍgÈÏjÅÌ‚ÄÌÄГÆÔ§ÅÔ¯ÄÑ¢ÅÖ´ÄÕºÂÕµÄ×½ÃÚÈÅÝÎÇáÒÇáÎÇâËÆáÇÇàÃÇÞÃÊáÈËâÌÊáÎÉÞÊÇÜÄÉÞÅÈÚÁÇÛÇÆÖºÅÓ³ÃÏ¡ÃУÃÏ«ÃϧÃÓ³ÂÔ¼ÂۺĿ€„,Œ ’%"š,&Ÿ1&¤:*”*#‚ $$•,'-( -&¢-&£-.©,Aª-(©0+«1*¬5'¬5&±5&²6&±9)µ4(±4*³6(µ5(¾7'À8&¿4%Á5'»4&º/#¹.$¼2%Ç4(ÓG-Öe1Ñr5Î…2Ɖ8¿R-µ/%­'!µ2&·1)¹2+¹4-º/+³.(°)'¬%(¦$%¦#%ª('°*(­%%¢)(ª&1¤#ª#'§$%©%(¬'(¬'(°'(²-+¶-+¸/+¸+,½*)¿-*¿/+Ã6/ÊA1ÌH1ÍU5ÊOހç…®ŽaÁع®€»Ÿa…,Œ…3§·Pœ”:¯¦2ÈÍRÆÎWÈÐ^ÈÐ`ÉÓ\ÊÓaËÓaÉÔfÈÓ`ÈÑ]ÈÑ]ÈÒ\ÈÐ^ÈÏ\ÈÎSÉÎTÉÏXÈÏVÉÎVÉÏXÈÏYÈÍaÇÎiÇÐwÇÒ“ÇÓ¨ÅÍqÅÍ^ÅÍqÅÌuÅÍ{ÅÒ¨ÆÓµÆÑ¢ÅÓ¦ÄÖ²ÃÔ³Å×¹ÇÜÄÈãÍÊäÊÇßÁÃÙ²¾Ò¡¶É°Áƒ±À{³¿w³¾{·Ä‚½È‰½Ê‘¾Ì•ÀÍ—ÂКÄÕªÆÜ»ÉÞÀÈßÅÇÝÂÆÙ¶ÇÝÁÉßÅÇÞ¼ÄØ¬ÂÏ‹»¶g‘B1ˆ),…!'~!dW \ zŽ)")#•)&ž*$¢,'§-(¨3'«4)«/)¬0)¯3*­6)¯7)±8*²6&°6)°5)®2(±3'®4&±0$¬,!¬*!ª+#©*"°)!³*"¸0$Ã9(ÉO)Ís0Ëx3ˆ;É®Kȳc͉@»B(¦±/#¸5)·0(¹-)¸-+´-*²/+±+(¯))±.*³3,²&'|D.¯•u®-4©'%­))¬')¯+*¯,+³/+´0/¸5/¶5/·1.º0,¿3.¾3-Ã8/Ê<-Ê_;ËcÇ™cÆãÓÉ´–mS¦¼†¹É´À‡‹u*‡ž8­­IœŒ7­›2ÉÍQÇÍUÈÏ[ÈÏbÉÑUÊÑXÉÒ^ÈÓcÈÑ^ÈÏ[ÇÏ\ÆÐ^ÇÌ`ÈÌUÇÌPÆËPÇÌNÆÍPÇÍTÉÎYÈÌ^ÇÎiÈÏuÆÐzÆÒ–ÉÔ¤ÇÏzÅÍ_ÅÎ}Ä͆ÄÏÆÙ¶ÈÚÃÅÒ£ÄјÄÔŸÄÙ²ÇÚ°ÄÖ£½Ì‰¶Às®µb¨±`¤®b¤³e§¸o¯¾x²À{µÂ€¸ÆŒ¹ÇºÇ‘¹Æ‘¹Æ¹Äˆ¹ÇˆºÇ‡¹ÅƒºÆƒ»Æ…ºÅ·Âz·Áy¶¾n²ºe´ºe³ºi³´mµ·p³°q«£m‘„apQBIWx‚ Œ"$œ,&¦4*­8.°9/²;2®5,ª2+®4-®6*±4,¯8,°9)­6)­2'³6(³1&°1%­-#¬,"©+"«+"¯,"·0#À3%Æ;'ÉG*Í\.Íw/Ȉ<Æ«mÅÇ’ÊÐ˳gÒ•=¯<)˜¤% ¨("¬(&¬*(®-)°+*µ,*¶.,¸0.±1-|2-gM6‘¥m´‰k±)&²..µ,,¶--µ4+¶3-º4/¹80·3/·3.»7.À8/Á4.È?0ÍK1Î]2ËžgÄ”oÆÐ³ÅÆ¢´¿–£¾‘³Ëš¼Ö¬|g'ux-£¢C®©Q¹®9ÊÍNÇËTÇÏ\ÈÐZÉÐRÇÐWÈÐYÈÓdÈÒaÉÏ\ÈÐ`ÆÐaÇÌ_ÇÌWÈÍVÈÌUÈÍQÈÎRÆÍTÆÌ[ÅÌmÆÐyÈÏyÇÎ{ÅÑ“ÆÒ›ÅÏ‚ÄÍnÄÏ{ÄÍ‚Å΄ÂÑÆÕ ÄÐÃÍrÅÍuÀÊs·½d­­T¨®Y«´b®¹l¯¾w¯Â­Å…°Æ‹±ÆˆµÇ‰ºÊŽ½Í–½Î›¿Ïž¿Ð¢¾Ð§¿Ò©½Ñ§¼Ð ºË“·Äˆ·Ã€¶ÁxµÀy¶Ã¸Ç„»ÊŒ»Ì»Î¼Ð“½Ð“½Ò•ÀטÄÚœÄÚš½Ë”¤›w’eO‰;7ƒ&Œ ˜-%¤5*±8/¸>0»A0·=/³9,³8-±8-±@.²=-¯9.±5)°7'®1'©-%ª.$ª.$­-$­.%´4$½<'ÃD)ÈI(ÌT,Ìq0Ç”;Ƴoº|O„nM­¸vµ£TÀ IÒ|;¦&!Ÿ!¦$ ©%!©+&§'%ª'%±((²'(®0,q-"gR8‡g™©o¬iD¯(&°0.²1,³.,¯.*­,)µ1-¸4.¸6/º61½60»5/Á<2ÉL3ËX3Ín:ÈšQÆÒ¶Æ½¥»g¸Ò²·Ò´´Îª¸Ò¦{`%zz1Žˆ5·¹U¾¶<ÉËJÆËYÆÌ\ÇÎRÉÐMÈÎTÆÐUÈÓhÆÑiÇÏ\ÇÑeÆÐiÇÎdÈÎ_ÈÎeÈÎfÈÍYÇÎVÆÍYÅÎjÅÑ„ÄЈÄÍÄΊÂÏ‘ÂЗÂ͉ÃÌzÃÌsÃÉjÂÈbÀÅWÂÆ^ÀÅ[ÂÅW¿Â[´µU¬®Y¬³i¯¹t¯¾v°¿z±Á~±Äƒ°Æ„²Æˆ²Æ„µÉ‹ºË”¼Í–¼Í›½Î½Î ¿Ñ¦¾Ô¬¿Ö°¾Ö°¿Ö¯¿Ò¬½Ò§½Ñ¢¾Ð¤¾Ò§¿Ô¥ÀÓ¥¾Ò¥¼Ò¢½Ñ£»Ï¢»Ï¡½Ïž½Ï ½Ð ¾ÓžÃÛ¥ÅÚ ¾É®”lA8†#%‘'&™+)¦4.²9/»@.»F0»H0¹@-µ:*·>+´;+·9(·9(¶7(°4%³1%³3%´6%º6'À=)ÄN-ÇV/Ê\-Ïs0Ë—3ø[Äϵ²Ÿ p’®y ¼i¥ºdº–Jµ?*š¥' ¦$"¨(#©(&­))­&(¦-&r-%UˆlU¤´€¬zH±)$°.(³-)±*)®)(«&'±))´.*³0+¹2,¹6.¸60»61ÄG4ÆL3ÉS0Ì@ÉžFÇÓ¦ÉÖÁ¶·ƒ´Ó¬¸Ô´³Õ«²Ê tiff-4.0.3/test/images/palette-1c-1b.tiff0000644000212300117540000000636011244340171014726 00000000000000MM* Ô< ÿÿÿÿñÿÿÇàÿ€WøZ¢€>ÿÿþ—ÿÿÇä…ßÿ×øH¬¤ß×ÿÿøÿÿÏþÿàÇø%ûÿÿð$ÿÿÿÿ€ÿÿóø)úH«÷ÿÿä!ÿÿ¯ÿãÿÿñŸøø"÷ýÿ@€?ÿ_ÿõÿÿáøÿþ‹À%ŸÿÿýÿÿðÿøþÀ"ÿ?ÿÿÿÿñ_Øÿÿ@A€”“üÿÿÿÿÁºØÿÿÐ  ã7ÿÿÿÿÃïøÿÿ¼Æ¿ÿÿïÿÃkxÿþþ €ˆ”ÿÿÿÿ‚úøÿü=ÿB§ÿÿÿÿ‡÷øÿüÿ B€I 'ÿÿÿÿ‡þøÿüý€àa?ÿÿÿþ}øÿý¿ü4èÏÿÿÿü ×xÿàÿüá"ˆwÿÿÿüýø?ã_üxÀ((ÿÿÿø_økÂð@À¢ÿÿÿÀõø^Âÿà‚ Ä€BT¡ÿÿÿà_øÅÿ_ ZI)ÿÿÿà×ø_ç¸ /˜ÿÿÿÀïø7åþ@‘ÿÿÀïøÿûø"ˆˆ¤)ÿÿ€·ø_óà€œ!"%D_ÿùÀ·ø~÷Àü„ ˜ÿðx?éxwûÀ~V EGÿÒ¿ûÿø_×€ø 3üÍ»Ÿþø Pú$¢IP%ð3ïÿþøÿÀÀBð†ˆ@ÐGÿÿÿøW@Èù€>@PTA©¿ÿÿø~€@ð  €ïÿÿøoˆü @£R*@ÿÿÿø_@ù€¨„Œ ßÿÿøÿøÀø(B 'ÿ¨ÿÿøÿø@3ü DPÿŽ ÿÿÿøÿüÀ?ù€˜B@Oÿž ÿÿßðÿþ @ÿ  )ÿ›@ÿÿÿøÿüàYÿ– _ÿªÿÿÿÿú=p>îÿ "HÿPÿÿýhÿø°x­ÿäA/ÿ…@ ÿùøÿðxíÿà‹¨_ÿPÿÿ’Xÿð:øç÷ÿñ?@þ@ÿÿÁøÿð?üõïÿð  GTÓÿû¸ÿ€?ýÝÿÿðà^¥Ðÿÿ/Xÿ:¿ßÿÿò?ÒQ§Øÿþ?x€;¿ÿÿÿøà *#Ðÿþ¸9@?þ¿ÿÿò?ä€Ð ÿþÿøkø?ÿÿýàª/ðÿÿõXFXýçÿÿð‡ðQÐÿâøuø?Ü{ÿÿð_ð@`À ÿÇøyP6wÿÿÿùú•Ÿ·ÿɸ@>Û{ÿÿùOð _'÷Ãø dßÿÿøD–?€ßüX)k¿ÿÿøB’ þÿ¸6ëÿÿø lÿÀ”ü ÿÿX_ÿÿø€dßÀù€?ÿÿðùÿÿð šôÿÿø¯ÿÿøÂ)}ÿÿÿÈýÿÿð©‡äÐÿÿÿð 0¿¿ÿø)”ð ˜ÿÿÿðdÚÿÿø¯ð ÿÿÿèxÀûÿÿð!ð ˆÿÿÿÀÛßÿÿðL‡ðBÿÿÿÐYöÿÿð•ø@ ÿÿÿÀóÿÿÿðA7øxàßÿÿˆlïÿÿðûü)ü7°ÿÿÿ€Hþÿÿà~üÞ_àoÿÿÐßÿÿð{üÿŸðÿÿ€ÿÿÿðüþ"ÿø7ÿÿ »ÿÿð=ÿþAÿÿüÿÿàPÿÿÿàýÿdÿøÿÿÀ ßÿÿào„=ÿc_ÿÿýÿ@ÿÿÿá³àÿéÿgÿ"Î@ÿÿÿÀ¿°ÿÉòþ˜)÷ÿÿÿðÿÎ@wÿ  @ÿÿÿ†ÿøüÀ_ÿÿÿÿƒúÿ÷€ÿÿ¿ÿÿÿÿÿöÿÿ@ÿÿÿ ßÇ‹ÿÿÂ/ÿÿÿÿ [ðîÿÿ‰ÿÿÿÿÿ ÿø~ÿ¿ÿ ÿÿÿïü'ÿý_ÿÿÿ?¶×ÿÿyÿþÿÿü>]GoÀÝÿÿ ÿÿüý½õñ+ÿÿÿXÿÿü—íÿð_ÿïÿ8ÿÿø9þ»_ü«¿ÿþ¸/ÿÿü=V¿·ÿ_ÿÿÿ„øÿÿø[Ýåÿþ)ÿÿÿø?ÿÿàfº¯ÿþ»ÿÿÿøÿÿð*ëöoþ]ÿÿÿøÿÿÐWu{ÿÿ%ÿÿ ø/ÿÿà­W__ÿÕÿÿÿ@ø?ÿÿÀ[¼þ¿ÿ ÿÿðoÿÿÀ*ë•ÿÿ¥ÿÿÿ“ð;ÿÿÀ¯ù÷ {ÿþ#ð?ÿÿ°.s?þ•ÝþþGÀÿÿà÷îíÿ ³Þþ _ÿÿ€D©·u¥Oÿî'Àÿÿ€6ÛJ?¶…ºþ‡€P¿ÿÿðUæÝXgßl€ÿÿ€Q nºš¿ßþ`_ÿÿÀ+·í•Ivø ÿÿÿÀ*uz%+÷ü% ~ÿÿphYåZÚ.œ¿ÿþ@ :$¥Zeoÿ¼€ÿÿûà„Z]øÕšø ŸÿÿàL$“ÈUVíôÿÿ¿€²[-½¥{¼ÿÿÿ Ifà\_ü¿ÿÿÀ$‹ ¸d—Ûpÿÿÿ@*59 &ïüÿÿ€I‡‚äTÕy|¿ÿÿÀ! Sº‰I_ôûÿÿÀ(’©h%n½èÿÿÿÀ……ùÛû|¿ÿÿ!Bd˜‡iü¿ÿÿJ€©a)mÿèßÿÿ‘H˜"·Wø@¿ÿÿ©¨UvûØ~ ÿÿÿAP —¯¸vX{ÿÿ¬©QîyÐÿ¢ïÿþŠQP UoðÿÉÿÿþAÈgçpÿt_ÿþ&¬P\¿àÿè ÿÿüU ïÀÿþ_ÿü¤ªX)7@ÿüÿÿü­P*Í…ÿýßÿü b €Xÿú ÿÿü„Ù¨uðÿþ¿ÿü!dPmÎ?ÿü¿ÿð`@ØÿPÿð çÿðA€pÿ²€ÿàÿàÀ @ÿþ€ÿðÿà{!ÿÿàÿÿÿÿÿà‚ÿÿüÿÿÿÿÿÀÁÿÿÿÿÿÿÿÿÉlÿÿûÿÿÿÿÿÿ  ÿø@ÿÿÿÿÿÿÿÀ¯ÿú ÿÿÿÿÿÿÿð_üÿÿÿÿÿÿÿý_ÿÿÿÿÿÿÿÀ"€èÿÿÿÿÿÿÿþƒøÿÿÿÿÿÿÿÿ ø?ÿÿÿÿÿÿÿÿA€;ø/ÿÿÿÿÿÿÿÿpøÿÿÿÿÿÿÿÿ~7øøÿÿÿÿÿÿÿÿÿ¤@ü0B?øÿÿÿÿÿÿÿÿÿÀC/ü0¯ø—  Ž™ Ì)1A ¢@ äSpalette-1c-1b.tiffGraphicsMagick 1.2 unreleased Q16 http://www.GraphicsMagick.org/ÿÿÿÿÿÿtiff-4.0.3/test/images/palette-1c-8b.gif0000644000212300117540000005215611246012074014556 00000000000000GIF87a—÷ÿ $+* 3<9 4 ;)8:&>H#HVW XLY'M0S6$ggx yog's/k8%v8&n*#u!l9JWGSQ)Yy6Sl/pJkG(iW*vG)vV+wY4mS2ig+kh6jw8uf+vh7ux:qu,]gXwDw{BmwEic][‡8[:hˆ9h•:u‡:v–FÊ)'ÄЃ0é¹9²ˆ’J²ËÞRÇØÑÃ'¡”Š.´èR¦·Ã€k̸³<ט!¡ˆòÝxßÑ"‹Êh¢Œ2ˤ­ö2š`I ¬õÛÚ^n¸Ñ¥)»|ƒþÂÖX“Í3«èI"‰8‰š˜‚Ì1°äQ†±®ë ±ŽÌêȆ2ùÏØ³Ï>0iN8á@ &˜|BËnæì“J(©à"ŒØÂä2L\RZ(ÚÒ2™PGÌâÆÈÂGÐQ„IÜyßw³È+ &Ѭ64Ð,M4Îä1†–à‡¯¥lÑ XÃR5”¨qF €ÄŸFü‚¼æ‡!ª âÆ©.Byæ$ÓÜå.W¸ºEBýhY‘Ì!bÄÂ'0ê>QŠc¤ãÈØÁ-Æ!Ž\ì"Â@†0†QŠ0k½ó-~Á‹`ðBMà:Æydap Ÿ`BšÐ¬ž5ë]þ²Ð„õÔ¶=îq cH"æÀiA `ÃÖ0E6¬Z(˜)`‰4˜A3š‘"ÀXˆ6" iPê<æ±W ™»œc58D¸Á‚àœ=Š4Žp°ð„ PP‚€iÁ˜…)ž@ŽsPéÇ 9:È‹RáªÛŸ|7 ¾†ÌDp%èÐ OèZמð‰ù8AÙƒ†3 QÄhHãÒp5 á…)ÎBs@æ0‡Çx SCŠiRL"~€P„"¢ AŒQU…P•\¥?D´aU¯"Ù@XA®nˆˆ„5æŽj¢0¨A &À\¡ Eþ(Å=Îñ#rxÃÂ8G9Ì!dä­;¼ÓV)¶ÕÂOžg² @(<á I(‚Zù„&ÌçOp&°GKjHƒaš‡5¨AHHq u°R~ðÑNØ ^(ÃÖ°L2ð…€fü¦É2VŒˆPÕ¹‰"Žá$'95ç*H ÂŽ`ÕœñGMÌD(RЃ[8á;¡Æ9È1Ž]Åîù`A‡± &TLÑãÅ,†a&ˆŠ" (@Rù&0¯ ' ÿÀìÔ5/çÌØ«†ËúQl,Ã(N(Ú7›ÂÍ¡p.€NTbŠ`„PÃXÍ¥á›i(DúPƋة‰`ÄþÚ î©2:¸v´£#ÜpMИsàƒ8ÑåYC„ä@;øÁݵŠc1âÙ…¶îÓÂ5©i·èYN€èÀ M“¦ )˜r>Œ-þ‹½ÌîóˆÇ5Zª1¤.Á³(…,¾ñ׉BèÂTá‡FUÛΰªÚÀ#hã»!aÂ%§âÓ‡oHÛ±nc$ö@Ì:Ø! ÝE.˜CŽt€zé9.º>ÏßjŠû0ö#Š"¸ ˆ †ô¢ød(¼£×L`O¿Ë(9÷ ¡ E”Á˜0áðÔåo°#äpB(Ѐt“X„žµ ˆ@ÌH¦cš Šrl£©þó!ѧ7õTƒ Yæ^uõº©ëè¼j$”a;\b¥øÎ¿žŽœMrxâ—žô=ó>\ `‚ &þ@( U¶¨­›°CÆŠBO°$©ú³§ DxA˜àD&/ Þi#þè.„p@ z0€8€ÙTzáÆoÔ §Päà„V#ìF8À„Ð"Èt‡@Ã¥98R77‚uj`u’ š€-™°`ÿ& kWÈ ‹ÃvÇ@}ùÑpjÂ, ¥€çJÍRX<äfûÁÛq ›° Ø“6Êp^ÀƧQÎÃ;¨ ù=p 0€I«PŒcXz¦hi@†oÀ Þ`±*»Õ"„É0{‰¦tLç*šãb8’#Y9#¸*‚àz° þ¥Ð pÇWÉ á}1$.{òA5 N°$ß·!åLpQ¢ ÕCb3>°¬Ø›ð Ë@`eprp ’×5Íâ ÛµÞÀ&ИÀo°†c?3RMñs*…n}À ­' z4RFm@8ÈFP§â¤9Tu9wÔM´*° JV&Žh&ÆÀvà6-ä Ÿ´.@0œØ‰  Øwâ÷¢@Šx²3ð? Y™  _PyÌãõç§ ý § €@tÐi€d8†Œ0†Aezf€Fv žÐß0°€hddþ3"KW##öFK@‡€bW•UÁ7N¬²*Ëð54è;¶3.É05âA^|Õp¼à!` P•P×!¥ÍãͲX²`”2@¢•4¡`0¶HS¼ƒJ§à äÐ" sÐippÐdØ—ÇX€i0{@©€¸à€`#…ÐT ¦€5r#ÕX#LÇ%ƒ(†bfG¼GˆAéÎÀ'"Ç ¾3Cãò;/4.®Ö›Ø‰<<èU&I„þØCyÅÝÑ´Ð;¥Pu lé}w §À>`d°h”(†…àDþ`Þà °Ð0…Àˆ0’ŒÐŒˆJ×tm´tM‡VÅbãÄ{ãÄ™¯0^F‰Ž5SS&•$P•°Ùƒ<8$~KÐM_LðRÐoãáN Nð½¹-´p <0SáÅÚ@s§ ÊÉœiP}Y€`(šxPGP˜·05b3Š0 P“ã¹twèž8r9+ö*w4@Y7@Ò”Tà £I ÀšÉ@JéŸã2 ¹ @•:u6°5¢¨ IÐ.O OÀp³À“G ÙB õ«¨CSü€ €‘ @¢ 0 Ǹ¢+jžþ-ZhT|àM ¸° ¦÷"a4Fç9ž²çžîYb®2­"Ÿ—ãôy9Š€¡ª ¡9^þIšSӔ塥¡Pu¶‘`.µéJB`«ÿè5³ºÉ;º-¼ÃI  gE0a`J}¨… |É—~­£iÐ6 nx xPF¦'#ã™mŠPÒtžæI2%öt™zU+Ö©Ÿz9…”ÒäË€¡¦ªŽI9Ÿ <Tð9ÐÐð!T°P°±IÀ.¡¼ ›I ÃÚ›û§À]äÀ#JЃ€gw8’ÖZ¨. þh0 € Èà4Ba´£èjž#9žëš䳬’Šð*‹™ã„G¬‚UÒ$’  L#&¹0šV*š—("09À°KP§@*8@b ±WpK U±CÀey y ʲ@!:²` ›d` µ×²} ÇÐH*ä xÀäÊF„À‡ Méjž†`;9{;i™A‹E+ªª *ªŠ ´…èÊp¡´àˆåa‰? :0$0#Tð°g[ UYK¶KpUлh ±J0x÷¥'›±Ý! š÷¶? !Ч¦0) ñ—1þZ€K€p¡—®ð鶸âY‡ :«® h‡>›m˜ ´¢ 2X”I»*¡‹Ux¤ …Ÿ»°;8ð¿¶ú°fûh[W0¶[Û»Vл½k¶ Ú5brp+69@O,p°ù¼° °p,:€i8Â. ž/ŠG0u‹ «0{‰p³bFÒ´‹°¢à#Y2>»Ã<)N¡º¹Fû¾Žººª¢ W &Nà,03À:°ÿ‹àeË»U°À½û° ü Y4ÇÀ›¦x"ÁjÆ@þwÌ9ð¼Ò+ 4›n…à·i`½XtNp 2;ÇCj³þâi¾[™Y5Àm?L½“0 – ØE\TŠð­)`$à9~ [Ô½{϶pÏ ü ­ÜÊMíÊå°]² ¼åp=àZý ­Ða]`³% `-[Ñ"l}Ð A¦¸Àä° n€KGžÓHÇBŒà™ÝÐ=ÑNÃ…`Þi{ƒp™„ä¡{êý úP¡ž)ø^ä}í)- ¡ŠU€^m «øàwPà»X©ý H å X`ËÔÀÎåà µ £p Õ0þ ¿ð_ÇÞæ¾° ™ ád€`"9ö —àPh=Âh„@4Ð6@³l% ·   ÐxÇãɳ|}Ò‰m‡•€{7‡‡à(ɦþøŽï¢~ïúÐ ÒD âm °´Ž ÝÓð<ðólQWP ¦½ÚNíÊùmì0 ËÊé€Q9 gN ×€ømN É® ›€ v t e ^LЩp펢pð+`D@ApBÐA : oIªÌUòx×äË׌ð…œö…` o€[!x™ª>@E{êõÐĦï@ }=ÍÓþ\Îj€Û°% =PÅV,§`à°Î_l µ Õ`>SP¶K"@{÷£€ ×p Ö øËÎò.¿p ¸0]¡`‹E` ÁêLš@inÓvä(#LšòD”$©Ð¡B¥9Pú¤!Tˆ#‘#-zTÉ’¢B‹&©i3È¡Cˆl*B„óä#JîÞõë§Ï]»zú굃´H’"¦Ž)$Èé4l(!£Ç$P–<¹R˸uëØ±+—ÅV.dY¬|+®  h$Qò•6kذ»F¬š¯W­0Ù!³¡B„K¸L}úô£‡U©ðœ h +nª@þqñIÔ'"EB™ Ä›6UäV³žU O A$E2=)©R¥G‹5Š9h"š‰ª¹H‘#IÍÜÕ+Z¯Y3èõ˜IÂŽ[;"§\8ذ¡ƒŒKI˜@RëJ•odýåCk«J\¶¤ Wn @¨PYbŠ%öº0lˆ™†_zÉÄ9Äp ªRRIE&zГTpYå 3ñƒm@ᤇ"z€ŒL8)å&Ð!G˜qæ Grb1Æ7Ú@D$@aä$KÚáÍ·E iICˆC‘DlÊi’éÞ®Kšyç™f–Z**íáN’1 p¬êè &¾Zï”oÔa'~øþÇ ±ª°E *€ hðOÀ)¤è›k3”izÅÁ8`€ ($”Ï8%WZ¹ã C´é¬8áä“QJAu”OHäæ˜bÄÇÕcb‰å=Ì Ž© ²x,i$ÈD‚“ɦš¸ËÉ‘I(qÎ+%a†J²“ä)Ate*L5x@ ²â!‰®žÂŠ)¾)ËÖAÇ +æ“bOþìˆ%î• ì—^^ÑdŽ 0ÀB&•Sº–f!$09ö±{BšÂCàøÀ9ðAv Ä°ÀU|@'Rþ¡ U`J~¡(Å&ê— L€Â3 X•)6ö jîâ€ÂØ…+ˆaŽ|¼QÇPP5î0Ð1E)•hÇèüñŽ•  jPƒ䩳 r;ʹrFx­FJ¢@q‡#¦¥2Y`sHAÕ”€<[, éb‡×¦Tœ oÚÇ8‚(*Ta Ü›Áv0ÒüÀ¤™0©z ¨eÂÄ,B3QŠL î+"&4?á1]Ñ$G8²IŒq¸Ñá°†/¤Q 7¢æÔcQ‚2ÁE" òÄ*’êi“Ú‰0[Éʉ—Ñ >n ;^PŸXH‡¡IhÖ¾¡ö˜%‡àȈþ r”#£4 ÁÒf®î ;ðÁ‹(ü@Ô%HA Ot¢#ŸÈÄ'6F LÔ ª@…¥@‘1b¼‚áGPƒ ™#ŽÅðaØ0ˆã)tÏ‘™>¨Ê˜ìhóÔÙ!oâ.b}äB‰f€0hPà aJˆe–gv`ôÂVi@rS‰g<§fŠÖ°7¼aG‡^’ˆÛÕß„)×’Qþ¼¦¨!}ÐÝ€nì@™7 ±œ‚6ÖJ¯a"â¢*ð' ø– |À„o b8 òD€€'¨T©>AªK\è=¸E“ Sxcƒ»Üƒ2“ù|¾…™‘¤‘0¢eøÙtš¡4Ð z c°àŽDì0þ5YPS#FéTK'_À æpÀ- „°ßËíñ©p‘!¶`"°‹«cÙä`8x.Š0t\èõ`Nt‚%bB‰zÀ–»T•B3ª§‹l²ödr¶6¶3÷ M¬Ã…8Îr1‰IH–˜„> =†0¼aÐk0´ $õ B 7Žh•Ü!´G#â0·,Ðo˜@,pÁtÐjë6! 4P'L1uìãÚÀûÊ *L43ˆµ¬]ø„ä"À‚a÷ÙŽçÁnjL¢Ì©22Ê­e¾0/²-¾_¬þg† ‰MP"»ÙõFƒHCØÐ?üa¬H7¥Nõ›$‹W¸ý°£b€¨º ò%À P`" A’o¨B·Ç*푎yÜ#åÀ † í> çÁÔ/  ×ÀšQ<¾up0P˜JØÑ¬gûš#a0ÀœË¹_°¶U@ƒ6 „ é‘“@‰¡‰EHHðV ¦Xè+r ‡9@6Pƒ;à=GcŠHó w˜–GS„3€Ä›¢ˆ€€ A˜€N •:@Nq¸r0†;‡q0‡A‡|W[‚,xõ“ÁH€@þ€€xÁ°;˜ƒƒUð;ê‚ ¸þƒ&ù„PPd2…;™`(rˆ#´6ñ±6Mƒyz@Ô;å˜@Ix I(cr@t0‡m”§ªã*G`†Ü’¯B.`€8ðDL€ èk‡Xp˜[Ha†qHsP‡Wt-W´‡~à†@Y‚H<€‚1€@<€6ø‚ h€ ÀƒIp:0Ø‚.Ђ h¦aÓ,S À‘¦Á1ÔŠ#bø^È9ó0𹦚‰§z GH¤DZ¬ Às€‘yƒ´º=ȉH´„>3«G;þÈØDƒáÄ‚!€@€eÈqa@Rˆa˜WÌ>sp-qH{À‡UB Ð÷;È÷(€XHð‚h¬€ x4è‚-°L-Ø€ìLS Q@0Zp…Éœq8ðAMþѳ6=ðÙ˜@Ž–É ÚyŠEh„1X@¹…s@ÄghÄÄ §Ài‘„HÄlQ„=oD´´ÂÐg_ˆSœÅc8X¹‡!Ô˽´‡}¨;o˜Ê%À„MÀL(ö€àƒfèƒ5ˆF-ˆÆ.ˆL§ã‚-¸ý¼…Ñ`kĘŒ)Z ¹`@†bðFDM;Ìr¤q*šÐ³¦L$ÚL„9 x‚܇9ƒwºáâG€„b$AØ€L@xA÷‹¿M€pjÊœc‡ºœ‡qàNs8ÜH| ñìr¨;`¦ô ðø|/¨IǼþ€5èóË´L3œÀ …/ó˜‘yœaPиŸ_ˆ›Øb¤3„B(®“¨Í§2Š ‡tðu`…/@·xzD«³DsR„2 à„H€D¼Ä»B P†W¨Q_(†ºÌQy#¼{P‡|ØOe%|èmè*°ƒMØf²ƒ=ð?Ì5ÈÏ-Ð è‚7€ƒ5¸R,ÍÒXøŒQÖSñ˜é…Ì‘0ðПb%ƒ1´6•ºB( sÚQ [àM!ƒ1€§wr'žÙ «sK€x€`TÄë5 `j¢¦bÀQyÈQq¸‡îþÜËnÕ} P…ˆ;ÕLкÑWmÆ/ÐU4hÆÊÔU3ÄQ0° 6UÑIÆ)ÈñFo<ÓkÛX ƒ0pVŸ¤Bà§]©§Pâ@ƒ ‚ èÐrÀzÑFdƒœ'Cލˆ7DhDhÀÁ8Q ,ŒWg€Xx…^€X¡ÚL{ÒOõTNõOX@9UM; =?xƒ6@ƒš”Ušô¹+ý‚X½LiT y kÖRS ¹Ì¹œEÍña10(YA’ ÙÜFHÀƒ9àƒ hô†s¨…tø.±cƒ;¸<€„à @ ƒÎ‚ÊÖ †UxàÌP…;–'€‚8F…§……`ˆ6ƆÞTð܇4@èÃMÈÚ³„³-ƒ.ø‚LÎá.¸äŽU-ÈÒ (QðÞT8°fk¶4…MÑ ŸiHb^X ø€(nß1ð‚1@ƒ^&\.À2à>¨&…S@\ైÇZ؇Xp¡À„˜šN˜¬K…[À" ¨c'Àc'h]!8ƒÄ„UVW€…ÉI Ë±†cÀ†Oðä_þ‹ ؃L3€Xú”UP6h]ÅÒhĦ[UÎæüŸ83b;üX%æ: ¢ p€ Àë igeƒá¡0‚&8…(X)°[qá_sð†<í 8ˆp!H“.±°…Z¨« Z˜…þ;®Šu!UPçlngX(­¾çqØWDƆ狅jÐ<(Û7Hƒ3€Æ/ Ïú$èƒ~ÆËÔO¹C…´NeUžœ’É6Œk%þøŽ*Òë :Ðn;È>`†ˆd>…)°oˆ‚$x!XNDÜU£]°i &Á¶\@\À…[¨r¾ãY@it8…'€ØÅ4î„QXmAŽWˆ…ê l8†j€-RèyxHƒ9 =F/Èäà¦Oƒ®Lh ëËRºÍé ^eVþ<¿­èkã…] f ø¬…°à¨”#0"0þoðtˆ(ÀA‡th 0‚NØ’!T`roÀ…ZÈ…[°cY¸t¥r8&‚+ë_ð/ dRxZWx…8+­WxÚj¨ep4Úëƒ1ƒKñÖàë¯e-ƒÂº-… Mˆ.™p4†4mP_˜WØ€öå%¸.TϽ‹oR° €"\ #ðHЍ*ßP`S¸08‘"ˆ«S`rþ¾…S Ø;¦…)W‡gwó$€í®ƒNèLèuVm`Uín·ÝXp<0ˆ6ƒ8Øê6Hƒ^úttô¸¥ƒRþ8…X¨fk…S.…,Ö_HâX®0ð™_à…Ni.0 À‹NZ‚ðž‚ó¢0@€ ›%h‚%HY¸Krð_%ðéKà„`ŠÀïÑV‘HÖOga€E~8‹o€(ò:Ðö’Ãvlç;f=˜=XgPH¤Øƒ<`FÔéä.8ƒE‡w·Ì2” ¡[ÑzX€è]è…dõ…4%=3:¸€RWx%€‚SÀ…äµXºç‹€@Úæ1)h‚Ž"tPs¨U˜Nx»‡¨é9˜@V_¸9át… HÖùŸz>˜þ Ï2 ƒ<Ð=ø\“$g}KtèLî3ƒ2ðmLŽF;øUÌz­Íÿé#V¿j°hQà€ °€´_‚&@…÷‘‚Z@æPƒžë€¨Â ‚$øŠ&P‚+ˆÇs8sP& ØàOð 6¶Š'pé9A‡'H€àP:0`/ˆ9læ!3†ÍHmЬYئP 6jÚ˜1Sæâ™/»tÙÂñ£—µ\°CÊÔ-S¦\¹"ËÕÊ]¯tõòõë°i8§ñÄ9«H„"¨$Y²ä”*U¨p¡B¥M¸ràDpX1!BE˜<éþú¤.réÔ™#w ‰ZMDÀ("Ї† ä̱s‰S“'¢j%*•9èD=™€„s/&Ó¡`Á7lܬAƒ¦MB„jãeÐËdìòEä/gDrÜ¢ÅÎ(S©R©¬ÍV+š½výâu'°œ¿¦™bÑ !J =u*U-[Þ¼}‹ªMÄ©#L¤‰’®¢N 3§î\ºqȹèJH­"=&lCFNNœœŒ?Uë?_¦œƒŽWˆxÐôÁa¬AÙe\ÖF„¢¡g™¡F±šiuqk}I)²Õf›+¾èÖ 0ÄÜþ9“ ' ‚I(Ñ„_~Í– .ÓiƒÄâxã $°C^¢Ü¢—(ƒ9ȈC(8sÊ1´ A(¤ ƒ[MqŠ,µÜ2§-þ%)Ë"v€ vð'„`0Æ•1ÔF œ²(#ž’F Vdƈ¨‰‰TG)¡ÐfÊI¦¼ÄÒ.½ÐHÌ/ÉÜ«:µ`#$…^1 ®ª … $ðÃ1Þ¨b Ñ.¹¤"Ê,¹S–8Áˆ¥Š¢ ûI'¤ð‚ .à°ƒMä%Ë)sâòß-„9A4Á„(„^xaÙ¡¶1ÈCœ¹Á… fP4iþˆ¤}t†˜¦È-ªDÛI£ºòŠ/5Icp;Ý´Ë(„NäõÄwE )©(%,Ðì-ª´*ßY‰K1æŒS–7[Ý‚ tð@ .è CÞ9Š(qþ‡ .¶Tq‹IL€ XðÁÖ@P`|–†¾jV#h·¡…Òö¤•Á‘e‹Æ\°(m®¤“+»”J#Æ6#ÍM:ýBJ(@Å#?aT 8w¤–äÜ0À|á" ²¥ •†ÔtáR«Ù0·p T £Åll³–ø5ùÅç‡^ €’FçDA Kˆœ”`„"!E((òÒ„ŠkrÎA…'”€Áh;àÁ%BA ”¥ËL#Œ^ðtIo£嘎œ‚ ÊÒ°”``ƒ¡ò¥/Wj(ŒhĸP†/ˆa£^ MÁæŶÆ5$©€2˜,“,¡Ø¡ù TÝä‹ÀØ)b€€ý)¡)  ‚úMð@aþHáñæ¾)£,a Rx*Xp!$ -„(H¡â‘BšÖ—"‰",a)Ç9Àáÿp« eø7Ü«! ![g 1 1Ê•ø‚4RKÒ„o4™š0I2Ì ¼à¦ˆ…J\ª–Ä"~ó£©wÑŠO¬€ ÀATv %$ x$ÒvÅ?µÐ:¨q¯ˆ^Š7ÐArP‡wW+À[30.páÆuåCÁˆC,Èú·2rD öJ²ùÎÇêa:`™ÀÄcaÑ"úº¢[ìE4¾H _l\~ºØl 8pÀœL0™Œ``·ÙS`­ƒ_.ç§NAåw>Ö±,ЀÉB‡?ü§D%üÀyµÕê d¬{:Þ8…®&ÃØ8 Ï ¡‚ïÍxš“u=ú‘Z–:ÉZ¨€Tý…“V í7<þ@ .›Y˜¢¥xÉKJ%Æ/Ûï(Šp¦¬•<D0°˜ Î(ÙHˆ›‘ðàÉC;ÚO¹¹ÑóÁŽn^Ø9 ʇ¥ð mpCì8ú¸ÉÂ\$±jÅŒG€aÀêaûŒÙ†8΂îxG?ú/dä G61µ ò^À h€0 €™È„ßäëŠVÐw°¨uˆ!ŒbÈDן  `´ †?™Êï‰(òÈÂäen%H¡æÓ^‡Ññ?€ Ð@ä@Q…UG¸áƒ¹ : ‚* ‰0ƒ- I_Ä^Ö̋ՉdÙì‹!þÂ!0‚"PÂ;„]?¼ƒÜR-ÈùT@\€0Ó À @ Ô€ `B&¸Ô”mÅ]ÅÜšŒøKŒÂ%ÄÀ ¨Ÿ´ èQ㥜²›F^ËMS=˜šéñC9ÐÀà@Ip…8Å7$—riCS¤Â-Ø¡ë ((@pÐ[‚AŽiF"ìÞ *Â"€>ÔC3ÙGYÄÚU€@ˆÁ¬€h€šp@x&¼ZdM÷MÌÅNàøÂ+´Ä(pB ˜€L!˜Ó5ÁãÑß± .ÛDÁË)‡QœÂZ¡¡C9¨Ã:€d[" þΊQ¼!*xC£5…*ÃlÜ¡¹ø(d@ÔÞ‰`†hgÈR¿5à :â’™19€ € œ€<šøˆ$À%ˆ¢–âb©èBà°)èGÈEL¡ øÙ=Þüí"›áß<Þ‚½ÿM-œØè=E¡IÅ2bU3~^É(Û¦Öa¹I98þ!bô”£fÂ!(B"TB½C;< ŒÆFmÔÚS ÈÁ=>À Ø#¤€DÀ„À%\Bº÷ÁÂ+䆩ÈÄ.0S|µ"À Håº@CÛ-Òý5^.²-˜Å B/ÚþeSœØS( Œ ¨¡3æ˜$DÁÿ¨ ŠÖ‘ôG-Á[5@„cíb¦á$Ú à$4ƒ;üž%,#pÔhÖÙ•4ÀÄ´@ ÄÀ%PÀ@8á(À}Q}ÕDWZÙW–B+r pÀ4€¬í¸ŸÉÔŸ'h!¨Ü[Ar¬Ñ¦l5u¢ üå_:cIzØjýÏåèŠs¤)ìE-AñD8Š#¦­ÁÂ{îÕ!ð[f¶ƒ;TÂ#0!h„GiÁ¤@pvÎÐÜ£h€T"À \_+,ÓK¼ÂLX\/è‚/Ž•‘ éÇo6ÀH€ 4¤ûþ¹Áü-§r®Ü8gr°VtÊÖôŒB^Ž@`æÀP‚‡å …sèJ‘ð_TA Df âX޹!l× ôX"XB3´C3X‚,­²Ú€ÆLÀ¬m‘.èþ‚úM0@)t‚Þrˆ-xÀ Ø@µZÕ ¨€ tÌê) ¸@Ï 9KxkÁœÖ8ñ¬øÀt.p.¸ìÀÐK‚YŽÑ’!À¼†c„<*Ù•¾ ‚"œà×YB#0B½A-¥ÆÁ}”æt@L, Ô4V 8ÀTå(@š¾D/¨)ÅX™û¬Ä1qB'Ô@\Â€ÑØ@ À€ Ì Ðø¶@ À€à6dqú™ÉTޏ0AʉKÁÑäÀ·ì€ àèžS|Â'|G:BäðÇOéEôá)=mM’#†ì^øØ$XÂ$4B ¼ÁB(ß•þ^@X@pn"œ@ ï%¼€L€l®Ä2Uœ„ÒíÇŠJ|½i+^Blï0k Ø´ºÀÊn ð î£e ¸4¤¼o:­+üýú@ÏêÀü¬€KŸmÅwTέh*®aœzÂJ„ãaÁî¾T-#,Â#,B"0Ù€Áœ` SdNß h ÈÀ à p€¼€~¸m|Ý„RÌnÔ•©„±b/ @€)™àª/ÄBëáÖùÒÁá"®´"1Áœ“¸<®X=yKφ.ºö@Òlűp̲͈Ë'0¹ÀŒœLÖÞHm¸'õì !Bþ'2B i82%>À‚j@p@ ÌAÂÂj&ÈÝû¤©TÜö¡|ñ¦~p‚ Hr)@b¬€÷êéÓAÔA ® ¸@ ÀHk ¸ß‹‹²UÎ8%±_ú,T±$ pÓò9È< @ !€Ô›¨âLm¾é›,Å1#tt4@ )¬Û=%Bßp€KsÀô™ô œÐ(Кº‚°ÖšÇÚ]+¸TÞ¾Q' €ØN²‚˜qÆ€ À, ðS®ËÆ|2Z¾ßü¦Ü)q =Qñ9õ€ŸnŒÓÉm1üÑDŸÂ €êꨮAþ3†hZN2t43£R@BfÛ H€ìñ˜ÀD¥°€Ïf+HÜKm2!•M™ÝS+ õ)!€€@ULuú2uÀ@ .Tós·Ì¢É ÜÉŒr À@ °@·+÷Àô€phñ,¯«¦ê…ˆBˆ¼¦8ZÚMNT¼A ‚õ¼¤X˜´^‡ÒTÀ0q°4o@ÂJsp6€ÈfmRÜŒìÖ´›b(¶xâ)™Ò˜r€ µ ðÌB,²ÞjR^T»v·Ôœ™Ñr‚¸â ¼ È€û‚S1Ô¶|´Ž“òÈüv-üvp€þ„½ñPKfàÛ+atS¢ØÊðõucÀÐA h@‚DŒ÷À(\_•ee+$ò„ÂD•݆¬ p'|ÀkNò)A€K‹qæ7`ÄÀáÆTç7>ÓÎ9u‚@ÃQ ¤À¶x"!8tù‚3´·a?A_xÛ Èphd@àKôL+eFÙ 3‡ÁLf€óÓ0…c § @ÂN@&Ð4Å­’7÷U‘•Ñp'ܰê y{õ  ¯™ÀÀ<»ì 8ù“C+Äò7€B''n °@ª¸ È€÷ $ô0AÈò,‹‚¦*­s<»ÐÐqìò82DþŽy¸Žé‹e„Aâˆày^i‘¶‡6\¬>¡—Â'˜÷ömŸ©tåWÖ]•ÃKŒ)|B$¯óz··KWºúН<óÁkÃ@º´º¶ DµÉt‚d¯ `ù€¸ð€Ç€#Í9ÍzÐ2‘ØpAÝ€ÉFœx›g]U†H,sØ€†[€vˈ\À'Ú%®4déTfÂ'0è?Îí ;©°DO“ ˜´\xÀº»³ ¸;05–Ç@ `ï¼ÃRsz©ƒÂ¾×³ ü» t¹´ºÀóÒ$4 ðÖûÅYC,ˆÀ€»ä !€„ ÁPþWCÊB@·Ç‡MXÉw@ ÈÁ²sA%>Ÿóñ½uÓ `»ÜIv•åôn¼B0Ô+K¤¬uBDº)•RÙûü Tzk®<·öhË;K+#µÁ¾èXÂ@Sº@ÀMŸÙÎÑÔN$,ËŽš®(P¸Z#@,É’=¨=u ¾ÔyØ03Ì} Ô‡ÐÁÈ“<˜ôóRÛM„B(d;or_n\œ+C8@V0ƒûèx)t‚²N>å›lÏî­ ®ËÖÐ'.Ä‘+Æ€·@(›ÌçtÈ@°ÈÂ<Š$,„H„™€j2Ô“'R,Š þ <@ˆ€`À`Ö¬A³ ˜0/[¢i æÁ›%ä¼³AŒ 0pÀA£z”2ÅiT«V¥Z½Òõª—®]ÅŽ ‹,X,]®\‘2ÕéÁÐfháƒ*Z¬°ƒ|`¤X¡ÂF ¿5bÀh#NF:2B¤…`.t’pr‘ÊL.1ùÔÄIQ§žˆ’rJÔ| L6¨á%˜-»Ì ƒSŽ967`°ùCƒA4p°öR)RŸF‚ÕÔi/ëV]™rÌW,_¯L‘E§AдçÓ¦¦bE *Tð¡SG~ *`ðù˜…þ …:¢“TH¡…þ\ðÁ‚P¨#bB ›xâÒ2Eðˆƒ8¡<ØŽSζ—` c¦™fÀDŽä(§ 2¨Ñ(`C-¹ 2)E¦\)ŧt©Ê—¯²+e—^‚Y2;RPJ­³Ò;À#·Ú³a.:ð«£PX†Âjè„ò¬Ã8©Á†0 "H‡‚l0B#˜h”<=ûŒ4Qd‘”rDÀ;¡ ¤ãÈàDÁˆŒÜVÜm90õMÓ,À :õ´‚”*å’Q‚’H©tñeí¶{¬ì:€+P«’‹à#î{O…»øÀk…0áþŠ¡"jpA°Áj(‚fa˜ã„r2;ÂÓˆ‰&Ê3¢ EɰˆH4  <ðÄ“ãh Æ]ZÑÞ0äØCß}1½Ôß;Ä`C6ÄàBSN…©§H!r“"uÑÅ”VÀ"Æ•WvɮބB+9^SóàPøH¦/V°¯÷˜¬1bàaZ¿T0Á„^ÐV‡ ¸¢‰oÁÝ“ 'œ ×"PD âµEQƒàà¨Q ¶ˆ –VÌ-Œ=6ÑÄë=4ÑÓÞ2íÉìKÂûä’LZªV"Ž»^vñ…n‰K‰2¨¡°2¹]}u‹=”ñ«!¯›Q†aYja`0d&"°›þ¯ÍÖ‡ xpH¡$˜(bhpŸ@iÎd!D÷)¦†4Ž•`¯4 L–Ù¤ë¯÷µãÒ± £ƒLBYª¹RÞ†»*«¾ŠØÕª\Ù¥ ö>KÇ^#ð„WØK…ºŒÅ噟má?i%S¯Ä÷Ofn#ä|¡E‰?4'ž0mÑE  ]*øÒ•â¬uRaÐDí–Q»ÛiBübƒÀz3‡L§Šñà1ëìbHòÅdŠ!'=½rÀ Ç„i/hªC Z8¦Å&0+ øè‚¥ ,ßAt@!aLH‚ç$ä9P€"¢øÄ'žPBÝ/ÇéþPG2à¿HÁN&2±0 h¼"¶óZØô0‡9Œ bxA&>‘ LÀ¢™ Ž#ÆÁ‚ðƒ`‰ßþ–: z"|ö2>Ô!‡b‚ ¦ujkqÔ2Sð‚ÈêCHeÜLJx†¤Åù›*âÏ5ÇáŸm®ö4¼Î‹a TK4^@C¶[`÷`61`âj³`)¨c<æ5¯|ÄŽÌȵTÏ"Iá^ŽŸ:  .6p$¥˜eáÒ‚˜>”›™,À–ø ç9$"ñ¢0…(BŠOaX`ÐÓ0á¢W;ML»ì…þ/ͨ ;Ø¡lXÛ(.qÑLô¨U±Ý\Ñ*æ± ä QŠR¬Td&È|`°Í½@«AGhY \0-ð¥@F(0dt3l² =bp '8щŸà ^Ã!@U½là)H}q& ýE/€±K`øÒk˜èîÄ‚b^¢µã&ˆt«|Ô™º ƒ®”sB判š(„»…Ô%|¨™ ¾ə٠˜#‰L¨“½_9„ô"?ÈS PH Ö €@ @›­J*¡¯KÉ*¦ñ ièòÎxÅ+¨»=a/X[Fþ{” Û•bÀ†U:ØLfL:Jé +p•B€øÀõ>´=ý€©=9-''¦¥,¦xIÁdݲµ@„Œv°!0áN`B>PÁ 8@ Žp"¬Db @ Àk /.ܦ«W[CÒ°†U\£ÄðN5b‹WŒÂv˜˜ho6@ÌŒ®ÍŽ£`ÛÃ<·ºn£8éuUŠB_ýu²PÁìB‡ì½à‘D(Âlª¬ô&‡p 60Y¤š”AæŠðƒ"ô@ËzBgŠ@ŒA np$ 4#BŒPCqZ;€FMø6DƒJÞ0Vˆ#ò0Ç;æþÁ b¼ ¼ÔNTœÑèØ*0Þ`tñA`ì‚0PËrpœ]íV³zp‹LŸº€é>ø1Ìb˜U´÷œpµ:Ðãðð0(jçB9´Î@Añò‚¡æH ;’8°"Áà¼F6°Œ ÓÐ4lÕÎGµå àn¬vXãJà¶ò.Þ„‹3hçF„¿ ®®Š¢Mkz»Öü«! d.¹T.ÓZÓ²S‡¿¨ÀÉЀÈ6kÁfò ;è(¹Ì(L '(À `7;ÊPÆ2< 5³Y‹x0] ÇäÂi€CÞ°}Ì<×6‡Ý̨þ»Þd ˜À„ˆ™ 7…*ññAb`âo×= Žõ8·ø8È‚EÖ˜D­F°ÐÀ2` Ü-óí¡A‚04þJ IAa n¸ƒÇ•áŒg4ƒ"W3$Ü `H¤Ö(xv/mnØcæøØ‡:ê1èLxm½¹@ d LÈ`£>ß(\éêÑfFÚU%°nQP¿é”F`˜º‹…Η¢©Ê.Ä —æÐ X@ìû“m&¾ü&Á³ß €¸àhÙáŒePãõ¨Ç;ú ¿«Ù‹hÃPtµ•¤!`xÆ<Пþxºkzè.Ѐþ ”àô÷¹ŠÙVt#Y'é¤/© ‹âéðºXÓ àà:@êbP`…^ >î£.¸„KœÌ€÷xO$@&kþ°Åòkp`H@  D tà:  ¡ã<ŽîAú¡ôAÜ¡(Áš¡ü€ aa êv^gââÁˆ¾£Ð(Ê'² jBF6È6)è2¡è’ÇÂÊU|ÁôòÊé4Qj-ÐK>r¯9Àê¦L‡æ >È<À 1p¥$€þªK B@l ¸ATÁgÚàòŸÁúj°òaòA4Ñ®þmÜÁ¡Þ€åÊo°¡P‘¤á·4ô@ìàŒ¼FÄ`¡Wa:¼¦48ª:>¨™˜®o¤I9ÆðºÆ0¯x/%P²blf…"Pæ" éôp¥ò°z|¥ b@ì!îÁÌ!@[^€ ÎL(!ïÜ¡*Ñôaúaôøø!z°AÚ\B&6ŒªAV‘Ð~+¢av‹ ’¨!r Ò £Á {a:6Žœ¢Ž"㤤„†±éŠ19.ðऑ DÆÉ\­ëê°;À š¦) zúFz `d@îAÄ„!B!þ¦LÎ $!ï²!èAkŽiõÁêšA'A&0·~á~ëžÁ.ò"w+ÌR!Íò!wË"¥«A·œaÐ^¡VJ@°L`÷n’c À<ðŠQ9 -rÏ$`A"Öu¯,:&-¨é&q2ÒB( fÀÄáax Xàè`Øà „Íã˜Á°AäaêA6í¡øÁ6ýa(w³ÚÀ€(Ò·¤A·ÐÒ ‘ó-2"#ò8 ²"åÒ“!‘S mì$€cògzFr-0МæÐÕÌÓ`&s=‡±§$þ0]c'' €B o60>à̆m)=.ú¤áâò´è®í( Áa„p r ¸œ!. r¨SÒ"R!29A49 ò¤Á¤!ˆ¡.å²8Ì4! 0Iš.-—£Ó8ðÍ–¶˜Ü†©0Át¶u–j)RNÁØ`«á5ëÁ`o׿ÐïxtæFxÈ!b¡b!ìxä¡wéÁªMx¯mäØzÃ÷0¥woÙ@†× †o˜†H Æw|ËŒã:þNï”áРÌ·SS¢ êXr+·S–h=•s#áXaÞ¸á•íà`Á¬¨vk«vM9LC5ôaǘŒOQcåá@w×wg3bᘑY+Â`“–y™96ÜŽ‘¹šYÁ¨Ñ ‘-÷ nØ›k؆W’'Ù‡;îúì” ¼@r¨r=ù ÅX”ëÕh½—^ÁTÕlÈaÌa“nqj!˜W]—! 2N'V ­!KãaŒ3Vw1Äj™¹!œÙŽÃ¡wÓÏv÷•ç¸â¡Ï:z˜³tXá¦WzU/×›ñà.7’™ îî ÍÎÙ¤þ Äœ!Ö` ŽX~ß`VÀb¡à95ëÎrA5JÏáXÁÌZóÈè"}Õ ]7Zå9«acÙ¶¢;¬*T.ú˜3ÚŽÉAÂÁ¡ÚªÑÖwÓ¤ÑO¯švW¯Ãæ`z9ÕîP5ŸçUœhãº÷‡_ŠUA¶bî %W~× $þ€ø@~9y~AÕhÿN˜!¹ÁÎáª;tiff-4.0.3/test/images/minisblack-1c-8b.tiff0000644000212300117540000005670111244340171015417 00000000000000MM*\¤Uf_eceffecdegdccdc`a]_`_[l’£¦ŒRCHGJt—¤¦¨«ªªª«ª««ª¨¦£Ÿ¢•}ž£ª©–—Ÿ¡¡Ÿ˜“‰€yriu‘ ¡¢›œžŸ  ¡£¦©¬VDq–—¨¦˜\OWZ^aYOst\XTQ[]fyƒˆŒŽ‘™”“”’‹jU[acPSjruwy~ˆ”šœš™•Ž_umpmnjjihijkkknmmkijggd_b‰³ÆÇŸ_G;Iƒ‘‰ªÄÉËÎÑÓÒÐÏÎÎÍËÇÁ·ª•–¤ÀÅ¡w^`chkry…ƒƒ‚~xn©¼ÂÄÊÏÑÎÎÏÐÏÐÏÐÓÖàËGMˆÃ»¼Èµzhfc_\`PYbacamy€“¥­³»¿¾½¿ÂÃÿ©xq|xao…”—–™¡¨´¸¸¶´¬Xqkmokijhghikkilkkhiijiebaby¦Äʺ›xuŠŒ¤½ÃÅÊÍÐÐÎËËÊÉÆ¾¯—¡«¼Ç|NJQWWUVVSSXXUZa`r³Ã½ÁÆÍÌÇÆÈËËÌÌÉÉÊÊØŒE?„ÄÁ­¦…š© ™–jQW[TZZj}𤩮³´µ·¹¼»½½»¹¡url]lz…ˆŠ‹”¥­¯±¯¯¨Vofjifefdg`ekigljjimiikihgeamÀÉÉĵ˜†ƒ¢¹ÂÇÊÎÐÔØÙÖÎËij•¥³ÃÀ|QUWZXZ\]`__a`^^_`c†³ÌÌÉÏÍËÌÏÎÏÑÏËËËËÈjd~¦ÍÆÀ¼³˜²³œœ­Š^IQUTu…‘𡧬­³³¶¸º¼½¿¿¿½·”rcWjyxy›¡¨°²±©¨¥Qiglnntz„ud_afigikhjnlmkjief„«ÂÇÆ¦‡£»ÃÅÍÕÕÔÒÏÐÕг•–¬º¾žqa\YXXY[Z\_^^_^_bcaa[b‰Æ×ÎÎÒÑÒÏÐÒÏÊÆÃÉbpŒ³ÏÇÊÒͦ™ª©©µ¬x(5j†“œŸ¥ª¬±²µ¶µ·¹¼¾À¿¾½ª|WNj{›£©°³²°®¨£b‘‘—™¡¨°²²­˜mZ_cc^_aeffceebecYbƒŸ«v}©¾ÆËµ‘vkd]at…£½Á¨dDS^[YZ\\[^]_`aa``aa^ab`Xh¦ÙÛÕÒÏÎÏÍÊü»™d}}ªÌÊÇש˜§´»¦¨²³¹x@‚–šž¦ª°´µ¸¶´·º¼½¾¿¾½­wEFm†„Š—Ÿ¦­¯­®­®ª¢µ«­­¬°²³¶¶¶¹§mRWVVSPT[XWWWVWUWVTTPVl{£¼»‚PEFNPSSPNTl‚y[RXXVVWXZ[[\\\^a`aaaaabbbb`[‚ÈãÖÏÎÊÇÄ»¯¢]Uyw–¤ÂÒÀ»¨È¾³²´¹¹¶¹£„‹”œ¡§«±±³¶¶·¹¹º½¿¿¾¹¦h0GuŽŒˆ“› £¤¤¢¡¡£¡ƒ´­°¯°²²´¶··¸»žWHILN\YLGJHEEJKILPOSSOg›¨uKPSUXXXYXWWSLMSTVYZYXZ]\\[\^`aa`_`cbbbcbddYc¥ÙÕËÆ¿»¨ž’iVNfœž¯«¦–»Í°©¯ÀÀ¿¾¸´ž„’›¤§©«¬®®²·¸¹º¼¾¼¼²šPF~“‘ˆ˜›œœ–––”˜›…¹³µµ·¸µ¶·¹º»¹·uDHGk“…`Zff^M>?BDIGbgKk›zPRSTXYWY[YWXXVXWUXZY\\ZZ\\]_^a`a```babbbca`c`Y|ÂÏ¿µ¨”‡et_,dµŒŠ†¤ËÍÁȵ¶¤±ÌËźµ“‰œ ¢¡¡¤¨ª®²¶¸»»º·µ¨Š:]™–‰ˆ‘–••’“•”–›…¼¶¹»»½ÄÄÈÎȼ½„BAEy™“‰‰‘“”ˆnSCGJHhjIy„WOPSVVXVVXYWTUUXYVVYX[[Y\]\\\__^`__^a_``_`a_bfcZj§¸¡ge{‚z_~¬–¬­ ºÎ¿ÅÏÎ¥°ÎÔÓȾ¸²Ž•˜š¢¥ª®³³´¶·¸¸²ªz(w—𙄇ޒ•šž‡¾¸½½¿ÆÐÏÕ×Ⱦ¸µyB@W†‰–šžŸžŸ‘g@?:EE`Š_PRPSUVWXXWVSSRRTQRSUXYYXYYYZZ\]]]_a```a_`^`_`b`b`eŠhCD“–]x­“¼Ÿ—¸ÍÐ̺»ÆÍ×Öͺº›Œ•œ¡¦©°µ·····¸¹®¦•f%ˆ—˜œ—Š‚Š˜¤§¤Ž¿¹¾¾¿ÁÀ¾Â޶¶šX:NŠ˜ž£¤£¦¤že'ˆ…TOUOQSVWVVUTTVSRUTRQTXX\YY[YZ[ZYZ\\]a``caa``^`ddbcelZU«ƒ~x^b‘‡¥§–”Éĸ¼½ÃÏÓÐÉľ¹®’œ¢¥©®³·¸¸¹¹·´³«ŸŒR@‘–—™—™”‹‘”š¡§«©’»¼¼»º¼ÂÅÏϽµ†-1tŒ‹˜›Ÿ£¤¥¦¥¦§˜-T“tSRUURRWVTSTRSSSSSQORTVUX\ZXZZ[YVW[Y^_``a```_]_`bdb`biU‡šxw[^pŽŸª©¥¹ºÀÊÒÔÒÎÆÂÃú¶  ¥ª°²µ¸º¸¸·´±­¦•x4_•–•˜—¢£˜Œ“—ž£ª¨Á¹º¸·¶¿ÒÓÖÓ¬p$]“Œ–¡£¥¥¤£¤¦¡‘E!7ŠnRQTOSUVUVVWWTSRSQRmnPUWWZYYZYZ^\YTV[Z`^`aa_^`^^_]__`aguhb_cjŠŸ¨¬¶½¼»ÆÓÚÚÕË¿Áľ¹¬¡¦©±´¸ºº¹º·°ª¦œ…Tp”•“––›Ÿš‹’–ž¢«ªˆÁ¸º¹¹º¹ÇÎÇûJG~Ž–›ž¢¤¢£¯³¥Ÿ–w;7g„gRPTPRUTTUUUSSSUUSvŒ’‡_Y[Y[\[[`b`^WURTZZ\^`b]]_^[\Z[Z^c`djlbltu’ §ª°·¼¿ÈÏÔÔÎÄÁ¿ÀÃÀº±¦ª©¯´¹»ººº´©£™‹h%!z“”“–˜——™‰š ¥¯­ŠÂ¹»¸¶···¸µ´˜^FtŒˆ™Ÿ¡££ ²Ò×µ“‚E@Š–zbTSTQQQRUUUTQRWYUpŒ™Á­`VZYWY\_cfca[VWWY\]\^__^\Z[YWYY[\\_biƒŽmqŠš¥¨¯¶»ÀÇÉËÊþ½¾¿À¼µ¬®­¯³·¸»ºº°£™o3*ƒ”–”’”™™™ˆ‘›£©®¬„º°³´³²³´´±”d;S…Љ“œ¢¢¢«ÓáÞ¬‚Rj‹r]TSTRQNQSSQRQX[X]šÂ½ƒVZXUVU`dca`[YZWW[]][[^`a_^\Z[ZY\[\Z[]bu‡ƒ‰” §­¶º¼¿¾ÁÀ¿¿¼½ÀÂÄ¿¹¬¯²²´·¸¸¹·¤“‡l3 .‰”–””‘™™”‹“šŸ¦¯®fy‡–¨´²±±šh@;s‡‰—  ž›¢Éßá¹XBŽ•kZUSTRRQSUUQNRZZYx”±Ç«bUXXWVRV`b_\ZZYYYX[\^]^_`ba^^]\\^^[]^`]\_k…œ¥®µ¹¹¸¸¸»¾¿¿ÀÀÂÃÁº¬¬¶´´¸»º·°“x\+  +Š“—”•˜™”’œ ¢¨©[wy‚†™ª­“dA(W‰„‹“ ž°ÇÜݯrK!}ƒbV`YTSTSRPSQPPPU^^s‰¡Ç·{QWUYZVTURZ`ZWWWXXX[]_a__ababbba\]^\^^_^^_\[v¢§©°µ¸µµ´µ¸¼¾¿¿ÁÁ»³®¶¶¶¸º¸µ¦qD  ƒ•—•••™œž˜•œ£¦«ªcŠŽ‘‘”ž‡A:~……™ ™¤ÐßÖ e= `tOCZ\XUSSSROQPNKM\_p‹’±ÅžWUWV\\YZZVT[XWWXXXYZZ\^bcabcbbghd^c^]_^^_^^_Xg£¯©°³¯²´´µ¶»¼¼¾ÀÀ»¶²µ¹º¹¸¶µ›? u•–•”Ž‹’šœŸ™¦«³¯k’–—š  Ÿ id‹‚•œ›—˜žµ½ŽU, ZmHBXeXXVTSSTQPQPQPZhy~©¸µxPWVZ[YX[ZWWUWXWXYYWZ\\^accabcbcbedb_\_`_^^]``Yf©­¨¯°°´³³·º»¹»¾¿¼·¶´¹º½¹¶´ i””•“’‡‡–›œ˜š¦¬³²s’”œ™¢¢§©œYm……’™•“¡Ÿ‰sL#JlJGJfe[WUTRSSQPLONOQysˆ²´ŸYUVYZ^][\]`]WWWXYZ[ZXZ[Z^`ccbdccbdac`_```__^]_a\jª¬­±³´²²·»»·»¿¾½º·³·¼½¼¶±Y   R•“”Ž…’›œšœ¥«¶¶t˜•œšŸ£¦§§¥ˆy†Š”‘ޤ²³ŸsE*nKLI[ri[WWURSTPNLNLJc{}«¾±vQTSYWZ]\_toZYY[[[\]\YY\\]_baadabcd``a``__a_a`acd\v³¬²³µ²²¶¸»¹»À¾¿½¹µ·¾»»·©;  3ƒ’”„ƒ“œ››¥¯µ³r”’™œžŸ¥¦¦§‘o‹‹–¹ÛÁ’s: vaROUfreUUVRRQRONNLMUyl‘¬²UUTUWX\\[]^Z\]XY\Y\\\]]]]]^babcccbccca^_\_a_aabc`b]޲­±±¯±µ¸¹º»¾¿À½½¸¸ÅÁ½¸›" 4Ml‚‰Œ‘Ž‚v‡›—™¥°·´jŽ™››¡¥©¨¦–o€‰£ÐßÃZ, l|]UR^f`[VWUTTRTRONNKnwr™·©iUVSUVWZ]^^___`ZZ]\]_^]a`]___^acdedcccaaaa_b`_aab`dfi§¯ª­®®±¶·º¼¾ÁÃľ²Žz}}…‡u]/+Ksƒ‘’’’’‘‰y~—–𥮷¶e‰•™™¡¨¤¡™{… ÖݵwM* )‘n^YUY[SUTVTUUTROPPNVˆ•°µ„XYVUTUUY[[^```^^YZ_]]^``a`aa`acdccegdcba`b`a``bbeebecv–®¨¬¬®³¸º¾ÄÁµ¦•‚LDiqz—§ž\Ef}ƒŒ”–™›šœœ–Ž…“™™¤­¶µh‰Œ”˜šŸ£¦¡œ˜~Š©¾ŸrI# U…n]URRRPOSRSSRSRMNMGm‰Ž¥¹¯nZZXYWVWZ[]__aa_^YX]\]^__bbbbabaadfgefed`bbaab``bdrlccli‹«¤©¬³¸¿À­•†ysi^ely…‹“”š¨£t}Ž˜œ™šŸžŸ ¢›’ޔ𣍱³o‰’–˜ ¤¡˜€[‚˜‹nD  XqshYRQPPMLPRRSUTSONMNƒ„›¹¾¥`_YVWXVW[\\\^_aaa\X\[^`_`b``cba_`acfbcfdbdbcb`a`a_befein[¨¢§¯¹°xymihlqr{„‘•šœžž ¥ŸŒŽ˜›œŸ¦¨¦¤¥ —‘Ÿ¥©¬s“‡“•—Ÿž˜“Q=`\; gž`k_TRQONLLMQRPRRQOOGgƒ†¤»¾Ya_XXXXWY[[\__ekmdX\]\^___`abcbaa_ecbggddbabc```acfccdfh\^•Ÿ¥®“scXXdy~usv…˜šŸ ¢§¡££”𦍍©¬§  ¢œ–”›¢¤s†“•—›™—•~+  `ºˆU_YSPPOPQNMPSQQPQPPOƒˆ•ª´»ƒWa^WWWXWY[\^acs‚„`VZ\^`^___bb`_`_dcbdedfd`bbbabccccfgkd^]e˜‘rTB>:Jh|vjl{—š¡¡¡£«§¥§£˜œ¢ª­³²³«¦¥§  œ˜œ¡i‰‰”–˜“‹ˆV  Y·µzRVSRPQPOOQPMPONQPPNd~ˆŸºº·s\d]YWXYYZ[aa^fv~œoU]Z[\_`^_ab`_]_a`bbdfghgcaabbidfdeggb^_\oT$CP_`_kw‰‘—˜¡£¦©©«©¨£¤«·ÁÅüµ­¦¦£ ¥žœœgŽ•œ•Šm14¤µªtQQQRSRRONPPPOOQPOPN€~‰ À½³hae`[XY]\[\_`aflmv™•ZWYZ[]^\\_a__]\bl`cbddjheacdioofiffe`__^\Z&;GO\SYk{„‹’™™ž¢¥ªª©­¬¨§«±·½ÅËÈö­¯«¦©£ d‡Žˆ¦Ç•q]/|°§›kKMPSRPQQONMOOPOQQKdŒ›ªÁƹm_fe\ZY[_^[_bdcc^bw™oQY[[\^^_bcda`]ah`aehldbecgwzr~…mdfbheb^^e: 4H]_N_mw†Ž–šž¡§ªª¬®°¯««³¶¶¸¶Äɼ¶½Á¶§££¢a†…‰ÄË…kX5+' S©¬¡—uMOOQRSPNONOOQPNPNoŠw”˜µÆÆÃ‰Ze`[\Z[_]]_bcbec`bl”cUZZ\\_a``b`ba`_acfs¢˜}kcx†— ©‚gceva^^b_ ?SIP^lu„‹’˜šŸ¥¨¨ª­±µ³­©¸¹´²¨®°³ÂÌÑ멤£ˆ´ª¬¼¶®¯°­£˜ˆc,!+±§›“‡PQSQPQQNMNPOPOPRaŠŒ‚›š±ÆËÇ©``[[YXZ]X\_`_cfcaa]„‡TZYZ]__b`ba``_`cddz®Ãħqƒ¡¥¸´«Žhaj¦Šg^^^l? '3>QXmu€‰‘–š¡§§¨±³¶µ²­¨¶¾´­¢£Ÿ¤¿ÕÚÝË®¦§•ż¼¶¸º¸¸¶¶±©¢>\«©¤—Ž“XKTRPPOOMLNMQRSGtŠ|¤ ¯ÅÎɽiY\XXXY[[]_`^bfebb^a”_SZ\]\^bcbddaabefcyÆÔÐα¡ÀÊÊË­lam®h_^g\&2Kitx”œ¢¢¦«µ¾Ã·¯®¦²Ê»©Ÿ˜”¢ºÕÝÝΰ®­–Ľ¼»¼º¹º¹·²¦—‹jD$"‰¬£¢–Ž™iDQSQOONMMLPGSN1€…’¨§§¿ÐÁº}ZWVVVX[[[]^`cfidcd[„}RYY[Z__`ccbcabcihk¹ØÑÒÇ·ÌÖרÊgd~²—wdabi, !1Ecsz„‹’˜˜¡¢¥±ºÄȽ²®¦®Äα›”•£¼ÓÚÜÍ´¥›“ƽ¿½¼¼»»¼ºµ¦~bL.G¥© œ•’‡CJRQQPNJPbN;c_:yoCŒ˜–ª¹Ã·¬¨—hWTTX[][Z^abdpuvg_h[TZZ[]^adecbcbdlfxºÒ×ÕÔÆËÖÙ×Ñšfi©‘‡ri`amL "4D`y„…Œ“•š¡¢ªµÅËÌÆ¶ª©±¦¨É˜™¤²ÅÑÀ“to’ƽÀ¾¾½»ºº¶®ˆnWF+k®¤œ”‰ˆ¤cASQORIZ„[u{w|€€v~r€¢³¶ ›¶ª•ZMUW[]][\^`bmƒ‘rb\aPXX[[`abeb`aacijƒ´Ç××ÌÅÁÍÓÒ‰fwzzvsie`bgZ4FWr„Š’“›ž¥¨¶ÇÎÏκ©©¬²—®·—•ª£sM_wŠ›‘É¿Á¿¿½¼¹·²¥”€cN<(®¢›“Ž‚‰ª‘BLQPJU®}{•Œ•‹›~‡°¸¨§™¿¹›’lOUY]]\^_`diw~f\hoPXYZ\_abccabbchuŠ´ÃÕÝγ®ÇÏÌ®uhycackob`aeh' 1FQi‰Œ‘–¦©»ÍÒÒ;©§¥²­®Æµ¡…XEiƒ”œ’ÉÀÁÂÀ¾¼»¸® ‹kP<&!‹¬¡™”‹}‹ ¨a>QNN™°—zh‘šŽ„…š£y{®ª£»²­¬¢­ºhLY\\\_``frz‘q`\kVVWZ]^`cbabcddi|³¿ÎÔÉ£ŸÅÌÄ”npsb_dfjbabhq7 !9GMmƒ‰’•¡¡¤¬¾ÑÖÕÑ¿¨¥¢­«›‰¶È}V_r…”˜š•ËÁÁÂÁ¾¼»·«™zW?!"𬠛wž®‘=LIƒ²£”ƒƒ„ˆ’—Œ{†£‘þ®ÄÌ»²¸­¹«SSYZ^]_`dv‰›“qf\h]SXZ]__aaaa_cdh~“¬½Ìʬ‡œÁ¸Ÿyjul`^abbc_`ivJ !6ENn„‰Ž“šž¢ «ÅÓ××׿¦¤¥£«Š}pjWal|‘••ž “ÉÀÂÀÀÀ¼º³¤~Y;"1¥ª ‚𥍰a;e§¨›‡ˆŒ”› ¤¢••‘³¿¿¿ÂÁ¾À±¦¿€KZ[_``ag{¯Äµ‚k^caSXWZ__`ab`fcbk~¥µ¾ª…z”˜}rivn]\`caab`q|M!4:Ql|ˆ‹š›¢¢³ÉÕØØÕ¿¥¦¥¥†q]YY\h}‘–— ¤”ȾÀ¿À¾º´ªŒ\= F«© ›”š ¢¢°•>ˆ§¢…„‰™¡ £Ÿ¥¬¥£­§¨¨¥©¯±°³¸©TX[]_bei€¾ÒÏ®pc``RYYX[]^b^]a_aiw†““’„ywxsrrnh}e]]fpˆw^auzP4L\ex…™š§ºÍÖ×ÙÑ¿©¦ ¡–dUXPV|¢Œ“˜Ÿ£•Ê¿¿ÁÀ½·©‘^0 ]¯¦žš”˜  žŸ«®o¢“†Œ‹”ž£¦¦¬¯¹»±¯²µ¶±¶º»´µ»fSZ\]aej…ÂØÚÈ{d_^XVXYY^^`b_]]`ipyzrwwvrnmkhmp[^^gŒË½l_€~S7JXcy„Œ’˜› ©½ÎÖØ×礤¦¢’jPKh›ÃÚœ‚“— ”Ç»½¿Á¼­[" u°£™’’œžœ›Ÿ©³¢”Ž“•™¦¨©­°¹»²³²·¿À¿»½¸¶ÅtR^b`cfiˆÂÖÛÓši`[XSTYY[]]```_adgntqmuysokhgek_]^\c¨Ýã™^ŒˆR4K[g}ŠŽ–ž©ºÌÔØÖ϶ ¡¥§‹^Tp±ÐØä±|‘˜›¡nŒ“—˜“Œj< !‡©•Š”¡ œž¢ª²žŽš˜”‘‘˜ž¥¬¯¬­²¸¹¯¯³¿Ï×Ñž»¸ÅqQadbacr‹ºÔÜØ®q``VRTYXZ\\]^`aabchnmlqrjhecbhf[^]]p¶Øå¶f“ŽT0L_d|ŒŒŽ• ©µ¿ÐØØÏ¹¥Ÿ¢§sY‡ÂÖÜÓ›ˆ”šœ¢Nomprt|€†’„_3.‘¢œšˆ’¢›Ÿ¤©±‘…’š–“”— £«°°«³·¸¶±°µÅØÜÐÅ¿»»½gUcebdas“°ÐÛÛ½a^XRRX[Z\\\\]`bdefhhlkieecbbgZ]^Z`„ÂÙܱq‹‡M/AUcs…ŒŽ”œ¤ª®¯ÄÖÚÒ»¬™§]–¾ÒÞÅvcyŒ˜›Ÿ¤b„|{{y‡‘‘–“x77“¢ š†’˜”¡©­‹}‹¡›“”˜Ÿ§­­®­»½½º±±µÃÕ×ʽ¸»´\ZcdaccnНÌÙÝÎŽe_VRTX[[X]Z[_a`cffhjjfdeccdh_\_\\c–ÎÙШn~w? -;Lcu~†‰™¡¤¦«·ÏØÕŸ£ zŽÂÈÝÁkk}‡”™£¤eŠy|y†‹”“Žv2'Žš•‹“šž£§‡{‰¢¡—”™£­²ª´ÁÀÀ¹²°·ÁÊÆ¼½º¶»°TYca`abi„¨ÅÕÙÔžicZRTWXZXZ[[^^^dedgjgededhi^[`_\[n±ÖÖÌgok/ .>HWp{‡šž¤¦µÍÔÓȾ¬Œ¾Ì×Ìd_vŒ”œ¡¤bƒŽwu~†‡“Œ…Y“ ’’”“–—œž‰{…™§™› ¤¬¯®»¿¾¾¹®­´½»¹º¼¹¶¹¶dSa_`aai{¡ÂÑÕײpc\QQVVVYXYZ]]]afegjighigga[`c_\^…ÆÕÒ·uef`1BFOfuw}‚…’¤ ¸ÍÎÏü—°ÊÓÕnNnw„‰‹–ž ¤Zz Ãwu~ƒ‰ŒŠx: |ª”‰•š‘Š‘‘Ž’”€ƒŽ¢¢››¡¥¬ª²º¾½¼¸¯¬²³¶¸»»¸·¸¾zN_`a__gt’³ÃËË®vfbWMLX[ZXWWZ]_`ffeiijiga^_bdb_aq¥ÊͰ‡iaeN 2>DL`jpu|„‰—š°ÇÉÄ®¡ÀËÛ—=^mx~†‹—œ ¤Udk޲¡{v|ƒ‡T Z–•‹•‘Љ‹Š…†‡Š†„Žž¡œš¡£©­¬µ¸¸º¶¯«²³·¹ºº¹¹·¾ŽQ^^_`acs†–›¢”ugeZNJGVXVWSUZ\`dcceeeca^^_bcbaxžÁȧ~mc]e51>CES^kq|€‘‘¤¶Â¿«‰Œ·ÌÏÖ^7MQevŠ“—ž¡UZZq—ª†ksvnQ (Q……‰ŠŠ‡‚~}~z†‹˜›™—›ž£ª­¯¯°´µ²°³´·º¹¹¹·¶¾—LZ^^_`bjvx~‰†xlgaYVDDPOLN[VZa``ba```b``aab`n¡Â͹‹qh`[_"&2@8Eaq=9Ki¤¨ËÒÓÓÏËÎÖÁŠlŠœ )KNGA6862, n”†‡ƒ|xm_J8&m˜Œ““••˜¤ª®­®¯±µ¶¶··º»¸»¹º·½˜FUZ]^^]bdkrrvwxpldm• Ÿ©¼Ç²µgFUV[\[`a`dcdbbuŸ²¿·•pdb\`? %(,+0* ;ª­xR„µÄ©ÀÎÑÑÎÌ̽°Íßµzƒˆ–œ',1, "  (lpgQ_‡€cN4)$u˜‘Œ••–˜•˜ ¦ªª¬¯²·¸¾Ä¿»¹·º¸¹·¼BUX\[\\^afgjmrtmmku}zzÀÆÂÌ¢BRU\__`a__abem޶¾·•vje_\a9Ca  #;°ÃÁ«š¢®¤º·ÌÌÎÔÎËÍÊÇÑÒݱr„’•$ LbT;""d|aPA76/'ƒ––™˜˜—œ¡¤¥¥ª®¯¹¾Âž¼¸¹ºº·µ»‰ASV[\\^_`abehkolmjeYadhzªÅÁ»ÆUQ[^bbbbaccckr­»¤oca\]Zy°_ ¹¹¹©·»œ¬³¨ËÍËÓÊÆÄÅÏÕÔÓØ‡uŒ’  _Œn@+'#$Kh\UC424*2’˜“—”—˜š £¥¤ª­¯³»ÃÀ¼»¸»»ººµº}š›”•–•–™œ ¤§§«¬²´¹Â¿»»»½¼ººµºr@QUXWUW[`abbfmrnkjhknPWiu¬Ì»Å§GUX]_baaehjt…‰ˆ…‚sibb`^d˜»:   б´µ¶¾ÂÈÊÅ»ºÅÇËÎÐÐÑÒÒÔÕÒÚµgƒŒx˜‡xW/z£xE.+0/*;ci^K7/0.+$A››”’–“•—¢¢¨¤§­³·º¼¼¼¼»½¿½»´¸gDPQTVWZ^^`_aaiolkmmjl^Uzz™ÅǾÏ_HVY[\^_bdfkutsneccad``:ŽÆN 'œ¯±³·¿ÅÇÈÊÈÇÇÊÎÐÓÓÔÓÓÔÔÔÛ²`zs’ŠŠ‹‚e;}šqU@60.)'Ql[J=4.1//"U š›“‘––——™ ¢£¤©¯µ¸»º½¼»¼¾¾¾¾´³YBNRPQTWZ[]^_`ceglkjif[W‚|ˆ»Êµ×;OSVY][]babdfaaaa`jkiAu‰s  3¢ª®±µ½ÅÇÇÈÅÅÈÌÏÐÓÖ××ÕÔÕÒݪWx~x”„ra…Šm[J;431/8WXM=11/30,dš™Ÿœ•“’”™˜œ££ «²·¸¹¼¾¼»»¼¾¾¼³°QBIMQUUXZZ^_`bfhiomkfa[N}{€«Ì¶ÂºEIOTXZ\_b_^_]^`acjnjU*h`  4¡§ª®²»ÁÅÇÇÆÇÊËÏÒÔÖÙÙØÕÔÓàœQpv|ž•’ŽipqVMA52244FXOB623231-$žš¢£˜‘‘•”–š ¢¢«±·¼¼¼À¼º»½¿¾¸²¨G?HLNQTWZ\]aadilkkjhcb[Hw…yŸÀŬÖb=KRTUXXZYWXWW]bbaf\ +\ZcD 7¤¤§ª°¸¾ÁÁÂÄÄÈËÏÑÓÕ×Ö×ÖÔÒà?aq|ž”˜}h‡}bSF:31028NN>6474121,+Š¢›¡¦Ÿ–’“””˜œ£¬°´º»»¾»ºº¼¾»¸µ¦E?EILNQXX[_cbcddee][kmmvwŽyŽ´Ï¦ÓŽ7JNPRY_frnimm`SPYZ *^Š™–‘…kU6 6¡¤§ª³¹¼»¾ÀÂÄÉÍÎÑÓÕÖÕÕÔÒßo:ep{š—„^€ƒn^QB:7469CIB736454/1'4•££¤£žž™”‘”˜š¦¬­³¹¹»»ºº»¼º¸¸µ£>;BDGLMUYd\[]_`a^PVpy‡£†ˆ‹ƒ©Ñ«Ã¹@FGFTcq„~{‰•©­•rR %`•œŸ¡žŸ™Ž{\!$‘›¢£¥°¶ºº½¿ÀÃÇËÍÑÓÔÕÕÕÖÕÚQ5emzšƒ^x†vfQE=77568;>:67533200%A›¥¨©£ŸŸžŸœ˜™¦«®³·¹¼º¹¼¿¼¸¹¸·7;@BFJIKRYWXXVVK;Di„ˆ“œ¡¡†”Ž£Ìº´ÓlD?I[n~ufh}”™¤¬šA -w˜˜œŸ¢¤ —†Z›ž ¡¨°µ¸¹»¼ÀÃÄÉÏÒÔÕÕÕÔÙÈ/HW‚Œ[t„}gRA9577:88<=75512/30,M𢍧¢žžŸžœ §¬¯µ·¹»»½¾¾»»¼¶¸•-82441444865576423112$kž¤ª§£ŸŸ¢¡ £¥¨¬­²¶¹¼¹¿¾»¼¿ÀÁÀºµ5:5J}Šˆ”’”•–Œ‚nITjG‚y…œ€‰”‘Œ¦Â»ҬŸsfe‚‹‘ª¨™Œ‚„‘•“–ŸµÉÐÕÓÓµ‘hGer„…†‰‹ˆ‚{y|zicvš šnRVQRJWmaVOD:7687645688778767554%nœ¤©§¤¢¢¡ ¡¥¦©­¯´¸ººº¿½»»½ÀÀÀ·­l*4H}‰œ¨šš›œ™ššh79(Z^F7eŽ˜‹¡´ÊÂÏŰ›?^¢ˆb~“š–u^Z]hƒ™–ŽŽ“­ÑØÕ×Ú| 2Zixzyux{sjhifVLd‚sgQPQPSITcULE>:977976998<78=?<9761's™¨§¦¤¡¡¡¢£¦©©­°²·º¹¹¾¾¼»½ÁÀ¿·B2q‡Œ’©¨¢ž£¤¢Ÿ¢°œN D$ $†’“‘Ÿ®ÉÌÌÉ»ŽG‰ŸžŠwzš‹KCFOYl†”—œœžš–¡ÈÛ׿œ‹,DWdheggd`\\YOKZhfRFQOPRSURLTIFFBB?:6547665:789879731(t›£¨¦¤£¤££¥¦ª«¬®²µ¸·¹¾¾¼»¾ÁÀÁ°~"U‚‡“¡¤¦¦©¥¥¨«²¼¼PJP,#gŒŠ–™˜™©³¾ÐÍɿÒ`«’Ve€¢y2BKUez†‹”š¡£ œ¤Êᛕ82QZ\[[[UMKKGFUWWLEKOQVWUUVANJHECCB<8476668<9;9777332+w𠦤¢¡¢¡£¦ª«¬­²´¸º¹º¾½»¼¿À¿Â§V)t„Š’–žž¤¥©¬®®±ºË™Xžy7/…‹‘Ž›“™¥²ÅÏÍÍĹÀiƒ‘}¦Š€2ALOYu„–ž ¥§§¦¥¦ ËÅœ›F!@NMLSLEA?5=QQNNHKPUTWYXXU>PMKHGECB>75546<=@:78755533|¢¦¤£¡¡¡¡¥«­­¯³¶¹º¹»½»¼¼¾¾¾Ã‹+ P…‰“™ŸžŸ¤¦¨°´¯¤ˆ}Àº™?x›ªšœ£µÀÎÍÀ¿ÃÄp³›†qg1KS_jx…Œ˜œ¤©««­ª¢¥¬¶žœD4ADDGD=911GHHGHLNTWWXYXZU:NPPMIGEEA<5675=BA=8545656<{¢£¢ ¢¡¢¦«­¯²³¸»¼»¼¾»»»¾¿¾¾_k…‘•˜š”‘•—Ÿ£¥0†À¶¢…<3…‘¯¯¦¥¬®²ÊĽ­ÀÒx›¥…;[fkmn~ƒ•Ÿ¢£©¯°ª¤© —•9,5<@?<8/0BDGKFLRQSTUUXZXY9NJNNHIEEEB;877?EEC96788959ƒŸ¤¤¥¡¢£¤©­®°³µ¸»¼»¼¼¼¼½¿À¿²9'z••”–ŽŒ‰™ž¢¡¤¯¡9c¨¯«¢Zƒ£§Š‘ž®±¼ÏËȹµ‡­­¨©º^Hloq{}~‰“Ÿ£¦§ª®±©£¦“Š,05443+&<@CKJOQUSTWUWVY[V5NIDKNMIEHEC=9558668/9…œ¢¨¦££¥¥¥©­¯±´¸º¼ºº»½»½¼¾¿¿—#5ƒ–—˜˜˜“‘“•›¥¨®´¾Ä`1v‰™¦²°“m”¬±¯®¹¾Ðži~¨ÇÁ‚(ez|vuu†‘˜¢¤¦­¯®¯®­¨§w "(/1# 4>?GINROPRPSRTTW\W4JG>@LMIEJIH><GA9:96510#OŽ™ª¨¡£¢££¦§¬±´¶¸¹¸¸¹¼½½¼¼¼¶¦Z4”Ÿ¡¡Ÿž•’•–•‹„€€~x£§¨¦yˆ Ÿ›Ž{˜—´¼©§ªom¤nHUm~ƒŠ‘Ž•˜£©¯µ¼¿½µ®§¬g IHIFFIMPQUUSTVUUXbj6BCHBADEHIJIB:8;A=86422+'T›©¦¢¡¤¤¤¦©«±µ·ºº¸¹º»¼¼º¹·­7OŠ›Ÿž¡›“”–••‘ˆƒ~‡••—•š•’–š”›¡¥‹RRxuwyyŠšž• ©¢ŸŸ¡˜—›œŸ¡ª¯¸ÀÆÂ¶°§®u DOLJIMNOQTUUVVUUTWjx8C;@>?@BCDGF@:7:>>7951/)'` ¬§¤¢¥££§«¯²µ¸ºº¸»¾½»º¹·² q_¤§ž™‹Ž––Œ‹Ž’““—–—‘“—šš™¢°­L`cho’œ£˜œž ¤¢žŸ  £«¸¯¾ÆÈ¼±¨«‡ 5XFGKMNNOTVVVZWXWW^~•:C9:8<>B9:9<:8>BB@@@8;99982.,'#t¦¬£¢¢¢¢¤¦¬¯±¶¸º¹¸º»ºº¸¶°}7 0x¢ ‡‰ŒŠ““ˆ…†††Œ‹Š–•“š¢Ÿ œž¡¤§©¤•Vjyy|…„—ž¢£ §¤£¥©¬­©ª©¦¬¹¿Áƺ²·§™% FE@CGLNQPSSS[]]][br§ÆÆ@A@==::97650,)'#|¥«¤¢£¡¤¦ª¬¯³¶·º·¶¹»¹¸¶²¤h) C|š–ŒŠ‹ŠŒ‹Šƒ„‹‹ŒŒˆŒ“‘‘“š›˜™Ÿ¨¶¸­§žm^rw€‡Ž”£§©ª²µ´ºÁÅÃĸ«¬®¼ÁÁ¼¶»¨ž, 9H>>ADKOOOTTTWY\[^gÃÔÔ6E<;@<846>@>=<;97553.*&'-†¦§¡¡£¢¤§«­°´¶¸¹·¶¹¹·¶²ªœ‚UP{‡„ƒˆ†ŠˆŠ‹‡†ˆ‹Ž•–—›œ˜™œ¢¶ÌÒɽ¬|^ow‚‰Ž’˜¡¦§¬¼ÌÔÔÕÖÖÓ˵­¯ºÁ»»´·§2 +J;=@BFJQTUTRVXY]]hr¨ÊØÖ:F==@;63',=>=:7721/0.*$'@Ž¥§£¢£¢¤§«¬±´µ¸¸µ¶¹¸¶´¯¢‘sBY{ƒˆ„†Š‰Šˆ‡‹‰ˆ‡Š‹ŒŽ“•–’‘—š™™›ž¥ÀÕÙÙÓÊ“arw€††ƒŽš¢£¥¸ÈÙÜÛÚØÖÏ»­¯µ½º´°±¤ž6 A?8:>>DIPUVVSXXZ\]x·ÎÚÔ8D=;50".?<;;61'"#Pޤª£¢¤¤¥¨«®°´·¹¸¶¸½¶´±¨˜†d3"\uƒˆ‹ŒŠˆ‹‰Š…‰ŒŽŽŽ“˜–••—–’™œ ªÁÕÙÚ×ܬ]t{ƒ|„‰“œ£¨¬±ÄÔÙØÖÓÍı§ª°º·¯­­ŸŸ2 4?7;=>@FKQVXVUVYY[`…²¾×ÚËG?@=?HC3,"'0+$$;RYXso8j‡“ ¨¡¢¥¥¨«««±³³¶´²´²¯¬¥—ˆvR)/`rzˆŠŠ‡‘Žˆˆ‰Š‡ˆŠ‘•““”˜š©º½ÃËÑÔÔÖ½jdtqsw~‚Š—¢«´»ÁÄĺ­§©¨§«®±®­¦¢(*65;=BGHLNRY[ZXW\]biŒ»ÍÒʘ=E<=<@FB5.$,E`Y>;Q[A ‹–¡¥Ÿ¢¤¥¨««¬±³´µ´°±³¯ª¡•…rO(5_uyƒ‰Š‹Œ…†‡ˆ‰‰Œ“Œ‹’—¡®¹¹»¸¼ÁÇ̽€blpmuv|‰’”’™¤¥®³±ª¨¦¬§£¨ª¬©¨£¤˜ -..8A@@><;72&!\U8(^a4>[: ?‹Šœ¡¥£¤¤¤©­«¬²²³²­«®¯«¡™lP!7]mrx‚Œ‹ŒŠˆˆ‡‡‰ŽŒƒ…Ž‘”˜™ ¡¥¦¬¬ªªŠfehgptv†ŠŒ”˜¤¨¦£¥¥¡¥¥¤¡¡ ¤''14;BJKNQWZ\YY[_dr˜³¸¸Œc[8A?A==84+$go73sveSr~? H”ŽŸ¤¥£¦¤¦©¬­®²±²±¬«¬¬§ž•Œ~nJ!8[kwx{„……ŠŽŒ‹ˆˆ†…„ˆ…„ˆ‡|~Œ‘”–™›™œœ Ÿ¢£¡†lbejnxv|ƒ„ˆŒ‹’™ž¡££¤¤¢ ¢¤Ÿ¡ ¦y !')1:@BHILSY[WXZ\_h{œ±¯œm^Y2<<=;=87(CX'2~`61/6%W‘‘¢¥§§¤§©¬­®±±±²¯¬ª«ª£™‘ŒjG6\isstxx{‚ˆ‹‰‰Š‡„…„†„‡„{{…Ž’‘–˜—™™šššž›‘mfhnwxw~€ƒ††Š’˜Ÿ¡¡¡ ¡žššŸ£Ÿ¡ž¤g !&+38BCHKNSYZXYW[`h¢§›€b[X.:96221$4X0 be#~m-B7*d’’¥§¥¦¢£ª¬«­°¯±²¬¨§«¨ ™‘Š€kE)Shmmsppso|€†‚‚€‚†ƒ|y~‚‹“•”’’’’——–‡zpgjisuqu|ƒƒƒˆ‹‘–›ž¡¡¡ž›˜ ¡¢Ÿ¤W&,57=@CIOVVXYXY^aiˆ¤š–€b[T.755/.*5`T*)q3,‚€_b7:i“”§©¥¥¥¥¨®­®¯±²±®¦¤§¦”Œ„|i;Kfpoqplfkqu{yxwxy|zvxy||~ƒ‹”–’‘‘Ž‘‘މ{qjiisuqu}~ƒ†‡Œ”–™›žž˜—ž¡¡™ŸD ,/6;ABEKPUTVWYZ_`g†ž¢|^WR:H>942*HA) U„DGlu{oG/y’¦©¦¦¦¦«®­®¯±°®«¦¥¨¥“‰‚n:A]hknkd`fejsuoqosvuuqwy{}ˆŒ–—”‘މ‚{tqkvxvsx€€…ˆŠ’–•–˜œœ›•— œ›š–)(-6;=CFJOUVVVY[^`c|“šŠdZVQ>ME>8=;/,#RuV@cuv_[[$,ƒ˜§¦££¤¦©­­¯¯®±­§¨®«¤œ”‘Œp:9Ykspgb`\`hppjikklmqnqqz}€„“’”‹‹“’Œƒ~xvp}€|tw~|}‚†‡Œ”’‘”˜ž™•šœžžž‹*49;=<;:3<<$JIE3Quya{^0ˆ–§¥£¡¢¦«¯®¯±°°¬¥¦ª§£Ÿ•‘‹‚p1,Seppped^_bkhbghflposquvx}…Œ‘‘ЉŒŽƒ{wtwtyytwy|‚‡†Š’’–˜••—˜˜š™œ~079>>BIJORSUTWV]]brrbVSPK-589773,'1&96@R`tsr‰b40‘Ž•¨¦¤¢£§­¯¯¯¯°®©¡¥¥§£œ”’Œ†o-#H`npohf][dmkgdabhpsrpury~‚‡“’މ‚wurtsw}yz{|x}‡ŠŠ‹’’•˜–—™˜˜››• u *3<>?EGJNQQRRWXZ]chmjaYRNE*/35673+#,3),8!Tjgz†UHs_ŒŒ”§¦¥¤£¨­®¯¯¯°­¦¡¥¦¤¡•‹…f&7Tgnrnnibhusne`ciowtpsvuz‚‡‘‘Ž‘‘‰}qmmrv{€{x~€~|€‡Š‹‘ŠŒ‘––’•—–˜–¤j'3>EBEJOPSQQSRW[]]^cb_WOH>#,/0+,&'(3$9L>R`=,Fd‘“¦§¤¦¦©¯¯°±±±­¤¡£¥¥¤”‘Œ‡b$,LZdppllehuvnc_bit||uqtqw}€‰‘‹‘“’Œ…ymfflow{yy~~}€ƒ‰ŠŽŽŒŒ‰•””˜—™™¥Z!6;CBAFLSQQRRQRVZ\]_`_XPI? #/HBEHF;$ Q›–¨¨¦¦¦©­­°±²²­¦Ÿ¡£¡¡œ•“†T COWhrrpkiruoa_cny~}wsmlrsz„Š‰ŽŒ‡wjehmnv|z}ƒ‚€}„…ˆ…‰‰Œˆ‹’‘—™˜› ¤H 5=ADECJORSTQQUVXZY[\\UOH> #.=<4/&&7EI*/"`™Ž˜¥¦¥¤¦¨®®±²±¯¬¦¡¢¦¢¡œ˜•Ž„K3HJZiqvpksxrh\`lv}}utkknry‚‹†ŠŽŽ‰„sc_egmq~||€€€†„†ƒˆŒŒ‰Œ‘”š˜›œžŸB 0=?EHFGMOQRSTSXXVUWYUPHB<!)0356+%;?.#)'v𗥍¥¥§©®®°²²±°¦¢¦¦¥œ™”‘ƒE"FJNZjuuonuuka_kvwywtjggpr‹‘“Œ‰wdcbikltxwy||z~ƒ…†ŽŒˆŠ‘“”™š ¢¡?  = 9DFHKNONOQRRRTSSQONJA;95=@D>1%"%FbU.<˜–—¤¨§¦ª­­¯°±°®«£ ¥ª¬ª¡š–•i&#>FMR^klf`jssc]iu{y{|zpdhnyy„‰‡‹ˆ{i\^bdeisvriptv|~‚†„‡‘ŽŒ–™™˜œ Ÿ¡H  :81AKNOK>,  "' Dœ–—¢¥¥¤¨­®°±±°®¨£¨«¬­«¤œ˜–[1BJRYfmfbjlup[_kx}~~}skkmsx~ƒ…“Œ‚ob_`dfnvxtmosquz~‚Œ”“™˜›šžžž N$ >HMQONMNMLLMKIEC=;=:90HMJZTH@8$"$*` —™ ¢¡¥«­­±±°¯¬¦¡ª°­¬«¦Ÿš’L(>KXYitiaajtteXcmwz|{qpkhqz€Šˆ‘Šzld`\epzwuv|yvrsx{€†‰‹˜›˜šœ™›œ I.+ .FRQPLNNJJIEA;>>BA><1GLXlgXIHD3"%" s —˜   ¥¬®­±³³´·°¦±³°®ª£<#;BR\cnoednuqm`\fpz|wrhait|„ŠŒ„xgd]^fnwx{ƒ‚‚}€††ˆˆ‹’‘”š˜˜œž››žB*A9) ,CLMKJGD?::<=>FC<;099GU^_NFHE8 !€ œŽ›¡ŸŸ¤©®­°°´¸¼³«³´±®«£œž‚(5>I]_cgmjmtqk\S^ivzyuojflp{„‰ŒŒ|eeeabosuv€„…‚……~†‹‰Œ‘‘“šœœœž:.LI=+ !*3569:;;;>AB?8J_SIG>==97><2 $Ž›ž£¢¥ª®®±°°¯©¤¨±²¯¯¬¦žŸk -BG[cjdfjnsynYSZfqvrzodahit}„………o^^fffkrrw†ƒƒ‡ˆ‡†‰‰Œ’šŸ¡˜˜œ›œ.$CWOG -669B<>===;;@AZtja_YTM=2--&   2œœŒœ ¢¤§©­­°°°®©¤¤­±°±®§ œN*BCS_hfeklpxnZTZcnwv{ujg_fp}ƒ‚€xg\Y_heiqox|€€„„‰‰Š’’””¡£šžžœ”  3ON‚? $/:>:?@?D>>?=?C=OeWXXUTSPIE?565127:9&Wžž›Œž£¢£©¨«­®¯°°­¥§­±²¯­¥¢Ž/ /GGP_igalrspfYRT_iqxxuljb`p{„€|ui\U\ghjrryƒ…‰Œ‹Œ‘’‘–Ÿ¡ž™šžŸ‡ "4<€ ',1:=>?B?@?>@:<=9[zoojhb_]ZZY]bZVTUPK?sŸŸ—‹›Ÿ¡¢¦¨«¬®°°¯ª¨«¯´²®®¨¦q'@EPU^c]aouo`UXT\cozxulegjqy}zwu^RUX^gnpuy€‡Š‰Ž‘’‘‘’– Ÿžš™•žu %,u(04;@DEDFCA@@>;<;r–Œ‹ƒ|tnfb^XVYWTPNMFC¡ŸŽŒ¡¡£ª¬®®¯¯®«©­±³²¯¬¤M ;@KUWZWZfqj[M\^Xhqzxqjcehqw{{zuaQUYYdmmr{{~„…‡†‹ŠˆŽ‘“’•šœ›š˜’¡_  *4:=AHJIGDCA<<:=<}¨ž›˜Ž…€vrgg_[XVSRRHNž†‘œ›¢¢¤ª¬¯¯°¯®ªª¯²µ²°­§Ž2 0=EQTWYafstcW`dgqzzwpigdhpt}zmZSVW[ajln|}~‚ƒ†‡‰‰†”œšš˜——›4  &38>DHJIJDCC@<9==<…´©¨¡–’Šƒvqkd_WXUXJ^•œ™†•›› ¤§¬¯±°°¯®«¬±´´²³­ªw (;APQWX^gnvl[]fkmv{|vriknsxzvebX_^X]bbkrux||‚…‹‹‰‹‰“œš™˜”‰  %47AKNLGEFCC?<;>>@CHG’¾µ´²°¨¢Ÿ›’ŽŒ|kaSPDI…–…Œš˜˜œ¢¨®°¯±±¯¬°³µ··³®¯‹ #&(8AOYVZahslZZdkqu~~zwsoowz~{rjVHOTMIJLTTT[iq{‚‚ˆ‰‹ŠŒ“žœ™•”b  15>BCCCD?B@>@AGID’¿¶µµ´®¦¦Ÿ˜“Œ„uiYSDY‰ŽŒ‘™•–œ¡ª¯±²²±¯°³µ··¶´°³h "#!#2=EOP[dgsv^T_in|}‚~yupqsv{|uqYFDGLHHMMTU[isw}…‰‹Š‹–š™˜–“y77KOPN?* (29@B@DA?BCCBFHJI“À··µ´²®§£™†znbPDgŒ‰ƒ™œ˜›ž¡©¯±³³²®¯²µ·¸¶´³«<  #""# +8BHIP]gpsaUWejw~‡…~vpvvy|xvnYCBCCAIMKU]]enov{€~„‹ˆ‘––——ˆ4Rbgb_gf_YH%  +5;==>ACCEBFMKOM”úº¶µ¶µ¬¦¡›“‰}k]KEr‰‰‚…™™ššž¢¨®²³±±­¯²µµ·¶´¶‘! $5>GCM]cnpeWXbhp}‡…ƒxtrz{vwveYHBCECEGS[f_bhu€€„††Š‹‘—”’‰@JSWcimoojef`P6 ,6;;?ACDFGIMLOJ—ƾÅÇÿ²¨¢œ“‹jZJI}‹‰€ˆ›•–™›¢©­±³³³°¯³´¶¶·µ¸g !+:@CNXagmdWS\cn{†‡~xvrzyxuraREBABDGHQY][dpyˆ†‰ŒŒ‹“–’ŽN@S^t~…†‹…zleab[E$ "19=>CGFJMMOPL¤×ÐÔÔÒÎÄ´ª¢›‘ƒscT=M€„„}Œ—’–™¤­¯²²³³²¯´¶¹¹·µ­7   ""%(7?BJVafie[OSYhvy‚|wtpuqvxi[J;?6=@EIJQT]dsz}„‹Š‰Œ‹’’[-Ydq”›¡œŽxlffgfX;#)4<@BILNRPPM¥ÞרÖÖÒŵ­¡–whWI5Sx|||Œ‘Ž’•—¡«¯³´´³³³µ·»¹·¸‡+9ADN^jpi^RPW]etzytnspssoVOG95018:BAFNQTduw}Œ”‰‹’“g$QER\mŠœ¨¯°¤›ŠypqkfggeR8#%5@DHKMPOQI ÙÓ×Ö×ÔÅ´©Ÿ•†i[L=)Gjwtv‹‡Ž’–Ÿ«¯±³³²³³·¹¸¸·´J  0=EI[hqnYNHOY_iid_fjroig]UJ=206247<@FELRen{„ˆŽ‘ކ\j`=PZxªª´ÃÆÅ¹•„|tskjihZJ96;EJKKMPI£ÓÌÌÌÌÊ¿°¤žŽvcR?,7Wd]c‚ƒ†“Ÿª®°²¯²²´¸¸···“ &4BJ\hsq\PLMSX]\[S^ieged[K@.-*146246?BBGV_n}xqjfJ?rtWHPb—œ¢¸ÊÐÛÝÒ½±›Œœ“ІmicOADILF•Ǿ¾¼¸´¯¤”„yz{‡‰‰“ ¨¨   “ŽŽ–¡Ÿ¡¥­±¶µ²µ… $08DYgkeOGDFHHLNTRT_]`]P #&0,/.''$$(%r¿Üר×˦”Z\_Uar€¢¯ÀÏÙÜÙÜÕÑÖÙÖÙÛÒÚן”€eSG=;BA•ǽ»º¶°ª¤¤­·¿ÂÀÁ¿À¿½¾¿ÂÀ¾ÁÀ¾½¸´³¯¤žž¢¦«ª¦&  #,6F[hcLABHDJKLQPRWVHD/$"&($#:g·Ïƾ¸¹­›kYaY_io‚•¬½ÃÒÕ×Ú×ÖÖ×ÖÙÛÓÝÇ„ —t]TE;5”±°´¸º»¹»»¸¹·¸¸¸¹º¼¼º¼»ºº»½ÀÁ¿¼¹´±¯­©†QRTQJ?2'  ")5CQO<33;=CGJKRVQL<%%  XÀ˲º­{G_kbcS`ns‡”¦´ÀÅÇËÐÐÏÔÛÛÛßÞÍ…|uƒ‹ia[T6’À¹´°³¹»¸º¼¼½¼¼½¼»»¼¼»½¼»»¼¼»¼¼½¾¼¼¾¿½¾¼»½¿½¾¾¼ºµ°¦“wW7  )073,$-46>EHMMMJ:% :*:cG47D?Uq}‚‰“”¨®±´·¸»µ²¹ÇÍÓÕÓ¸„oobeia_Tº®§²¼¾¼¾À¿¿¿¿¾¾¾¼¼½½¼½½¼½¼¼¾¾¾¿¾¼»¼¼¼¼»»¸¸¶¸¹¸¸º¼¿ÁÃû¨„V,  %&#'/8EGIJC;.   &2^bjrrtv†•¤§¯¶»À»ºÆÏËÇÏÀˆzfYZ_`cXб £¹¼¼¼¿¿ÀÀ¿À¾¾½»»¼¼½½¼¾¿¾¿¿¿¾¿¿½¼½¼¼½½½½¾¾¼¾»¼½¼¼»¼º»¾Á³—|^: #09CID:+    3ISX]ZZXXZ[UQRVV[ghks{†’™¡¨žŠ‚eXWWZ^W‚©Š½»½¿¿ÁÁÁÂÂÀÀ½¼¼½½½½¼¿½½¾¿¾½¾À¾¾½½½¾½½¾¿¿À¿¿¿¾¾¿ÁÁ¿¿½º¹¼ÀÁÀ¸¡q: (:><1#   Bagfc]\[YZZ\]`]ZXVTPIGIJEIMNPQX\`\UVTPRNj~]šÂ¼¿ÂÂÂÂÃÃÂÀÀ¾¾½¿¾½¾¾ÀÀÀÀÀ¿À¿ÁÀÀÀ¾¾¿¿¿ÁÁÀÁÀ¿ÀÁÁÂÃÃÃÂÁ¿¾À¿¼¼»¿Ä»—^.  *-*("!##  +?Uc[WWTSUQRSTTWXUZ^YZZ[YWXYYWXUXZ\]dj†‹taMLL<¦Â¿ÂÄÃÅÆÆÆÅÅÂÁÁ¿À¾ÀÁÀ¿¿ÂÀÀÁÁ¾ÀÀ¿Á¿¾ÀÂÃÂÂÀ¿¿¿ÃÆÇÉÊÇÅÄÄÄÅÄÂÂÄ¿¾ÀÄÄ´ŽQ"&*49=>@@@CJMSNG>70(" *BQOPQTWUSRVRNRPSRSOPQQRUVUX\^YZ\Z[[_cmŒ§§•’;:q­ºÀÂÄÄÄÆÆÈÆÅÄÂÁÁÀ¿¿ÁÀ¿ÀÀÁÂÆÅ¾ÂÁÁÀÁÀÂÇÈÆÇÄÀÁÄÇÊÍÎÎÍÍÍÎÍÊËÌÉÈÇÅÅÅÁÁÃÈÅ|$-2;;>BDBBFMPQQTX`_b_acca_[XSPH;0-00/7ERUHDJSUVXUUPQQONMTQ8ILIKMNONRTTTVW[]ahjv©Áŵ¨ª"<§¥®¿ÀÂÃÃÄÅÇÅÄÄÂÁÁ¿¿ÁÂÀ¿ÁÀÀÁÈÆ¿ÀÀÀÁÁÃÅËËÇÍÍÌÎÑÔØ××ÖÕÔרØÖÓÕÒÓÎËÆÇÇÇËÌйE7@ELQXI=EKNNOPTRSUWWXY[YXZZ^_\]ZWVZ^nˆ‘’nVNXXZ[XUQNKJORNMOGLKMOOPTVWUVXY`hlu¦«“ί D~¦Œ›¾¾ÀÁÂÃÄÄÂÁÁÁÀÀ¾¿À¿¿ÀÀ¿ÀÃÇËÀ¾ÀÀÁÉËÈÊÍËÎÓÙÙÕÎÆ½µ³³³¹½¿ÁÃÅËÒÔÕÔÏÓÕÓÍîWF@6%#7FGILOQUVTTWXZ[YYXVWWUQPPOPRX`o†‰’ª°•cGT[XVVUVRQUXPR™TNQOSSVW\[YY\\ae{¡ØÂv¯¾¶sŒ¢‡•¾¾ÀÁÁÁÂÃÁÀÀÀ¾½½¼¼½¾¿¾ÀÃÃÈËþÂÂÅÏÒÉÇÉÎÏËÀ´©¥¢¦ª±´·»¼½¼¼º¼¼º»»º¶¶²®¯¯¬®ªŸ„Y)!2;BMUZ[^XUXXYZ[XVZWVRQPPRW[bjyˆ’¬ÀȲ\AJMOPSSUVYWHR™“QUUVZY\]ZZ]_^foz¥žÉ·°¾Éfn˜¡¤½½ÀÀ¿ÀÀÃÂÀÀÀ¾½¾½½¾½½¿ÃÃÂÆÈÿÂÂÃÅÊÅÀÁ½±£¢¨­±µ·¸¹»¾ÂÃÅÅÆÇÆÄ¿¹¸µµ·»¿ÀÁÃÄÅÉÌÌÁšpR>@LU[ac`\[[`^[YYUQRRRSY`gkt…™±‰q­Ÿ ŽLFKLPMNQQU@U…žyPVWUTRX[\]]\cnv„ŸË½ ÇÇÂÅbr€­ª¼½¾¾¿¾¿ÃÂÀÂÁÀÀÀÀ¿¾¾ÀÅÄÁÃÄÅÂÀ¿½»·¹··µ©¤©®±³µ·¸¹¹¼ÀÂÂÃÄÇÉËÊÊÈÇÆÆÇÈÈÇÆÆÄÄÄÄÅÇÎÍ¿—WAFLU\cghb]`]]][WWXY\bnsx‡›±É³š ªª˜`CLKNOPOP@-q©ƒQTURQNRVVZ]]]jmr ÊбÅÈÆ¾— ]R]h4]t)1A]€Sminisblack-1c-8b.tiffì?ÐääÓGraphicsMagick 1.2 unreleased Q16 http://www.GraphicsMagick.org/tiff-4.0.3/test/images/rgb-3c-8b.bmp0000644000212300117540000021320211246010660013673 00000000000000BM‚ —%`{1zz5ˆŽU¹·<¶¾JËÉYËÆ\ÌÆRÎÇMÐÉTÎÈUÐÆhÓÈiÑÆ\ÏÇeÑÇiÐÆdÎÇ_ÎÈeÎÈfÎÈYÍÈVÎÇYÍÆjÎÅ„ÑňÐÄÍÄŠÎđϗЉÍÂzÌÃsÌÃjÉÃbÈÂWÅÀ^ÆÂ[ÅÀWÅÂ[¿Uµ´Y®¬i³¬t¹¯v¾¯z¿°~Á±ƒÄ±„ưˆÆ²„Ʋ‹Éµ”˺–ͼ›Í¼Î½ Î½¦Ñ¿¬Ô¾°Ö¿°Ö¾¯Ö¿¬Ò¿§Ò½¢Ñ½¤Ð¾§Ò¾¥Ô¿¥ÓÀ¥Ò¾¢Ò¼£Ñ½¢Ï»¡Ï»žÏ½ Ï½ Ð½žÓ¾¥ÛàÚÅɾl”®8A%#†&'‘)+™.4¦/9².@»0F»0H»-@¹*:µ+>·+;´(9·(9·(7¶%4°%1³%3³%6´'6º)=À-NÄ/VÇ-\Ê0sÏ3—Ë[¸ÃµÏIJÂp Ÿy®’i¼ dº¥J–º*?µš '¥"$¦#(¨&(©))­(&­&-¦%-rUUlˆ€´¤Hz¬$)±(.°)-³)*±()®'&«))±*.´+0³,2¹.6¹06¸16»4GÄ3LÆ0SÉ@ÌFžÉ¦ÓÇÁÖɃ·¶¬Ó´´Ô¸«Õ³ Ê²'g|-xuC¢£Q©®9®¹NÍÊTËÇ\ÏÇZÐÈRÐÉWÐÇYÐÈdÓÈaÒÈ\ÏÉ`ÐÈaÐÆ_ÌÇWÌÇVÍÈUÌÈQÍÈRÎÈTÍÆ[ÌÆmÌÅyÐÆyÏÈ{ÎÇ“ÑÅ›ÒÆ‚ÏÅnÍÄ{ÏÄ‚ÍÄ„ÎÅÑÂ ÕÆÐÄrÍÃuÍÅsÊÀd½·T­­Y®¨b´«l¹®w¾¯Â¯…Å­‹Æ°ˆÆ±‰ÇµŽÊº–ͽ›Î½žÏ¿¢Ð¿§Ð¾©Ò¿§Ñ½ Ð¼“˺ˆÄ·€Ã·xÁ¶yÀµö„ǸŒÊ»Ì»Î»“м“н•Ò½˜×ÀœÚÄšÚĔ˽w›¤Oe’7;‰&ƒ Œ%-˜*5¤/8±0>¸0A»/=·,9³-8³-8±.@±-=².9¯)5±'7°'1®%-©$.ª$.ª$-­%.­$4´'<½)DÃ(IÈ,TÌ0qÌ;”Ço³ÆO|ºMn„v¸­T£µI À;|Ò!&¦!Ÿ $¦!%©&+©%'§%'ª((±('²,0®"-q8Rgg‡o©™Di¬&(¯.0°,1²,.³*.¯),­-1µ.4¸/6¸16º06½/5»2<Á3LÉ3XË:nÍQšÈ¶ÒÆ¥½Æg»²Ò¸´Ò·ªÎ´¦Ò¸*u‹8ž‡I­­7Œœ2›­QÍÉUÍÇ[ÏÈbÏÈUÑÉXÑÊ^ÒÉcÓÈ^ÑÈ[ÏÈ\ÏÇ^ÐÆ`ÌÇUÌÈPÌÇPËÆNÌÇPÍÆTÍÇYÎÉ^ÌÈiÎÇuÏÈzÐÆ–ÒÆ¤ÔÉzÏÇ_ÍÅ}ÎņÍÄÏÄ¶ÙÆÃÚÈ£ÒŘÑÄŸÔIJÙİÚÇ£Öĉ̽sÀ¶bµ®`±¨b®¤e³¤o¸§x¾¯{À²€ÂµŒÆ¸Ç¹‘Ǻ‘ƹƹˆÄ¹ˆÇ¹‡ÇºƒÅ¹ƒÆº…ƻźz·yÁ·n¾¶eº²eº´iº³m´³p·µq°³m£«a„‘BQpIWx ‚$"Œ&,œ*4¦.8­/9°2;²,5®+2ª-4®*6®,4±,8¯)9°)6­'2­(6³&1³%1°#-­",¬"+©"+«",¯#0·%3À';Æ*GÉ.\Í/wÍ<ˆÈm«Æ’ÇÅÐÊg³Ë=•Ò)<¯˜ %¤"(¨&(¬(*¬)-®*+°*,µ,.¶.0¸-1±-2|6Mgm¥‘k‰´&)±..²,,µ--¶+4µ-3¶/4º08¹/3·.3·.7»/8À.4Á0?È1KÍ2]ÎgžËo”Ä³ÐÆ¢ÆÅ–¿´‘¾£šË³¬Ö¼,…3…ŒP·§:”œ2¦¯RÍÈWÎÆ^ÐÈ`ÐÈ\ÓÉaÓÊaÓËfÔÉ`ÓÈ]ÑÈ]ÑÈ\ÒÈ^ÐÈ\ÏÈSÎÈTÎÉXÏÉVÏÈVÎÉXÏÉYÏÈaÍÈiÎÇwÐÇ“ÒǨÓÇqÍÅ^ÍÅqÍÅuÌÅ{ÍŨÒŵӯ¢ÑƦÓŲÖijÔù×ÅÄÜÇÍãÈÊäÊÁßDzÙáҾɶƒÁ°{À±w¿³{¾³‚Ä·‰È½‘ʽ•̾—ÍÀšÐªÕĻܯÀÞÉÅßÈÂÝÇ¶ÙÆÁÝÇÅßɼÞǬØÄ‹ÏÂg¶»1B‘,)ˆ'!…!~d W \z")Ž#)&)•$*ž',¢(-§'3¨)4«)/«)0¬*3¯)6­)7¯*8±&6²)6°)5°(2®'3±&4®$0±!,¬!*¬#+ª"*©!)°"*³$0¸(9Ã)OÉ0sÍ3xË;†ËK®Éc³È@‰Í(B»¦#/±)5¸(0·)-¹+-¸*-´+/²(+±))¯*.±,3³'&².D|u•¯4-®%'©))­)'¬*+¯+,¯+/³/0´/5¸/5¶.1·,0º.3¿-3¾/8Ã-<Ê;_ÊcËc™ÇÓãÆ´ÂÉSm–†¼¦É¹‡À´x%|Q·¨J²®8¼ÀRÐÇYÐÇ`ÒÈdÓÈdÓÇhÔÉgÔÉoÖÊcÕÊdÔÈgÔÈ_ÒÈZÑÉ]ÐÉXÏÈTÐÉ\ÑÈ^ÒÊZÐÈWÏÈZÐÉ_ÐÇ`ÏÇlÏÆ•ÒÆ“ÐÇdÎÆcÏÅhÎÇgÍÇjÏÈ‚ÌÅÌÄ“ÐÄ§ÔÆ¯ÔÅ¢ÑÄ´ÖźÕĵÕ½×ÄÈÚÃÎÝÅÒáÇÎáÇËâÇÇáÆÃàÇÃÞÇÈáÊÌâËÎáÊÊÞÉÄÜÇÅÞÉÁÚÈÇÛÇºÖÆ³ÓÅ¡ÏãÐëÏçÏóÓüÔºÛ€¿Ä,„ Œ"%’&,š&1Ÿ*:¤#*” ‚$$',•(-&- &-¢.-£A,©(-ª+0©*1«'5¬&5¬&5±&6²)9±(4µ*4±(6³(5µ'7¾&8À%4¿'5Á&4»#/º$.¹%2¼(4Ç-GÓ1eÖ5rÑ2…Î8‰Æ-R¿%/µ!'­&2µ)1·+2¹-4¹+/º(.³')°(%¬%$¦%#¦'(ª(*°%%­()¢1&ª#¤'#ª%$§(%©('¬('¬('°+-²+-¶+/¸,+¸)*½*-¿+/¿/6Ã1AÊ1HÌ5UÍOÊ€žÃ…§ÃaŽ®¹ØÁ€®ÂaŸ»“–-oE¼¸HÊÇ]ÑÆ^ÓÈfÔÈiÔÇeÕÈj×ÉkÖÉnØËiÖËbÕÊaÔËYÒËYÑÊWÑÊSÐÉTÏÈWÐÈWÑÉYÐÈUÎÉYÐÈ^ÐÈ^ÑÉcÐÈÒÇ…ÐÇ[ÍÆdÑÈeÐÈdÏÈbÎÈmÎÇsÌÆwÎÅÒÆ ÑÅ“ÑÆžÑÅ‘ÎÄ~ÌÈ̛ΪÏÁ²ÒºÕþÖú×ĹÖÄ·ÕÆ¹ÕÆ»ÖÆ¹ÔÆ´ÒIJӯ²ÔƪÒĨÑÃÐÅ‘ÏÅŠÑÅŽÏňËÂŒËÁŽÎÃŽÔÆ†ÐÉIt ]mu { ~"…'%„&(ˆ!&‡"%ˆ&&’)-›(1›'0¢/.£;-«,2³.:¼-9»,>¼);¹*=¿+=Ä+<Ã+;Â):¾'6¸%2´#/­"-¦%›ƒlnqlny&’!.ª#0° ¥¥!«!,³%.µ&/¶(.»'*¸',¸$&±$'µ&'²$$³%%®&$­'+µ&(²$ §'&¦(!¥%#§'%ª'(©)(¨)%¬*+¯*+³++´*+µ.,¹5*¼,1À.3Ã17Æ1?Ì3CÌ1XÌs£ÈŸÄÇ¡ÉÌ™³Åp¤Èn¨Ä-ž,œ'v:³µXÒÉ[ÐÆ^ÓÈhÓÈdÔÈcÖÈjÖÈoÖÉgÖËgÕËcÔÌZÓËTÑËVÐËPÏËNÐÌOÎÊSÐËSÑÉVÐÊVÎÈWÏÈ\ÑÉ]ÏÈ_ÏÈhÏÈnÎÈZÎÆ_ÏÇaÎÇ[ÎÈ`ÏÊ`ÍÈeÌÆiÎÆvÏÆÏÆxÏÆyÎÅrÍÆkÌÄpÍÃwÌŽ͘ÐÄ ÑèÒŨÓÅšÐÅ“ÐÄ‹ÎÅŽÎÄÎÆ’ÎÅŠÎÄ„ÍÅ…ÍÄ‹ÏÄ…ÌÄ|ÊÃyÊÂ|ÌÁ{ÑÅyÑÉk¼ÁT§-Cz MTYVSQLRZcn!t$!{!!ƒ!#ƒ%$ƒ$"…#'‡$+•&,ž)3¤$-'”!…|oa YKEB951-*' 4 mž)³%´ '²!*²$,¶&/¸%,¸&)·'*²'-¸&(´#"³'*¯')­&*³&(µ%*µ&)«'*«**¬')°**±,-±,0²+-²/2³06¸08º,0¼3/½L-¿0.À)0Â//Ã14Ç.8Ë.HÎPvÍq Ég¢ÊP‡ËIƒÌQzÈ]¡*t±Kœ2£°]ÓÇWÌÄ[ÏÆdÑÇ[ÒÉ\ÓÈbÒÇaÓÉaÓÉ]ÒÊZÐÉVÐÉPÏÈRÍÉNÌÊMÏËLÍËMÌÊKÏÊQÎÉVÏÉVÏÉZÐÇYÏÈZÐÉ]ÎÈ`ÏÆ^ÏÅbÐÇaÏÈ`ÏÈbÎÈZÍÇ\ÌÆ`ÎÆdÍÆhÍÅmÎÆpÎÅsÍÄrÎÅrÍÃuËÂ~ÌÂ}ÍÄÍÃÎĈÎăÎÅ‚ÏÅ}ÎÄyÍÄsËÄoËÄsËÆsËÄpÈÂuÈÁoÈÀnÌÃrÒÈjÆÄQ™¬3UZC;GPIA7=EF O QY_ZZ U R X U OKH D@8:76523722*,+*%5j—#,¹(;Ç&2¿%-»%/¸&+´'*µ&-µ&(³$)´$+µ&*¶'+¸'-»*/»(,¸,2»-7½*0¼/1¹.2º-4¸-0¹--º/1µ/2µ,2¶+/¶1.º+*»+.¼.0½01Â-1Ä-;Ç.EÊBpÊNvË=VÆ08Ä+%©*¨<´½+Œ«5§³XÍÄUËÃXÍÅXÏÆWÐÆ[ÑÇZÒÉYÒÈ[ÓÉ]ÒÉUÑÊUÐÊKÍÈKËÈJËÊKÌËLÌËIÍËGÍÊMÌÉRÎËOÌÈSÌÇWÍÉXÎÈYÎÇYÍÆ\ÍÇaÏÈ]ÍÇ[ÍÇ[ËÇWÌÆ]ÊÆ^ÌÆZËÆ`ËÅeÌÄfÍÄiÌÅhÍÆiÌÅnÌÄrËÄnÌÃnÌÃpÍÄwÍÃwÍÄoËÅpËÄkÉÃfÇÂcÆÃeÉÄgÎÇhÎÉfÍÊ`ÂÄT¦¶;l‘,c?39ADBC?<?JE:>JX $r#*o *ib V G??<<76;9911+)+-*))'( H'ˆ)A¶*?Ì,<Ï-:É)2Ä*1Â,3½*1»*1»,2¼,4½,6½.:¼.6º-2º-/¸+-¸,-²(&±$¨#©%­&­$ª$ª%$®##²$&³%'µ*/º05º07Ã+1Ã((À+(Á*%Á&"¼'!Å(+¢1ˆ¯E¿À7©µ8®·SÈÁ]ËÃUÌÅOÌÅYÐÆ\ÐÆYÑÈVÐÇUÐÇWÐÉQÍÈPÎÈLÍÊNÊÈKÊÉLÊÉOËÉLÍÉJÍÉPËÈSÌËRÎËRÍÊYÎÉXÎÈUÎÈSÎÉXÍÉ_ÍÈWËÈTËÇYËÇXÊÆZÊÇZÌÆZÌÆ]ËÅ^ËÅ_ÌÅbÌÆbÊÄcÌÄcÉÂfÉÂeÊÃeÊÃkÉÁkÈÂhÈÃeÆÁeÈÂeËÅcÏÉcÎÎY»ÆJ™±³·GÀ¿^ÊÄ_ÌÅRÌÅWÎÆ]ÐÆZÐÆYÏÇUÏÇVÐÈTÍÇTÎÈSÎÉOËÈKËÈOÌÉRËÈPËÈNÌÉOÌÉQËÈPËÉRËÉTËÈVÍÈVÍÉWÍÉYÍÉYÌÇVÊÈSÉÇWÊÇ[ÊÆ[ÉÆ^ÊÅ\ÊÄZÉÃVÆÂWÆÂVÄÀ\ÅÀ_ÆÀ_ÅÀ_Å¿_ÈÁbÊÃiÍÅhÏÅeÒÉeÑÌaÆÉT¯»?‚¢(M|V@813<@JNLIMC>CO\ W WK LS]&g$6q'7s'8x'8x!0v%qa O./340-(.4;>@@?44930-$ +(0\ Lw,4Ä+9È-FÊ1OÎ0OÎ0TÌ1XÌ6pÏAˆÎSžÍV¢ÐX¯ÐZºÐaÂÒpÆÒn¿Ñm¾ÐÍϦ×ΦÒÌ¥ÌÊ´ÖÌ¡ÀÍWnÏGXÐ4<Ë+-Á+.Ä+2Ì.2Î.4Ó.4°8”°WÒÄUÈÂM¾L½½NÀÀZÆÂ[ÊÃQÈÂUÉÃVÌÅVËÆVÌÇUËÆSËÇUÌÈPÊÈNÊÇMÊÉRÊÈSËÇPÊÈQÌÈOËÈMÊÈLÉÇQÊÈSÊÈRÊÇRÊÇWËÇ\ÌÆ]ÌÆ[ÊÆXÊÆ\ÌÇcÌÈfÊÄhËÅ]ÊÅWÉÆXÍÅZÏÇXËÇ[ÍÈ\ÌÇ^ÉÇ[ÇÅYÁÂX¹¿U¬¸K–ª9t–(Px+Z E5,-8;BIFHLJJ MLK Q ^h!ng_ UZ"a#g+n&4s)7u)>y'<}'<|':x%o V?/101-2DDC H K K H D?D?7,. -9J &</;G.ikE[G7&Z&c>` &|&.³/RÈ2bÏ3iÓ6q×;‚×9…ÕA¥ÔJ°ÑOµÑX¸Ða¼Îd¾ÍmÂËl¸Êj´Ê~¼Ê¦ÌʹÓÊÅÚÊÌÜÌÉÙÉ¥³ÊQhÎ?IÌ;GÑ,8Ë0;Ë2>Ò04Ë,-Õ,-°@—°bÖÆ]ËÂXȾVýS¾»R½ºUÁÀQÆÃQÉÅSÉÆPÈÆUÉÅVÉÆQÅÆMÆÇLÅÆNÆÆKÆÇQÆÅQÆÆMÉÇPÌÇRÊÇPÈÇVÊÆQÊÇQÈÇPÉÆQÉÇXÌÇaÎÈgÎÈfÌÈ`ÊÅ[ÆÂW¼Y¾¹V¾¶R¼²N¹­@ˆ$Gw#It#Kz&Gv?o2e!^S F?6/07;?CFHMQNIR V SGKP[ i!0u)B~*?| )m!a"^)g.f"3n'8s+:v)975$ .[hiر‹Þ¿jǤsѧdÅš;…D^&cm0n|+`{.^(7œ+;»/NÅ0TÊ4fÎ5qÓ9…ÓJ¡ÒT¸ÐxÇΊÌÌ’ÎÌžÓ̬Ù˯ØË­×̸ÞÌÍåÎÔãÌ×äÍÞçÏàæÎÆÑÇ`lÅF_Ê@QÎHgÏVpÒ6>Ï12Î.+Ê+&¾…C˜®iØÉbÌÃ]ÊÂ]ÉÁYžS½ºK´¸H®´B­·G¸¾LÄÅQÎÉWÒËUÐËSÐÌNÎËRÏÍOÍÍMÌËQÌËTÎÊUÓÌTÑÉUÍÈ]ÐÊYÐÊVÍÊWËÈQÆÄO¿UºT½µJ³©J­¡G® H³£K·§L¼­O»ªK¹£B›— O+903:68CEHGKMHHONNPPQNS TIH X]"g"4w-N…4^4XŒ$9!/p!3m%;q!5o's+C|(A|+B~-J-I&6y 4s\:,2=G I T T VU S L H H=;54%7J.mryʧšáÁ‰Ø¹‰Î±…ɩ̩bƘP°6pt+Rv0[,>ž(8À-FÅ.MÊ2jÎ9ˆÐQ¬ÏoÃ͈ËË´ÚÍÀÝÍÆßÍÐäÌÎàÊËÞËËÞËËßÊÏÞÊ×áËÜâÌÐÚÈáå̹ÉÈHmÇn•Ê_„Ð[uÏIMÏ,-Ì+%¿%¤!’€K™ªr×ÉjÌÂkÌÃeÉÂZÆÀTýO¼ºE°²9›©1†¡-t .t£0v¡2~¥6ˆ¥7‹¥6Œ£9˜¬?©´I²·L²·F¨±I©±M¨°L¥«E›£A— A—œ=™–?¥œD­¡G²£C±žG´ŸK¸¢M¿­NòSÈ·QǶOųVË®9DB?LNLMONNQTQTQSSTSQUS ZJN Xc$m"2u/K…4]6b7[Š+>}(8q%4p&7p%;p'=i)Ao(Cq-Jw*Gw,Jx3Uƒ/Sƒ8V„3Q…)? L LHF OUXe\_^S RQ PSN A396~r†Ô«°îʪéŬêÅ«êß޶f½“S¨ƒ-\e*`i1Z{*3¨)<¿1W¿5jÆ8€Í@ŸÎT´Ê†ÇȲ×ÊÏáÍØäÍÖáÌÛäÍÐÜÉÇÙÇÎÞÊÔâËÐÝÉÚáÉÝãÉÌÙÇÝâÉÓÞÉj•ÉeÍQ`Ò87Ñ,"Á&¦#”!’"¢$“Ušµ|ÚÆ|ÏÃ~ÐÃvÍÁmÊ¿dȽX¼Q½¸C±±8¨)t›G‘,†| nT7 \3pBwDt¥–A²¢F»®JÀ°MÀ¯P¿«Q¿«Q®QƶPɹSÊ·SɵVƱTÈ« Hr7QQTXXZZZ]^^]WXU YUQP W QI U^"g (k-Gy7\†7i9jŽ3X†,Cz-@t*@r(:n(Et*Gr,It-Oy-Oz-Q|2[„3[…2_ƒ;d‹2Mƒ.G| 0md [ R\]cd`\V"V,d [&Z4a :eDbQ\ET%WVBzid™‚¹›‰²x§…À¢zÑ P©)^g5{w/RŠ%.¸+CÁ1\¿5sÈ:ƒÎ>˜ÏT°Ë¥Ñ˶ÔÊÓáÌÖàËÙâÌÙáËÎÝÈÎÜÇÌÙËÅÔ˽ÍǰÃÄÊÕÆÈÒÉ‘¢Ç–¥ÈNeÏ/7Ò/*Í,$´+–"–#£%«& °'!›mÃ©âÆ¨ÖÆ§×Ŧ×Ħ×Ä¥Õ†˿Y½¸E°±<¨®5’§&p¡U˜<#…pQ)cRv#hu^r!ex3ŒŒ8Ž‹6ˆ9’‹;›‘>£•D°žH¼­HÀ²JóLÅ´O®OűPƱQǵRʺR˹S˸TÊ·Y̰GžšCFNRT___Y[^_]YYVV VPT YM OY"d"0r(:w1Qƒ6_‹:o‘9m0Qƒ*Cx)?r*@s/Jt0Qt2Yw3Vx2Uu,Mo2Yx8g€5`€4d7c{8^2O):x"-sdaafhnd$_&`!0g%2m 4k"=h'Ro,an1{k;•m<•h6Œh6ˆ\3W9vX,NO) ##AG=m;„k.Vh'2$&³*=À5kÂ;ŽË:•Ð9ŸÐb½Ï£Ñ̽×ËÚãÍÞåÌÍØÊ ½Ç¬ÈjÊUvËU|ÉnÆb‚ÈZtÇZmÈ6GÍ3>Ò.5Ñ&#´$—$Ž'™% ¥% ¬'¬' ³&!ž„¡ªÄåÊÃÝÅÊáÈÉàÇÊáÈÈÝÆ¤Ï¿eÁ¸K·²A«­;§/ˆ¢%_˜I•5 ƒ n›Æ@¬Î?­Î\ºÊšÇɯÊȲÈÇœ·É^„ËClÌ:dÎ1`Î/UÌ2TÉ2HÆ1FÉ/@Ï/=Ò(.Ã$#¥‡„ ˆ% ™)#¢'#©' ®'#¯'#¸("¡Ž¥°ÐëËÍáÇÐâÇÏßÇÏßÈÉÛŤξi¹TºµC­®;Ÿ¨6—¥.sœ%\šD“1‰|Mu0ƒ5ˆ€5ˆ4†ƒ>šŽ@Ÿ“?ŽC¢“D¥•C¨—E²¡K¼®HÁ²IƶLÆ·OȵQƲTƲQÆ´PÈ·TË·WλRͺVʶ_ͱAŽ”=@KQR[[U _ ]Y Y ZQQ W S V V L LZ(e$1j'5n,@v0U‚8dŠ9p‡5f„0X{+Is*Im-Sp3Zs6gt?|x@„{B„z<~w9tu;{{;t{=x~¥ª8™¢2…ž,m™%V“!@!‚Ay4Œ„9’†:’…5‰<šC¦˜>¡•D¤˜D©›D®Oµ¥L¿±IÁ±IŵMÅ´NƳRDzTŰP¯PǵQÉ·Z̺V̺TË·XɰW¿«*\;LRU[SX \ \ Z ` \ VW [ ] ] S PU'a%,m'1l+;r.Ly4[~8`ƒ6f„5`€1Tv+Gn+Mn0Wm5jvAxE†tJ|GˆxD‚s?r;xu=v9w|>}~A€€;jw6Tu(Å-PË1jÏ9‡Ò:’Ð=žÍ>–Í6|Ñ2hÐ/XÑ+FÏ(?Ë*>Ê,=Ñ.:Ò)1¸„ ZHP m‚"Œ%”%˜'!£(#«'"³+&¶+$¶(!»'&§`–®ˆÔ‡ɾÏÀ©ÐÀŸÌ¿ŸË½–ɺeÀ¶I¶±C¯­?§¨7œ¤4£0€ )^š#H”062‰‚;œ‰?™†5Ž;–ŠF¬˜B¥”B¦˜C¨œB­œM³¡J»©K¿®LÄ´OŵPƳSDzSÄ­P­RƳOȵUɵTɶR̶Xȳ`ͱ2f|8INTWT Z ZV[ [ X WT S ZQM LY"(h'/l(5j-Ar1Oy3Z€6a…8k„5a|.Qs,Kp-Wu5dq:tuF†{L–O–I‰{B‚w@u>zvB…y?„xA€}A{}@v~7[},D|$3v'/s"/q!1p$5o%8q#;q%Fv+Tt+[u,Zp1hr6|n:ˆt?“vHvDqB¢sB¥xB¥xC£vJ¨wN®yQ±yN­xLªq P\"K”$+³(5Ã1SÎ/cÑ3nÒ4oÑ3xÐ1oÓ-[Ó)GÎ(=Í)4Ï*4Ó*/Æ!!› \%!F c|‰ "”$š'¢'¥( «(#®*"±)"´)"º(#«O–¬kÔÄaÈÀcÈ¿^þ^üe»n¸Tº´E³²?¬±?¤«9›¦4Œ£1|›(a™'M’4ˆ1}/z|=š…?™…8‘9”„Dª—Fª˜C©D¨žD®ŸG³¢GºªJÀ°LųLÇ´NűPŰPÁªQìRưQȶRɵTÊ·QɶUƳ]Ë®Jœ–?>JLQRWVWX X W U Y S V Q HO"e#,k'9m&5l)Br5U}7Z…9kˆ:p‚5c{-Rp/Sq4bs9mp@{nGŠxN—}O”|L‘{Bƒt?}u>|tE‡vC‡xAxB€y?|€7b|0O{%8t#1m#3o"6p!5k!8k ;m$Kr,Ww5fz.]u-cs0po7ƒq<’u@”pAœp?Ÿq>žrC£rC¥uI©xI«zS²{P¯xP­vE|;YB!&Ÿ$*·&.»+<Æ*DÊ*IÍ*KÏ,KÎ*DÌ(<Í':Ó*0Ò$%µ‚ B V vƒŒ#•&™#›%) ) ' ¦)"®(!°)#³&"¤C”¯`ÑÄYÆ¿RÆ¿MÄ¿OĽSÀ¼O»¹Cµ²@°±<§®;¡¬7•¤1‰£.wœ(f™%S˜:,„(i{>‰C <™†:’ƒDª—E­›A¨œDªžD® D²¡H»«J°KŰNƳNdzPűRªR¬PŲPÈ·TʸSʺSɶRȳXÇ­X½¦1_8ELVVWWVY \ Y U \ ] XS KY!&d)3k)q€=w6^u.Pn1Uj;jm:rmC„qJŒuN˜|L“€IŠ{Ax9xu?~z?w>„xC†|@@|;n.O|#4l"3k#5l"6k3j!?l%Cq"Cj)Qk5Yt-\q0ip5wq6zm9†m=n?—n=•jCœmE¥t@¡sI¨|I«|P±~P®‚S¯N¯ƒC™+PO"+°(7Ì*>Ï(7Ì'3Ë)<Ó+:Ó)2Í(-Â#ž\' L r€ ˆ"Ž"’$•+˜%™%›'œ&™%¢(#­%²&"¹'%¨;“°VÐÄPÄÁLÅÀKÃÀL¿L¼¹C²´A±µ<©²: ¬8˜«6‘¢0… )oœ&^™!H’ =+†"Ty<š„A¡ˆ@ž‡<‘}A¡B¬—@¦•A¥™B¬ŸE³¡J¼ªL¯KIJMųLŲMűS«QîSƱQÈ·RɸTʸSÉ·PȳSî[Ȭ1g€:ELOTTSS W Y Q S X [ V QQ _&,h+7k+Eo,Fq/R|5^€7c‚;v‚=z3Yw,Oo4`o9pl@woGˆvIŠvLzK‰zHƒwC~v?xs>zr@p>„rEŠtDˆz@}|>t€.Rw#;j 8i%:o'An">k x{:h~+Ot!=n$Gp(Ms'Dl"@h!Al"Cl%Op'Si'Ql+\m2po6}p>‹tBsG—pC™nD tH vF£uB£uF¥wO«}W¶ŠQ³‹P¯ˆMªˆL¨‰I¢„5_y#)* " %"# Oy‚##–(•)š,˜(œ#–'—#˜$–"š$&¦'ª$6“ QÏÆK½F¾E½½C·¹=±´:ª²7¥°3œ­2•«1§3‰¨+s &]š#K˜=“20-†2…@ ‹C§<–„9•‡H¬›Gª™F©˜F­šK´ŸN¹¤L¿­LðKòKñUůV§S¿¦RëRDZWȵWȵQʸQÈ·SŲTÀ¨P¯¡$Y*9=CGKHQ OL S Q VPQY#*j);n0Pr6Vt2Np2Su7`{BHIG O U S TNW &c%-k.Ht3Vq2Ur1Np3Sw8`€upDƒpH‹tI‹wBzuyŠE.;=<CBEKM R S R MU#)g&1i0Ds0Jk0Rn3To5[v8d~8nƒ=zƒ:m|3Wq3[r9hsuqAuCˆwFˆ{@}}x€7aw0Rp3ap7er8jqAxwE†xF‡uB€y?vx:oq8lo7jj5pm:zo;tFŒvJtG‡s=su1Uu(Lp,Sn,Tn+Zo/fk5uj4up4{l>‹u@‹w@sB•wE—sKœrIrM sH¢sGŸoN¨wJ§{J¥wL¦vL©xP®|WµƒW³‚U³„U±T±€Q³zU¶€2D$""%#%,-/*7 f{!Š$”')!¢*!¦*!¤%!¨#£#Ÿ#ž%– ”’"”%‘$Ž$p’3š³-ެ-Œ­+«)v©$j¥#`¤ Vž!Qœ"LšE•B’$E–!C”=” 7“5“3’*Ž*†4†S¶“^²’L …<œŒF¯œK¯šM³žM³žK¶ M¼©H¿­KÁ®MÁ®MÁ¯Q®TÀ­S¿§P¼¥S¿«VįUDzSijRÁ°RÀ©U¶ P¯—'Bs5265<=;CDDGE M#'k).k0@m2Mq4Qo=Up4Ps2Ut8c}>t;j{1Vt*Fi2\k5_n2Vj;lp?{rE‡vEƒw?ys9pr3ep1kn3ms8zv:xB‡zBˆxB†y>}|6^w(Km,Qm-Xm*Wo.jn7yl5ym7iAmA‹rBqH™sH›pNrL›qO¢tK¢qH pM§vO©zQ¬{O«yO©wS¯|W³‚YµƒX´ƒV´U²L«{W¾…1gb   %/75 J :3 X m#‡"Ž&•*!¡)!§'!¤&£%¡#%œ™–“#“$ŽN%n°`ªaªZ§ X¥ O¡KŸIžF›E›Bœ!HŸ'L¢"C =ž"9œ ;š5–0’"„/xSµ‘^²’Wª‹>œˆG¬šO°›Q±žOµžN¹£N»§I¾ªJ¾­MÁ¯KðOðTÁ­T¼¥Q»£R¾¨V¬\ƱVijQÀ¯TÀ«T»£U»›;p… H084;;=BDDC FS'.m+6m2Ep3Ls7\r8dq5Xw7^xw„9p2[{,Mr/Qu/Mo5Yr8cs>vrF…xF€{Bw9ru4ip3lr6pr;{r@…vCŠxC‡uB‚v?}z5[s)Ko-Ql,Vl.`l3qi9zk8~i=†hBiF’rE”sC”rMœsPŸxQŸuT¦|P¥xO¦yQ¨{OªzMª{OªzO¬zR¯`¹ˆ_¸ˆY¸…Wµ}Y³Q±zWº€@„m!#'"3KUUZv~ ;2 Ro|…’%”&'ž$¡$¢#¡"›$˜"›"•!‘#’"‹EyZ”H‹JŒJŽDCŒ@<‹1Š-†%uxsgiu~~ mTrO³“V±“U®‘>›‹H°›Qµ O³ŸOµŸP¼¦N»§L¿«K¿¯JÁ°L¯PðX®\À¥S¹žQº£U¿«ZįYòSÀ¯R¿¬S¸ S¸–J›[,9::>@BADH H[-6r,8m-Fp7\sr9b€1Qw+Kp/Mo7^p?oo>ytC‚zGyA~v:ss9po2cq2bn9xu?‡zI’}EŽ|Aˆz@{{:i{-Wz*Rk,\p1mp3rj4ui6€n:ƒhAŒkE•rD”qF—sO™rRžuU£uS wS¡xV¨{W¨xV¬xOªyO§yN©yS¯}`·‡f¹ˆ]·„W´}X´€W¹ƒW»†H™|+%(3M#^*iXˆs‚$&'Fm u ‹!‘$”&“#š!™"˜#—!•"™•#”$‘ŒYs'w‹!iˆ]„Y…PƒF†;‚(vqj j e^4#5>B< ,NF²”L°“U°‘DˆF­šN±œQ´žR·ŸQ¹¥N»§N¿¬J¿°L±MñRïUÀ«X½£R¸œP¸žU¿ªXï[®XñRÀ®Tº¢S´˜R®”(Dq63:@?7<=?@<Z)2l)5j1Ln9`l;nn9jn;fstuByE}zE†z>~w7nu6kq,`q1jr9wwB‰|I’{G}GŒD{9hx0Wv,Vo/bm3rj3ni6ue8h6}i>‰m?ŽoC’sD’sI—sK˜sNxNxN uP¤yR¦|S¨~L¦zPª~Q­|P¬]µ†g¹ˆb¼‹Y´[¸…Y¹ƒY·Qª‚ 5 #0G!^.Ds*Dn`‰‚62[''".Si }‹#Ž #”%—5˜+ –˜!˜#˜œ"š&—$?tVŠD…8~6~*t(u'y!xs&z#|uM&+7ELWOQ? ‹N²“X±Gž‹F­˜J°œO³¢L³¡K·¥N¼©NÀ®JÁ¯NóNòOïT«U½£Q¹›U»¡_í_Ä­]Á¬VÁ­Q¾«R¹ T±”Tµ’8hƒG-8;;9;=@? D]&3l+;k5Wr9ep=ns9dt:e{xp3in2ej2op6rl?rH‹uK”yK•}M”}N“~>tx/[u+^r0kr.ml.oi2xh4l4€n;ˆm@tG˜zB—tG•uK™zLœwH›xI›uHŸvH vM¤zL¤uL¨zO©tP«{[²c·†dº†Z³{T³|Y·‚Y¶Vµ…-9+7P'6j1Os/Eo.8p D*!"$4J \ r ƒ ‡"‹%"‹2'— ‘"•!“!”"•&™'— e#v$p9tK)W€+X€>€02+†~ U-/4?ZdhbY4Ž‚P¶•T°‘EŸˆE­™I³ K¯žD°ŸJ¶£P¼¨NÀ®J¾¯MÁ³QòZƲoɳ‚̲vŨa¿¢lŬnÅ®b­VÀ®R½©RµžQ®–R²”F‰‹[5;:4<>>;? O!!b&-j*?i4[q6`o:gkx‚:s‚9k~1Vw+Kr5Zwvu6os5ko7st;zs@ˆxI“|P™Sž€Tž‚YšƒI…|3ir3io/ip,fk-ke5}k4‚n8‡j;ˆiD’rJ˜tI™tI–qN—uK™sB’nF›uE¡zE wG£|J¤zN§~O©{Q¬}[±ƒ]´…_¶„[¶\µ„[¸]¸…V·†9F"3DW,@n.>j%.fW9)!.F ^ r †ƒŠ!‰‘ ”"”™"œ#ž"Ž e5|;€"L…/g-`‹%GŒ4…1‡(‰vJ:B@>Ffkhee-|}N·’O«‹E „Fª“K²žJ° F°¡H·¤O¿«NÁ­H¿°KôQÅ´[IJlŰÆ®rÀ§X¹Ÿg«nÄ­cÁ­Y¿®R»©R´ŸP¯—R°•K›!)k;<;2697;B U#)f(2j/Kl5Yp9fm=xm@wp8dw7cx;m†@w‡;q†6l„2[|/Ww8fw>t|C…{F‡|HŠ~B€z>zu7mr4cn5qn=‚pEŠvK“zP›}S€U‚Q‘€G€z8kq2hp+ai+ch0nj3|i8‡o8Šk>ŽlD“uC•wD”wE”uBnB‘qA“sC›vCšwEwDyH¢yO©}R©zR¬~]²‚^°~Z±]¶€a¹€Z·}\¶~X¸… BN!2=V(1j"'eW H6("@i#"''¢$%©""¬&!©&¨" !˜ "!— ™%¢%ž!– Œ i5;ƒ9}$P„$E„3ƒ%ƒ `3?OPLIFUlq zi!auJ¶–Hª@ ‹C«•K²J´¡I²¢L·¤Q½©N¿®H¾³K¶O´VÁ°VÀ¯X¾ªX¹Pµ˜V¼¤^­[¿«V½«S½¬P·¤O±™P¬“K¢+@r>4==;9<<F]$.j,@m4Tn4Vn:nq@}v;mu5\{5]z7i?x‚s<Šp<„o;‚h:„h@‰l>l@•pE›uEž{F¡yK¤yP§yV°ƒ^²„]°€[³‚^µ‚Y´~[µ`µYº‡#LS#58 H[Z E:(9s% .+­+*®)(®($©'&¬&%®& ª'"¥'!¥# "š!!˜!˜"Ÿ"œž!‘j,z8":„!<‡3Œ!‡ vG-JX]_ [UAK^\ `=ESH°–FªŽC¡ŠC©”I³¢P·£O·£Mµ£O¹§N¿­IÀ±KÁ´NóQñR±SÁ®W»ŸS·™R¼£S¾©Y¾ªY¾¬S»«Oµ£M­˜Kª’I§1T{ L4@<;==8F`(4h+?j/Kn3Vm:ip=uq9gt5^{9h€8k‚Dw„Do‚/Wu1^r9qsC{F‡Fˆ€FˆFˆ|@y|:qq7rs8uq;}uBƒvE‹xK’|L”}^¤…WœPŽ}@tx3av.]u.at.hp/nk3{m6…q:ˆo7‚q4{h5|m6s5~m6„n:‹pAs@•s;—sG¢}P«€I¥}K¦}Q«~W°„Z°[²„Y³`µƒa·…`¹‚c¸€^¼€&RV$.? HP ?0&EŽ&#ž(%©,*¬)'­&%­%#­&$¯'$®&"¬&!¯(#®$"ª%!¦$¢#ž!•”#’ ”"‰z$|(~)†!„x\00\a` lc kO8Q8p+az&Mv^:QE¬‘G¨‘E ‹B¨–M¶¢T¹¥S¹¥Q¸¤R¼©O¿¬I¿±JÁ³LóPñSïTÁ­W½§Q¶›L´šO¸¡U»©[¼«Tº­L²¡J¬•K¨J¨Ž9h}W47<;C?9T$-i(9l+Aq-Jo3^n:ps>qu8hu2]y8j~:u„?t„:bv1]n9ms>}xE‡xD„yE‡xF‡{D„{?wt7hm:mq=woA…v@†tK”{Q˜O–O™„K–ƒD…|8i{/Wx,[v-bu.gs+jp/rn4‚p5…q2€o0sj2|o2‚q5‰j<ŽoA‘pB–sEs?›qDtO¨{M¥xL¤wM§}U­‚[±ƒZ±ƒY²^¶ƒ_¶dº„e¹‚`¼…%LL02A Q2#FŒ&# &$¡'&§($ª&'¬$#­$"­&$¯& ­% ­'%°)'¯%#¯%#¯'%«$!©%ž$˜#“!!‡ hmnoY@&%Xo km { tv"By[L#X&Kr 4k` (J?¢ŠH«“D¡Ž@¦•M·¢T»¦R¸¢P¶¡Q¹©P¾®I¿³HÁ´JôN²TðSñP½¬L¶ŸL²˜P· Sº¥V»©T¹¬L±¢J­™I§”H£=z„c87;<:<9U*:j+@k+Hj,Ph6ii=~r>xq8hq6f|D%_*>g*Bi+Hf3cku„@ˆ>|‡9k}2_u8kr?uD‡vE†xB„vF„vBww9oo}mA‡rEuP›~P™€Pœ}RŸ„QM–~E‡}1ƒxH­“@¢ŽA¨•O¸¡Tº§Q¶¥N¶¤N¸¨Mº©OÀ°K¿³IÁ·MöPÄ´YîW®P¸¡J°—K´ M·§Q¶¦Qµ¥M¬œM©—K¥G£‹GŽ„/3pH;@=?8K07n(Ah+Hg1Zk:sl>€rBsAvt;q{CxƒAx‚9l}6`t2`m;soB‚qB„rC„wC‚uC~t;po6mm6ph=}k<mGsT¢€Už{R S¤‚V¥†RžQšGŽ}?~4dx0dr+ep.rn/up/wm3ƒn5‰p6‰m:‹m?n=q=‹q>‘oD—tH™sD•oA—oC›uK¤zM¤uI sI¢uR©|V«zS¬}Y±]³^º‡a¼ˆc·]»†?L$*?) U‹ Š$˜% %! % £%¥&"ª%$­%$³%%¸&(º(#»*(¿(,½''½$&½&+¾((½('º##´%ª%¢!›D 5-.++Ccl ˜•u`X Z%g8o vB|‡=r„4f.Xv1_s9quAxE‰{D‡D}xB}v8sq9tl;xm=~o@ˆoL•qTŸyO™tSžxW¢yW¡V Rš}N•yC~r5hk-bk/nh1se2{h5i:‘r:n;o>“u=’s>”r=’uB”sFšvD™tE›vA™qDžvI£yI£vH¡sH¤vO©{Q¨xT¬|Y²‚W²}Z¶Z·b¸‚[¹„DK)7?1t!ˆ $%! $ ž$ ¢'$ª&%±'(²$'¸%'º'(½(&½*-½(-¿')À&'Á')Â,-À**º'%´&©$ “B0JY_c^\PMg\D`!8v5j!8m$|q;|qAyr?ot:kxV.Ao1Wo5hn=zq>xqy‚=y…~uE†|G†}D||>xw?}t={qA†mIŽoJ“pQœxX¦|U w[§y^©|[¥{^¦€X|Q–xG‡q;yh5t`3t\3~_3ƒ_:Œe?“d;’`;cE“iA’l@”nApD“rE—uKžwL vN¤zN£}J£xH¢{I uQ§yT¬T¬}Q¨yU¬|S±Z°~\³^²~fÁ…1bY!0C4 [€‡$ ”$–!•%!$$©)*±'(³('´((µ'%¹$"½%#À((Â*-Ä*.É*/Ê/2É13Ë22Ê,-½*$´(§$” z € ‡ ŽŽ‰ |n di\ \%i F$Sh4ou0ku9‡{?”…%Nt?j9pŽ%_uC›‰Aœ‹C¥’[º Y·¤P¶¥Oµ¤O´¢M¹ªN¾°M¾³JÀµLÀ´OÁ°Q°RÀ«P¹¢MµœM¸¡R¸¢Sµ R²ŸN­H£•H ‹DšˆF“ƒ<7@&d2Kq8jr;wp<|r:wrvvA}tB‚q?‚pDŠnM”sM”pRœsZ§zZ§{[¤v]§zZ¤|Y¤U¡}TœyIŒs>j7zg4}c6…e8‹c?‘fB˜h;“e;aB•iA–mA“m=pB–nGœvJŸyK¡yS¨|P£~L¤yI¡vK¤vP©{U­W®€SªzR­~R°S¯[±~Z¯}bÀ†>th#7@? j‘# š"™"!™$% %'¬'&±(*´&'´&$¸('º%%»(*Á*/Ä+0Ç+/É/0Ë36Î34Ï31Ë-)À* ¸&ª#• „Ž’”’ Š € mdWD,b$d8_*Lm0]w7y8x:x~B—ˆ0^|g +HA¡AžŒC¥“[»¡Z·¢Sµ¢O³ P³£O·«Q¾®OÀ²MÀ´NÀ²NÁ²RðRÀ¬S»¥L´L¸¡S·¢W¸¤T´ N«œH¡—I ‘C›‹D“…;r_E>;L):m7`q>ur?yp@yn8ol8km6Zr2Sz7b{Ši<‡d<‹e8‰a9Žgs~!(hP=8"&e6St>qr@p?|k8pi2fl3_s3Wx6Z{:hy?s{Bwt;pn=pl?sl?vf>wfAzcEcB~aDƒ_Aƒ_EŽeF‘kH”mL˜rV¥y\©~Z©{[ª}W¦xS£qR£qU¨wZ«z[©zY¢vL˜pB”j>f;‰f4…^>“j@–k9”h6Ša5e=—e@“g@“hAškGžpGŸqL£wN§yP¬Q©|Q¨|W«}Y®…^µˆZ°ƒT«T±…X¶…Wµ…\¸…]·„_¹‚O} /46R nzƒ‰!š$"#!¥'$®(+µ()·)*»')¼')¼'+Á-3Ê/:Í16ÐFUÖdvÙ[k×=BÖ//Ï)'Ä%!¿((²•®–Ž ‰ z9w4i ^ Q?#SkA’‚!:e">h3n~;wA‰w4xt zeBi<|mLykmwlExoO‰uXuXŽrXt[–wY‘qX’qU“sTrT”qRšrV–mKgCŽeI”gLšeR¦lW©r[ªq]­u`®w^­x[«w[ªxXªxX«w^¯}b®f«}[nFa;„^3zU5~V3~T7ŒY8ŽZ7ˆ\7Œ_>–`DžfIeIžeL£lP¤oUªv[¯|b±…cµ‰g¶d²‰iµg¶Ža´‹Z±‡S°…[¶…`¹‡^»ˆc¼†_¸„b¾‰/Z_), S dp}†!Ž!• ž$!¦&&±(,º)*½),À'.À&,Á'.Ã*0Ë-3Î4=ÓYjÖ€”Ñu…Òs}ÔS\Ø04Ð)-É&(½ ‰š—›™š“Žz0x(Rv WE,KAŒy/cl-Q#R ?!T'_Q= C \`C¡>¡’M´ X¶¡V¸¤R¸§Nµ¦N¹¦N¹«P½®O¿­PÀ°LµLóPôSIJU­Q¿¨R½§W½¨V»¨R´ J©˜F¡FœˆDŽ€8mw(8oGA'^2Zp;qlB€k?ƒgAƒkB‡nI†mR‰pT‘w\™yc›y_™y_šv`›za˜vZ–r[–sZ–rZ™pW™l\žlS›jI‘bH•^P eWªl^­q\¬ob±wg³wd²wd³{c³zd´zeµzb´{j·€k²e©sO–d6‚Z0{S5}Q5„W9‘\;’\9^?˜dAœaD bJ¢gG¡iP¥lT©rY­t]²|e¶‡i·‹i·Œh¶Œj´‹i¶c´‹[±„W²„]·ˆb»Œ]¸ˆdºˆg¸€eÀ…9mk$' [ em~ˆ˜!œ"!£$#¨&%­))µ+-¿*.Á),¿&.À&,À*-Ç-2Í5=ÑR`Ô}‘Ñ‚šÑw‡ÒR]Õ.4Ï*+Ë(-¾ • ›¡›’  g,h|2q€&dF*R8~t:‚u1jo&Mn:zy@Š~6^>3IWE¤”>‘H±œW¶ŸXµ¢R´¢O·¦Mµ¤M·¨Qº©Q¾®O¾¯KÀ°PijOóQijWįSÀ¨P¾¨T¾©V¾©Q¸¦L®žH¥•Fš‰AŠ€;q{,=p VD)_1Yn9uiCˆkD‰lHŒmP—qX—s[–udšwi zgxeœzbšuc™t`™o[–r\–nb›p\šmYšj]žoUnI’dH—aR¨l\®m_¯qd±te³xi¶yg³xh¶|hµ}p¹ƒo¸q»„t»…y¸„x³~Zi9V.uO1{O4€R4ˆS;“Z=‘X@–_H bG bM¦dQ¨kR§kXªpZ­q_³}dµ†j¸Šk¹Œm¹o¸m¹h¸Ž^´‰]·‹\ºa¼ŽY·Š_ºŠkºƒiÃ…G…t#" V h hwƒ ’"—%!¡&!¤%%¨)+´-.¿+0À)+¾(+À(-Å*0È+0Î3<ÔKXÔv‰Ñ§ÐŒ£Òq†Ö7CÔ*.Ï),Ä¢¤£¢¡žš— Šx ^+T)H~)cCS1^q1bo(T!6Z4Xp-_I>;W>›Œ<˜ŒF®™S³œX· N´¢M´¦Lµ¤Nµ¥R¹«Q½¯L¼­N½®MõOÄ´RųUİSÀªP¾¨TÀ¬VÁ¯T»«M²¡Hª–Ež‰@Œ}8qw.FoL<)[4_j=zg@‚gEŠhP•p[ w^ŸueŸwj¢|l {ižxfžzc›x_™wb™t]˜v\™tbsb¢tb¤s`£s]£qP›hNŸeS«lW¯n]°qh³vn·{q·{l²yt¹u¸ƒ{¼‡¼‰†ÂŽÁ“¾Š•¾Œb p1xV1xS2|S0}Q4ˆX7\;[B›_F£eJ§hP©iT¬mRªkV«o\¯s_²|c¶ƒl»Œt¾‘s»o¸Žpºnº‘e¸Œf¼‘d¼d¼`»‰`º‰h¹†gÀ…K‘u'D j kz~!œ&$¥%"©%$°%'´*,¾*.Â+0Å'-Â',Å(-É+0Î/7Ñ=IÖo‚Ó“ªÐ™±Ò—±Ó\o×-3Õ)/Å¡© žš›œŠ{dQ c#I€!Ln'Tg$[? E [*=oO2*;;•‹>˜D¬›RµZº¡P¶ N·¦L¶¤J¶¥N»¬P¾®M¾°K¾²NÄ·NŸOÆ·QÅ´SïQªWÁ¬VðR½®O´£L®™I£B’€;tz,Am O6-[6bj?€iCˆlI’pWv^¤z`¡wg¢m¢}m zižzdšwbšta™u`˜r^˜q_™q_sg¤sg¥te¥ub§rX¡kPbQ¥fU°m`·um·{y¼…ƒ¿‹†¾‰ÃŒÂ†½‰“Àޥə²Ï£´Î¡²Ì™h p,rN4}X5„Y0€U6‹^9^>[?š^G§hJ¨iS©jX«pV¬pb±wf´zh´t¼‰r½‹t½s»‘t¹q»”m»’f¹g½”f½h¿’f¾e¼Œi»‹iÁˆOŸ} -=rn w~Ž š$!Ÿ''¥&&«$%­&(¸*+Á)-Æ(.Â*-Á(-Å,5Ì.5Î5:Õ]lӥϟµÏ©¾ÏƒœÖ?OÙ'-ǘ«šš—Ÿ¨¤ ‰pQ:o)‰-W„-Rw1c*k'Ex.Uw4h?,36Ž…?˜B§•U³šY¶ O°›N³ Nµ£L¶¤O¹©Q»­O»¯L¼²MµMÅ·MƸPǶSDzSíWÄ®WűRÀ¯Q»ªR²žG¦‘@“ƒ;yw,GlU6*T3ed?…lB‰nN”t[t[žuZ ua xk {m¡ziw`•s^—s`™r_œq_›t`œt` wf¥sc¦uc¥tf¬t^ªnX§hR¨jW±l]´sj¸|wº—çʧ˜¨Ì ¥Ê›¬Í ¶Ñ§¿Õ¯ÈÙ´ºÎž^•e3vM:T9†Y6ƒV9ŽZ=[@–^B ]G§fR°o[±p[­qc³zv»ˆy¼‰‡Ã““ǙŗÀv½‘rº“tÀ™m¼”fºf¿”kÁ–lšlÁ’kÀ‘jº‹h¾ˆY­ˆ 81nrv…Ž"™$#Ÿ&%§&%¬%'²%&»*-Æ*-Å)-Å(*Å'*Ç*2Ë/3Ð07ÔGRÓzŒÐ£»Í²ÆÎ©ÂÑtØ5AÉ™­ Ÿž  ¬¦ Œ lL m Š‚ w g*l'Fz/M‚-N{;x6pƒ)`$*pw9’@¤“R²™]¹¢O² N´¡O·£M¶¥O¹©P¼«Q¼®K¼¯LôMŶNŶRÉ·VDzWƯXDzPƱQÁ®O¾­Q·¢I©’A™„„e>‰qH‘sU›wZxVžwW›sd wk£{h x_™v^™v`œs`žq_šp_qažsc£rb§ug¨tj®vc®r\«oV¬n[±o\²nd´sl´x‹Àˆ®Ì°Î¡·ÒªÁÙ´ÈÞ¼Ìà¿ÐßÀÖà¹̢FzZ8tUB‰_<†\;Š[<‘\C™`HŸaH¨gJ«mZ³yf·rº…‰ÁŽœÇ™£Ë¢¬Ï¬´Ò¯´Ò­£Ë£‰À”y¼t¾“o½•j½“lÁ˜qÄœuÆŸrĘsÄ—k¼d»ˆ\³Š#<'-hƒ‰‘#•%#œ%"Ÿ&#¬&&®&'¹+,Â,/Ã,.Ã)+Â'*Á(.É*.Ì.4Ï6<Õ`qÑ ·Ì½ÐÍÄÖϰÊÕk‰Æ–¨–•žž£œ ‡ zb €™”” Œy_DMll&c Z)"bm@ž˜?£“S¶™]¼£R¶ŸN¶¢N·£N¸¥O¸¦Q»¨R¾­L»®L³MƸPɺUʹ^˶`ʲnɲ~ȲTųP¯S¿¨M²–H¢Š@‹|1WkR3 G7nd@†h@oHŒsU•uYžxVžuTžt\žrdžrf wbr]˜obžwd r_œn^lbžlb¡md§pj«sk°vh²t`¯r[±p]¸tY³m[¯icµru»~–«˚¼Ó¬ÍÞ¾ÒáÃÕáÂØàÆßäɱŠ6kQBYN‘cG`@‘^@”]GŸbI£dL«mX°ue·€z¼…’ãƘ±Î¨¿Ø¹ÇÞ¿ÈܽÅÚ¹¾Ö´¬Ì¦˜Æš{½Žm»pÀ—rÄ›zÉ£~È rÄ–xÅ—pÀ‘eº‡^´ˆ,A(6 Q„‚†!"—#!–%!¤$#¬''¶*.¿*/Ã)+Â)-Á)-Å(.Ë)/Ë)/Í/6ÔThÓ¡¶Ì¾ÐÌÕàÎËÛÓž»ÄЬ—žŸš ’ ‡k ‚£œ›š’ ˆvbjni\ZGLk?›“?ŸV¸›`½¡R¶œN´žN¶¡Pµ¢P¶¤Q¹§R¼«P¿±M²NÆ·PɹY̺[Ë·WɲuȱŸÈ´XȶPÇ´SÅ®P»£MªC—€5hm&U8 E3d]?†gD‘rFtQ”uU›uVŸwU£tTŸs\pcŸt]›u_œw]–p`q_£ra£nd¤rc¥og§nk­pl²vg²ob±p`³q]¶p\¶n[±jd·si¸xwº}•¿‰ºÐ§ÒßÃÙáÈÛâÈÚßÅáåÈ£¹–2mOG‡aNeO–jK›gC–_F¢cI§fR±p]¹{o½ƒ¿ŠÀŸÃ”ºÐ¯ÎßÂÕãÈÔâÇÑàÄÎÞ¿ÅÙºµÑ¯‘Ä—q¾rÀ”tƈͨ‰Ê£yÅ™zÄ”zÕc·†^·‡/E#1/z‚‰“!–!¢##ª%)±)+½),À')Á%'À&(Â&,Æ'+Ç(,É,2ÏVgÑ•©Ìª»ÊÒÝÍÕàѾÒÄ‹®š£˜‡ t |ž œ˜ ˜– Œ Š ‡ … ‚ xnvZ7c?š–?‘Y¹›b¹žS¶œOµOµŸO³ŸP¶¡S¸¥S½ªN½¯MôOÇ·PÈ·T˸VÌ·Xȳ]ɲdË·T˹RÊ·RȳQ­QµœI£‹<{w$7b? =3_[ChH—qKœyL˜sTšpXŸuT qT rVsZœo^ t_p_œp`l` mb£lc¢pf¦mg¨jk®ng°rf³q^¯lY¯l]¶p_¹tb¸ra¶se¸vk¹}€¼„¸Ñ¤ÔßÃÚáÉÚâÈÖÝÀÏ×­‚£|3rRC„_FŒ`O—eQ gN¡fH¡`M­kZ¸w`º}j¼„t»…~»‰¦ÉŸ¿Ô³ÕãÇÛäÍÛãËÚâÊÖáÆÒàÄÉÚ»¦Ì£~Ô{Ä™‚È¡•Ϫ’Ì¥‚ÈŸÅ™…Æ™h½‰\¸„2J($ J"!ˆ…‹ Ž ’$œ$#¢'(°**º(*¾()¿&&¾(+Ã%,Ã',Æ'.É(/ÎHTÓjwР³ÉÆÒÊÖáÏÏÝÉ«™—£• ‘Ÿ¦¢žŸœ˜— –Ž ‰ t tb [=Ž“A’Z»š`ºS´šR´›QµžR³ŸP¶¢Q¸¦U¼ªR¾°O±MǶMɸR̹V͸YÊ´Zʳ\Ì·V̺Q˸RÊ´QűO¾§M®•F‘|1Tc F8,VSD‘eMŸnR¦wK›nRšiWžnSnS¡qV¤vSŸqW q^ r\œn[›l\žp_¢m^¥tb¨na§jcªmb²q`´qY­lV­j]¶paºuc»va·pb¶tf¸{s»€¤É™ÉÙµÒܾÇÖ°µÍ ›ÀŠWg3kV?‚[E‹cOšgS£lU©mM«iP±pW¶wa¿kÀˆpÁŠ…ÃŽ­Ì£ÅÙ¸ÒÞÀÓÞÁÔßÂÕßÃÓàÃÑÝÀÆ×µžÈ™|Ôx؊ΤŸÒ¬–Τ’Τț–Éžo¾[¶ƒ/C'#g%&žŽ‘“—# #"¨$&¶'(½&(¿&'¾%%¾'(Á%*Å'+Ç(1É)/Ì5;ÒCJÑŽšÍÂËËÓÞÏÕàØ©˜—œ¢š›ž£¥¤Ÿœ™˜ —’‘Š€ y wh `3€<›˜[¸h¾ S·žPµœP¶P³S¶ S¸£S»ªT½­OÀ±NŶNɸOʹTϺ[Ë´]ʰa̵[λTͺR̹SɵWİT·œJ£…:nnO4$DMD‘jO¤v`³Z¯~P¤rU sW¢qU¢oS¥oS¦sT¢sW£uY¡pWšhSšj\¢qZ¢o]§j\§kY¤d[¨i[°oY±j[±hY²j]¹rb»wc¹u^¶sa¶vf»~ÀˆžÉ˜¤ÉžÂ‘~¿‰p¸}A}^0lT@†^E‹bK˜fO¢gS«mO®kQ³q[»{dÀ‚iÈnÂxÃŒ’Ç•¢Ç˜¤Æ˜¬Ê ´Ïª»Ò®¼Ñ«¿Ò­¥È ÁtÔrŗЦ¢Òª¢Ò¬žÏ¢“Ëš£Í¢sÀZ·‡)> &&%## ’ —!ž$"©&$³&#¶$#´')º'(»''½'*Â)+Å(/É),É-/Í4;ÑgrÑ´ÁÊÍ×ÏÓÝÁ˜¤“•–š˜—¢¨¨¦¥¢ ž™š›– Œ…€ xpb.v‰<œ”^¹œj¾¢UµT´›RµœRµR´S¶ S·¦T½«NÁ±OôNʹP̺UκZÌ·_̲aε[Í»TͺTιRÍ·VÊ´XëN°–Dˆ|-V2+EB‹fS§yo¹‰i¸‡U©uRžoX¡mW£rS£nZ­vZ¬xZ§sX¥qU¢jRžgTžiWŸhU¡cV¦lW§iT¦ea²s]³o[³l`¹sa»xg¾c½}e½|cºvd½zj½t¾„y¿ŠsÂŒl¾ˆ`­|0\Z8y^CaF_G”`N eJ¢aO¯kT¶t\¼}`¿ƒ`¾…a»ƒlÁŠlÀ…q¼„u¾†yÁŽ€Â’ˆÂ„ÀŒ„¿z¿m¿ŒsÔ„ΣšÑª¦Òª²Õ¯¢ÍŸÈ•ÉœsÀ‹]²!4 $'3&!˜$!™—"œ#!¢$"¬&#±&%¶$$µ%'»&'¼&(º*0À+2Å*/Ê*0É+-Ê03ÒEKÑŽšË¹ÅËÂË¿“©–––  ª¬ª¨¦¡š“—™’  Œ } u wc)j‚@œ”\¶—i¿ [¸ŸW·žSµTµŸTµŸRµžUº¦U½¬RÀ°PðNÉ·P̺TκX͸\̵_η[мTϼTϺS͸T̵UǯP¼¡O¥†/Sa5 ><\T¨ur»Žs¾aµ‚T¦tOŸnY§oS¦nX©t[¯yVªyX«vX¯wX®sWªqXªrX«oV«m\®rY«lY®j`´s^´oaµpaµse·wdºxd¹td¹u^¶teº{o½‚n»oÅŽsÓR€s&QZ6ok=†gAŽaA‘_FœdK©gVµsZ¹|`Á…\¿„Z»‚_¾‡c¿‡e¿„_¼ƒe¿‡eÁc¾‡b¼†e½ˆ^¸cº‡e½ŠtÆ™‚Êž˜Ð¥¯Ó­·Ó­ ÎŸ‡Æ‘ƒÄ’kÀŠY¨-$%"& R*2¯"$£!Ÿ$¢%"ª%%¯$#¯&(¶$$¶&#·((º*3¾(.Â)-Ç)+Å))Ê))Ë,+ÍQSΛ̦³¾‰¥–ŸŸ›¡©ª¬²¯¥› ”™¢Ÿ”— ‘ † ‚ } vf$[€?œ–U´•l¿ž]¹ŸW¶œSµœW¶ VµžRµžU¹¤W¼©SÀ°RÄ´PȶO˺TλX͸Y̵`θ_оXѾVϺSιSηRÌ´TǬR´•=zt =/2nUP¨qm»Œs½bµ†\²UªtX¥jX¬oX©oX¬oZ²wX°yS¦oT«qS«pR¥lWªn[®rZ®r[¬m\°o]´u[³t_³t[®kY«k\°o]µrc¸t`¶y[´|g¼†uÊ”yÄ”3ON/1hc4ih6w_;…WEš_N«oR°qa·|f¾„Zµw[¸}[¹]»]¹~\¼ƒ^Àˆ]¾†YºZº…[¼„[»†`½‰mӉ̣{Ç•šÑ¦µ×­»×±¤Ð †È“oÀlÇŒNšw!  &+$)%t/4°#Ÿ%¢&$¥&#¯%$±$#±$#·'(»(*¿'(Á&)Á),Å'*Â))Ç('È&'Ê1/ËZZÑ}…¿ˆ¦§®¤£«®µµ·µªš™¥ “‘  ‹ †} tfK{B›–N®‘h½›`ºœX´šU³šWµžX¶ XµžW·¤U¹¨S¼¬RóRÇ·NɺRÍ»VÍ»T̶VÍ·WͺTϽUϼSмQλSÍ·V̳TæM¢‚1N,(XLP¥jcµ~g¶ˆeµ…i¹†b´\®sY¬l[±qY±vY°uZ±uU«uNŸrL–rI‘oIrKvN™zY«Z¬\°~\®z`³~]®xW«wX°{]µ~[±qb¶}e»„t¼‹c™}3UY! 0Pj>‚{<…l;‹g9g5ˆvB›…O¯ŽW³R©‡W·^Á–[¹XµU¶ŒW¹ŒP³~P´{T¶V¸Y»ƒW¸‚]¼†lÃwÇ•‡Î¡›Ó©²Ö¯±Ò¨—̘€È’lÀŒlÊBƒm#"'11459#$&'®$#¬#"§"¬$#¯##²#%´%&·&)»)(À)(¿')À(*¾('Á&'Â%$Å((Ç>=ÔU[½‰¶¯¨£ªµ¶¶²"³­¤š™Ÿ!«¦˜—• ”Ž Œ …z>ƒA—šJ¬‘i¾›e»œY´˜W¶™U´›YµXµžWµ¤U¸§U½­UòOÇ·NɹOË»P̼T̸V̵U͹UϾTѾSѽTϽSмTÑ»WʳV½–/^a.6;Lš^V¯wa¸…h¹…i¹ˆk·„h¸[²sX°mY³p[²t[¯xT§uMŸ{I”}GŽ{EŒ~Dˆ‚=P™]²Ÿb»›i¿’m»‘g±ŠZž~IˆpP›yi³fµ‰_³„T£|DŒnY­‰P±~|Êž‚Ыr¹œTšˆB“ve¿r¶§I˜’3wv3sw[²¥=sv%HW/Wb9uqB†„D‹‹D—‹D¢‹J¤}O¯{S²}V¸‚]¾ˆhÃŽqÈ—„˚ТªÑ¤§Ï£’˘xÇ“jÁŒkÉ9pf)"%+2<@E< N#%#"¢#!§ ¦ ¤# ©""³%%µ&%¸&(¿)&À'%¿'&¿('Â'&Ã%&Å)(Ê21ÒBH¾‚·­Ÿ¤· »¶² ´ µ°¡Ÿž¨#µ¯  š–– “’ Š …+ƒ<““K°’g»˜gº™\´–Wµ˜W³™ZµYµžU¶¢U¸¨U¼¬T±OŵOȸO˺QλXͺXζUÏ»TпRѾPнTнSнRÒ¿Uл[Ϫ?„w4 ,4cOQ©m\·€a¸ƒ`¸f¹d¹~[µuZ³uZ³rZ²t[°w[°W¯‰U®^²–^²“a±‘r¹œq¶“6`g">V2Rc?jiB€k@{m9dtM¡ˆÏ©kʘdĉƒÎœÛ®ŸØ²}Èži¸‹f¼Ò¦j©„?Œ`i®‡q»‹vÊ£N:nua~€)FH4ra0ig+bl.dv3~ˆB •F«†Oµ€W¼‡aÁhÄpÈ—zÊ™‡Ìš˜Ì˜”Ë—~È“tÈ“jÀŠdÀˆ4q].!&0;D R V WFr#™! "!¬ ¬ §#$³%'µ%&¶%(»''º%$½%%¿&$Â'%Â&%Ã('È+(Í53»…¿´¬¸ !¹ »¶°¶²ªŸ™¤#¯ «  • •—““•Œƒ;Œ”N°”]·•f¼š\º›V·™XµœZ¶ŸY¶ W¶¢Sº¨T¿«S®OòNÇ·Q̹WͺYÏ»WθVͺTϽPÑ¿PϾSпUнSÒ¿UÓ¿[Õ¹PªŽ C(4BK bU²yX²yY´{X´|W³{W±pV­qW­xZ­{\²„^±Œc¹•e¼™rÁž|È£ŠÔ¨œØ¬Idc"3>7‚vE™‚Z®ˆZ‹iΖoË•Z§:]X®w}рƚ{Üu܇ʨ„а¯à¼|«8z[K”fA—f[“…ß³‡Õ¯Z|*410q`AŽi=m7ˆj6…m4„o=™}H©}P²Z¼Ša¾‹aÀŒmÇ”vÈ•xÇ‘~Ç‘xÇ’rÇlËhÀX·…<Šg 5"&/C S]di ZW~!’!˜ ¨" ª#&®%(µ$$µ%$·&&¸%#º&%¾'"¿'$Ã&$Ã('Ç*+Ï+-¹Š ¼³!!¸!º³³¯¬°®Ÿš — ™¦¯ ­¬œ ˜ ˜—˜— –7‰”J±–R´”]¹–]¸—Z¹šT³™W´›Zµ›Vµ T¹©T¿«TÀ¬MðLƵMɶT˹ZλZкVÏ»RϽQоPмQнPѾPÔÁVÓÁWÕ½Zɧ3R+#6G”ZQ­pS±vT±uR°vT±yP©rN£uLžwS¡}Y«`°‘cµ”cµ‘p¹€Äš¯’-4M#%t\XÁ”hÇœgÇpµ‘4]bLškf½ˆr»”J¡tP©yY·‰oÄ›pÇ yЬ«ÝÀžÜ¼¢Ö¸ˆÎ¤‡ÊNšxO¦~hÜs×s¾’\ÅŽfÖ¢0bgD`2st6|j6‚h:Žo=‘n?•iC¢qF¯yR¸„Yº„`¿‡eÁ‹jÁ‹lÄŽrÈ“wÊ—mÄ‹h¾ƒg¾O®wH¤o&B$+7 L_ hfole c!™!ž$!«" ®##¶$%¹&)½'&¼''½()Â('Á((Å%&Ç(+È)*Ï(,º“ ½"#¹"#¹!µ²²°°¬£ — ˜— —¡ª© ˜ ” ’ ‘ • ‘ •˜5~I²–P²‘]·”[¸—W¶˜T²˜Uµ™V³›S´žT·£S½ªR¿¬QîOIJKÇ´Q˹\λ`Ϻ]ͺUϽTÑ¿LлPмPϽQÒÀUÔÀUÒ½]Õ·0ci6 19|^L¡fQ­rS²wS´|VµQ­}M¥{O§€Tª„Y«‡_±c´Œm¸Žt¹e›‚(F2AœtwÙ¬‚Ê£q¶ŽZ•x"8M2?IœoTªxrƘdÉ™^ÀŽ[¾ŽeÄ—dÆœnƤ¦Ø»•Ö´„ϯfÄ…Õ¯®ã¿p­>ŒgXµ„k»]¢~L¥‚I‰/a+U{0hu4vj4}e6_A•iDi^¥pV°yXº…^¾…b¾‰iÃnÈ—rÈ—nÂh¿ˆlÂ]·ŒO´xN²w8F3D`l"%u"({!(x#"wvnr!š "!¡#"ª!§% °%'¸%%¶''º&'¿''À''Á&*Å(0Â')È(0¼™!"»! ·!µ°®­©¨£ — ” ’ “›£¦š ™™ • • • –• 1’F°˜V¶–dº™[¸™W¶šT´™U´šT³šR³œR¶¢T¼«S¾¯Q¿­MÁ°KƵNȸU̹_͹Z̸TνSпMϽPоQѽPÑÀTÒÀSÓ¾YÙ¿Jœ…L:$VWJ hM¥hR­lS¯vY´~[º…Z¸†\·‰eº‘h¼’n¿’{Å›‹ÈžŽÁ™ƒ¶Žc—x>”g„Ø©„Í«g«Š$‘†C¡M¯€Y¸„_»ƒe¿ˆe‹gÁ‹hÀŠg¾Šf¿[·Ž³×»ªÖ®S¹~Uºz&IM#* N$-p*<):)9+?‹)5†%+„$%ƒ#!„x ‡(,ª%*¯$%­%%­$ £"!¬%%´'*¹&&¾')Ä)+Æ'+Ã&)È(*¹#®&)¹ °®¯¨§¤œ• ” ’Ž— •–– š ˜—” ‘ ‹z.wŠI¯”[¹•i¼™a¹šZ¸šV·›U¶VµžU´ŸW¶¢T·£Q¼¨Q¼ªL¿¬K®QŲPÉ´W˶\˳UÍ·WÒ¾UÒ¿SϽPξQÒÀUÕÃVÔÂRÖÂWÇ¥EŒx QS0[XMŸ^N¢iU­nW²oi¸ˆo¹r»r½ŽyÁŽt¾†t¾‡~ÀŠŠÀŒ¥Å’ºÌ³Îœ8SS'Fa1Go MF45rcM£wI¥mW°{[³W³{U´|gÃŽ{Êœ˜Ñ¨¾Ý¾»Û¹©Ø·†Ñ°}×´]¢‰*qTfÅ“]§|-^V7grC‘vU½‰D€€"]0s"8~&E‡,]Š6}=’ˆFž€T®|Z´~^¸€e»†e½ˆbºƒZ´‡c¹”§Ø»åèӪѬU¸}Q²x7E3 ^.Ew0N‚0O‡1M†0N‡/K‹,BŠ)8…)2‰+2Š$-‡'((3¨(1²(0¶$$«"¢%"«'%±'%·')À(*Â'&Â&%Å(*½'0ª3<Á'-¶!±¬¡—•–•—˜ “••–œ ˜ ›ž¢›• ”Œw,w†F­e¾™j»˜c¹˜\¸˜Uµ˜U´šS´šV´œWµS¸¡S»§R¼§OÀ¬O±OÄ´P˸[θ]ͶTÍ·XÒ½XÒ½TмNϽMѾRÕÂTÔÀSÔÀWͰU± 6fegD†ZQ£cQ©iU®gZ¯qw½–t½’mº†h¹~m¾„q¿„t»r¹~†º€¦ÄŒŠ®~1QS I$/{M2-9I’wK¡hT®q]¸V®uT­r[ºƒqÈ”ªÙµ·Ú¸ºÚ¸©Ù·xÑ©Rž…$KNC uX¸ˆ\¹‚@¡x9†rAŒj`±„WšHb4n!4w#=„'HŒ,c–<‹šD¡—O¬‰Xµ…[¶^·ƒ\´€S°}b¸Ž«Ö¸ØåÊÛàĥШS¹}K¥o(=% G$6l/Pt4_‚6c„4^„5_Š4^3V‘3Q,I“0H”.C•(5’&.”*9¬-I¼+E½&)±$¤&-¨%$²%%µ&&»'%¾'%Ä(*¯/:¢AIÆ4<¼)+»$#¶ªš” •˜•’ Ž‘“–”––“‘“Ž Ž Ž x,p‚L±’e¸•q½škº˜]¸—U¶šU¶šS´šT²šW³›U· S¸¢R»¦PÀ­N®OƶP˹Xθ]Í·W͸`Ó½WѽSϼQмOÒÀWÔÁXÔÀSÕÁTÍ´\Ç›7l€ r„$;oH–`N¥gRªiR­kd¶|vÀŒeµz`¶wg¶{i·{g´xj´ys³zt¨kNs_1L2SL*R}3`i%FS8@9uYG—dU©m^³{S©tM¤o\»‡~˲ظ¤Ó¬ÁÛ»Õ²sÈ™o®‡AJ.fbR¿ŠE—„*er?’oS©sa¬vi±Z¬€:€u([w%P€&PŠ+\•:ƒžGŸ«F£G¢N§vM§tX¬yyÄ–¸á¼ÑãÆÔßÂÛàĮҬT¸|E‘g 0-"^0N€5h<|†<~‹=|Œ:uŒ;x‘=y•9m“6a‘4\’4\˜2X—,?”)1-M¦6p¾7oÃ1Y¿-K³&'´%%´%'µ'$¶&$Á('™9E¦K[Ã=F¼/,º& ´­œ   Ž Ž  Œ”“ “ •– — •   Œ Š {*j…L´”e¹”p½›hº˜[¸–T³•Q²—S´›V³šU²šWµR¶¢Q¹¦O¾«MÀ­NŵOɸW͹aκZÌ·`Ó½YѽTÏ»RнQÔ¿WÕÀXÕÀTÕÀTÏ·[Î¥G—–‡…'BhF•bO¦jP¥fX®k^°p\¯n]±qc¯tj´ƒc¯z_¤mZšdF~]+FZ+Ri|B‚0ln.pdB•uP¢sW«vj¶€yÁŽpÀX®‰Iš‹<‹‰:ŒAšCŸ¢E¤H¤€O°€K»ˆwΨ۲ÇÝ»ÒßÂÑÝ¿ÙݽšÈ›N°l:w\'<"”t@—vE›qQªxa´}k¼ˆ~Ä’ƒË—ÌœsËžiĘa¼Y·ˆ]ºˆ[ÀŒS‹RÈ–s̮رÈÞºÌܺÌÛ·µÐ£e·„J¦l-RT.Z1Wƒ2d‡:|‡D‘G—‘F—”G›–IšM¡K IžŸHœH›H¡£G¢©H¢«G ©C•§E–§Pª²_½ÁY¤È/M¼!²$"±''¼'(•6C£Qe»Vg¸>J¸**µ¬ ’ ˆ … ˆ ‡ † Ž‘•‘   Œ ˆ ‡ ˆ Œ ‡‰2…I«”b¶“o¿šl½™g»™Yµ•R±’S³–U²˜T°˜T¯šS²šS¶žUº¥Q¿¬L³QųRʶ[͸ZÌ·]Ñ»WмWλRͺQϼUÒ¾YÔÀVÒ¼RÒ»XÌ©\É«%8€z€ t2In>leEdLŽgN‘rO“tOoFvl6Ri)Æ%/·#¸%&š3B J]»Na¸M^»5;¹%"±¥ “ Œ  ‡ Š „ |–——’  Ž‹ Ž Œ Š †Š zBŽ_¶Žs¿˜q½™g¸–Z²“U°’Q²•Q²—T®—S¯–S²™S´šU¸¡TÀ©NÁ¯PñSÉ·VÌ·W̶YлUϼUÏ»RͺSϼUÒ¾WÓ¾WÓ½TÒ»VÉ©`Ô´%Nm: N R ]ghk-8v7P:Z„9Zˆ;`Ž;aš0TŸŠq=mJ¢zQ©†V­…fº‡vÂ|Å‘zÈ•xË•vÈ“pÈ‘eÀL¯}M¸SÀ‰UÅ’`È—vÇ–†È— Î¡l¿‹R·M©p6rY 1 A7jŠ@ŠŒGž“K¥—K¢–M¥™O«žT°¤R°§S¶¬Yº¯Z¿±VÀ´[ĶeʺpмyÑÀuÓÀqÓÀpÑ¿lνbɾPšžU“ŽåÖ_½Ó.OÂ$$•.8›Mc¾CYºHZ¹GQº.2· ¯š ‘ ˆ  ˆ ‹ ‡ ‰‘” ”“‹ Œ ‰ Œ Œ ‹  u7„ŒV¶‘k¹•kº•jº—[¶•U²•U²”U³˜S­”T®“T±”S²–Q´šU»£Q¿ªO¿ªQȳSʵU˲XηUλWϹWϸTÍ·SϺSѹXÑ·VѺTɪ`Ù³-eH ` a a a a e g m!%”'1¤&0§q*4v;^G€vT ~Z«€g´‚b±{[¬jg¸~sÃyÄPžlM¤mP n@•aqÆ‘¡Õ¯†Ëž–ШÀåÃK€9X.Yo6ts:ws.Wr+Yt-hr=ˆ{AwJŸ|X°ˆ^µŠa¸ˆk¼…sÀˆsÅoÂtÉpÄŒEšsC¨{Nº‡QÁUÆ–WÑ\ÄaÁŠ`¿‹T»‡N°zG™j%PY'?kF“ F¡˜I¥MªœO¬›Q°ŸT´¦W¸«Vº¬ZÀ±\²`Ƕ_ȸdɺnͻҼ’ÖÀ“Ú”ÙÀ’ÚÂØÂ‹ÛÁ€Ñ¿4?+GLg´®aÈÚ5f¤'a˜;[¬HZ¸F^¶Ma·?Oº*+³£ ˆ ƒ ‹ Œ   ”™™–“ “’’ Ž Ž ‰r(bN´‘a´lº—h»–[¶•T´–R²•S²˜V²–U­‘U­’U°–Q±™R¶žP½¨M¿¬QİQÊ·PÊ´VηUнUκ_ѺZѹTϺUѺRиRÔ½RÈ«]×®=‚™ _sx~y{|s op z“Š l$%{6[†J’‰RŸˆT£wV¨r[²uh¼‰uÂŽ}Æ—LšmM£hK™iC¡kÏ¢¬Õ²qÄ“§Ø² Óº.\h&Kn.Vt5mr@…x7jz*Vs,Wv8w{F›†J „S©‰]¶‘a¹`¸‰iº†lÀˆnΑf´†=ƒj9˜wI´ˆM¼‹QÀ‹SÂŽS¿‡RÀˆQ¼‚T¼†M´{H¥p=€d%H!.gƒHœF –H£˜NªžP¯ŸU³¢V¸ªX¼¬[²^Å´cȶe˸iͺlμtѽ‹×¿£ÛÁªßÄ«àêßħßħÝÀ°ìÌFxs42Lu7eŽ1†š6‘¢+@¤GZ¹Yq»Sd¾;D¾'(µ¤š‘‘’˜’“𔋠‰ ‰ ƒ Ž †rAxI¯e¶‘o¼—i¼—^µ–V±”S±–U²—V°–S®”Y¯–S¯–N¯—P´™O¹¥L¾¬PîRȶUÊ·U͸SϼTϼ\ѼbÑ»[ѽXкSкTÑ»S̱YÒ«H›¦m‹ ’ ”"“"– ›"###Ÿ! £Ÿš ŸŽ|&&…W1qB©‚J¶†M»†O¼ƒRÁ‹RÁŠO¿‡R¼O¶D¦s>i.Qb0%:„™GŸŸG¤›I¦žM­£S´¨Xºª\À®_İbƲcȶi˸j͹tк{Ò½Õ¾–Û¬ÞôàŵàÄ·áŵáŵßÂÂëËx¬Ÿ # 19$&K+yœ;©¢/†œ)D¦M^¹\s»K\»:D¹)'´§–Ž’™¡™’ Š Œ Ž ˆ † |+}L®’iº“n¼—m¾™_·”U³’S³“V²’W²”V¯“Rª‘N¬’J¯—L°—N¸¤M¾ªM¬PDzRÌ·YÍ·WнXÍ»[̸\мbÒ½ZкNθR϶TͶYϪJ£¯|… ‘ ”"!ž'$ #"¢#$¨'*²'3¸',¾&-¾&-¿',¼&.¶"&¥Œ&'‰>_ŒKŠM•†V§ƒ\²ˆf¸‹mµŒI£fX®xP¨q^½‰¶Û¸”Í¥|Ëœ¼àÃ?hƒ5o0j$R3\4‚}E¯‹E°ˆK¶†N¼…N¾‹SÁŠP½…K´zG¨sAžq+_c<5>“ªI¦¥I«¤J¯£M°¤U·«`Á®eDzgɵiʶmÌ·kηqѼ}Ô¼Õ¾ÙÁ ÞñàÄ»áÄ»áÆ¼áÆ»âǼáÅÆåɤԾ .? :)GV4_U.{˜?¨¡<¥Ÿ0‡-@©Wj¼Yn»AP¼58º*&³¢”‘•¤$®¢’ Žˆ‹Œ ‚ ‚y sH¨f¹h¸’g¸“b·•U²‘T±”O¬ŽK¤J F£’I¨–H¬—J°—O¸¥M¿­MÁ«QDZYÍ·\͵ZλXμVͺWͺXμZлSκQͶRεVÌ«L­°"‰"—#˜!"ž$&§$$­'+¸'.À+AÁ(1Ä&/Ç'0Ë)1Ï)3Î)4Ï'3Ç#'³.4¦?_¤?u˜J’ˆS£fºRšrN£iV£qJŸbmÃÄÞ¾{À•›Ø©›¾»''‘!*#*ˆ)A‹1X6m?ˆ–;—5xœ9ЦD˜®d±µw°½Z‹À8V¿!)´Q. c)ZG©ŒF²’I¸ŽP¾‡O»ƒP¾€L¹yIªpAj.ba= B@’¯F¤©J¯ªM²§Q´¨[Á¯fÈ´o˶l˶pθtкuл}Ô½Š×¾‘ۘܪßÄ·ßžàÅ¿áÆÀàÆÀáÇ¿âÆÄàÅ¿çÌ,SZ3D;q\?€Z/{™?¬¦:ž¡=¥¡/{ 8L°^u¼Qf»;>·-(µ£† † …„,%­'$®œŽŠ‹ ‡ ‡ ˆ‚ s@˜Œa¸Y¯‹c¶eº—W´‘KªE¤ŽE¤E¥‘E¤”Gª“K¯•K±•NµžNÀ«RîRdz_Ͷd϶_ϸ_ѽVϼTκSλZϽ\Ò¼TйT͵TÌ­O±° 'Ž!‘"ž$"¢$$¨%$¯%&¸&.½'.¿+/Ä*1Ë*7Î)5Ñ*5Ó+8Ò+7Ó+7Ô*8Ò'0Ê)0Á4HÃ5R·;_œDsE‡kV©pKŽaL«oÌ™ÃÛ»o½Ž¸å»l‡¨ „ (#+£&+ª$/©%:«(A±+J´1Y»/R¼+I¾3LÄ=KÀ38Á$%À#¾3*Å>+À P%_'Zy=šˆH±ŠJ±F«{Bœr5uj*Y]/O1-TG ¸G¬­I±­Lµ­P¹®]Űl˳vÍ·u̵tÏ·zѹÒº†Õº“Ù¿ŸÜÁ¥ÝÀ³ß¿ßÅÃàÆÃáÈÃàÅÁáÆ¿àÄÁÝÂÌìÎJts;D>tXC„Y-{›>¬§9 ¡8œž7™›*^–EV³f|¼KT¹/0°'&©Œ ‰ ˆŠŠ'¥3.¸*$±¡Ž Ž  ‡‡ ‰…q8‡‰X¶‰Y¯‰f¸d·’Q­‰F¤‡D¢‹G¦‘I¥ŽI¨‘K­“Q³™N¶œLµN¾«Oİ^É´mηiϵ_ϹcÒ¿YϼRλTϼVÑ»^Ó½XÒ¼QζRÇ­Rµ¯#-‰"‘$" &&¦&&¬%(²&*·'-¼)0Á)0Æ(0Ë(4Ï)3Ð+7Ñ/=Ô1@Ù/>Ü/?Ù.?Ö+=Ó-8Í+7Ê)0Ã$ ¤B„qPžjFaY¼‚™Ô¨µÒ°rÄ”½äÆ8R‘Š +š%0¤&1«#1®$5³%1¸&2¼$/¿"+Â!+Å!)Å*Æ!1É$8Î!9Í73ÌK4Ó$0ÈG,!K,[o+[j0gm";b4!,YG§ÀJ®³K³°N¸±QÀ¶`ʶuϹ‚Ñ»‚кҺ†Ó¼‹Õ¹Ù¼˜Ú¿¥Þ±ß½ßÄÆàÇËáÇËàÇÉáÈÄáÆ¿àÄÀÞÃÏìÏh–Š(C@>qQGŠQ+x–>«¦:ž¡6™œ2‰˜,o’)P˜Qp¿cvÁCQµ26²&#¦’Šˆƒ |‘60±71±)%©” ˆ ‡† ‹ ˆv'bP±ŠX¯‡_´W°IªˆG¦‹G£H¥I¬’K«‘Q°’T·šN·œJ´šM½ªPű\ʵaʵh̳aÏ»\ÐÀXмPÏ»SϼUÑ»^Ò½[Ó¼RлQƳT¿¶%6—!š$"¤&$®&(³&,µ'*º(-½'0Á'0Â)3Ç)1Ì,2Í+4Ï,9Ó0;×0;Ú2DÛ2AÙ.?×,;Ð)7Ç)3¾"0œEpHdH—gjŸ۶–ÈŸš×¦ ¾¼*‹'œ!+¦#/°%1¸$4¹&4¾*8¾+;Ã&6Ä$4Ç%5È$1Ì"2Ë#6Ì$5Î#9Ð)@Ô.E×(=Û+», GW/mt/`q -!!&[F£ÁJ°¸K¶¶N½·UõiÍ·Ò»‘Ó½•Õ¾’Ö½”Õ¼•Ö¼˜Ú¾Û¾§ÝÁ´ßÿßÅÍßÇÖáÉÚáÊÒáÉÈàÆÀàÅÀÞÄÑëÏz¥—-YMEƒZK‘R*r‘:žœ5”—3”–5’3‡˜(bƒ.fKm­n‹ÊOV´3/¬›Š  u w0-¥EK»77±%#¦˜„ ‰‰ …zK~Q·’Z±„Y²ˆMªƒF¦„IªŒI¨H¨“J«ŽL®S´”R¶˜L·K·¡M¼¦Oí\Ȱiʲu̳cÍ·YоVлPϽSлXÒ½ZÒ½[Ó¼XÒ½PǶS÷(>¡"™&'«'*±&'²')±'*·).¹)0¿*2À)1Æ)2Ë)1Ì*3Î+5Ò-8Ó-:Õ0@Ø0?Ù->Ø.>Ö*<Ï+1Â:=”R—kK‘cL¡l„Ò¢·Øµ‡Éž¿é¿mƒ«$-¡#/«$1³%1º&6½&3¿(4À+9Ç)8É%7Ì':Î*:Ñ&6Î#5Ì%5Í$6Í&4Í)@Ó+BÕ+:Ü™%/}B™†6u ,!)'(WD£ÂI´¼Nº»P¿»WŹtθŽÓ¼™Õ½šÖ½–Ö¾Ô¼‹Õ»“ؽŸÜ¿§ÞÁ±ÞÁ¾ßÃÏ߯ÕàÇÓàÇÊ߯ÄàÅÁàÅÂÝÄÏèÍ…´£.cOH`NšY,y’<¦4•,‰#Uq&M(*Ew•n—ÏOZà ¤ ƒ z … ƒ |A@¶HI´6<±'#¦Œ  ƒ„} |.wQ°ŽZ³„N©‡C „D¥ŠH¨G¥J¦‘NªŽQ²’S¶˜O¶šMº¥J· N»¡OÁ©ZÇ®g˯u̱pͶaÏ»YϼUмTÏ»VѼ[Ó½[лUϼOÅ·U˸/T£#Ÿ'(°&(²')¹(*½',¿*/Á+4Ã*3Ç*3Ë'1Í(3Ð)1Ô,<Ø1EÚ0@Ù/?Ù1BØ0BØ0?Ô.BÕ*0Ë6A…N‘_L`V´|œØ°°Ö²–Ò¥»ÚÄ4I›&œ%3¬&4µ&3¼%2Â'4Å'5È(7Ì':Î+;Ð-AÖ3OÙ3MÚ1L×-GÕ':Ò$6Ò%6Ò&4Ñ'7Ô'2Ñ$1Ò(mF¥~~âª)RS %$!"$) I@œ¾IºÀP¿¼S¹_Ǹxй‘Ô»›Ö½œ×½Ø¾•ؾ׽Ž×½™Ú¾§ÝÀ±ÞÀ½ßÃÅÞÄÆßÄÄÞÂÁßļàÅÀàÅÃÞÅÍæËŽ¿§1qPH‘_MžW:{DT $G* "E]T‹ºVoÊ)+¨ Š‚ ~ w&˜FC¶>C¶21²%£Ž‰ „ˆ „%~N®Z³…K©†A¢ˆE¨ŒH«ŒH©ŠJªŒO­ŒS±ŽOµ•O¸Mº¢N»¡N¿¥NÁ§ZÆ­`ȯr̯ŽÑ·yϺ[κVλUκWѼWлVιSλOȸTθ5aª!š()¯(+·&.½',¾(*»(,¾*.Å,4É+5Ë*6Î)5Ñ+8Õ0BÛ3GÝ1CÙ0?×1?Õ/;Õ/>Ü2BÜ'00ZaCyXA‹]nÅ’³Û¸šË¦ Ú©‡£¹'™"1­#2·&5À)6Å(9È'7É&6Ë*;Î*?Ð-@Ò6M×FfÚNjÜLiÛGfÙDbØ4MÕ)?Ô#6Ð&6Ð%4Í$/Ð&G´S­‰|Ó¢:D').)%$(#,7ˆ®K»ÄW»Yú`ƸtιˆÒº›×¼¡Ù½–Ô»z̳y̯ˆ×¸ŽØ¼œÛ½ªÝ¿µÝÁ¹ÜÁ½ÝÁ»ÞºßûàÆÂàÆÂÝÃÊåʒ©4yXN›hS¬a1,+)'!" '0^vJ€¿2LÆ tj o)&¡AH·89°2/¯"¡  ˆŠ‚ xJ¢ŽW°ƒH¥„A¢‰H¨ˆI¬‹F¨MªL­M®L´—N¶œLºM¸ŸO½¦Q¨SéZÆ®xͱ’ҸкeϸZϺTͶWйRлRιSιNÇ·U϶;q®•('¬(*¹)-¾*.À)-Á(-Ã+0É-3Ë+3Ï*4Ï*5Ó,8Ø0>Ú/?Û1BÚ0AØ.>Ô.<Û-<»-Bq.OQ6_X;rYC¡pѨ¶Ö¶…Ç¡¸â¾Qi§"™$3±'3½*9Ç)8Ç*7É(7É%7É&9Ì/@Ò-@Ò3HÖJ_ÚTlÚVsÙdƒÙ`zÙJ`Ù0F×#7Ñ#3Ð#0Ê$0Ì'AÄO¨‘o͘.=/0*(-''(UG¼ÍUÁ¼`Ç»^Źoʶ̵‰Ê²zÆ­qƯe»£]½™¨à½”׸“×¶§Û»žÓµ¢Óµ•Ï®žØ»ºàǾàÆÁáÇÁÞÃÎç͉·š8NQ¢dW­_G=HB=650' +Dm%Pœ6£‘p\p5F²JcÁ=>´1(©›Žˆt?‰R¬†G£…C¢‰E©I­‘Jª’J«‘G­L±L¶˜L¸MºžOºžP¾¥P«TĪm̱ŒÎ²›Ð·—Ò»tи]ϺU̹UζUÏ·TιQË·KǹVи@ƒ° š)+²(+¼+0Â+0Ä*1Å*2Ç+3Ë,2Î+3Ñ*5Ò+7Ô0:×0@Ø2CÜ0?Û2AÙ/<Û-@Á3[c:mV=p\?u\BckÁ“§Õ²¦Ð®‹Ï¦±ÍÁ#:,­#6¹'7Á*8Ë(7Ê)8Ë&9Ê%9É&9Ë'8Î(7Ð-@Ö6K×QqÚ}¢×•µÕy“×D]Ù0G×%6Ò$5Ï!0Ê$2Æ",È9u™dÍ”(i`,2/.:82.$3>¥»WÇÄkɸsȸ^¸§vÊ©wÏ­O°’lÀžyƤTÀ›œÝ¹­Ü»¢Ü¹ÆßÀªÚ·×µ×²ŒØ¶ªÝ¿áȾàÅÂÞÂËâÉ`™sETY©h_µ_Y $J*K $HED F E5-# J-h‹,oŒ(`ŒCƒ$N—?‚¬As°1B¶&#´•‚ vd2}~P­ŠI¤…CŸƒEªŒI©‹IªŒK«Jª‰L­K´—M»ŸO½§N½§O¿¨OìWÆ­hʱvʮͱ›Ó¸}и_ϹV͸U̲WжQ̸Q͸PɹUÒ¸Cް#•).´*/»+2Á)/Ä)/Ç+0Å+2Ê,4Î09Ô.9Ö/=×2@Ú4HÛ8KÜ0AÜ1AÛ0=Ý:e­D‰zG{GŒlCdP©y—ѯ²Ó´¥Ñ°«à³Šµ!” /ª!/³%5½&8¿&7Ã*6Ç(8Ç$6Æ%6Æ%7É'7Ì*9Ò-CØWrÙ–®Ô¤¸Ó•¯Õd}Ù5OÚ*@Ö'9Ò$4Í"1Ç%3Ò‚%HE3dl-9;8 =B FA 98SP½½rÒÄмf·­\ª“g´–gÄž_¹—}ΫcΩ¥Ý¹ªÜº¨Þ½Èß¹ݺ¬Û¸§Þ»—ܹ’Ù¸¹Þ¼ÞÂÏèÏœ¾ŸAŠUS a^¯ni¹`WLZQ[HU>W/P2R/S(R!L :#!63{kC¥‚I§‹<š|:›~=”{;Œu80f’'N—1Œ‚s.r}N¬CžŽ?œ‰H¥‹H¦ŠH¨J¨K«L²•M¸N¾§N¬O¿­P¬PëTÅ­aȯoÉ­sÈ­pȱ_˲YιZιU͵XϸU͸RϺRɺXÓ¹H—·$Ÿ(+¸*0¿,2Ä*1É)1Ê)0Ç-5Î-6Ô4>Ú6HÚ8GÝ:Mß7OÝ:PÝ4DÜ3?Ú-6Ò9JÈJm¼c²l¥¨e®˜t»šœÌ©¹Õ±˜¿£š¾­BP¢"Ÿ"0¯ 0³%5¸%5¾%3Á(7Å'8Ç&5Ë&<Ì&:Ì'9Ð%7Ï&4Ò’w6‹t9Žr>”8ˆ‰+q‰;‰…M¥?™‘?œŠH¥†M«ˆN«ŠO©‰M¬M¶˜L¸ŸN¾ªKÁ¬M¾¨QªRĪ^Ç­fʱhɬcƪXÆ®SɰVθ]кWÏ·T϶XϹS͹NÊ»WÕºI›¹#"§).¼)1Â*3Å*2É)1Æ+5Ç1<Ö6EÙ>OÝRÜD\ß>UÝ9MÞ4FÝ0;×,6Î*.Â)'¶-)³:2 IO¬Ug³Yu©Š ´sŒ 19š#*µ$5º&6¾&6Á'6¿'8À'7À'6Ã)9È(9Ë';Ë':Î(8Í%7Ì(EÍ+;ÔXhØ¢¹Ò¸ËйÎÑ‹¡ÖGcÛ*CØ%4Ñ#/Ì#/Ë)¼23@ O]"a+Z+[ (Z 0Z$=a6Z=T6I$JI4nWCc4[0U!Bk9lwjµ˜[²a½˜Ý¸ÄÞÀÈÞ¿ßæ྘ݼ™àÀ±åƪίv–{FSN—aW¥j_¬jn·w{ÀnVi$jO!gV0ˆ\d®|~ÂŽKœq-Z1‰a6Ž`4‚\"U[B$% R#NjF”NŸ‰B–}@AŸ|Až~@™~;“{?s>q=s5‹t@€K›Œ<’Š?„N®‰V¯S­OªŒO¯O±–K¶žL¾¨NÁ«Q¯TíVÅ©fÇ«mÈ­`Æ«SŪRƲQɲS˵Z͸VÍ·SθTθO˸NÈ»TÔ»F–º##¬)/¿*2È)2È*4Ç*4Ë,5Ï3<ØYd")k#5e(Bb*Dg*Jc3ac8vg3x_8ƒbA’aA“[J˜_M•g[§r^ž|@hu4`rE‘†W¸“‘Ù³¿Þ¿ÅߺÛÀ{ºœˆ»™‰°“k‰r@gK8tFFXQ b[«fc±imºwÂlXc&wX)}`W¥u˜Å–{¶…;i2b7•c=žg?£k@˜e$Y] 9$ :%ZmR¤”W£’N›„Q¦ŒK£ˆ@ƒBœC‚Bœ>•€@—?˜‚C—ŒD‘‹=‡A¡†W³aµ’[°T­W´—P¶žL¼¨KÁ­PÀ©]Ç´hÊ´nɲ{ʲqÈ®[©MÀ¦QŰQDzS˶X̹W͹SͺQ̹R͹MȽTÔ¼B†»#%¹)3Æ)1Ë+2Í)3Ì*3Ï,4Ó;JÙNeÝVtÛ_Úc†ÚpÚbxÞ:LÝ.9Ö-9Ñ(0¿%'©((š&%•(1°'1·'/¶&1²#+²#,¸%2¿#3Ã%7È(<Ê'9Ë(9Ì(<Î*;Ï):Ð'9Í'7È%5Ä#4Ç%4Ê&6Ï&6Ò$6Ï&5ÏHRÔ~‰Ô®½Ï´ÇÒz—Ø?[Ù.DÕ&6Ò$0Í(5Ù!9Kh)t#/w$7m,Pi2`k“‘6ƒ†9•‚U®‹sº–^°T¬ŽU®‘S´–K·¡P¾«WÀ¯OÁ®{Ë´ŽÍ·Ìµ‘̳…È®_Á¦QÁ§fǭγrÌ´f̶i̵^μSË»OȹSÌ»QÄ¿,I®$&¾+4Ï)1Í*2Ï,5Í)3Ñ2<ÙBUÝrØ¢¿Ô¼ÓÔÆØÔÌÛÔ•¦×5FÙ+5Ò)0Æ$*°(,©)0³'.¶(.·)1¹)1·'2¹)1½*5¿'4Â&3Å)7É(=Î);Ï+=Ò+@Õ)?Õ*;Ô*<Ö*=×';Õ(<Ó$8È!0Ç$2Ð(6Ô"2Í!/Ë$.ÒVfÓ²ÅÎÉÙѽÕÔ®×8NÙ&8Ô)9Õ'3ÏL1 Qk,x"5t'Ct5lnBƒlBŠfI“eKšhRžga­rs¶z¼‚|º}¨Ì–ÉÛ²ÌݲÍÞ³¼Õ£­Ó“i§‰?ƒoÆŸ¨Ù¸ÉÞÁ·áÈ>vp-XE@€\J[PŸdT¥hU¨f`µnl¼vn¼zÁz(v\9¦q7›i1”_2—d3“a7›j<¡l<§sC²xD±uF®pC©v7ˆk+K& ?AO©›^ªšb¢T™„X›…QŸŠD¡ŒA¥E­”H³–I¸žK¼¡9‘6„ƒC}kµ‘n´T«‡S©„S­‹Q³‘K·MÀ«añJ»¬iı’ι’͸™Íµ„ɰeÄ«[ĪrÈ®˜Î¶ªÖ¼šÔ½y͵oκ[Ì»OȺWλR»¾#2©'-Á.7Ï+4Í*2Í*4Í+4Ò3:ØPdÙ€šÔ®ÄÑÇÙÒÑÝÓÍ×щÔ0>Õ.7Ð(/Á$)´',³)0¶(0º)1½(/º)3»'3½(2¿+6Â)5Ã'4Å):Í)<Í):Î+=Ò-?Õ)<Ô*:Ï(9Ñ':Ð&9Ñ(?Ó)>Ô$2Ê!0Æ%3Ð$2Í!1É -Ì6FÓ–¨ÏÍÛÑÊÚÓ·ÍÔYw×%;×.G×->Ûp, Qe*p%7x,Ow:{oCmE”lI˜iP¡iZªmlµwv·{ƒ½€ˆ¿€¨É’ÌÛ´Óà¾Óß»ÃØ©¶Ó˜È‚HŽwF‡ŠÒª¼Ú¸ÉäÄ¡ÚÁ7o`9nOJŒ\PšaX§iX®h_²okºuq½{xÀ(o]7o1•i2•f2”e1’c3˜q8œz;§B«{A®vF³zF³t:Šm*^E&fB¤‘\³šl¯—h©M—zZ¤ƒ]¨ŽGž†B§ŒG±—G¶›I½¦Jè?—9††Mžn±”d­ŒQ§„Q¨…R¬ŒT´’S¼ MÀ­K¾¯K¿±Q½®|ɶ†Ë¶ŽÊ´É²_ì]Ä®iƱšÑ·ÈàÅÊáȫվŠÐ»nλSÊ»Yμ\À¿&;³+-Ä.6Ï,6Ñ*3Ò+5Ó-4Ô5BÚUlÙŠ¤Ô·ÍÑÏÞÒÚãÓÇÎÐhrÓ-9Ð*3Ê&,»"(´&,³(0»)4¼*3¼(/¼*5½&0¾'1À,6Ã+7Æ(5É)9Ë+<Ð*<Ï,>Ò.@Ô,>×*9Ô(8Ò(:Ò(7Ð&8Ï%8Ó);×#4Ê"/Ê%2Ð!.Í!/Ë(6ÒnÒÀÑÏÑÞÒÃÓÑ}™×,EÙ8]Ù4Oá‘0Na(m&=x/_~;sB‘qJoO¢pX«pc´xr»€}½„†½†Á‰¬Ë–ÎÜ·ÛáÅ×ß¿ÁÖ¦­Í“|Àxx¹Dƒ}P ƒ“ת±×´ÌêɑϷ=y`D€PR—ZW¥\\¯d`³lg¸po¿~xÁ|UT+ƒc,€b*„c0ˆ`5‹`5‘m3–t;uA¨tA«€<—{)cl#^\[ bC ‘^´šj«hªJ—€W¢‡j´—\¯”J®”E³›H¸ H½¦LƯ@œ›=ŒZ¡Šg©‘[¨ˆR§„N¨†R«‹T´•O·œM½«M³NÁ²L¼®]IJpdz{ȰrǯXïT¯cƳ£ÒºÒáÈÙãÍÁÚÚѼxϼ^ͽ`ͼmÌÀ*Hº&&Ä-5Ñ.8Ó,4Ò+7Ò+1Ô;KÙawÛ‹¥ÓÀÓÑÕáÒÚáѰ¶ÐV^Ö+3Ï*4Å'.¾")³%+²&.½(2¿)1½)2À(2Ã(3Á'2Â'3Å*5É)6Ï)7Ñ):Ò*:Ô,<Ö,=Ô/A×.?×*=×':Ó&;Ð'8Î$7Ð#5Ò)<Ó!/Æ#0Ë"2Ì"-É&2ÏQdÖ¬ÁÎÔßÏÖãÑ¥×-IÚKpØCeã'ª5Mh,x'I/a|7tDštP¥qO¨qY°rh¸zt¾ƒ‡Â‰”ÅÅ‹¼Õ§×àÂßâÉÔݺµÎ˜”Ćf·rƒÃ}z²‚-bf[¦ŒˆÓ©¿Þ¿Èë͕ԹG…l:vLL“XZ¨he¶qg¸ukº|wÁ{)vx5£Œ3ž‹7¦‘<«’>¬“<§8žˆ3„,k€1` 86?QS U;•‰c½œi®‘`¦ˆOš€Z¥‡l³’a²•O°’F±˜G·œH½¨LƳG«¥Hš’a«Ža©‹U¦ˆM¤…L¥„Q«ŒO±–K°˜K·£K½°LÁ°L¾¯O¿¯YİyɰyɲV­Nï[ƱͶÅÙ¿ØßÆÈÚ›ѻ|ͺcÌ»bɸƒÔÂ3X¸!#½.3Í-6Ó,3Ó,4Î,5Ó;FÝZmÙ˜´ÒÇØÑ×âÒÔÜЗ Ò?FØ*3Ï)7Ã$-¼#*µ%+¸'/¾%.¾'2¾)3Á(2Á'4À)5Ä*6Æ(9È(7Ê(8Ë'7Î,>Ò2C×0CÖ1@×3HÙ1IÛ+?Ø(<Ö&:Ó$7Ò%4Ô)<×(;Ò!/È#2Ì!1Ë!/Ï7HÔš°ÎÒÞÏæîÒœ«Ö!;Ö[{ÖRqÞ.³;Kj$;{0X~/ev?ŒuM£wP§oRªn[²rhº{n»}†Áˆ¢Ê“´ÒžÏÝ·ÛàÈÞáÆÑÛ¶®Í•€¿g½{x¾|Ã~=‡a,[fJ”ƒ”Õ®ÄâÃÈéˬáÆd«J–dU¤f^²nf¹sh¹vvÀyHžžcÜÄVÏ»WѽXÒ¿XÓÃWÏ¿K¾³5•NŠ^/,5>GO1}€kÆžp¶“e«ˆY¤ƒX¥ƒe¯Œd¯‘U®’H¯•E³›H½¨JȲD­°H•—l¬‘[¤ˆPž†J¡…M¦ˆN¨ŒG«“K°˜L¯—J¸¥L»§L»¨MÀ­Oįrɴʳ]Å®XưVŰkɲ”͵£Ì´”Ì·uʸs͹^ɺ\Ǹ†Ô¿:Z¼$¿)0Ì+4Ò*1Ñ-4Ò07Õ4;ÙSjؤ¿ÓÌÚÑØáÑÎÕÑy‚Ö0;Ø*3Í)-È)-½&*³&*¹'/À(/¾(2¾)4Á(2Å)7Ä*6Ç'7Ç$4Ê'6Ì)9Í*<Ñ1EÖ9LÛ5GÙ/CÙ7NÚ9TÛ3KÛ-FÚ)AØ(<Ø.8Ø$8Õ/@×$3Ì"0Í#1Ì!/Ì'6Òƒ›ÏØåÏçëÑ{Ô/ÓTsÔMhÜ,´<Pn!:{*R.g}BŽtK wO¨rU³ubº|gºzjº{ˆ«Î™ÅÛ°Õß¾ÝàÇÜßÄÓÛ´§Ë“r¼ylÀyzÂ{~ÃT¨e2rH-Y[CwrÄŸ´Þ½ÆäÅÈòÔ~ÄžF™XZ®kd·qg¸vr¿yTœŸtÜÈeоfÒ¾fÒÀfÒÀaϽWɺEº®4œž PŽqI.09@ ]seÆ o¹•h²`®‰Y¨…`ª‰f²‘a³”R²”H³˜K¿§I¿³']®N˜›w¯™a£‰H•IžK¡€FŸ~F©ŠH²˜J°—K¶¡J¸¥L¹¢N¿«Nîf˵v̳]ŪWêXÅ®]Ȱfdz_®`Ç´k˶j̹QǶ[ǵtÉ»3F¹#%¿',Æ(/Ê*/Ì,3Ð06Ó3;ÙNeÙ©ÀÐÑÜÑ×ßÑÀÆÐOUÕ*5Õ(3Ì+/Ì(,À%,¹'.¾'.Á'/¿*4Ã)4Æ*5Ê+8È'4È'2Ç%3Ç&5Ì/=Õ3FØ;UÖE_Ú=VÙ5K×8QÙ9PÙ6OÚ4IÚ0DØ,BÙ(@Ø%;Ø-DÖ6HÔ!,Í#1Î#0Ð)8Ú_pÔÂÌ͵´Ñ€N,^C'RK=sbg­ŒœÕ°ÈæÉs¯ˆE ^X²m_¶oeºxl¿xWœqÙÇdÏÀgÒÁgÐÁhÐÁfϾ]˼QŹGº°6“ $N'xN10-EZ_Áœo¼˜e´c¯‹Y¨„V¡_­‹f³‘aµ–OµœMǧ<–´«F„¨wµžv¯—Q¡‡@•€A–|B›E „G­’LµœI³›H¶¡H²›N¹ OÀ©T¸\µšZÀ¨L¼¡L½¤H½¦G¸£I¼¨N®QÅ®PïXÅ´\ͱX¯»'+¸'+Ä'.Ç(/Ë*1Ï+3Ñ.6Õ1:ÚK^Ù¥ºÐÊÕÐÈÒÍœŸÑ;FÖ)5Ó)3Ì13Ê#'¶%1»&0¼(.¼(2À*3Ã)4Æ*7Ë(4Æ'2Ç(9Ç'5Å'5Í/=Õ;PÛMgÙ`yÙ]{ÙXxÚGdÜ;TÙ:QÚ;QÝ5KÚ1KÙ.IÚ*DØ%>ÕDZØ,:Ñ!0Ì"/Î+7Ø;FØhiÑRQÑ"1Î$5Ï2RÓ3UÝ(°9Pl#=y,T~+f|8ˆrEœqK§sM­o]·vc·uf»wÀƒ®Í˜ÊÛ²×àÂÛàÆÝáÇÑܹ¯Ò ăuÄm¿xfÁw\·m×8OÙ7D×"0Í".Í&3Ñ+5Ó.1Ò+3Ò%5Ñ"2Ò/KÓ3Wà(©: Yn%p"Fw/rw:ŒtH rN¨jP®nZ¸wb¹to¿|v½~ ÈÄ×®ÖßÂÜàÈÜàÇØßÀ±Ñ yÁ~qÄoÄ~nÃc»x[ŸfI…X7nK2hL6gL8lJA}MP–^X®mX´q\¶qe¾{iÂWœžyÝÇnÑÁkÒÁoÒÁoÑÁiÏ¿`̾_ͼYȹKº²>¤¤/z–#EŽ'}[>CP¬“oÀ^µW²ˆG§~;“q9‰lP£a°’pÜL‘­¦ »ÁTw®—ÁŸ‚°—[¥‰B“}?“~B•zC›G¥ŠI©‘D˜Ž=ƒƒC•ƒP·›K¤„K£z¡Ó±™Ì±uÀ¡•Ô¶¦ÙÀ†Ì¯tŤ•È¥|»¦aβP³½ ,µ"&½&+Å'*Ê(0Î)/Í)/Ñ)2Ñ,5×=MÜ^kÖ}…ÑsxÔBG×26×%.Ì8<Ð/2Ä#'¼&-¿'0¿*2Å*5Å*5Ç,5Ë-5Ì)6Ë+5Ë)4È(8Ì*9Î->ÒAZÚ_xÛ… Ôž·Ò¶ÍÒ²ËÒ ÖIhÛgˆ×¾Ö±×iŒÚ:TÚ(@×2NÛ1AØ$3Ï"0Ï%3Ò%5Ò'5Ó(6Ó%1Ð#3Ð(BÏ-PÝ*œ2 V n3x Ds0tzA—xJ¢rN«oT²pY¸x]¼}j¿~i»ˆ¿Õ§ÔÞ¾Û߯ÛßÅÜàòѠwÁ‚nÂ~oÀf¿ƒ}Å‹`¤hR–^CˆRD{Y4dK8rN?ƒQO—WY°j[³o[µlc¾vb¿zRšœxÛÆoÐÀmÒÀqÓÁmÐÀfξcͽ`Ì»ZɺO¿²@¯¦9”—-gŒ$>„"{ fODœ…pÁœZ¶‘M¯ŠE«„A¢{9‘oM {f±”oºš4D« ®& Ã!Á" ºt—ª•¿œv«^¨‹@‡v8rgK¤…R²ˆL ‚C”CšvPµƒ[¼BŒiD‘d‡Â•‰»”p¹Œ—̨„Ä }À™†¾–r³“^Äžpʶ3I»»%,Å(-Ë'-Ë&-Ì)0Î(3Ï)1Ò-8Ø8GÜGSÚhwÔhtÓ=G×,1Ñ&/É=@Ñ(,»%+½&,¿)/Á(1Æ(3È+4É,9Ë+5Î*6Ë*6Í+9Ë*:Í*7Ñ->Ô?VÝ]tÚŽªÓ§¼Ï¿ÐÏÈÙаÉÒn‘ÚlÖ¬ÃÓ´ÎÓ§ÂÔ]{Ù)FØ0I×2LÙ%4Ñ#2Î&7Ó':Ó,?Ö(4Ô%2Ò%5Ð%@Ð&Gß„3 W#p7y@z/sz<—wG¢pM«pO¯qRµp`¿€a¿~lÀƒŠÃŠ´ÑžÒܺÛÝÄÚÞÂÕܺ´Ð |ÄnÀf¾€rÇ~ʼnb·yY¤gË•´ÜªS“d3dG:oME‰WO¡cX®iY³l\¶s]¸vL™œrÚÈjпlÒÀlпiϾcξcͼ_˹YȸPÄ´F¶©=¡œ1†”%Y!8‹!} b9ŒoÃ_·’M±Aª„A¦};˜sJžxuÀ‘b‘£ªº' Á% ¾ ½,)¹{ž©¾šU„|H‡y]¦ŠTŸ|O¦{R±wK¤rC—fV¸~`¶„G“iEŸp|řȢ{¼“º‘f°}¯Ï¦’ǬN±ŒPž”HMµ$½#'Â'*Ç).Ì'/Ë(.É)0Í(/Ð*0Ò-6Õ19Û@NÚbp×SX×/8Ö#,Ð3>ÐEGÍ #¹&-À&-À(.Ã&0Æ(4É+5Ê-7Ë,7Í,8Í*6Ë(8Ë'7Ë)7Î-=Ô;MÚVm×’«Ò«ÂÏÉÚÐÙäÒ½Ïщ«Õ„¤Ó³ÇоÐÒ»ÍÒ†¡Ö5NÚ*=Õ8UØ&5Ó#3Ò&6Ô-@×3EÚ'4Ô"2Ò!4Ñ$:Ð#>Ö c6 Qg6sHv)qq:—pF¤mM©iM±nUµq]»y\½xnƒ}ˆ¬ÎšËÙ´ÔÛ¾ÕܽÎÚ³±ÐŸ|Ä„pÄeÁˆyÊ™~ÈŠf¹{’ʼnÀØ¥£ËhÀzLŸg5dN,O=?}QOžcU®iW´n]ºxK™ŸlØÆdÍ¿gÑÁeÏ¿gξhνc̼^Ë»^˺XȸN¿±B­¢8“’.l$G‹"1}k,qxmÃf¸“R³ŒD¬ƒB§@ yAxn¸“;E®´&"Ã'Ä$Â$"ÃÀ3.¾f{¤6[jHrK†vC…pJ‹pL’pE™dU§uIƒmF”g@…aDšea»ŠŠÆ‰É¢s³‹[´È¤k¿˜T¡–/4µ#À%&Â&(Å*+Ë*.Í'-Î',Ë),Ð*.Ñ+0Ó-2Ö5?ÝNaÚjtÙ@GÙ+5Ñ#-ÎQ]Ó:9À$·)-¿&-¿(1À(2Á+7Ä,7Ç.6Í.9Ï+7Í)4Ë)5Ê'6Í+9Í,>Õ-?×KbÙ‘«Ò²ÇÎÏÝÎÒÛϼÍϪÄÒ£¿Ñ¼ÏÎÅÖÐÆÕЧ¿ÓNkÛ&9Õ5RØ:VÙÒ1Â=> Sj7u$Oz/}v:›uD¦nJ­sL°pN³o]ºv^¼{iÁƒz†£Ë”Ã׫ÍÚ¶ÍÛ¸ÎÛµ¨Ï˜xÅ„rņnÆÊ•`¶pŒÇ‹§Ì”r±pe³nf»xkLJbÀ‚H‚f-TM7nPEŽ]O¦jY¸|Kš¢gØÆ_ÍÁ`ÑÂ^ξa;b;a̽_Ì»aͽ]˺YŶH¶ª=—7ƒ*W‹"7†t|&2V>l`:bh5ODŽdF{f#GJJ¥tO±Q°}mÁ•ʩԴ‚ɦn™n¿‘`£•@R¢)+¾'&À'&Â(*Æ*,Ê(.Í(-Ê(+Ê+/Î+1Ò-2Ó.4Ö:CÝDJÚLLØ39×)0Ð1?ÍhtÓ+/Â$*º(.Â&/Ã(1Â+1Å+4Å,6É/8Í0;Í+7Í(7Ì(8Î'7Ì*9Ð0AØ(:Ö=TÖ–µÐÀÖÎÎÝÏÌÚÎÉÙϲÅжÍÐÊÛÐÐßÐÑÜÐÃÓÑl‚Ú$:Õ&>ÖVvÔš×_vÙUhØ7HÚ,>Õ"3Ð#5Ï&CÚ)¥1C Vj5p)_v3Šp=œoC jHªjO²pP¶oX»taÀ|eÀ}ņ¡Ë‘½Ö§ÈرÉÙ²ÀÖ©œÌ“zʼnpʼnxÉ–x¾‰Àˆ¾Ú¬r²rW¬e`·rr¿€Ê‘§Ù¨±æµŸÒªi¤€E‡b?ƒYE•jI˜®cØÂ^ÎÀ\ξ\ͽ\ν^˼aÊ»aË»_ɺ^ȸXµI¶ª?¥œ<•—,`“*„g YE™„qÀ™d¸“U¹’K­‡A¥~T³‚4S¨·'!À("Ã'Ã%Ã"Ã$À!¿"Â#Ã%à ¬-?Š.Dm+HK’pY¦xS—rOª{\Á”^Á`¿’•Ñ«·ÜÀ‹Ó³}ΪGw34´++½*)Á)'Â('Ä()Æ+-È*-É',Ê(/Ë*0Î)0Ò-4Ö/7Ø39Û03×04Õ,6Ô!*ÑSfÒ\[Ë%¾)/¿'.Á'0Ã(/Â+4Å,5Å-6È/6Î.8Ì+8Ê):Ê'8É(8Ë*6Ð/<×)=Ó*CÒ—´ÏÍßÎÇÕÎÊÖκÇÍŸ±Î½ÎÏÎÛÍÒÝÎÔÝÏ¿ÉÏcsÖ);Õ$7ÔG]Ò“¨Òp×erØBO×*7Ò#5Î#9Ì%>Ø o.J Td8n+ik5‡e:‘gB gG¨jK±pR¹sU·tc¿~eÀpÁ“ÉŒªÎ™»Ô§Â׬¯Ð›’ËŽÉ‹lÃvÇ’¯Ö©ÇÞ³¢ÇŒm¸t]³l^µmy¾}ªÑšÍáºÙãÈÕçÈ´á±Ï”d¾ŒX³‡Jš©eÙÄ\ο[;UȺWÊ»^˼^ɺ_ȹ]Ç·\ǶW²J»¨D´£6š$_`]"]pi—r¼šc¹”L«‹C¥~V¤‹'2¶À*#Æ(!Ã%Ä%Â$Â#Á!¾!Á#¿ ¿$Ä&Æ*'·!,‹P{sZœxIoR¨x[½V¹‹nÅ›£Õ²ºÚ½ŸÚ·‚Ë·6I¼--¿,2À))Ä+)Å(*Æ**Å.-È,+Ê(.Ì+1Í,2Î,/Î-2Ó17Ø06Ö,3Ó+4Ò(.Ñ'3Ño{Ô94Â!'»+.Ã*0Ä*3Ã*1Å*4Æ.9È/9Ê,6Í-9Î+:Ì)5Ë(6Ë(7Í+:Ñ,:Ó%7Ð8WÖ¨ÆÐÌÙÎÄÓÎÄÐͦÎѪ¼Î½Ë̾ÊÍÁËΔ Ðat×/@Ø#3Ô3FÑŽ£Ñw…ÚTZÚ0=Ó&3Ì!2Ì$=Ô 3Ä?@ MYeBn4th<‰`<‘]Cž^J¬hK±iMµoX»xcÁ~fÁ~nÂ~džšÍ‘´Ò»Ô¤ Î”†ÉŠʉiĄʔÈÚ¬µÎ—Ãr¼xe·o_´kz¾z¬Ï–Ôá½ßåÍÞåÎÇÛ¶‰ÈmÇ”kÈ’?™W˪L¾¦QÀ§w̵gdzQÀ­UÀ°W°P¾¯L°¬G££9Žš'\‡ gQUgd cL£†wÆžnº–T¯Hª‚KŒ’ "»$Ã(!Ä'Ä%Â&Ã%!Â#À#¿!Ã#Â#Á%Á#Á$Ã"Ë4C®[˜Už|M“sW³†P³…vǦԴµ×¼˜Û²h°´-<º28Á/0Á.-Ä-+Ä(*Ä*+Ê+.Ì(*Ç(,Ì*0Ï,2Î-/Ï.4Ô17Ø-4Ô)1Ò+2Ò&,ÔNeÖigÑ!&Á'.Â),Ã*.Ä,2Ä+4È.3É07É.5É/6Ì,6Ê+6È)5Ê)3È(4Ì*6Ñ,8Ñ(7Ó>VآѲÁ͸ÃÌ”–ÏHIÑVcÓ†ÒŠ•Р±Î «ÎˆžÒaoÛ,:Ú#3Ô+BÒ…–ÒghÚ19Ö&0Î$2Ê!3Ê%@ÛŽ.L Y"a2d'Lk.]_6€]:ŽZD^G¨eL±kQ¶oXºu^À}fÅ„mătÅ‚ŠÌ‹–ËÍ‘•Α…ÌŽzʇiƅΗºÒ˜¥ËŒ‘Ç…x¿yvÁyo¾vÁ{²ÓœÕà¿ÜâÊàäÍÅÚ²‡ÇŒnÀ‡iÀ'hj< o7Ÿp=£q³Ôª´Øº>šv*~_#^b-S V [K@AT\^b^ OofÀ•uÀ›_µ”M¯„9n™Á"Á"Ä(Å( Å&"Å$Æ$Â%Â$Á%À$Ä% Â$Á#À$!¾"ÀBU²Z•†GˆiXª~P±€|Ë¡§Ôµ©Ó·‹Ù¬L~´-0¾6>Ä05Å.,Ç..Æ*+È(+Ë(0Î(/Ê)/Ì)0Î,3Ò,4Ô+1Õ.7Ö+3Õ*1Ò+3Ó4CÔpz×>7È +¾)-Ä*-Ä-0Å,/Æ,2Ê.6Ê-4Ê-4Ë06Í*4Ë+5Ï)5Ì)4É(1Ï)6Í(7Ï*:Õ9L×€Ô{‚Ï\YÏ=?Ò*6ÑDSÖYuÑVhÔuӎч›ÓO^Ú+:Ø&5Ó&9ÒftÕHN×$4Ñ$0Ì$2Ë%5Ð!4ÊF: R,r(G| @m&Kh-df3}a7]B eKªfN²oVºpX»r[ÀxeÄ€kƃnƃtÇ„yɉÌŽ‡Ð‘ÏvˈkÇ…–Ж©Ð’œÍŒ–̋ĊɅ’ˇ›ÌŠ¹ÖŸÊÚ¯ÔݸÔÛ·¬Ð—yÅ„l¿„d¼Œ%jp<¦i=«u3§m|½‰½Ö®Q®|-ŒW"kV 'KDQNHEJOVYWY:ƒ†lÄ£l¸›V´†/]ž¾"½%Ã(!Å)Æ'Á% Ã%Â&Á%Á$¿%À$Ä$Ã#Â$ Â$!¿"Ã6D´V›„T¥zP´†rÀ–¡Ò®£Ö´ˬ9S´/6Á8?Å2=Å//Ç.+Ç+*Ç-*Ì+1Ï+1Ë'-É*0Ð,4Ó,6Ó-3Ö.2Ö,0Ë+4Ò?PÙoØMEÑ!"Á(,Ä)-Ç,.Ç-.È-1Ê+1É,3É-5Ì.6Í-8Î+5Ì*5Ê'1Ç)7É)BÉ'5Ê'4Ï+:Ñ.<ÔÚ8@Ú>MÛm‚Ùyx×,,Æ#,¿),Ä+-Å,.Å./Ç-2Ç+0Å,1Ä,4Ç/5Ê*3È(3Ë'3Æ'1Æ)8Ê,KÇ'3Ì(6Ð'6Ï)9Ñ+8Ñ.?Ô,=Ò)9Ð%4Ñ(5Ñ+5Õ2=Ô5FÕ;D×18Ô+<Ø(9Õ':Ò%9Ò(2Ð&0Ñ#3Ë"3Ê".Í 1¿98 U-d";j&Gl-\n&Qh(\e1}^:“cB¡eI¬ePµhU»o[»oaÀshÃwmÅ|pÉlÊ‚rÈ‚wˇqˆlÈkŃtÉ…ŽÌ‰¦Î²Ó–»×¦ÂÛ°ÀÙªºÖ¢¢ÏŽÇ„˜Êƒ’Å‚Â~vÅ„mÀ~dº…U·†+tj?ªd7©h<°p?´vB¶xE·yC±u9©n9§k [aD8)&$ #$'04$SvcÇ·tȧ@gµ!Å&(Ã)!Æ+ Å'Ã'Å$Ä#Â$À'!À%Â%Â#Â#Á#¿% Â$Ã%¿!Ã4B»K‰~KuV¸ŠŠÍ¦…ϦmΦ7Z¼/1Â6;Å01Ä++Ä+(Å(*Æ'+É&+Æ&,Ç&,Ë)3Ï+3Ð(.Ñ06ØCLÝIXß^nÜ|„ØKDÒ!)¾)4À*-Ä*.Æ..Ç02É-5È,2Ç-3È-5Ì-6Ì*4Ê*4É(2Æ(4È)5Ì(3Ì)7Î)6Î(:Î(:Ñ,;Ô-<Ó,=Ð(7Î%6Î&4Ð&6Ð)5Ò/>Ô*7Ò*9Õ(6Ö(8Ô(<Õ&<Ô%5Ñ"2Ì#4Ë".Ì&JÕIAJ K+Y;b&Me*gb,gh)ge2~[<\BaI¨dQ²jV¸pYºob¿piÃukÄxmÇ{qÉsǃsÉ„mÈ„iÆ…aÁ‚hÄ{€È„¤ÎºÕœ¿×¥½Õ£³Ñ”¨Í‹È…yÃzÄ|sÁzm¾yoÃdº~Z´†O¸„5}vF­k5¦h>³sB´wB¶zEºH·}C´}B´w6’q S*09?3+&",$$)]wsϪI|¸"$Ç13È.(È)!Ä%Ã%Â#Â" Â$!Â#Â#Á'Á&!Æ% Ã%Ä%Â#"¿$Á%Â"ÁO SœtO­~mÀ•~È¡pÕ¦@u·++À47Ä14Ä**Ã*'Å'(Æ&(È%*Ã&,Å%-Ê'.Ë*0Í*2Ñ-4ÕBIÙT^ÜhqØe_×/2Ì%+À*-Ä+/Å-3Ç03È/1É.3È.3È.3É/6Ë.7Ë,5É*4È)5È)3È+;È*9Ë)7Ì*:Í):Ï(9Ï+;Ð+9Î)5Ë'7Í&7Ï'7Ï#6Î%6Ï(6Ñ&7Ñ'7Ò&5Ô'9×(;Ô(AÖ%8Ñ"4É"2Ç":Ò:Ÿ®@®v/o#[Z?W6Z2W#G^.wc;n8Šg2|\4€Z?“bI©oSµwV·z]¼wcÀ{bÀ}eÁxlÄwuÉ„nÅ€iÅ|iÅ‚bÁ€Z¸p]½skÁ{ˆÅ—ǂ͉–Ë‹šÍŠŠÈ{Å{sÄztÆ}kÀthÀweºuY±Q´‰P¾‡5~vF²t2¦l=²v>´y@¶yE¼G¾…H¼„G¶|D±v!U]4;S$hg"aj3Z=1-&#4kpRŸ·*4Ì×86Ï#+Ä)0Å,0Æ*/Ç,2Ê.4È.2È/3È/4É-5Ê-7Ê.8Ë,7Ë*7É*6Ë)3Ì*=Ì)8Ï(6Í+=Ð+<Ò(:Í';Ì(8Ë&8Ê'8Ì(8Í&5Ê$5Ë#6Ë%6Ì%6Ñ':Ó&7Ñ%7Ñ&8Ò(;Ñ%?Ò#0È 0Í5“¿J¿‚NÊSÏ’F®{1†i+p`$_^&^`,pa<‹mA’l<Šb9‰_>Œ^H¡gP®nV·t[ºs`½u^¿ycÀyjÃvqÆhÀyfÃ{dÁS±iX¶h\¼qd½tvÃ{Ã|Å|ąȆrÅ‚jÀyh¿wjÃxe½p_µmV®zQ´‡Q»ŽTÀ‹-zqB¬l6¦m:³u;µzA·}G½ˆGÁF¾ŒEº…Dµ}6–pg]3špH±„<¡}*}jAZG7*&"%(Tr5OÊELÏ:<Ï+*È'"Â#Â#Â%Â$À"¿#Â(Æ(Å(!Å*#Ç*"Æ(!Å%¿$Á¾" »R„”N˜rQ³ˆ‡Í¦ŒÓ©X²ª-8Á23Å.+Å('Ã)(Å&)Æ$)Ä%*Â)-Ç(-Ê'-Ì(,Í)/Ï*/Ñ+2Ò-1Ô01Ó).É$+Ä)/É).È+1Ì-4Ë.4Ç.4Ë/4Ï-4Ì,3Ë,8Ë.8Ê,6É*4Ç+5Ê*6Ë+7Î,;Ï)8Ì*8Í*;Ñ(:Í'8Ë*;Ë)9Ê'9Ë'7Ì%4Ì%7Ì#4Í$6Î"2Î$6Ð&:Ò&:Ö&8Õ'?Ô(HÓ!+Í0†ÅHÆ’N¿ŠPÅVÍ–]Ø UÍ™F¨t:c=Že6_5y^5yZ3~]7ˆ[;‰[D’aEŸfN¯oUµo[»qZ¼v_½zb½xc¿zgÅa¼}O©hP®fY¹o\¼qa¼rf¾zqƒvÅ‚qÄnÃ}kÄfÀwc¾r`ºgZ¯gT«wP¸‹U¿SÖUÊ‘'th7¨j7«q:³x=·@¸C»‰E¿IÁ“F¾ŒDº„Jµ~9˜f=¦oqÁ˜Ïªh³6ƒhH^I3+$#'9QbÞ?EÐ/.Ì(#É&Æ% Æ&!Ä#Á$À(!Å)Å* È*!Ä) Æ("Ã%!Â%¼#¼#½½CV«X›zI£}g»‹Í¤gÅ 8Q½1+Ç-,Ä**Ä')È$(Å#(Ã%)Ä&,É'-Ê(/Î)1Ï)1Ï*2Ò+2Ñ)0Ï,.Ï'*Æ&,Ã+0È+/Ç,0È.1Ç14Å/2È/5Ì-7Í.7Ê,7Ë,6É,7Ê+6É+7É*8Ï,:Ò,=Ñ*:Ð+<Ñ)<Î(;Ì'5Ë(8Ë(8Ì&6Ê%6Ì$8Í$5Ì#5Ë%8Î&9Ð5KÕ.AÖ&6Ó&6Ñ'FÒ%@Ö2}ÈKÇ—OÀPÆ”SÉ“YК]Õ¡aܪaÝ«WÉ–N°}DŸo;Žg:‡`2z[.nR4uW8\>bG iM§jV°sY°s_¸wlÇdÂT¦pCŒWEšYQ¯e[ºl`¾r^¹n^»pg¾vf½ub¾yfÀvfÂy`¼p[²iVªmT¬~O±ˆP¼‘SÁ–TɦVÐ%sc6©j<¬p>µw@¸@·€@»‡A¾FÖIÀ‘H½ŠKµ9“d7¡kl¸„Ñã¿ÎéËÆ£8‡oN^ O:,)#SatÜ@EÑ3/Í,(È*#Ç/(È0+É&#Â+%Ã+#Â.$Å, Ç+#Ç*#È(#Å&"Â%À# ¾#À!Á))ÀY‹“L“mP¬xÄuÎF{®-(Æ++Ä)'Ã%'Ä#%Ã%&Â&'Á'+Ç),Ê(,Ì).Ï+2Ï+1Ð+2Ð*0Ì+/Ë'-Â)-Æ-1Ë-0É-/Ê-1É04É.4Ë/5Ì,4Ì.6Ê,5Ê+5È*7È-9É+9Ì*8Í*7Ï*:Ð,<Ð)9Í)9Ì)8É(6É'6Ê(8Ê'6Ê'8É%6Ê%5Ë%7Ì$8Ë';Ð+8Ñ%5Ñ&9Ò%6Ñ)TÔ6ÉMÈ PÅ’SÈ—RÉ–SÌ—VÑ›[Õ¤^Ö¦_Ù¬bà³bܯXÑ¢RÀ‘L¯~C›g(TK$IF:|V?ŠUC”[Hœb]µskÅ„c·„MŒ2Zp#GO6xUE–aG¡_P­bVµmX¶pY¹s]»s\¼pa¼t`¼q[¶n`ªkKŸiU¬{V±ƒO³„R¾‘WÆœXÍ­UÑ¢&xi:®q;¬s>·€B¹€A¹„C¾ŒG‘HÅ—MÕLÂE²~0…]9šgD¤p†¹ƒÐݵÚëË¢Ó±I”y#b_ !N<+&%$JU¤JTÞ/.Ë)#Ç'!Å4/Ë>9Í52Ë0*Ê-#É.#Ê-"É,"Æ*"Å& Æ'"Æ'"Á"À!¾$¼ ¼CV®M‚sA‚e`¯ƒ…Ë£e»Ÿ6F¿'%Æ''Ã$$À$'Ã%'Ä&(Å)*Ê).Î(/Î).Ï)1Ï+0Ñ*0Ï*3Î(,Ç(,Å+0É*.È-/É.3É.1È/0È.5Ê.5Ç+1Æ+4Ç)6Å+5Ä+3Æ,7È)9Ë*:Ì+;Î*9Ï)9Ë*:Ë+9Ë'7Ë'7Ê'6Ê'8É.3Ê'8Ê%6É$4Ê%5Í$5Î%7Í&4Í&8Ò';Ò$AÓ@¯ÁP̘SÇ•QÉ™S˘S˘UΛYÓ¢\Ó£\Ö¦[׫bÙ­gÛ²eݵgÞ¶`دXΟD¢ƒ=†y?sA‘mGoIžqDƒm4_h$OC SY$Gc>€mH›jS­oT±jW±gX²jU²jW²iZ°lW­oN¤kFaC—eV²|U¯}N³„U¿‘YÇXήWÒ£/€q?´t>°yB·E¹„E»†D¼‰KÁ‘L”MÂ’OÓDª~2b=˜gB§rD¥rl®w°ÊœÚçĤѫQ¨5€o3U D/'!;LSÉ/1Ò&!Ã"À+$Å@;ÊJKÎ<7Í,"É,"É-#È+Æ( Å&Ä$!Ã$ÀÀ ½#· ¹('¿Ls—AweU¦vÀ›qÌ™IŠ­$%Æ$&Â"%Á!(Â%)Ç%)Æ).Ë)-Ì(-Ë*.Ì)2Ê&+É).Ë)0Ê',Á',Å,.Ç),Ã,0Å-0Æ,.Ç,0È-1Æ*2Ä+3Ã)3Ä(4Å+8É*7Ê*9Ê)9Í+9Ì(8Ì'8Ì(:Ê*9Ë(:Ë'8È%5Å'6Æ$3Â(5Å'9Ç$5É%7Ë%6Ì#7Ï%8Ï%4Í$6Ï"/Î4‚ÈSЙVÈšXÍUΚUÌ—SΜ[Ñ [Ó¥_Ó§]Õ©^Õ«cØ®g×°fÙ±cÕ°bÖ®\Ò§[Ö¢eá²cÛ±cØ«`Ö P´‡ @##)+-< C*Q'K^:wkH™kM£lK§oP¬vQ¨sTªqHœdB]H nY¶€X°}R´€WÀZÊžXÏ«VÑž0xC¹x@³{Hº‚E·‚F»ŠI¾LÁ“K–M”OÀ‘<™ƒ4‡yBr?¤rC°}E­xS¨r…¹†™Å”ŽÈ˜a¹†4‡fA\ G3.O>BÖÀº¹4-ÆMKÎC<Ï/)Í,%Ê-$Ë*"É'Ç("Ä%#Å$ ¾ ¹#» ¹ º8A¸P€IpmÁ—•Ï«oÇ7a¶ Ä$'¿"&À%+Ç&)Ä',É(/Ì'-Ì,0Ð@LÕ;GÐ%,Ë(-Ã(,Â'-È).È*/Å*0Æ+0È)/Æ(,Å*-Â*2Ã+1Â*3Ã)6Æ*8È+7É+7È+:Í*6Ì(8Ë):É*;Ê)6È(6È&8È&6Æ'6Ç%5Ç&4È(5Ë$3Í%6Ì%5Ë"6Î#7Ð$;Í -Î(XÐKÉ®TÉ–WÍŸ[ÏŸ\Ñ¢XÏœUÏXÓ£\Ô¦bÔª\Ó©`Õ«iزhÖ°j×±bÖ¯]Ò¬ZΦ`Ñ¥gÖ¯hÔ«fÔªbÒ¢XÆ;J"'%&,(0DEœhK¨pP¯tQ°uRªrR¬qF eHžcR¯u\¸Zµ€S¶UÀŒZÈWͪVÑœ,|{?³rA²{G¹„B¶Fº‡I½ŽI½‘MÁ—OÅ•Gµ‹"Q},p~C›r>ŸmD®xI¶€J±{IªtT®vnº„c¸†A¡w2…jM]I6,,3ƒ8=ݾ³ µ@:Ê>7Î0(Ï-$Ê+"É("Ç' Å'"Ä$#Ä$!À"!½!º#¾# »#½'ÃKg¯I{tQ™}ˆÃ¡…ÉY«£%.Á#'Á$)Â&+Ç'+È*1Ì+.Î(,Ê*-Ê,.Î-3Ì(1É),¾),¿&*Ã'*Ã)-Ã)/Ã+/Å*-Ã(+Á)/Á)0Â(/Á*2Ç+4Ë,9Ê+9Ê+8Ê,:Ë*:É(9Ì)8É*:Ì(6Ë)9Ì%6È&6Å(5È&6É&5Ê'4Ê%5È$3Ê#2È$5É$6Ë"0É$EÎF¶ºPÉ—SÇšWÍœXÏŸYРYΞVÏ[Ó£eÖ§hÔ©ZÒ¦aÕ¬j×±hÕ°eÕ°]Ó­[Ñ©YÍ¢_ѧgÔ®kÕ®iÕ«`Ѥ^Е)bZ"&$\QN¬iO­qS³tU¯uT°wL©qGžlO¬xU·[·]´T¶„UÀVÅšXΪ\Ò¢(tr>­mA¯vE³}A´€Fµ„HºFºG¹ŽJºŽ*f…a(YG™Š;˜rC¨tG±}Q·…N·ƒK³~S²}a·ƒ‡ÈŸ’ϪU¡~!Z_ N8*$;C=Bѹ­2*¿=8Ë-%Ë.%Ë+$Ê(!É&!Ç("Å#"Ç" Â" Á"!Â#Ã$"À"!¾,+Ç:>ÌLq™Jqt¼–˜È£rÍ :eµ!Á&+¿%)Â',Æ).Ç)+Æ%*Æ'-È(.Å&*Â'*Ã&*¼',½'-À&*Á',Â(,Ä',Å'+Á(.Ä*1Ä)1Å(3Æ*5Ë-8Ì,8Ì,6Ê+7Ë,9Ê+8É*;Ê'9É*;Î+:Î)8Ë&6Ä%2Â'5Æ'6Ç&5Ç$2É#3É"1È#5Ë$5Ë ,Ç%>ÌJ®ÂQÈ›QÖVÊœYÌ›WÌ›WРXОWП_Ò¢iÔ¦lÓ¨bÒªfÔ­iÕ²hÕ³bÔ¯[Ñ©YϨZÍ¥`ѪcÒ­jÔ±aÒªcϤ`Ñ›?’r% !$0xaS±rQ±uQ³vU°sS®sL¢iI¡jQ²yV·^¶€V²~Q´ƒVÀ‘UÆ›VË©YÏ#nf;§n=©y@¬y?®wA¬{B¨|Aª‰A±2†¨ “g"y6€”@™zBžlB©sMµ~R¼†O¹ƒK´€m½ˆÆß¶ÚëÌÂåÀm²’,of6W?+':Vƒ=Z½! ¿µ2*Æ1+Í.%Ì)"Ê( É'!Ç'!Ç! Ç!Á" Á" À!¿ º»..Ç52ÉBNÃ]”‹U§€ŽÃš ×°W§¥$+Â#&Ã#(Æ$'Å'/É(/Ç%,Ç(-Ç'.Ã%,½')»*.Ä(+Ã&,À#,À',À(+Á&,Â'-À*.Ã(/Â*1Ä)3Æ,8Ê,8Ì+6Ê-8É-8Ë+7Ê+7Ë,>Î+>Ð)9Í'4Æ(=Ã$6Ã$2È%6Æ&4Æ&2È&4Ê)2Ê"3É"6Ç)É AÍH¦¾YÉSÁšUÉ¢Y΢WËšXΟTУSÏ¢VФ]Ñ£jÔ¨mÔ­gÔ­kÕ°k×µnÖµbÓ¯WЧYË£^Í¥`Ò«`Ò­^Ñ«`Ñ©aÐ¥]РPµ…?O1 +;‰cR³sR³uS²tQ±tMªqH¥rM­vT¶|Z¸€`¸…U±„R¶ˆWÀ‘VÅšX˧X̘!d^1b3g7—k;›m;œxA«™D¶¹@¶Å/ÄG¸™uHŠ;–Œ?štB¥sF¯zM¸†Q»ŠN·ˆT·‡Ä–ÃÕ­ÚæÉÎéÊÀŸ2~qHb H* @>Š}Aƒ/J¥*/³30Ð/&Í(!È' É% É$!Ç!Ä Ã!#Ä!!À À!!¿ !¾($Å12Ç1/ÊIX¸V—€l¶‹¸Ó³Ì¥;j´! Â%*Ã#'Ä%,Å&.Å&*Á&(¼'+º%(·--Ä32Ê,-Ä'+¾$,¿%+¿'-À(,¿(-¿)/Ä(1Ç*4È+5Ê*3Ê)3Ê*6Ê,7É+6Ê*9É+9È)8É(8È&3Â&5¿'6À%3Â'4Å'5Å&4Ç%4Æ'4Æ13Å%1Æ -Ê(YË?«¶O¿šUÀ›ZÈ¢YΧ`Ы\Ï¥]Ï£WÏ£UЦXÒ«hÔ­qÕ­tÖ°mÕ²rÖ´q×¶s×¶^Ó¯X̤WÈœ]Φ_Ϩ\ΩZѪbÓ¬cÑ©`Ï£WÂŽ8‚hCS@&-BkV±vW²zP²uP²wM«qN±yQ¶{U¹[¹‚[²|R¯|S¶„U¾UÀ‘VÄšXÇŽ+ks4Ž„.…5–‰8£ ;´ºB¿ËA¼Ë?»ÇBºÉ4–É#I¿œŠ,q“;™‚BŸyD©wK³|P½ˆP»ŠPº…Qµ„u¸‡Ç×°ÞéÍÖëÐÉ«>‘t*Zf C(@TF¢‚P©ˆR¡=@Ð/'Î("Ë% Ê%!È" Å"!Æ# Ã"#Å#%Ç$'Ã"!¿ ¼%"Á0*É..Ã-)ÉKk£W«~‘›­Õµi·ª*<Â#&Ã'+Ä&*Å%*Â&*À$'¹'+¼43É64Ì50Ë./Ç)/Ã)-Ã'-Â'-Â(-Ã&-Á*0Ä)1Å)4Å*2Å)2Ç*5Æ*7Ç,8È,8Æ)5Ã)6À(4Á&4À&4½'6À'6Á%2À&3Ã&5Ä&6È&2Ç$0Ç&3Ê)EÏ1vÅ>«£H³“P¼™XÅŸd˧lЫmЪhÏ©bѨ_ЪeÓ­lÕ°tÖ°tÖ°vÕ´sÕ´s×¶yØ·yÖµ\Ó¬WÆšZÆ™^Ï¥_Í¥]Ì¥^ЪgÒ­eÒ«_Ц]ËšM¬{?‹i/ca#E#!(;J¥m[¯oZ³xP°vQ±wM«rR´{T¶{Uº€\¹U®xQ«yW¶…U»ŠT½‹VÁ–\Ç1Š™?ÆÐ8»Ç=ÀÉ>¿Ì9¿Ê>½Ç@¿ÇB¿ÈC¿ÈAºÊ4ŒË!B¿–=“7“CœB wE­}N¸ƒP½‹O½ŒM½ŽN·Š†À’Õß¼ãêÑÕèÍwÀ™?™o$Ta=45osR¡†W”HMË1*Ñ'!Ê$!Ç%"Ç#!Å"Æ"Á# Ã#!Æ#!Ç! à "Á""Á)(Ê,-È&)È03ÂT—^²‚µÐ­–Ì­Cy­ 'Å'.Ä'+Ã%)À%*¿&*½03Ë;6Ì;6É:4Ê62Ê,/Ä)-À*.Á(,¿(,¿(0Â*1Ç*2Æ)/Å'0Ä)2Ç+5È+8Ç*5Ä(7À&5¿#2¾'3½&2»&1º)5½'4½%4¾#2¾$2Á'5Â'9É,SÓ4qÏ3z²8•A¨K´—S¿šXÅžhͨvϪ€Ñª†Ó¬~Ó®Õ±‚Õ¯xÔ°sÕ°nÓ®tÒ±xÕ³s×¶}ظuÔ´\ЮXÅ›ZÈžZË£\Ë¢^˧dΪfЩeЪdÑ«aÑ¥W½O¬}Is7ye.G&!!*AL¥iR²tP³yQ¯yP®yK¬xP´~S´}V·„U®xM¤pQ¬{T´„S¹‰WÁYÇŸ[Ë”1”™DÑÕ@ÈÊCÉÌDÅÉ>ÃÈAÆÈCÅÈDÅÇLÆÆDÁÈ@¾Ë4Ì ;»#ž/o™Aš@{E©|MµL¼†N¼ŠO¾O¼‘T¸Œ’ƘÔÝ»ÚàÃÇŸL­|A˜p@\F,vN–Šd¡“N\Ä50Ö"!Ë"!È#"É Å! Å" ÄÉ#$É#%È#$É"%Å!"¾"#À&(Ä(+Æ&$È?Z­O¢zvª†¸Ïª·«*;¿$)Â)/Â',Â$+¿(-Á-/Ç81É<6Ë>:Í:6Ì25É'0Ã$)¿&,¿%-¾'.Â(/Ç+1È(0Æ)2Ç+3Ê*5Ç)5Ã)3½'2»'4»%1¼%/¹&3·'3·)6·(6»'4¿&7Ã(9Ê*@Ñ0iÕ9…¿+c™/pŒ;˜B®“M¼™SÀ™]Çžk̦}Ъ“Ó­§Ø²«Úµ­Û·ªÛ¶“Ö°Ó®xÓ­vÓ¯uÔ³qÔ´yÖ¶kÒ¯YÌ«UÅœXÆžVÆXÉ]Ë¥gÏ©cЪhÒ­gÑ­cÓ©\ÊS½Q²„L¤y;}i,M( #@IŸcP²sQ³yP°vN¯sP±tV·zS´}W³~Q¨tJ¡mQªwTµƒU½XÕVÆ¡WÉ”1’˜JÏÒEÆÇDÈÉFÇÉAÈÊBÈËJÇÉÓÈ¥ÙɆÒËmÏËSÇË0€Ë#ª/†5ƒ‘H „I§zM±}K·MºˆN½ŽO¾‘O¼[¼‡Ã–“Æ›h¼R¸‹M±};‡n)i •6Y–l¬’Yo½<7Õ"É Å""ÉÃ!!Ä#$Ç "É!#É%$È$#È#&Æ $Á $Â"$Â$&Å"'Á$&¾Bp—Q }}–’is·*4Ç$,Å'.Æ%,Ä'/Å)0Å(0Â//Ã63È84Ë62Ë/3Ä%+¿%+»&'·%*¹(0¿)/Ã*0È)3Æ+4É-7É)3Ã(3Ã(7Ã)7À&3¾'4¾&3¼'4¼'2»(6Á+;Å'5É&;Ë,GÇ-R¸+P›4eŽ7r0y‡@£ŽIµ•P¿šUÚ^É mͩЬ’Ò«­Ø±ÀݹÉàÀËàÁ¹Üº™Ö²ŒÕ¯€Ó¯zÕ³{Ö·sÕµcѯUÉ¥PÀ“UÄ—TÖ]ÇŸbÌ¥iϪgÒ­iÒ¬hÒ«cÓ©_ΠWÓW¾ŒS³‚K¤t5rg?$ @B‘aQ³nO²tQ±rN³xP¶zP´zT³{U²P¨yH¡qM¨yQ³„Rº‹T¾‘VÇ¡WË•8”ŸNÐÎHÇÇGÉÉFÇÆAÆÇ=ÅÇjËÇ¿ÚÉÅÚÊÄßÍ·ÛÍsÌË?±Ì%T l T…I –H¢}D¨zG±J¸‡L¼P½Q¿‘S¿X¾[¼ŽV¾ŽUÁS½‡Kª|":i nTˆ†b}³I@Ö#"Å Æ$!É Ä! É##Ë"$Ë!#Ë%$Ê"%Ê#'É!(È!%Ã!$Á $¿!%À$¾$'¹:WªEN¾&À#'À#+Á&+À'/Á(-Ã(.À).Â(-Ã*-Ä00Ê-.Ç(/¿#)»%,»)/Ã)/Â+6Æ*2È*3Ë+5Ì+6Ê)4É(4Æ*6Æ(5Ä(5Â)7Â(3Á(7Â'7À(9Â):Ä+?Ì5\½H{6d‚0]+T‡0Z‡H†Œ.eŠ@—ŽOµ”\Á•bÅ™mͤzÒ¬Ъ…Ï©©Ö±Ëß¾ÙãÉÚâÉÑà´ڶ–Ô¯‚Ò°}Ô´‚׸oÓ²]ЯSÄŸM»ŒRÁ’RÄ–WÊ¡[̧bÏ«fÑ«gÒ«gÑ©fÒ©bЦ]Êœ]Ä”WÁT¶‡Išs)X] 8 ?9€eP³qQ²vQ±sO´vLµww´yš²{r°}K©uJ¦qM¬{O°~Q¸‡R½ŒUÄœSÇ’8”°QÓËLÊÈMËÈMËÈMÊÇKÈÇ^ÉÇŽËÄ¢ÍĽ×ȹÖÌlÆÊE¾Í/tÊ rd7rH…C¢zCª{I³‚I¶…K¹ŠO½Q¿‘U¾’W¿“V¿TÁUÂQ­ŒQ'-/RfhªMIÖ É!Æ$"Ì#"Ì É"Ê"&Ë"&Ê""È!"È"$Æ!"Ã#$Â!(¼!&¿ &Á&À#¾ À #À '¾#)Â"(À%,Á)/Æ&-Æ%+Ä(/Ã'.Â'/Ä&.Á%*¿&+À(0Ã&.Á*3Ç+4È)4Ë)4Ë+5Ë*5É*6È,4É+5Å)3Á*7Â+7Å*:Ç,<Ê)9È%8Å):Æ-AÐ6¥PŒl«‹J‰=‚6v“(M‰.[x3s7‰‡AžQµ‘]Àš`¿™^º—|Ì«{Ï©šÒ«¾Ø³ÍݽÔß¿ÑݽÂܹ¥×±ŒÕ±~Ö¶€Ö·hЬ_Í©M¹ŽMº‹RÀ‘RÅ—SÊ WÌ¢]ͧdÏ©fÒ«hЧfÒ§cÑ¥`΢]Ë[È•ZÁQ®~@Šj0G61kXQ´pP³xO³uQ¶yR´y¦´|³³~™ªsH¦sK©{N­|P°P·‰T½WšSÅ4’©LÐËKÉÄSÎÇVÎÇZÎÇ`ÐÉdÍÈlÊÅ…ÍÄ“ÎÆmÇÈIÃÈDÂÌ6”Ì!9¨‰!6G…S „AŸ|A¦zF³„G·‰J¸‹N¼‘P½“P½’TÀ’PÁO¶5` L8*H]ŽŒ]hÌ$"ÉÁ#"ËÂÅ !Ê!%Ë %Í!$Í"$Ì"$Ê #Æ!%Ã")Á &À%½ )À'À&½&º (¿%+Â'+Ä(0Æ',Ä%-Ã(/Ä&.À&0Á(0Â'0À&-Á%0Â&0Å(0Å(1Ç+6Ê)5Ë+4Ë,8Í*6Ê+7É,5È)6Ç&4Ä)7Æ+;Ê*;Í'9Ë);È+=È,BÕ%8°30W_~»žMŽ‚BŠ~;€€-Zx/drN¶‹E¦„=›|V¼—Z¾—H­†Gª‡ªØ¸–Õµ{̨ŠÏª‘Ϫ¨Ó®ÆÜ¹ËÞÀÁÝ»¤Ù¹…Ö¸uÒ²bЬ[ÅŸE«~M·„O½ŽMÀ‘OÄ—TÈX̤aÏ©gЩfШeÑ©cѪaЧ_΢_Í [Å–U¹‰L¤v.WU*!F@N¯rO²{O³{S¶|N³}u°y–¥qh¢mL¦uM«yM®{PµƒS»‹WÁ”VÛTÆ‘/ŽšGÍÍGÈÅRÌÇVËÈ]ÎÈ€ÑɲÙʶ×ÈÄÞÉËßÊ•ÑÉ\ÊÊFÅÌC¾Î/e¾™)CQŽSŸ„Dž{D«zG±~Iµ…M¸ŠN¹‰N¸‰N¹‹G¡2Y™“‰)-…6Xbª21Ë Å"!Æ!Á #Ç!#Ì #Î"&Î!'Í#'Ë"'Ë &É!$ %Á$À"%¿"'¾%¼'»'½#)¾'+Â&-Ä&.Â%,Â%.Ã&.Ã&-Ã%-Å'.Å(0Å'3Æ%2È&2Ç(4Æ)5Ë)4Ë)5É,5Ê,6Ë)4È*6È*4Ä*7Å(6Ã*7Å*9É)7Æ);Ä'7Æ%>Ê9|Ã.`3w7n`ŸŽY§N‡@‰ƒ)W|6…y^É•H¤„>ª‡mÓ¯U´A°‡qÍ©³Ü»½Ý½¨Û¾{Í®wÏ­˜×¶¾ÛºÔàÅÒàÄ´Û¼ƒÕ´jÏ®aЯN²ŒA¤wH¯~Kµ‰J¼ŽNÁ’QĘUÊ ^ΧbÏ©aÏ©bЦaШ\Ï©`ѨdѪ^È›ZÂR°z9r_,')J¥hR´xQµ{T¹}T²zM£oI™iN¢qO©wL¨yL¨xO±Q·†U½UÀ–Sˆ+‹œAÊÏ?ÅÆFÉÇJÊÉMÊÉ\ÊɆÍÉ“ÌÇ£ÐŹÕÈ¢ÐÈtÍÊRÊÊMÊÎ3vÀ •”$—>x“[ªŽT¤‹Až{B¢tE«{F­F«‡B’Ž5e”&7›Ÿ!¡#"¦#!¤1O¯3Y "1‡FxUo¾&$Ï ÁÂ!#Æ#%È"$Ê"'Î!$Î"$Ë"(Ë#)Ë#(Ç %à &Å!%Æ#+Å",Æ)à )Ã&,Æ&+Ä&0Ã'1Ã%-Ä%0Æ&3Ä&1Ä'0Ç'1Æ*3È)3È(3Æ*5È)4È(4È*2É*6Ë)2Ê)5Ê(7Æ)5Ä)7Æ)9Å(7Å*9Ê*=Ë*:È".Å%IÅ[§ÄkÈ·K­ª=’§+^‘5ftH†zJ=‚€*_s>{fÆ–K®„ZÅš`ÅšJ¸lÑ«®Ü½–ϱ Õ³½Ü¼¶ÚÀb¸˜{ÄžºÜºÒÞÂÍÝ¿ª×·}Ó°eϪ_ȦD¤}C®‚H²‚I³ˆH¸ŠK½MÁ’QÅ–WÈœZÌ¥Z̤]Í£_Ϧ^ЩaϪeЩcËŸZÆ“U¸‚Gh!;)@^SµwR¶~T¶|P¦sGœkH¡nM§vM¦{L¦{L¨xMª|N®Q³…R¶‹Sº€*‰ž<ÅÏ:ÀÆ<ÃÈ>ÃÇBÅÈCÆÈFÁÆMÂÆRÃÅ`ÅÅaÅÅYÇÈRÅÈMÁË-a¹ š$%›3a•P¡‘Iˆ–+TŒ)R|/d€._ˆ,O%1•˜–š š"# ""ž/J¤3Z”!4ˆ1c’Z£¥H[ÈÈ"Ã!$à #Ç!'Ï"(Ï"&Ì"(Î%+Î")Í"&Ë#)É",Ä")Â$,Â"+Á!)¿",Á$/Ã&-Â'3Â(3Â%.Ã%/Ä&0Å(1Å'1Ç(2Ê(3Ç)6Ê(5Ê*7Ê'5Ê(4Ì*4Í(7Í+5Ì*7Ê)9È*9Ç+<Æ(:Ã)9Ã*<Å(7Å/Â;fÀˆËÅ¡ßÁ‡Ì¹kÄ´U·«@Ÿ A•8gr<}x0^t!N,li~Ì›K }OŸxCrI¿’–ߺ°Ü¼Ò²¢Ø¸‡Ç¤‹É¡\»’sÆ¢µÚ¸½Ø¶¤Õ³‹Ô±tЩ\ͨG©†<¢tG¶‰M»ŠL½I¼I¼N¿‘NÔRŘTÈœYÌ¢\Ϧ_ШbÓ­aÓ®fÑ«eϨ`ϤYÂ’N¢t";@-3hVO­mS·zS²xM£mG¢nL¬vN°}N°{O°zO­xN­zL¯~M­}M¯P¸€0‡š>¿Ì6¸Æ7¼È6»Ç9¼È8¾È<½Ç@ÁÆBÄÇHÄÆJÄÆIÆÇKÉÊ@Æ$9¦"&™!'›+$0˜-H–+?ž ,›'˜!)š'—#–"–!'ž '£"#¢")¢&,§%(¬(5ž(C‚$>ƒ0`‹O¦¤]±µÆ#0À$B½i¡Å³ç˽âůֿ Óº‰Î¸rʹV¶¬N¬¡Yž‘3os&QqEr*iwY±ŽE£ˆIµ‘fÄ¢ZÄ›a¾‘X®~„ЧºÚ»gÆ¢dÀ–aÇœ{Ô±’Ñ®‘Ñ­„Ò®vΧ]Í¥L²•B˜vLªFµˆM¾‘OÁ”OÄ—PÄ›QÅQÈžRÈŸXË¢aÏ©_Ь_Ò¬bÒ­eÔ°jÔ±lÒ¯iÓ¯_ËŸTµ.UR 0(DUF”hP°uQ«vJ¡nK©xO²€R¶ƒR·„R·‚S°}P°~L¯€O­N±„O·€?†’K¾Ê:´Ã5·Æ3·Ç5µÈ7ºÉ9¾È<ÀÇ?ÄÈEÃÇGÃÇGÈÈAªÆ.W²%2¡(7©'3­&5©#1§#.¥%3¤'>¨%9ª%6ª&8¨$8¨%5«)7¨&3©(3¯'2¯&3¦&9˜'@(Pt0n9‰R®­fË¿kÇÁ?nÁ&µ´¼ÆÊ Ë ËÌÈ!%Ã.N¾Buµ„ˆZ¶­rËÁ€ÔÇ}ÛÉg½ÄK‹¹9bµ0O·8A¹>4º,<¼;XÀBu¾?§R¹—rÖ§tÚ¯Z±³-J¬§#*¶,5Á'0Á&-Â%/Ã&1Ä'1Ä'.Å(2Ç(2Ç)3Ë)3Ë+6Ê)6Ë*4Ê'5É'8É+6Ê*3Æ*7Ç+:È+7Ä"-À(H¿`¥Ä¬éËÉèÉËßÅÄÝÁ¹ÛÀ»Ú½½Û¾¶Ú¾«×¼˜Ð¹Ë¶q˶R¤ž/fs:‡„7‡‚E£…Qœ޼¯Ø¹ŸØ´ÂäÆg¼žQ±dÀ‘|ÊŸ„ΩPÀ“\Â’oÉŸkÌhÖ ;…u?Q9ƒG¢„P­‚J´‡H¹‹OÁ’PÆ—SË UÍ¥WΨ^Ϭ]Ϩ\Í¥]Щ`Ò­dÔ®jÕ¯sÔ®sÔ±mÕ²hÕ°]É”?z‡%1x%9k4k…C”…E›lH¤pL²~Sº‡XÁYȘYÊ›XÇ™YÇWÇ›YÈšVÅ–RÀ‡9“)O¶&L³%W°1W±*Y³&b´,j¶-v·.yº2t¸1bµ*I¯'A¯(C±-Iµ5N²2J³/L·0N¹1J·.M¹0Q½0N½0Q¼/Nº1M¸0Kº,E¹,Q¤;ˆ™Y¿¤vØ´‡Ú»„Ù»a¸›?ŒƒJ“‡X±¥nȽ„ÏćÐÇÚÊœäΜãͧáͲÛ͵ÕϪÙͳáË ÞÇ_´I¢™U¨ŒiÁoѪsÒµd›¹9U¼/:Â)2Á'0¿%-À&.¿&/Á'1Ã&/Ä(2Ä)5Æ)3Ç(3Æ(4Æ'3Ç'4Ç)7Ê+9Ë*7È+6É&-Ç&;Æ@zÂÑÊ©çÈ­ÚöÚÁÂÝÁÃÜÁÀÞÁ¼ÚÀÂÚÁÂݸÚÁ«Ö¾¡Ó¼ÒºŠÚÂ^¥¤/ct5v{B €mÊŸ¶Ý½¬Öµ®Ù¶ËÞ¿¢Ý¾X¿“S²‚f•^Á–I¸‰\ÑkÑœbÅ™=z‹ _t)eŒ=–‚I¨‡Mµ‰I¹ŒO¿’MÅ™RÇ›SÊ£VˤWͧ[ϪXÍ©[Ъ^Ñ«eÔ°jÕ±pײoÖ²mÔ²iÕ­[Á›’2{ƒ>•E¨‚G´†K»ŽMÔQÆ™PÈSͤTÌ¥XϪXÑ­\Ó®bÓ°iÔ¯p×°lÖ°iÖ±kÔ°cÐ¥Kš¤5[¶0M¢.Sn7tk>…y?Žd@’`D™hJ©xQ¶R½‰VÓYÉ YˤZÊ¢VÖU•RÃŒ :§-W¿,P¹,T·+W¸+Q·*N¶*P¶*Mµ,Lµ,K·-L¸0O¹/P·1L·5Pº4L»8N¸5J¶1J¹2Jº5Lº3Jº2D¸.@¸-@·*E±7sW¹ €Öº•ÚÀƺ^®Cl£=o–K–ŠM—@†‰U¯«vÉ¿ÎÄ‘ÏÆŸÓDZÕÉ»×ʺØÉµÕȱÓÇ­ÔÆ©ÓÅ£ÒÅ–ÐÃuËÁU¼ºH¡¡IŸŒZ¶”i¿zа„ÓÉ>g¾"#²!¯#'¶&-¼&,¾%)¿%*À%)À%%¾&&¾'+Ä)+Ã'(Á(0Á,;¿+<»1^´XÁºzÓ¾„ʺŒÏ»žÓ»¹Ø¿¸×¾¤Ô¼¤Ó»­Ô¼³Ö½¶×¼·ÖÀ³ØÀ«Õ¾«Õ½¯Ö¾³Õ½ÃåÈ[—B\7ZA•~زœÐ²fÄšV½—@›vVµ€g¾—b³‘S«‘UžŸ8YŸ"5œ#:¤$@§ 5¤&=¦#@¤)^˜7„ˆ;‘|E¦yJµ…M¿‘RÄ—SÈœW̦Z̦[Φ_Ï©dѬgÒ°lÒ­mÔ­lÔ¯jÑ­hÒ¦V¯¢;d¬9[µ8W¨7Xw>ydC‹oG›qK rK¡sH£uN­}P·‡U¿‘YÇœXÇŸYÊ¢XÈŸXÇ TÄ!E«.^½)Tº)Y·'U·#W¸%Q·*Qµ$P´&O³%O¶'P¶)Q¶)P¸)P¸-S»+Q¾-S¹-P¸)Lº*N¹*K·)K·(E·%?³%H­9Ž]ˤ~ܸ‹Ùºa£­-Kš'•“0?‹ŒH =˜‹U»ªyÕÀŒØÃ“ÙÄŸÜŪÞůàÇ«ßÇ§ÝÆ¡ÜÅœÝÅšÜÅ–ÜÅÛÃ}ØÂgÓ¾SÈ»J»¯F¨O¯Y¼”gÓ¼WÕÎ?¢Æ-eµ#D©!B³#Eµ%Kº&O¼*XÁ,cÂ.oÃ/tÅ0rÄ2sÁ/t¾0p¸.gµ(Y±2v®Qµ³oε~Õµ‰×¶Û¹­ÝÀªàãܤݩݩުݦÞÄ ÞæàñáÄ»äÆÎîÍ£ÖÄAhFp6œvݰnѬtÓ­‡Û¼hĶ/vž)Y(T£%N£!H¥B¨!I¤:Ž"J'Pœ$J¦#J¬ Hª'` -~Ž6’wA¯zGÃŽMË—PПW׬]Ù¯\Ù®]Ú©bܪgܱgܳfݲfݱdÚ®S¸®4h±-Y¹7h¿7cº1V‰8xs@œsI¨tM°vP³{IµxL¸{N¿„RɉYÑœV×£UסUÔ VÑ QÎ54¢KE±F=¬N@¶R;¸Q;¾Q<¿T<¿R;¾T:ºU:¼U;¾U?¾V:½V7¾W7½W7¿V7¾V5ºU4½V/»W2»U4ºS3»R.·WO¯v‹¬›¼˜½~x¹N&ªE¥G¥F¥H¥a_¥jt¢gs x޵™¿šœ¿ž¿¥ ÁªŸÁ¨žÁ£ŸÂ¦ Ã¤ŸÄ£ Ä£ŸÅ¢žÅ›œÃ’œÂŠ˜Á|–¿z˜Äs‰¸etšl†°r‘Éo–Ðs¡Òp ÒhÍi„Ëi†ÊjŽÍn‘Îo”Ïm•Îj“ÌjÊeˆÊeÇ`sÅ\fÂZZÁWQ¾UE¸[Yµp„¸ˆ—¼˜º”™¸—œ›œŸ•žžšžŸ™¡ž™¥Ÿš§žœ§žŸ¦ŸŸª ž²¢ž½¥ Å§£Â«§VIq@6a]up†ž‹Žœ‘³§¥®¤¤”£U@–P+•R4œQ6£M9®P8¹M2ªB0[a VZ±F4³A3ªD4™D7‰JK€PZhXl`a„kgvg”~]˜„\›‰_œŽj£wŸ¨vžŠwž‡zžŠvˆr’ˆ]\ŠP9ŒVA‘ZI•ZK•Tïõ,_pjgkw…„n`q|ÿ}ÿ~€ý‚„†ˆ†k6 ïõ 3brjehvƒ‚„€jar~}||}ý€‚„†‡‡…g.ïõ!9eukgn{ƒ‰Š‡|fct~}||}€€ƒ†‡††…e(ïõ=fsfdn|‚‰Ž‰|gfv~}}~€~€ƒ…ÿ‡ÿ†„c#ïõBgn`aly~…Œ‰}ljyý„ý†‡‚` îõ Gin`dp|~„І|omz‚€€€€‚…†……‡ˆYîõLjpiftyz€Ž‘}gm}€~€~‚ÿ…ÿƒ†‰|Tîõ Rmqkltx{…“{in~€~‚€‚ƒƒ„…†xOîõ Xpninx{€Œ–xip€€ƒ‚ƒ€„†…„uIîö"_snhp}‚‡”‰tgr€þ€ÿ„ …‚‚…‡†…rCîö(avpks~‡‹ŒŒƒqds€ÿ€ÿ… ƒ‚‚ƒ…‡††o<îö.avqkr{†ŒŠ‡~odtÿþ€„ƒ‚‚ƒÿ„ÿ…„m5 îö 5_sqjpz…ŽŠ|mgwƒ‚€€‚þƒ„……ƒ‚i.îö!;^rsnr|…•{kix„ƒ€~€~†…„†‡†ƒ€e'îö>cwslsyƒŽ˜—hd}„ˆ„ÿ€ÿ „…„„†‡†_"îö Fhwpipz„Ž—”|gf„‡„‚ƒƒ€ƒ„…„…†…~\íöLirlku}…Ž–wdh€ƒ…„„…ƒ€‚…ý†„{YíöRlrmnx€†“‹qbk…ÿ†ÿ…„‚ƒ†ˆþ‡…zSíöXswpnt‚‡Ž†lbq„‡‰ˆ†þ…„†ý‡…wKíö!Zqsmnu||€ˆidwƒ†‡†ƒ‚ƒÿ„þ…†‡„sCí÷%[mjfoz|~†€he|……„ƒ‚‚ÿ…ÿƒ†‡„o=í÷,_ojemy„‡€hf~Ї…þ„ ƒ‚‡…ƒƒ‡ˆ…l8 í÷ 1bpkdp{†‹‡~segzþˆ‡†……†„ÿ†ÿ…†…l3 í÷ 7cqpiqx‡‹‡|obi~ÿ‡ý† ‡ˆ†‡‡†‡ˆ†j+í÷=drsmsw„Šˆ}oahý…†‡ˆ‰ý‡ÿ‰…e$í÷Dhqpluy€‰Œ…vcg}…þ„ …‡ˆ‰ˆ††‡‰‰^ ì÷Kkqmju|€‹~ii}†…„„…þ†‡…„†ˆ†}Vì÷ Omqliv}…ŒŽmm€†…„„…†…„†„ƒ…‡…yPì÷ Soqlkx…Š‹Šon…„ƒ„†‡…„…ƒƒ†‡…yLì÷ Zqpllz‚…††nm~ƒ‚ƒ„‡‡†„„ƒ„‡ˆ†xFìø#btsmou{€†„rfoþ„ÿƒ „…†…‰„…†‡pDìø(ftqlpw|€†ndq‚þ„þƒþ„ˆ„†‡‡m;ìø/ftqlqx~„}jds†ÿ…ÿ„ÿƒÿ‚ƒ‡„†ˆ‡i3 ìø 4fvslqz€ƒzjgv†…ý„ ƒ‚‚ƒ†ƒ‡ˆˆi,ìø8gyvmr{þ€xklyþ„ƒ„„…„ƒ„†ƒ†ˆ‰i'ìø!>izxou}€€ujn{‚…„ƒ„…†…„„‡ƒ†‡†g"ìø Glxvqy€€}pel|„†„ƒƒ…††…ƒ‡„††ƒaëø Pnvur|‚}m`i|†‡…ƒƒ…‡††‚‡…‡…ZëøSvtot}‚ƒ}ƒ{d\l~…ÿ„þƒ …ˆŠ†…†ˆ‰xRëø[wsnr{|xd_o€…ÿƒþ„ …†‡……†‡†sKëø!`zrns|‚ƒ}~tbas‚…ƒ…†ÿ…ÿ„ÿ…ÿ‡„oEëù!$exoms|‚„~|o`cvƒ„‚…††…„„‡†‡‡„m?ëù,hxnls{ƒ€{m_cvƒƒƒ„…þ†‡ˆ…††„k7 ëù 5mzpov}ƒ€{naewþ‚ƒ„„…†‡ˆ‡ƒƒ„ƒg0ëù ;pyppxƒ„~{pehwÿÿƒþ„…†ˆ†þƒd(ëù?mtlnv~‚„|{rhkxÿÿƒÿ„ ƒ„…††„…„a"ëù Dlskkv‚„|{pgn{„……„‚ƒ†ˆ„†ƒ‚}ZêùKovokr|€~}|qgn{‚ƒ……„þƒ„‡……{Wêù Pqwqjltz{}|qgn{„‡‚ƒ„……„‚„‡‡†zRêùTquohglqruuldl{„‰‡†ü…ÿ„ÿ‡…uLêù Zqrledÿgÿdgddo|‚…ˆ‡ý†…„…‡ˆ„qFêù$atqjþeaYY_civ‚„…†‡†…ƒ‚‡‡ˆ„pBêú(duqkfgg`WZ_bjyƒƒƒ„††…þƒˆ†‡ƒm<êú!/dtqkhijc[^__eu€‚……†„‚‚…‡‡…†‚k5 êú 5gvpihmpgZYZ[gx‚ÿþ† …„„†ˆ‡„…h.êú=jwpiiorj_XY[gyÿ€ü† ‡ˆ‰ˆ„…€e'êú BkwpikrtneZY\i{‚€€…„…†‡ˆˆ‡ˆ……~a!éúFhumhmuvoi^[\j|‚€þƒ …†‡†…ˆ††}]éúJirjgpxvoja[[i{€þƒ„††…ƒþ‡{Xéú Poqhhs{vmjb[Yi{~}ƒƒ„…††…„††‡xQéúVusiiv}vmkd[Zj||€‚ƒ„ý…†…†…tJéú !\xujjx~vmlf]\m€}ƒ„ƒƒ…†„…„oAéô4¿üæÿáyïõ>ÉþæÿÝmïõKÐåÿ×^ïõ YÕåÿÒP ïõgÚåÿÌCïõsßæÿýÅ7ïõäæÿúº1îõ"êæÿô«,îõ'ïæÿï'îõ,«ôæÿê"îõ0·ùæÿå‚îö7ÄýæÿàuîöCÌåÿÚgîö PÒåÿÕY îö^×åÿÐKîölÜåÿÊ?îöyáæÿüÁ6îö‡çæÿ÷´/íö#•ìæÿò¦*íö)£ñæÿí˜%íö.°öæÿèŒ íö3¼úæÿã~í÷;ÈþæÿÝpí÷HÏåÿØbí÷ VÔåÿÔV í÷dÙåÿÏHí÷pÞæÿþÈ;í÷~ãæÿú¼3ì÷ Œèæÿõ¯-ì÷%šîæÿð¡(ì÷+¨óæÿë“#ì÷0µøæÿç†ìø6Âüæÿáxìø@ËåÿÜjìøMÑåÿÖ\ìø[ÖåÿÑMìøhÛåÿË@ìøvàæÿüÁ6ìø„åæÿ÷´/ëø"’êæÿò¦*ëø(¡ðæÿí˜%ëø-¯õæÿè‹ ëø2»úæÿã~ëù9ÆýæÿÝpëùEÍåÿØbëù TÓåÿÓT ëùbØåÿÍEëùnÝæÿýÆ9ëù{âæÿúº2êù‰çæÿô«,êù%˜íæÿï'êù*¦òæÿê"êù/´÷æÿäêù5Àüæÿàuêú>ÉþæÿÚgêúKÐåÿÕY êú YÕåÿÐKêúgÚæÿþÉ>êúsßæÿü¿4éúäæÿ÷².éú"êæÿñ£)éú'ïæÿì•#éú,«ôæÿç‡éú1¹ùæÿáyé@@€”Œ@„t|(1ª2Æ; ÚRS,,› Œbý Close up of a ladderAdobe Photoshop CS3 Windows2009:01:22 14:56:39Stockdisctiff-4.0.3/test/images/rgb-3c-16b.tiff0000644000212300117540000042651611244340172014144 00000000000000MM*+ª£4I5ò²‡E©KÞ¬®> FG¶Ð@Ne¹q<5SP¾Ú;ÃRQÀ<ÓRÀ¡<_T‚¾õ;ÄRî»5:ÖU ½«:hUÍ¿v;ùU‹¾Ñ?îUù¾":‹Vµ¿A7±Vp¾»7îWöÀP8XT¿—7AVè»25½Vj½à5VK»ê/ÁW¼2‘Wƒ»¡4¦UZ¼36S̸’.qR•°O[X&­Œ v…¼÷œ’޾µ£™zº]yWSªö&áNͥ͆E¾¦qGަ›ÀG¥âAHU¥Ï_ëbM£+tájä Ðtg˜¶ªŽ¥xîÀ}šm‘À›FÀLž‰žý­ ö¦˜Â„ŸÁ«¿ŸL©ÃrŸª¤CÄ7 ©§0ÅŸ£¥‚Å… Ð¤Æ) $£ßÆgžÚ£‹ÄjxœqÃTF“Â;™@‹BÀº–í}TÅ ™p{D¹›Š6t›tvfC±‡‡xlàÊ#’}r±Ñ$–½oŽÓ¡´s‹Ó ¡p¯Î„ÏhþËä…HiöËŸ‡iûΪŽùk;Ïc‘½oFÐD•5pÏC•©mûÍ_“úkT˽òk2ÊÖ‰Ff^È‚ieúÆs“`¤ÂÅfÞ]XÂ([;Ze¿#QuXI¸ÃE²U°¶Z [۸܅Uq2½/˜(ˆè»˜ÿ¼¹ši•ˆ›Á˜“–‹ OœÀ›dž°žž™´ŸçŸ(™ËŸ¢i› p¦~œûŸ‹¨ŸçŸ›§Ê  Š§8Ÿa¡7«Ÿ¢ï³z Î¦¾y£µ¨/ÆŽ§Â«¯ÃEqºIsVÎb6:@^p²uÀ]ìŒZŸ}‡i’anw¥Û¨³ß¥q¥“¯q¤i•z‘Y—aA;UŒ–2+CPP5SG¤l6ÇQt®Ò9yNº[8½Q#ªÙ3NÄ0áC:¡ b [ÿ²|[ WR³È4•G3«3CBš•4¡E‰Ï7ìEDMKfKEh§[IPíaIm_Xªl„ýa¹v¿ g¹m”ÖgÂ…J™„^B‰¯œ=\ᎨC_«¤žkB©" SxI‹\Ÿ~wuˆXŸ2ª­¼iU¹ÁÀÕåyšÄÙ?Œ½Å1Ú7“µÆy݈ŸýÆtßN«4Ⱦá¯æÈÁà>«ÕÇpÝÿ¨Æ¨Ý½¢pÅÒÞ8Æ“ÝašºÆ‹Ý­—nÄ5ÛìžÂÊÙ%~M¿\Ôdh<»ìÉ»SЯɻñK6ø¨âF‘¤°FPE”ѼÍYн[ÔgûÏ>Ö\WÅÆñ¢é?q¶of-L©¾E#W³µBˆ!¢¶wF$ »+KM%Ƚ•O'‹Y;*ƒÃ©d:,®ÄŽp(.ŽÆ5un0"Äírç0€ÂMsž2¶¿\tð/¹¹8q 0„¶±hS.O±øZ(ϯv©3´a¶R¶^Ï8oç¶GÖJ¶çØW‰Ïº…ÜcžpÁÞÖ®Äàú«ˆÃ0Ý‹¤ ÂïÞ=¥¡Ã-Þr©ÿÃAßFªgÂÍÞ ªðÅß™¦ÐĪߪ¡iÄDàù§JÅÄâβÇÆå¼„ÎïpÏÄâ×£ºiHAˆhp±G Íœ¡6˰ðÞv ¬¬ÒÌn†­¸Óìu½VÜ"ˆe·BÅKhΟ*w/‰ž3ZF)}£çT¦) ¤FNç%_¦#H™!‡©$B²äÈIÿ!³Ž©:ù«ŽHJn"ô\PÚ',¦ÍJÓ$w­£J÷#6«XHÁ ª¡d`â'ÂH~¯-£xw“>6Š{¯ëB ŽÀÃÖGš˜vÌ$M‹ _ÑP„­€ØWg°3ÚÕ]À¯zÚV]$ª Ûw]Ž«;݈bв~Ýgs´NÝ”gײñÞ¤fÀ²DÞ¶fŒ¯Û d®ì¹8T²¤iX4ɺ>YØ.À5h×7å»d`8‰øVå1sëxy8}s©œ®A.t›©6IIwG±‚N8|´gP§ySµÏJ/{¸¼Ly…À•NuŠÉÌRêœÏÒ˜Y³£é×ñW<¢6ؾVB ­ÔòU»¡_Ò!W?ŽÏHQª¨;2 H¿øWô."º9P”,·ÁT~,<¹WÖ+±¸ Qö+k·´NÈ*Í·™PÐ*s¶"MR+ µïLd,ô¸wK\,ȸøLî- ¹ÇOz0¼¸®Pq/¬¸_LS2»™PT5ú¼YM44¸÷OJ8D·¡K*6º™Jð1»~J³2Ï»2Lý5<»‰K-3I¹kDâ2йJ@D.Z·ÝA-ô±ËE©*»¯t7e¡.¹ÖX*»9×/€˜ÁhÛ•¬ºÏÇJ‚1¯Ož[_¤-lÁC©–±p=x‹r–¬L5Ž(˜ M؉œ‡)@Ь8°+UàÀƒÊ¯váÄÖÏ/Çб’6ȘԇŸäÊlÖ@²™ËØ­»õʹØãºÝɾÖM¶šÈÔ²†Ç(Õ7®zÆŽÔC©ÝưÓA¤‘ļÑÅ–²ÂËÑu¡»¼ØU¢z¢PHh0Ÿ§I–”±·¡ZžžO¿êi×±ŠÐèzÂÉÝÔ…%¾Ðgr>³?#d"Ô°Ž£!·/'#p½j-‰&¿r,9'Àw)¨%>ÁG*J%0Á2)†%m¿l%ò%¬¿·&a&rÅ"+Ç'×Ä++I)WÁó(/($Â<0(çÀ¢< ,Ǽ<¿+ìµc^o1Ý»yÁûXô¿Ô‹z‚»3Êú„š»ÜÐ%¼vÔ$žêÀ“Ù%º™¿ª×é¸ý½DÔ祤¼uÔ¥½ŒÕ®”¾(×y´¦½†×ê·+ÀÌ×j¸zÁ*Øã´L¿WÕð«Ü¾jÖf«Æ¾Ü׃°G¾4Öд™Èûåÿĸ˜"•[m]%Bb¾[28-)•˜Aá²öØü–²³Ñ„š›}Åafi—ͽÒVÎvõœ@·€¶LW>˜C¿cgÞ’b´c;‘ä¬$T7 1Ÿ~Uè Yä9œÇ5ˆ"þ¥a:ž$¨@R$줿5² 7§N=I&h¤Ò@e#“™q_)·‰~„ð7Ò}v‘õ;Dzx¦°E_…¶SK6’QÀ(M¿˜.ÄúRð2É?TN¦ËÍ—X=¦¾ÍZŸ§“Ï$[¶ªÐ_“­ÑÕe°³ÓÊh®^Ól®&Õ)n°oÔãlÄ­èÒ¶jy§IÓ–hó¢Ü¯ûWG¬Èd¾<#µ¶[è9¬©cX?8|wêXx7’däz>ÊoÀ‹œC—qx›æGÀrÙ ÓKÚt?¢>KŠv ¤cHŠ}¼®€N_ˆ.¸@Q8‘»¿ÔU°œÕÇÒYÊ VÈ‹X¸¢ÜË YÖ tÉXÕ¡È/XÒ‘qÅ7T¦šÉ>#“»V€+ú´¦L'”µ„Q’&^´uO12 ±®LÊ(²K_$q³ÅKH(j³¿I9&¸´ŒMŽ(´§@g)³½Iî(¤¹ QP-:¸jN;,r¶KKµ/KºµPZ3l¸ÞNg4`¶‰O†5ä¶TM¥3…ºœR·2tºªK834ºXJé2À»^N©1µºKB27ºÜJE0s·ÛJì.K¸®G-ð³ CY+þœÎb½/ß6­žJ]¶@ÖïrˆÀìÚTŸ¿çÛÔȺ`×{‚ú­„ÇÚt…“ ©X±‡;“×D͈òD»¨)°-QG¾^È8i®ÃÃÏí„üÇÁӒʱ՘*Ëð×M¬ËÌ7Ù„¶¼Í4Ý·ÁÁÎâYÊÏgâYÊÌæá)ÃîÉHÕÞ½#ÈÓ °íÄÕÑ®ŠI»ÁÁ^_®œ÷¡àI–‡_¢õO/•ï»é`,¦ÉÊm_´†Ù«‡ÆtÌ÷yĽ=fF· &w!è·Ÿ-&$Õ¼G-è$ú¾ã1ÿ$ßÀy.c%½Âã0Ä&%ÆÁ2#'È2'vÆÝ7”(£Çø6=)fÈ5¡(É8¨* È™7Z*bȇ3F(þÉ–3x'bÉ+4©( ËÔ5x)¦Ç Ü™¶ÀÃÖ²¤<ÂçÜi³õÂÙû¯<¿ÒØ—ªö¿‹Ù‡µÚÀgÜ ºÁmÚ»ëÂÚ}ÀAÃnÝœÀ°Á¾ÛÕºÀ!Ø!®ÀÀìØt«€À‚Øm©ÇÁkØc©ÇÁáÖ%žbk6€wƒe÷*fyŽ%<“˜á¸êoø»0Üç²/³ß×­°üÓnøªÊÑ}‡H¢9ÉŽsM‚¡³êHïœbÍ>jŸîÌòj-„÷¸™L(‚t¹JQ6œXÃŒkŽ•¸’I¬”/LÍ,ã‘f-·¼žÀ4F›¢d9N|’¨?- ¢ƒˆ|:2J‚r–‰>Sƒ.©&F@†Éµ.GlA¼dKx•=ÃÉMššˆÇ©QÛÍÉOP®¤ËÍèT¦i͘U"ªãÐ[XŸ­øÑÙY6®ÇÔ>\´°ÇÔ©c¯îÕdjV±HØp¤±×llš²©×%jC± Õ]k˦Ñkd+¤ÇšªKl·µ[÷5ó£N,0‘nÿT.°lAt¯87y²…³>³dð ?×`h’ñ@ßh©š~Dqy,ª*K?‚¶ÌR‰¶½ÎS”XÃÜVè¡XʹY‡¥ÌDY¢¢¥ËnZµ–šÄ>W/–*Ã=U`Œ¦ÃÍRâ“æ9Ú´·¡O‰)B´WML&À°ÌX %+²€X@1ʳ÷Y¸+µªbû&É·²kM,™¸5vØ-™ºåz.[¹Cuf2«¶hc;1^°ŽI”+°ŸA¼'4²QCã(“µúIë-ì²ÚNŽ5§´¬Jœ2ǸFLk0+ºJO80i¸‹J~1b¹ÎMÝ.®¾Qü0½¾NNÂ0ÿ½Q|1»ŸN“/ÿ¹N11µºìKz0—¹àEÍ-&¥Q×,k™â‰z;=¤»¿íY•´çØèv†»ØÛ>ˆn¼[Ú2….œb¹´a~„ @#ˆP“•Js¦|²Xܾ¬ÉŽokÅÏê…8ÈÑ\ˆËSÛ·nÏMå8œžÎtäß„Î2â5§à΀Ü1²þÐŠÕØ¶<ÍÿÚªþËýâá´\ÇÈß  øµ‘Ã`O™Õ£J/*¨­U˜ÇÂ]jªÊÒ:o…¶0Òòsغ^œ’e ½mU­9ËÃ:S/JÂt2)ÛÀ0_'QÁD-ô%òÀ‚.f&‰Â:_¾× þtè"ÁŒÞfA)EƒF–ï>‡¨ÍIŠE¶4MÓH¹¿I¤’ðÀO}™áÆ$N$›ÜÈ6RÝ£èË_Sˆ¥"ËÿVµ¨^ÎÆXMªÑÐ[”©©Î½X°« Ñ*[¾¬lÒa^¹±CÔöe¿²eÖÏj³5Ø=p¡³Öøp?³XÕ}mÕ­¶Öwi”œÂªùqH-Õ±×=ª,Œ¯ûA»*²CÞ+ô³ºHÄ-P´JK.7¶ÁIÌ,[¶©E+µöGs.²´¸GÊ/ϳD°.©µqGœ0·éCX.L­˜8;'6›vPï(ü˜‡í;û•°åR¾£T¿l]²¨ ŽH—}LL9$ˆ¦…r>w®·§ZµÂCËÍr{Ç×ÕÊ8Ü5}½ÅM¾;gÙºH‹ôL ¶(c9R¸;Oç10ºA‹8½»X5>½´=3,ÉÁ†X~;i¾þuãC¨™?s˜¹âS ¨L×Nr«°—Û uH³¼²P[E¬àJ½-ú§îÃö·Ÿ*œ#7ÂY6,À°1+(Ãr.-'ÃÚ/×%¸Äâ2$&šÅ1ë'ÉÆ“.ã'aȬ3(7Èœ2W(Ëà3Ñ)†ÌB4-)ÿË96M+ÄÌ6{)eË•4E*¤Éû6 (!Éò89'ÏËF7)+vÇ€3×*CÈœ7æ*VÉ2:Q+¾ÅŸ8,+¡Á®-Ò"í¿ýH¨(ÀÅ ¥±a8Ëâê­‡ÊLéVÊ[Æ|à]Ëù¼ÞtŪÀùÜ º¬¾QÛ–»Ê¿xÜ[¾¿‡Úí·•½UØw«ÍºÑE˜Í·pÌ‚H·¬Ì­qêžê¥RksŠgM/s„⇘:D‚êˆu7¨†`¤HER:ÆQŒ½Xßžuº<Ù;¯ùµaÙp Ç å|Ã|žÕ½•gâ‚c²TR7‘‘ÀÍeŸóËÄ|¡ªˆÏL„§”‹ÀÁP®“ŒÃG\b |Ê"pÉÍ.l ¡M×Ihøv†X;\R??hƒÌ×9…H£H5ƒ\®,Ph‡ìµ.JÊ‹º#Hp’âžP8—áÇ=Pc¡™ÌS䦊ÎiV©‘ÏiX<­£ÐÍ^c©ƒÐM^2¦Ω\Ñ©ªÑ]ã®Òõa*¯kÕ d©¯ÒÖkk®¿ÕƒsÖ²uÕns®²ïÖ!ms±Ö3i•kÊ^ ˆC{4?ãye1S%Ôkù9À%Ò†mlQ4Ú…Þ”ÑDmfœtF'q¥^I?;³ˆLþˆ»…StÂbX¥™eÉY¦›¾ÊôZ+™èÈ8YO±ÈuY«œÈoWö›cÉJYk–ÿÅðVÿ‡ªÁ…R¾’§†¸?lËR¿šKðÄBµ4:UÇ:¸\5Ìȇ¸¢3tÉi¶5ñÉý»y7¨Èã¿u9ÉÈÁ¾<_ÉÄþ?[ÇÚÄvEÍÈĉHÉ8ÉhG]dz«kB ³}We.΢2¡%7ª7}(ç®4'ù©µ6#&¤¨‘1Ú#q¥µ.Z#b¥…4%ã¨æ?'‚«"9«%1«‹7%Û©B8f&}©f8I$׫é5X%Û¨®8)Fª?3Y&/°#3k(p°I2^'ÿ¦ü42&ö™€9ý&•œ@['¶tˆPÀ)¬nÉ1)‰œÅ9ϭݯ$RcÀÌŠfnµÈjlIÂ'o+?»µÃ&Kµ{ 5½©‡úÇ-‘Ë4nÌ NñËÞ ÏŽÌÌtfÉ‚®×ÄÂ%é!‘¿iNè.ζ³u¯C+¸CfV oÃ-O$1ÂS,à"þ¾À+Ù%€¿D+@&¾E,r&ɾü-ž'ÞÂ1&&¡Ä$1(GÄ0 (Å~1N&ÞÅ×1P(BÈ0 )Ëp2—)YËÒ6w)˳62(xË~6Ï*Ë7‰'ôËy6Ï)ŒÌl6Æ)×Êm7a)¡Ìr8Ú*Ë›8D+¬Éž9Â+eÇ:[+ëÇñ6Ž)ñÂ:2à!XÂŒp7AÌÒ–~ÏEòäÎÈoápÉ—Ã\Û»ÁÎÛ4¸b½uØ>°Ÿ¼BÕ#£Y»üÓ-‘Å·äÊðyã°û¿©bC¤…±[àk_>2‚iˆTÞ&¿‰êf7‡„Û~í6AŽR©ÒK š,¼Iˆ³ôÚ8wÜÃrã¯^²üÕ±~ð¬„ÑwÛl–û9 ’ÕÀvi„¹»Ùv›¯ÙÒî„+£Àˆkt£dËo]‡¦/Ì7g¢©†ÏWz™©Î>|s¥âÍVq¨ÎÓègÁ™Ü¸öQY}þ–T=q|X¡`Hª€)­ªO‡·£Jù ½`M¿•^ÃrPȚƴQÏ¡ÁÌTˤ«ËEVø¦Í…Vª|ÐTZ`©Ð-]Ѫ?Ðd­;Òº^‚¬Òª_­¸Óƒc½®óÖiw²xÖ sK³¨ÖGs"±ÍÕn*ªíÑøgŽî¹[pn@0ŒÍS¿á>xÇ+¹6ïÉ’½87Zȼ6^ÈϽ9ÃÉ¿Š8¿È3¾=4ÇZÂA&ÇÿÄÉCǼŚHöljŒJ}È%ÆòJÊÊÊKÊÇd©@è§19?$[š'##œ•(!Áž‹+Wâ™!0Þ$—bHµ.'Ÿ)@+‘œ,C %˜¢'HV›=)¬!a—×'냖ù# —U#"ÅžÇ'E!‡¤ž'‡ [£X#š"Œ£=)?"“¨Q,0&:¬²(ß%’Ÿ6'(T‚çD( „7>\$b‹ä`Ÿ1!¥H§Oƶ±ù^AǧWT= Áè:ÀÜ!‹!ÍÆe#s!žÊ¡$d!¶Í'Š#lʱ(R$ºÍ0'Ê#ò͹)Á$™Ë«(Ï#·Ë¬'a#îÈ#'í$eÄs$Ä!ž¾¯r-¿kÙ¿Ö&´!lÂ'E!UÂv* ÕÄä-˜#ÅÅ.õ&ûÄr-&'1ÀÞ.}%iõ0[&úÇ!2x'æÆþ0y'{Åá1&ÔÆI0/%xÇÍ1(&¢Èé31(6ËÅ5})ÑÍ/5Ã)TÌ_6ˆ*+Ê6—'‹Êo4½(±Ê´6 )2Ëì9Z)ÃÉÛ9+8Ëu8J,È<:`+PÇ¿:ú.‘ÇÎ:¶,†Èá=<)ÇÆÎ>D-‘Àí0Q$¾B¹$ÄÆ¢niÊÌ莴0Æ*ã¾XÀ1×°k»Ôd Ö¹°ÎÙŠ…¹ÁËs\­k·ŸVw¢c­O‘Ÿ;Y\stp3“qÌQÎ'rþFB5x>iÐ*ÔŽš²Y¶‰$£ðE’µÒIÙ£šÄúfÌ›ÀÅZˆ’F¿aj~·¯#Xͨ"Ñs…»éÛeºÅ¢ìÇh–®ÁNdìfȰaᲄժ|$¯aÒÏ’ý®™Ò¸’†®âÒò…b¨NÏvã¦GÎB^•³³iLMvÞ˜¬B´€*«"L¥‰¶°FP‘´¿4Mú”ä P˜EÅBP œ&ÅoPížÆTQ‰ŸŽÈÝQÄŸàÉÂR¬£;Ì“Xº©¯Ðža±¬Äѽ_¸¬·ÓB_­®’ÓGbÕ°àÕ`e¨²ÕÁjˆ°‚ÓimW°5Óçi¤ WÌ\`G¶$UQRèV-.Ž0E `UÂDN(HhŠ”ÉG u~°ÎQ.vɬEQôn£¢UJŠxê™KÆ€º³OêƒØ·+Ræ„ñ·öSCƒ ¸{R}ݰÔS®~ƒ±Q €º°WMÛ­ôOb„š±ÕOv¸‚O¥ŸŒ‰ß+ÏìÆ²=#ÇpÁ©:GÈåij<žÈ ļ>pÈãÆ\B±É]ÇUC‹Ç-ÂYG?ÇEÃLM]ÆĘRÆÅ÷ÅÕ`—ÆhÆ+a¬ÉCÈ¡ZTÈÔÆ·RnËßÂ0Mѹúb-ëš®!^ž%ëœn%[ˆ•¡añ3X’e¡ÜQI—7‰ J€U+Ê}R–)R€·e1/_õ.ÞËOü,,•ß1È%]™Åä—<d9›h^ ›\ \>¡’#Ü"âŸK":"®¥àjCm ,²œ1ÍW#}Á âKëxÖ OÑsMžsCú’ß¿×Ib»&ßì–ã½*ݱK³•ÓpŽb¸òØñ¢é¤òÈ¿ˆ ¢fʋ퓒¼ª\᢬ÆÏtg¹TÛ¶¨·DØò¾ ³ÚÖÁ¥¡²nÕ®Œ€ª|ÑŽt°©OÎ]O†‰ª‚G²uI¢Ý<¦ŠQ¶ºGv‹¼7M›Ž_¾%M§½£IcʼêJ‘ÄÀ4N\”ÄyOH˜ÅƇR`ÉRUJ£)Í@Yº¦¦Ð¡\ó©›ÑÅ_Ý­ùÔqbþ®ýÔ0bE«´Ò«g6© Ðke·¤ÜÐVa “„þYºtâ¥N÷@`<9"±-QŒ(WUie3;nk­ÀP{¸ SYxâ³yT-m«¤Mênz£G¾v²¬åM.~e±£OJ{Ù°²Nµ{G°ÚOüy ­ÙOÛz×®aNËW°ŸMA~W®=M\‚:¯ºN0€Š¹}P¢M‹ù+\ЋË_ApÇÄÅç?lÈSÉÎGFÉõÊËKÊ2ÊâM°ÉÐÊÊ]ÊpÎd†‰ÇÉÍ¿“÷ƧÑn¤ ÉÕøºIÉ`Ñi¢³Ë‚ήtûËšÊÍS@Ï—ËTMbÁ$vù3–•ï 7C”Í}f—´$|e“ÄxŸ?ŽÈ«C[•Œ¤×TV{ÇŸA{t’£gB^|J¬SEÔ­ØḞիÖFa’çBc•MfR55›Ê7‹&ÁŸãÃa¢/!YF§k##;¤º!c#¶¯õOò1䡉Y«3kˆm1y#"õy=G¿ToÆU¥Ð$Ÿ&àÁÎÙ óÃmzÙÆê#v! É`%æ#;Êï%$"1Îó's"\Ï+$!ŸÌG$k"aÌ©(µ"cÌ)¨#yÇû(ú#³Ä¶%m ¢Æ>&â!Çr&!ÌÆ+O$ÆÐ,¦"[Ä*XÄt)W! Æö,„&HÅ,+ˆ&oÄ,0ë&çÃã1¸'ÿÅd.% ÇŠ0Ž%ƒÅ¢3=&æÅ¤2!'Èi0ç'µÇ61»'þÉR4*Mɳ4")°Çº3X(›É?6 *¹Éƒ4u)¨É¿4\(ÝÊ‹2e*8Ì6v*qË¿3)SË,5)ÒÆá7b)Å60)·ÇO7) Å÷9)VÅä7\)Ë9†*tÌ>7*†É½;,*ëÆ-.à#ÅÏJH&ÅE§¹[¸)Énk¦«9® L8¨‡’ø>#’^Ï+Guafì5ÿ{.† IöŽRK ƒP>s¨`^+{œÃ>¶—ÆÜf‰„•¯~KMšÚƵ[0›Æk`¦‘¹KI«üÒ*l«¾BÝ„¯Œ±¹ÐI–—´xÖ— ¬½ÝL¾Á„ÛŸ¶î™˜¹›cEŸ†ÄÈ{–»™Ý»VÃ%ß:Ó?ÀAÞÐΑ¸qØz«“°ÅÓ×~v«%Ð*eͧuÈÌ`+}Ø¥šDeƒ#¯…Cé‚¥³”I ˆØ³ÕJD‹¸ÙHÆ©½ðL’éÁÎN)—\Æ Qö=ÉtWÒ¥¾ÌÚZg¥=ÍZ¶¤SΉ^;¦þÐÀ_ðª Ñ_«#ÐÇb&ªÑÌf% 7̃%qÄ@|ï9•`ì.0wŒ3w7nê7¬ÓŽë paø§ýYÚˆUìNQƒÒŠ @µ|§W†)•z[…Ý6?•æÊ;^ï„É¥"HÛ‡ö«>è¯þÔ n‘Cµ\U«ˆ\°±AL©õ΂rU¼£Üõ³Ê½ÈÞA½ß¾õÛí©q¯¨Íæ{{­ñÐHx ¶Ù×ÿ™ ºÖÛÝ¿mÆátÕ-Å1á±Óœ½”Ü€´ÜµxÖƒÛ¯1Цk °IÑ¢aí6²ØOx-¥žA­ °DHЊ)µëK¨Ž­½˜K“W‡Nn˜´ÅQ`¡‡ÊÓUr¨Ï ^|ª Ð.bÕ©ÁÐaÙ§"ÑMcZ©Ñœa¸ª.Ðr\õ©uÒaªÇÒGdÜœ)É^öÆÂåZz±gR\_ûrª9L,мi)×'ÿh}¦Jîyo´ÜRa|wµÎQé~l¹óTézñ³#Tóp£õM‚iŸš1I×qÅ¢óNQxdª{P*yȨÈLÛxç©LLjú²ŸOe‡j¸sR8‘E¾(Uê–þÁ>V‰UÃŽSèªF’ž4ÉÌ@ÑMHÅÄÊuK”ÈVÏLSÕÈ Ï8V†ÈjÎö[É×Ðça'ÈàδeIÆ*Ë m6Å…ÎQ…ŒÇÏ7”zÈòÈn0É®ÃÇIÍMÂÂDUÍš•W6î©,9ó!؉ö,Žc6a"  †9GI„£¡0Sä|Ò `Aµzð¦úAe„ó´G3‰ª¸ªG—‹í¹[K;‘®½bO““¾6Q!’ŽÃPØ’õÀÔT­™ÁÍQ'ͶÒOW’a5ŸL žË8¿‹ *9I·®QQ^\ÌÎi)^-ʲ"6$‚ ̊"þ#ÜÃM5ëÆ$ºÊê!“ uÌe&!ˆÎO& ÏÍÐ%!zÍ$Ì"¸Ë3$¸"ƒÇ2#ø åÄ«%U!¼Â)w"¢Án&Ž!¾ %ÂîÁ/)Ï!ÀÔ(#¾¾:&Ÿ«»‹&ž”Ày(±  ÃM+º%éÅ +Ê'5ÇF0S(ŒÅ- 'ƒÄ~-Í%ïŽ/È(¥Á~/&£Â»0o'Âï0Ã(àÁk0:(ÂA-Ï&›Ã\08%þÆ“1'ÅØ0õ(Èa1b(±Ë½7+w̾5J)KÌ}4q+hÎ8a,HÊù6ÿ*5Êt7—+¦É)6,ÊÇû6¸)ÃÅj5*&ïÇq7)xÊÙ;f+EÎ8;Z*«Ëï9j'tÉf;—)*ÉT=ø+ÌÖ„C,@±9%3\_ãW0DŸš»ç~Ž‚ŽÐN %‹1C€°€¡;˜yZí-\r¢d£/9Œ·1Nd„¦ÅF*}l›ù> ˜i½DV]—Þ¿_Z㆘­îI'‡ÐªªH¹ÙKª¶¶Öw—)¨å͇{¹ªÊЊ‹7«.о’;¯SÔª¨ÝºÜáÇ ÀÖ߸̱¼‰ÞÙ‰ºÚs¤ÿ¸¹×?†m³5Ó³u§­hÑ·bÜ Æl[Ú~¬|EÔ…#·âMñ½ÔOß‘æÀÈMñ˜^ÄßPžFÉ1T¶¥?̓Y#ªgÐ}bªmÑ^g÷¨ÖÑŒfЩ¸Ò½fFª±Ò9cŒ¨_Ñ9b£iϧ_š¡eÎ`_Ö—nÆ[è‰Åº>UÇv÷¥ZM=U§Wè.Ã*8!À@sFú!"r†¯ºNÊ|C³‰OV|c´°Ož|ì¶ÄS~~1´SNÄz[°Ûu¨qî¦)–²nV¢¯hôuÓ§wLæz_«ÌM|x®ÀN ƒÈµÑPþŒ:»ÝS¸”åÁÇXœ˜ÃôVè’ǰTê±l•A8QÌ…ÔÅRÈÖË‚LÈɯÌdMŠÉCÌ•N ÈKË M±È¡ÉµK•ÈDÊ®^sŹËߎîÅEÎ.£ É4×ç¾_ÌÑ׺7ËgÇ5làÎ1¿+EÈËŠtñ0*s àd—·/‘~rù7•…ÅÔI%{f¢úD=|)«WCq‚Æ´\I_…®·DJ3‹wº/L0‘ ½íO¬‘¦À,Qi“¿®V#”À%X:‘aÀ—V¤éÂUCgÛUÈŒ¦­äQVQ—ê‘'é-]gHRÊ0ªò_h´×JFMeÉá! }Ç.!žÍ"Ó$ãÍ "‹#3Éç  {Ë"NÌ1&Û#ËA&P"½É"Ù#É–"W!öǶ$ˆ"|Ä"®!ŒÃ$U#è½C(4!:À'#!ÃÁå&v ¾Àü&cå¾ý#ޱÁ<’ ‚Àï$# è¿‚( ÓÃP)Y#¿Àæ(Ç"ïÁé,Û%´Ç¦/œ)©ÇÄ-ò'ÄÛ+º%õÃÍ/2(=Âä/('µÅ//±'ä™/%&¶¿å*u&ÀÃ,'ÃÕ1(lÂ9/'È?3“*\É”4»+ƒÌV5 *ÌM4v)ÆÌ‘5„+±Êy5n+É´6Ì*3ÉÔ5,>Æ\5ú+pº3í)Kà 7Š*wƾ7¹+LÈb:¦+Êæ<Ë,4ÈÙ9q)dÅæ8K%¶Ç|:=)’Ñ|Ap-i¥ò6„s PP¿Œx«òl´ªŠOJ̃D÷>$“Ìv«6·‰óMé(Nyj[_/.æsÃ3ˆN‰‘7ÏÙŸ B ’¶TQœ›ŽÁ^:š À3a"—¡ºÉ^ç«­Í}.ª§Ïç{Ó¬‡Ó@›B´ÙŸ¿³½ËÞjΣÀ“à;Õ£½ÎÞ[Ò¹ÏÝ?Ã6²’Ø ¥²²~Ö3·t×Ne·¸Öæw­yшiSªFÎ9`8º{M¢‹Å»ŒM\’Á;RĘ’Æ0RÁ¡6ËSÑ£nÍX!¨0ÎC]µ©öÐÀe«°Ó[gI¨‰Ñ­iI§²ÒÝfµ¦ŸÑýcˆ¢èÎà`¯žÌ8^X–jɸ\ qÂZœ~ˆ¯kR*jôŠý@fGî0‚l6aPY kî2q^µYQy³úPPv^´5PKz·4RKyçµRÞ}µ¦ý~Þ´´ s÷«b™¦s÷§’HÞ{‚©ýL)|® OB¨°ðPÀŠ!¸hP“$½ÊT_›ÙWb‘ÅÓS~ N”Ö8áÏÂÑTNµÈ´È`I:ÊÊFGVǪÇâFÀÈ-ÇYAdșƒ>È”ÌEjëÊ¿Û8À›Ë ÛmÆÂÎ'ßÿÅžÎÍÜ%¸£ÌAÍ»t_Í‹±º@'ÃVU %‚mbX E… U!–þ¡;Ie~%¢²Hžz¶©Dg€[±ÄG{ˆ¸÷J㓽cM-õ½÷P\’I¿çRHÌÀ8S‰ø¾éYŽä½+[¼ŽÃ¿ W)gÁÕV ‡Ä¾gSi}^ªæKòj:~"BoÝ ¦©PŠ†Çˆ±T¿´}‹b‹×1@äIÈÆ"(#PÆö H¦Ê_!”$CÅ"µ &Ê^ ê" Ì›#R#°Ì$ú"˜ÌD#T!óËÊ$n%-ÊÌ%,"ÜÊ"'œ#œÉ(*!Þĵ%Z! $è!3À´$û!Á®&!,¾Ó$F5º'½$ «]Wû:®¾ÄNÐEÑÁ°õ&ÆÁc(##äÂ'+ø#ÎÁ+Ë&Ñ«//'°ÄŠ-„(7Á¡.0(”ÃB/)—Äi-Ï(õž-ñ*¯ËM0F0äÈH.±-àÀ³/(U¼)ù$»Ð,æ%NÄD0 )ZÃ1/í)ßÇ:6÷+¯Éo2‰*šÌ 4)*ŽÌó5Ð+ÕËO6¶+fÊ 4¿)4Çœ4t(íÇ6Ô*ÄÅ•5Ø)Ã)5¿)Ãg7)lÂk4/(oè7à(ÌÁÀ8)(ð9d(‹Å:¾* Í?¢+ ¾±\ä5¤ž{ÄHàƒ}dù6X€T^ 0|ˆTÈ+ ˆZì0\‡H~Š×fb.my—©@f”ѵÉOÕ–kÁá]™¿Å÷bi¥BÎm¶­ˆÓC{y«HÑtçªÏυDZÂ×Ǫ~¾ÀàÌ¿Ê|ãéÚÊŸã±Û&ÃMá'ÒW·¬ÛT´Å°¢ÕÈ–Ù±BÓƒµ^Õ¥~¹4Ø{‚œ³¬Óäo—¯ÙÐî^M FÅ S¹7¼NMë’¦ÁÎR{–ìÄåR|¢8ËFWÙ§«Í\K«ßÐtc^¬[Òqgd«ÙÓg}ªŸÒWhK©úÓ½fǧѽcQÊû]—•+Å»^,MÂX6‡Ó¶ÌT“tT›KIp^YS*9+ ³è?í ƒ%eÒG9Eq´aPÛvà³/Qds³²QZváµOäx:µÄLÐyÅ´õwþ|L³D›S}бOs2uתjLr¦ªJN|¬ÓMÐ~ÿ°àOŇ¹žQ÷Œ—½ÊRÇœåÄÌV$“#È]SߘŸ’Ù1=Ó ÐJJ‡È¸ÇEžÊXɳEÉÞÈ G1ÊúÉZA£ËåÉ©B¿ÉÓÈ{J¼É¿ÔÅ€5ʃÚ¦ËáÓ‡{ÌyÐc¼¥ãÊJUÚ“µÁIPÊ—ýÄïUW–ôÄTx oȰ]¸¦1Íbc«¨Ðbiê­¸Ó>gš­QÒéi‘¬.Ó2iaªPÔ"cþ¡–ÏW`[”ŽÄÂW§¿wX2ƒX´:S’ur¤¨K±hs95Z?F'0%@àÌ ,b^’:Bnå³÷Rtó³uO¿sp²RQixú´.O/zž·Qz­µ³Q{å´(U5ú²àVz%¨ÝPÎr¢}HÙyЍÿM•„ð´~RGŒ»KS’n¿Tý¢ÇéVò•ûÌWša”Þ1œÕÜÒZEAÊûÈÈ@Í)Ê[CèÊEÆ®E9ɚĥ>¢ÉÇAŠÉyÆcCÈšÆDNÇ^ÆêLuÉPÂDsËé¿´@aÍ‘‘$4b¼o;¸ pŸ“#]™Ío/Κ›AT|(žo@‘|ѪYF„µûN@‡A½Lk‹„½YN«Ž¿O~‘À½ºOÄe¹‡TÞ™”Ç<“‰»÷Þ±ÔßÄNá¶Úä <È¦Ž„|÷®TLrq™~Aê\É@©iFòÁvÜ- b‹3—O@“Ñ¢VdƒÄÕ]+NÂ×H0Ú5SËí!î# Én" "^ÊÈ"È$ƾÜ :Åÿ P!äÅ¡ À"vÊB³EÊk$é#ùÉ(%ƒ#½ÉÍ$p#[Æ…%'"X¿Ž"‡!´ÁZ#j"wÄÜ)%&™ÇM,)Èù$˜&€®][?wz¼£$O\††ªÈw;ªÛÐW¹¤¬>·è¶À2;n+ Âá)¸$žÃR/¬)2Ãd-(Àv+×$ËÂ|-r(_Çì0-:Éã1‹8ÆËó6¥<Î::Ä>Ê͇6¶:©Éï5³2Ä0Ô'ÕÀ¦)÷%À”,{&k¿-Í%èÂò.ç'7Èd/ÿ(ÂÉ(1Å+«Æù0‘)ÇØ3)¾Ë3o+Çß5U*ÈÄ5‡*¾˜41)²¼b3.'›¼ 4Å'‡½¥1å&ºW0%츀3m&„¸ 3Ë'†·Þ6o)ý¼6l(ßÀd4{'˜Ä‚7€&àÊê9å(ÐÒj@‚*<Ö¯j1À‡† 9À™¤cä+ë-p®/®Ž™z;”o¯EC™Ê½…MOšƒÁpS`ŸÈ›]›§ˆÍ’kô«uÑ#~M­ßÔ›”R²èØì§Ã¶_Û «æ¸]Ü‚®j·Ûô«b±£×”®úÔdø®KÔzx¹¯ÌÔcw%³ÏÕev+µÕÈqø·×lzQ°[Ól¬-ͲYœœüÆlV Ÿ Ç­Xiž"ÇHV¾ž~ÉÌX¾¥¥ËÐ]¶©ÿÏÒh\ªúÑ]c¤®Óh†­±Ò8hGªhÔcîÍË@]½ãS…‚²ÉR@y–¤üMiÞ~;XMø,=ì(µ€M!K2@á$d YIfs³QOy´6ROvå±YPptP¯ÿNàu²Pãz‘¸Vc~Dµ:T8´EX$tÚ©JQ¢mó¢6KwÊ«mQj„GµßT款NV'•ßÄX_¡ÚÇ·Võ•QÉîW{šMŠÂ2Ñ)Ç@ÇÞ¼V8ÙÉúÀð= Í.À>»ËgÀr9ÊÈ!¾²>’ȵÀ @«ÉTÀ‘C8ÉŠÀ·Cù˪»­AkËúŒ¨4ˆÀZBÒ!Ü—¾…“í=¼…”…ŽŒ7‚%œÅCÑw㡜B ~>®7F!ƒð¹UNÚŒr½ìPRŒ½¾FOz‰¾MeŠ´·ßN²’íÀÚ‡½}à]ÖGÒêôäAÍþé‚ÖJšcÁix&p8šm?²alTÆ$à=å`4ÁN0tXp25L†Ï¢ŠRg•%‘}WÏÌJMÚI4ÒM*X2(Ë!\'ÙÈ?!t$ðÈ¿"ˆ%àÆ"#êÆá "‘ÁöB"¼ÃÛ ‚#kÇ!à#åÇø!Æ#)Ãî ‰!ªÂ¦# àÂ"g"’ÊÖ(d)ÙÉK-y,sÉ) &êÃ63Þ0A»˜^T _ ®„ÐÞ¶M­±Í –»®zCƒÆ¬'ì ¤ÅZ.<'ØÃõ,'JÁ#)*%ó¿Ä*0%ª¾©*p&ŒËà3\0ÿÍ67;žÊ³6ú;VË4;:ÉË62{6“Å|/i,aÁ†.)³Â.²*BÀ,Y(Z¿û,¸(ºÃ»0>(ÕÈ717*âÇZ2@*}ÆA/¨)tÄõ0C'ÅÈ 3)ÑÉ5ë+È¿8ƒ+ÉÄö6#*©Áº7?(¤¿É5f&ü¿u2o$¾`3X'Q¼2ÿ&ç»N1¶&÷½Ë5µ)´¾c4|'Þ¾×4ó%5¿’3$ Áä2ü$aÃ$5['àÊk9Y'0Ô³T,,Dмrl4l³u{r4 L–\92ÿ©“AЗöµKôšýÀS^ŸyÆ\YK©¤Îh¨ªÈÐFv¸ªûÒu­‹ÔÓ†›®ÉÓç~Ò²>Öx€s°AÖ\‚è±#Õ xá±™ÕÙt®ÛÔjo0²@ÓAtµ´¤Ö8y9·Øpsµ¹¸Ù·~O´½Õ0v¯ ÑŒ\М@Æ»X…žÀÉ<[£¦Ìy[£YÌ^\»¨+ÌU_QªÆÎåd¨©¯Ñfôª³ÑNfa¬xÒjeC¥åÑïbÖ¾²Wˆ~2­,OÖsxžjI‚fWyÑ7ˆH(.A'Ýh!¿Ö!ýA°*Ûoj¦ Mu ²ËS#z?³¿Q:y°\QáyدrPpx}¬ØK£µ”PÌ~Iµ T(„ ¸œWAxç¯nUp§¥”N"|Y­'QŸ„Œµ%T\‰ÍºiSÜsÁÄW½ $ÈxYÝ”ÈÌ\.sÛk+þ…TF4¾ž…‡/‰ä—35ö¡¤g8ü»cµ”;ºÌ«¿ÕBkËܽdAîÈ¡¼D@8ÊL»¡B‚Êp–±4ÎÀQI‰#⊴³Š›à˜“órS,C‚½™Á<0z0ŸôBÖx"ª€DJ}X´¯L‰½ÅQ2Šù¼ºP„†»hQ„ݶ{Qևɹjvf±^ØÈΙê.ßJÑUìU×ʬ$ÊyŽu’h>}fðZÖ*iD D¾) TØ@L¼ƒG£GA‰>©®P×¢?åRÚÐö@ä=}Ïm'}/zÌ"(ÁË $%nÈò!ñ%æÆT!"ñÆÒ!B"XÄ£ §#ÛÅÝ#³"ÿÈ*%‰#“Ä'¿$ÚÀ¢!Õ"w½Y` zÁÖ"j%ÕÊS+)0DÄŒ.Z.tÉå)u."£äkwKý:¬ X1›ŸÃ’YµíÕÙ®#«€¸‡jPÃ<`*éÄ&¼#‡Äú+<'êÆH*Ï&6ÂØ*õ%)ÁW*˜' ºE'€$å½—, (ʤ3ø4ïÍH4Ñ6®Ì¤0Õ61È•/„/(Äx/X)Îć-Ì)÷Ã}-\'”ÂÂ-´'UÃÆ-Ö)ÂZ-º&cÅŠ0T*6ƺ1†)ÓÆ`4X* Æ‘2¼*@È.3 )±Ç5G*»È97E+Èö8¨,ÍÆë9 ,[Äž5š)‚Á„6{)¬ÁÏ5 (9Ár4ò&ľ²4à&îÀ÷7&'ôÁé6­'‰Áx3(%PÄn3×&ŽÄÖ6&¹ÉH6—&…È2ä&KÈ[0ô$oÊÎ4+&gЩE’)BÅãv½1€£Ì«­?&”=´†H¯™÷½!P› “ÆÅX~¨“̰e`¬zÑl´«Ñ(n-©èÐÂiC©Òfb«SÑÐ_´®`ÔRef±;Öm$±q×t÷°ê×xu´áÖ£wp´ºÖs¨·Ø}s”¸)Ùz*¶Öçy}­Óê] š£Ç–W÷™¬ÇÆ[ ¦uÐ+^Î¥éÎ _®¦†ÍÂ]Ø«gÑ+^Š­ÞÓ6gÊ«øÒÕf[§ÑA_ð›qÌI]¹{”­hM©j‹±?‘alce/E±#¯#Â=à×<!`'ý¨;Æ)âm€¦—JÌp°[†y´`[ w[±gPŠwÀ²uQÔs^¬"N {»µ8R¶| ·KT×!»–V€|¹Ó\oyf¯EUûy}¬R…ù·;W[Š»ìU‹¾¾ Tê—EÁîVkÖÇï\·^ÙeS!§cB1Cg”‘l3Ìkß—é7Ümñ›«;Òyœú<š]«ñAq¹Ü·"EÆK·h@ÊÅ©è/Ò¹RHš6“u¾OE‹1I £Œ²—U;útÛš÷?NsÖ¥ÏBŸzÔ°Fà†×¸ýM—Šã¼…QÀ‰S¸ZNé‡À¸—TÖ—’Ň÷®„Ö*ÄGÊ7ç:ÛŒË<êHÎé 8ÁåqØI2Ÿc;H|ÅI ú—*ï@©& ¿}ï‹.>œ£„0B2¦JK/ý´!/ô+"Ñ)0‹4 ΢&Ö/Åɵ!)(±Ê „(ÊÇ!&ÈK" %Åš!½ìÄ‚æ rÅ#2!‹Á¾!Ÿ!LÁj b!À!Ð!š¾Ù" ìÆ!$ó(ëÈW2M1òËf01Ÿ¹‘X¹J9m˜…VžŒ·wm;³ØÔÓ¹ž¦ÌÖ€KµHjÜ;µÃµ!!;Ä`*°%ÃÅG';#‹Æ>,[%»Æ.q'&ÁÍ*a&²½}(&§ºå+à''¸m(h%ÖÅB-ñ-’Ë3 3¡Å-²,A¿k+Ç'ãÀM,h$ÁÀ¥,&%®Á+-»'TÀf,¢(À>-ë(,Äþ/R)´ÇÔ1†)ÉG4¶*™Ë‡65,Ë3ë*HËÆ4*)ÿÊë7*ˆÊ€7ü,zÊí6‚+PÊa9Œ*íÉ9V+öÊ—8¼)-Èþ8Ò(ÎÂì3T&;Àk6%&‹Á875( Ã24,%sÆ¥4«'BÆR5‰'ºÇû5&íÇg4o%øÆÎ5(ƽ42Ç{2%jÊç. SÌŒZO(·¯¬N?횤À¸OçœNÁUô¢¾É[1¨Ï!Z«¯Ñ+`¢¥ßÐu]-¤~и]ˆ£«Ð WަôÑV=¬ÒòX…®QÕphÊ­ÈÖ•q‡±F×tz²ÐÖTn@µPטrt¶ÿ×ÿq|¶ÇØsš°kÓÜ_¤Î͘Y 9ÉXT§‰Ï¢^-©Ïß`ª(ÏÅ]«’Ñá[­GÔbù©ÑÒ;c‡£ãÐ(`’Ž•Ã¯W½h‚Ë8GT2C`a@£Ì&î9] :.X'ŽBm-© ßk§ºBkvv²5Vöz³X(v³#P×wÛ²ÐPírN¬M„zw²¨N÷{‡¶åR:̺mVC‚¿¹Þ\5}³P[x|œ°ZSK„±¶ÙTBÏ¿Už‘žÁLV š®Å1VåŽðÈ™YFg*n#×nö¨<<y¶ª =z­"A+x-¯„?ì{Ò­VAß} ©AC'‰ŸªßAVã²oB¨Þ†õ3/“ö!vgÅmzC"^¬•(€þ7 z§™Ó@µm9ŸsBËsàªBÈ~³¶Mf†›½rRʃعöP!yµJK‹ˆÃ¾•mã·°àUDZÍEëóÚåÀíåçÂù’©²òmùg)pW,SXU7[?ÕOƒ+€',jƒ‘WO:™¾Z‡=yÀ% B!‚µüÇZ*²2YÎ4+l20Íq&.dË"9)rÉá ª(¸È£!¹'·Èl!Ä'`Çá â!áÁí&!yÂs î"ÂÁf 8"’¿Èc!Œ»$Z :¼~’ÈX.¦.ÓÊ2g5×ÄTOB­Œ=”¿]p7§÷U«š¢Ä"I°²ØZ¡…¦ž¨–WZí+O$mÄ’'#DÆò)#)ÆŒ'›%Ê/3'»È²/¸(sÈv,‘%-È—-U(VÄk/'÷½ý,Q&»å) '1Ũ.á*²Ä+Y)ÀÜ,,'ÀÄ,Þ$Á0- 'ÅÂ’+ô(lÂä,•&²Á.+'ÀÄ/.¦*÷Õ/I(cÅ_2*DÇ3ß*Ë8Y,æÍ08û,ÈË6A+ÛÊ8³-@Ì‹8h-ØË$8+©ÌG7{+›Ï¨>~,ÅÑ&?#+ëÎ,:)ªÇ¨4Ó'tĹ=¾(Üħ6b$ÌÈÉ2‚$„ǵ6‚%ŠÇs52&çÉ¥3&ÓËI4ñ&ªÊÝ2Ö)pÊ 3š"ÀÈ¡6l"òÉì)ò¦ÍÕA³ Ì¿´§FHâžÊY[›ÁÏS©¢°ÊÁV(£‰ÎúZ›eËóWç \ÎöXð¤Ñ,Tg£™ÐÄS­¥“Ð÷VÞ£µÒ±]‘©ŠÕ€j|­þÔòn^®9ÔØgù±NÖ=l9µù×ðla¶s×Kn“°"ÔXbÓ§ïÐõX0¤8ÌÃYY¥æÎ¾^Å««Ó!a®ªÒØ`}¬5Òe_ ªÒba&¥ÈÐïb7¡’Ñ^†/¶HPÞO¡?ni1fÁ¤rrPõKOìÛJ + ¯Åc“‰þ;–sx´gR~u‰´˜RÝt‚³QSüuk² R"q£«6M÷rŒ¦”H†vÈ®N&}j· TĸÖZ¿†#¸¼a4…>²6U„ˆ¹·BSA’^Á¾Woš›Æ*Vb§ÍÌY&™&ÍhX‚rºtÐ(‚m÷­¾?wQ°B:~´cEƒ€’µB<…T¶"FH™»Hå»­G3ŽººyH»žJ¤…ÔgB*žb]‹’Y®(»‹šHs\˜º;tt„¨þD~j²GP†‚¸Qxƒþ·ßNæ~Ö´9Kù}ð³§Sš„?¸a¤ŸÝɬˆWªùÏÛ“J~ë¡àV_{Ze!dN× ç÷9äÅ+"x$˜_ª‘~Cå;aÒ¬C>º<®/m¿ä*ö2ÆÌK9>Ì[%Þ-µËÑ%ï.GË/$:+?Ê!"(uÈd!m&óÆp"q(HȘ"á$ ñ!" ¥" Ã£!­#Ä`#eÀì"m$¿H!*"*È+ù,…Ík?:÷š…r>M(qµ¯Jt—<½t«¤É“™r¡BÍÒrÀµãeÝ:^Âj„!$À½+‹&;Â÷)ó%ÉÇŸ,±'LÈq.\)©Æÿ+õ)íÇ*u&É(.('ÁÆ„.D(ºÃ«*J&½Ä#*Ý'P¼Ü*©&;¾u,l')ÀÑ-|(Âh*Æ&sÃH,L(Å9-(µÅã,b(#Â@+–'pÅG/)&Å«1f*lÆÀ1\)ýǰ3[(ïËô6+Í9%-¡Í9,DËÁ7 ,´ÌE7â+ËÄ9Ü,ÀÉý9+ŒÊð;f*IÊ©9œ(Ï-;ÿ*ÇÎ÷:Œ+TËä8ú*Å®6­&hß2¼%ÎÇR5Þ(ÈE7'ŒÈ^5Q&WÊ)3$…Éë4$Él1þ"ÇÌ 5â#œÌ®5é$óÈ“,r!ÍV>Ð%÷Ã.¯qK"›ÎÈàQá–¤Ä7R<œõËTVu›ÿÍ—Y»›¯Í¼W’ øÑkWºŸaÑ!X÷ŸåÑ.Wœ£.Ó‹_´§‡Õ(iÊ©—ÔËlͪôÒçb|­éÔÔfȳÖ€iv´pÖÏi.°6ÕPc©³ÒK[ͨÑЋYÖ¥¹Î¯[,« Ò™`y­ñÒèd7±¸Õ+j°ªøÓbF¥ÐcÛœYÒpas[’ö?A%»‘ŒÎ9“_æ+Ð /!˜y E%²aiyS0Ýs$²¡S^uòQÍwh³ÛQsº°ÎU¨s´¯ S_in£KLdjý¢1I˜yy³IRHภVà·z^ó~³\W„tµ!R6’_Á„V»œ<ÆöV%©ÕÌ*Wž?ÏðY„|>|Û,rr·³Ï@{ù²ÇA„¹àGø‚f¶¹CˆeºãFhŽ­¾5J'‘º½ÆI¡˜QœMs–_Æ6PG‹î¶\G±}–Q¥"1q],brôœ?C~mûŸ ?x¤¯TE7G¶ÂIÜ|p²0K&u«.J0ví¯T³„åºÝn›† ¸ÕcÑxY¡íA­jñ…º3^HMvTIäÈ6}e8, @*Ž„g3¯,ˆÞ-=û8ÿ¾öa ³òuå¶b —ËV;AÎð7?Ðw)(0¿Ë°$.+Ê">++ÇÌ"[({Æ M'€Å"M'+ÄÓ#{$XÁ*!¬$¶¾!B#»!¸¾ÝT#¤»ô `#k½Ê #GÄ] 'Ô°kgýK~tž|9Ià}§™žQ¥¢/Ä7‰|ûÊŸ†r£Ü¬TZÂ2.c%½Â•'O#ÑÃb)¢$‡ÇÊ,*&^É +é'EÌù1*ZÎØ.X+ËÈ,Ô(–Ë·-ù*›Îá.R,‹ÍX4".*Êe1¯)¾À,÷)¼¿Æ,F);Ãô+ '%ÄW+'|Ä~-x*Ä%/c)±ÅÉ/Ï+”ÄL-û*ëÁà,+(ŸÂf/Š)VÃ[0)ìÂA/e(ÜÈ/2›*DËî5 ,%Êü9Ù,ÀËÊ9<,˽8È+K̼:Š,ŒÊ¤:´*ÃÍ}9|(ûÊ~9)¹Í¯;*ýÌ/6ü)"Í:+)bÉ$6g&%Åø6µ'É`5Ë(>Ê7&xËš6&{Êé4}'HÉš5ÿ%¼Ëe3[%É2†#¹Êª5s$’Ì«6º$ßÊ 0•"ZÎÑEQ$$»x¶ÖF­—æÊvPˆ›…ÈŒSc—Î1Wo —ÐJXµ¡–ÑcZ7ž½ÏbYb¼Ð—Vr£­ÔH\§ëÖåeð©ÙÕjhÙ§Ó\[­1Õýb±å×üjʱtÖ|h×±‚Öƒeà®Ôµ]÷©ÁÑõ[þ£–Î8ZB§èÒ‚_¦¯jÕ²g­®âÖ±l¬ˆÖiÞ¤¬Ñá`ù•ÁÑ¡^ŸZkcW)ôÞ5sv-©&ls%!üx"o¾'$ýQ÷\µ$piŸ¬ßNëq‰­éOÍuR³¶TvT¯ÀU÷xs°ÚUQqxª>Mm;ŸGÁyE­"Pÿ¸V·¸\4É´Ó]Ù„ð¶·T|öÁyU`› ÅðWE«ÏXÓ¢´Ó4\šxï€x0®xõ¹áCu|W´ž@{ƒJ»ZHg‚Ë·ýEYŠ›»öFˆ_¿1JI“÷ÁãLâ—<Ã:L+•9ÃM£‘óÁ±O{„%šqPÁâ»idžºiÇ-.4þÏFK¤MéÏó=D!΃)•/}Ëi&%,äÌ·$¦-FÊ€"•*=È»ñ'’ÄÚ"¿([Æ8#ä%,äy$r¿:½ °¹º 6¼TÖ#RºLã ¶»pÑ }¹A²8w€áªPìpôùI~˜RÂnI¬RЖ}žÈo¦·]b88(Äá Ù! À~'¶$@Á&™"¬È5+–%úÅ)E&ÑÊk,º'¸ÍI/L(kÍO-Ö'}ÑM0<,EÖ½Lz@‹Ñ#Gÿ;ËÌ>,8%ñÃã-;)'Âø-+(¯É˜.'µÉ9.­){Æp/†*æÇ°0¸*bÉ1+’Çn/Ö*Æ0,Š(±Ã -ú*ÀÃÉ2v*PÃ1Ô+¦Ät34*ìÇ6?*ÉF8¿*óÉâ7Z+ƒÉÅ8++Íù:½+ÓÌÎ6¹*GÌ:8„(¨Ê¸:Ð)óË‹;á*gÉž6])7Én6(7Éz8˜'Ç@73&½ÇÕ72'”È95h%[É84ì'Ìj6(Íá3Ò$Òͼ7,%®Ì5t%BÏW6H"øÐØ7í$ÎW<$ÂÏ®-R ™ÑXÓ(¢¯£ÊK„–»ÉåT韡ÎgXŸÜÏó[e¢ûÒ\¾œÑÐ XŸž=ÐU^¤9ÓèY ¦àÕ$\ë;ÕŽc*©îÓà\¬hÖJ`d²èÙai­±™×¢h…±î×ïjаš×}bm¬¹Ó¾]ÿ¦¸Ï©ZÁ¦[ÒÐ`a¯ç×·g½«öÔöhåªÜÕIgK¢¤ÓËcI•ÆÛXsJ›;óæ¢*Z¡ŒËŸO3"%^'9Ùt%~R',ý(‘D€0UNiEÑq©K³t‡°5Q$u™±¨Qˆsm«6RþqÏ­[S-eÁ¡™F»d!Ÿ Hæuد°RŒÚ¸ð\g€“¶Z_‚·­&;Õ€Ù¸·>ÞXºUB]„¾ºWAïŒú¿©CÈ’RÃ.H/˜‰ÆƒIB–Ä»MU‘'òLÿ~ç³(EÕ]c…§1 gþ›:8p¯¥.D±ƒùº1†”µòÞ¥ÑkÌlì@Ûw²5Óæ£Ey«•/IÌ`*b¦$Nç!Y o<¥¨',&ux`%¤3$»(¥‰UûJ­ßÝTñJ›ÌW.Ú/=Èl#Ä*Æ9!)'JÌ@/â4<ÎX9–>xÌÉ2—5œË}+ 0ÚÊM#Z-µËÂ$.?ÉÛ"Ì-PÆÿ"™,ÿÆ0#*ëÆä ì&…ÆÆ#''¸"P'aÁ[Z"Ì¿º("¼ì¨$½½Aû ‚¯{W'C¡t‚•NfA‚³A”ƒŽ°p``¤;Ì*…¢ŸÀ¼FehÀOFñ7Ç.%A'™Ä'µ'-ÁR$i$gÄn'á$¹Å'…%ÕÆ$)!&­Ë *È)yÎá.5)ÃÏÆ/](ØÐU.Ù*#ÐÍ1U)„Ñâ0x+¨Ð 0o*ÂÏ33ž*=È®,Ý(§ÆO-(®Êm0¥+ÎÉ.ô*6Ê£/ -dÊD3û.…É2..üÉ0Š/ýËa5Ç.uÈX5­.ùÇs1ª+}Ȳ4Ø+ÃÆ6–)Tű5+fÇŽ41+É7Ñ,<ËÐ9‡*Í^;*íÎÞ;i++Ð:'*åÌS:)ÑÌh:*˜Ìº9ú+fÌR7š'”ÊÑ7Ë'‘ÊÕ6ÿ'³Ê½8B'èËq3‚.€Ë8Ï'|Ê«6ï%óËZ4Ì$†Î€6&ÎÓ65$_Φ7i%ÑÎÅ4À&3Ó=8f&KÓC;f'þÔ”AL$ÅÁà¯ø@€™h͸Q –ÇÊS|™ßÊ{R™ÌITJ˜ó̃S{œ•ϹU^£ÔQY¦¤2Ô]V§G×\ž¬gØ[˜®Ùêbœ²èÛçhR¶nÞeµ¶¼Þühe¯úÙz`´ (ÎèY;„(¢¥Ey»‡v=æsÇŽr?ðm²’&Apc§GmržÌIlmrƒ´D‹iH`X4ÒOs$hCoSŒ ãYwdJc—GÑ$ßn€×>sjs›ÂH£o´®•Sèk²®T\h±ÊXk6³VXŠk ²øU€iþ³'X1lʰÜZ˜o¥®›W²k¼¥OHaŸ¤Fžf=—êC­|Ó³_VÀ~B¯ÑU… ´€O‘˜À{UvžÈDYf¯†Ï›YP£½Ó.Wªcçt*%Fjª7 pû¬Üo”¸Ä@R€ä¸ @Ö‡œ¼X@‰A‰—†ÄmG>‘©ÁIJ ‹¾{HÒØ¶YLCdà“Ø9Åk÷¢x8„ï¹mEÀ(äŸÒÊÌ„ê8Îü¤+ÇfŽ|o}ˆ…9_Nâ O¦­ ;88-ò*)žÿL#%ù¥@S…ÿJÜòuZbHÒ}E~AÎ /_4)ɦ(ö,¾Èµ#¼*õÉy(ž/êÊ+û0þÆ#J&ÄE& , ÃY$+~Æ›$ë.¹È  þ,ÁÈ#Ì+ÉW#V*{ƨ$ (.ÃV"Ò' Á*%y¿˜ ×#ÌÁÙ#ÒÂg" ÀÈ)T*”‹‹±ZXm©”LÏ‚X¬ôQ(áŲyæÏÎuÕ®¼{˜G?ÇP(Ã-ÍÅp+E+[ÄA'†)HÅ'4&ÃÎ%Ö#Ã&»%ŽÂ'Å&ÅÈP+Ú(&Ëi,»)šÌÓ,Î(eЫ.Õ)ŠÐM2+<ч1R+¤Ðß2T,ÍŠ1!*ÁÌ—0,â-V(ÆÎ-Æ)ìË÷2-‡Ê06-ÖË‹/J-—Ê?1¸.Ê­4â03ËË5.sͲ5Œ/œÍg4O,ÆËs6c.óËj6,@ÉQ5¥+ŽÉŽ7í+ÉÉ:&- Ìð:(,Ζ8n+Ð8*lÑ$;,* Ñ¨<Á,qÎÂ9ç)ïÍz9Z)¡Ê—8x)2ÊÉ6­(ýÊä6°'¼Ë 8Ð(hÊÑ6Ž'RÊ´8<'9ˆ6‰%§ËË5¾%ŠÍ"8,%›Ì28$åÑÁ;y(Òš9,Òž5â%ZÓ89š&õÒ70%qÕŽUF*$Ê!_6m¡ÈÒMì’°Æ#Q=˜YÉSw–éÉîSH—»Í2S•›ÔÑëVÃ¥1Ö#[þ¦ù× ^o­Ú´_y´wá6c4°ÝkbÕ¢ÛÑìY6‘üÁ·S~ì°˜Lñh5œ[C¿KMTY(ãFÔJA%Vl}':ÎV*Ѝ?¶[—”ÐD$c_œ§Is×¶~]’„½Ækw…"¸#c£Œ³Mp•[J2ÿOiG“#xUŠxË6aë—†Eð_…¢-G˜c>­æQ?mtµ·V™pz·TXsµ¹ÿYøt»ñ]îpª¼Å\Âtɽ“aer]½³aAo1·±\k“ªÃai¯ ˆKÆ{ƒ­U´ƒö²\V}„ñ³¶Ov‘æ¿RÜMÇQW‘®Î¶X¡¢³Ò!VDi.uk'zk©N7ôq…¬7éx§´¤:Ë£·Ó=…‚!¸ýA'‰î¼œCÉÙÀvEf“âÂrJ/Œ÷¾ÿF«„÷ºÀD¢~ó¶KJ©gA˜»9loò§š>3)Â…q®« Ðs˜˜ŽG´.hái„A6Æ^•He?I«‹z3È+Þ,% #”UAÎ \¯©9|'ÿß~bpQóÐÛEŠ?šÍË./éÊž#Ü(ÇÇ•Ë&5Çš ,& Äá!Ø&ÿÁüe#ÅÁu$ñÆ!œ(ÎÆ»ï)ûÈâ ;*iÅ!i*ÍÇ^ &)ÅĶ"b(ÄÃR!Õ&½17%è½~?#7¾Cv#À¾¦›¿¬ZVãCû{K›·XÏ~!¤NIÔ‘8¼¡ƒ&K"ÏÜfQ %­v1s-TT(vË$P&5ÁЕMFFЄ<¼:ÝÉk*‚+lê"“'ŸÃÀ #¢Ãz1#,ÂÊe%™Á¾6$TÀÖ"»Ã¯ð$Æçã(ºÅÜý) Æ™!y(ÏÈ#â*õÇ"t*áÆ !I(òÀ$|&”â$?¿Žø¼a E"³”â„ÈRés&™IN¬‰´1QɧWÍ÷ˆ=ªÔTL«’²ÀXëÂ#8‡-}Æ´3ƒ2iƪ+s.ÉÄI'i(ÂÅò))²Ç)Ö&¡Äò):$ÞÃÀ*Z%»È.)ƒË¶-Õ(sÌí-¹'kÍî-((@Ïä/“)úÒ/¿*2Ó 2T+ÔÕÓ1{.(Ó×1÷1Ê.z)EÅ,+3$fÉæ/d)¾É0.‹)àÍ 1H,̇4Ã-È~4º.yËî4r.çÐ4W0'ÌÖ4•.Ëñ4",äËÏ9,îË 8K.‡Ê6U,êÈ4Ï*jÊó5ô+\̱6í*ÚÏ¢7ö+0Ц;ß,ÆÍ—8u)…ÎA8K*PÒ8;¬*¾ÎF:´(ŠÌK9'cÌ;õ*ÅËF9\)WÌ‘9ˆ'Rͤ7F'¡Í,5 &ͼ7@%&Îj5 #¯Ïm6h$ƒÏ2Ÿ"WÑ6«$ZÓU:O&=Öñ:J&µÖp8‡'Õ`?×'`ÔcHW(ŸÎo,!tÅô‡80ú“OÇI2‹XÀyN¥¥ÆPo—#ÎRV«¡/Ù0]tšKÎuVub©KF…c˜O:·fG=w_±€6›^xz)5\[4y÷5¨^J~–4 \!ˆš7Ã[¸Š!;Baá“rDtfÖ ˆFoò°NÈpIµÈU·qù¼{[èv½Z¼zü¾:_ùyc½Îbwz²ÀNd3ÝÆgù}ñ½NaŸhøª‚Pg®ðQ/p6¹ÙY|r½][sf½=bz}¿f¥ƒ±Ãnq‚ªÆ"v’ŽÅ qÕ}›Ä6o@ŒÅ“kÔw®Á7g r›¿Fd h=ºÂa gv°1Z»w†«ØT€Œ`¹tQ&}ÀU‚–òÃãSõ’ËmU}wM~–5KtƳYF~m ¦«2›wT³.=Ez)µi?$zy·¤@U±½bF7†a¾ÎG›„¼øHŽ|ï·$Gpwm±ÆDÙ]ÊU£!‘4¦=S‘;âlh7i`$kAaª"(Z3t’=[Wv2-ó”&Ð#i…xOʪq6l74¶¸‡ ‰SÍ®4*dÍþCWÉ4†.§É{3-.”Éx4+/ËÊÇ5 0 Êù5¼-•ÊË7Æ.ÌŒ8D.«ËË7ü,QÊC7õ*XËÏ6Ï*¢Ìü3†)KÍ'=c+Ïé9 )VÎ6é(ÂÑ´=H+2Óª=,+ÙÎ:ó(gÌì<1'ÌÌD8z(hË8I&¹Í@8õ'jÍå8ò(JËt5´&àÌ¢6$ßÌ£6]$Í6X%ïÒo7 %êÔW;7'wÑ÷82&,Ò„7Ø%€Ó996&PÒ­;¢(bÓv@%ëÈí0‚#Î¥1*!¿Ö”/5±ƒÀBJ½‹Ä‚Nò“aÏþSd{©¯£Fcii†Ì2`ýp+¾_2_’%"`á^«&äb-p ,ÐmýŒ<_lè“wB9bd‹=:`FŠ99_W^>§gj¡¶H†o[¯ P¥uC¸Ves‡»$\&uÚ¾``°yŒ¿ò_SyÇÁ dZvèÃäjj›ÆØq¥zNÁªhr|aÃÌfÏ™Âej#±´SXhʶèXuqâ¼Ò\xuO¾rdê‚vÃìvˆƒÚÄ[|ßÅß}k†Å‚}8‡#É‹‚<‚©Æsy{ÀÈjsx(À|hlxæÃÇjëpü¾$f(n"¶ _›{;¯Vƈ‚µ!RŽç¼®Q§‹±Á¢Thvú}¾5Ûk¥®'Fhi§ 5¦sÝ´†?wµsBÆ{[·¥B]ëºÄE­~T·ÖHÁ~µLCúx µ‚C7rf“r6tSçÒ 4*:0õ:5×ì?W(÷3í+º&of5"¥ ,xc0$¸ É$5wó^X*!«_еsĸà}IªÈ®% "&É=3ƒ1;ÉÅ(”.±Å!v)”Ä›|%ûà Ù%µÃ¶£#þÃy D"bø!_$ÃÃd¼#¿Â ü$ÂNä'µÇ=!§&—Ä u%ùÅ•×&"ÂÔ%<À "l#V·$¢Ã`%iÂHñ"K à€O[u%SÐ7®©P•ÊÁemn¢2É¿~ ¦¶ÖFpŒ·ùv2AÁ+L+kŹ7ÿ4ÞÅ84D1ÛÃÜ*t*GÆf(*5Æò(M(ÉŠ(¼&(Ä?*î%¾Æ,·&EËY- %IÌ«.ð(ÎY0z*vÒ²3*ÝÕä4Š-yÚ”I‰CÝ^ƒT‹ÙrGhÊØ`-eþÍ300ÀË+0%­Å|-5*BÆ„/ð+˜Èr3Z-ºÉ40íÉË1;/ÂÈØ3_.ÄÉ‚3Ò.>Éã3´.4Ì70-ÌB7¼.¥Ê–5Ä,ÿÈÜ46+%ɺ5H*%É…3þ)¦É™;ì+¤ËØ9*;ͼ7<)fΠ:`*¢ÐW;:)—Ð09Ö(4щ<+wÏÅ9÷+¬Ëâ5Ü).ÍÔ8' Ðˆ7p' Ъ79'fÏf6·#©ÐÍ6„%æÒz7(³Ò7e'Ón79( Õ5è&K×þ9F']Õ;î(T×ÍL6Q-ëË 5%*êÊ4g*¥Ç"2Æ(QÉž4¾(uÌô5¹)`ÍR3á(‡Ï7)ÚÏu7*"Îü:z(îÒ§;/) Õ‡;à- Ôq=-ùÑF=_,xÏ"8,(œÎÏ6ù%qÑš4­&…ÑV6}&šÓ›5A)šÔÚ? /Óf7È*ƒÖ:)*r×76Æ(ÅÕÈ9(=ÖÅi.„ÞÉJ€Ú¼ÏÌ¥šÖºÞ¥ÊØ5À"¤Ö¬¾Y•‡Òγ÷‹åΨ°†É'^ëÄ|z@|ÏÄÉz¯zÈ‚t3yï¿om‰ÕÄ\o~~Ê»¬ds†ûµ\ZÛ…¸ÀPKo¯p†)7kЭÙ@u˜¬Ž:tá°9Îz»²¿Fï6¸<^&y@³{Fÿo¨9<#h†µ5@d°€ý%›[5#ÇšJ 4ëF!™²:2l 0s1/]†)0&7b;2AD†•ÕCm_<%/¨o³‘P=³Åýk3š%Á>h,­/c×9®Ãp"ýÂ(!¥$×Ã4 %9Å% r)IÅ÷!)Kŵ!J(ZÄ÷ ù$é G#sÄ#ƒÃuK&èÃUÁ#ìÄ8 %VÄÆ#}Ä#›ÃRà% À*É%±Áø*$úÀ&!#¢Ä5Q"£Zy«OnuRM¥uP dK^‹‚º\S­«Ò·¨ªŸÒ@™¬ÂÅ9sOº2Jb3âË9X2‰Å•= 9Kž6Þ1xÈ',´.yÇü(Ò*uÈ>+6)ÐÎP-[.¬Î -Þ)=Ê«-É'ïÍß-ï).ÑX0(¾Óâ1)ˆÔ÷1Á*›Ùf7Æ0 ÛÒ>Õ6˜ÛA8nÜšM¨>¿Ú‚ØmöØy5yìÆä,C,ŠÀ.,$Å~,†)£Åò-ä+ZÅÚ.f,öÈ}/þ.{È#2ä-êÆa0É+xÅU1A,=È/4K,Êø5×/iÉ¢3¬*EËØ3¨(ŒÇ²3?'5Ç)1U'zËŒ8ô)ÈKb,šÍ83õ(Ñ|7 (bЯ6 'iÑû9ˆ);Ò'8C, Õc?²/Ó1=¹-ÑÈ9í)ŸÒ4W%ÕÒÈ6(­Õò5Ž+ÈÕ`=Ï2ÆÕåG5}×üD±;[Õw9,2#Ù^<»+¡Õý9­(HÓ´;3'Ó‰:,%{ÑŸ2z(EÒ 1$&—Ìl3¹#]ËR3—#ÎÈ.À"”ÀD1¸ d9{Ò9.xU¯ qdÞ. kY;þ#mAH ' nû]<-µi(Q|&De½\à(¤_]}³2)c÷”:Öf/¢Ceõ¬ÓIªh±µ¶ProʼVoà¼k[ÁtÁ?aÄw‡Ä€hŒ|鯬nc‚&Ê®p±‚¯Ëœl’ƒSÉFrÒ‡ÒËØx"‡;ÌZreîÉ6mƒƒÆ’k‡…ïÊuŠMÌÌŽç‘PÏͧ—'Ô³r§›Ø¥»å±€ÛÝë”ÚmÁ ¢À×xºúœÏÚ£„Ãȳ/„iÊÔ™I‚´ÆW“zEÂå­„„Æ›wdVÁwn4…’»\e†Ñ¸&V5p•j»%Yiu¦æ<ÍvM«Ä=on(§ù3Eоn}{¯×Ö¾£} ¯’QžWÈg-{Wl "²K~(! ÷D€Q¶ÁNÖ H̸ENö‚JKOÌA½VÛ…÷Yp†ZWó.ÊYvԆЄi;1¤kÅLlt›ñ¹%l‚‡E´ÀV¨Ÿ€]Ö/K¿°Z“¾l5"§Ä:×%vÆ0!A(ýÇ" )V¦'ØÄ _%,ÃiÚ&Áëx&éÁÝ×& Ào$6Á{%1ÅG¾$–Ī<$èÃGÄ#tÂú ø$’ÀF!Ž$KÄ¿Ÿ"9µ#Dâ6ńΛÌVézð¦T߆ε’Q–¼ÀÉr°®´Ó$¡½´ûפF­<Ëèµ®S°9¦Â›6ô/¯Æe?Î8Eƽ=¼3Çä/5/?ÇÇ+a.6È *©+³Í8*³. Ð1\+KÌ1e+yÉ×-ô'úÑ@1+ ÓÖ4µ,2Ôw6E,‡×@3-YÖ×3'.]Ì™1 ,¦ÓÆ4`+Ú?Q0?¨Ùa‚IoãÒEsMzÁÁ"7!$Å),x(›È-Ý*ÈÇ.c,ªÉ¾.2-ÔÊö1Ê-™ÊP1V+ÙÊg34,vÍ›6-ÎT7 .üÎÐ8ã-øÍ5¢,Êù5*‰ÈŽ1›(Êt7w)¦ÊŒC;)öË¥6'¿Ð!4î'cÒ:q+^Õ‘=".íÒMAØ<ÁΟ7™4nÏ£6*+âÑ4:- Ò6r(ÕÏ;0Ó1TÏ<°Ö¢V©B½Ö–IçANÕr\ARGÖ{cÏ`mÚ)A‰6ÑÖ6ï(Õ:§&KÒ´5õ%iÒˆÛ_ý~ö*’bg_$S§-ý“W  ü[€› ®K­x@QB#U>Ùw\|[^ûÒ·ct§^ožpXO` S–Á¢fÊœlÁuª•Sµè_¢„à°N2šanÐ9²ÂY ÁôF"¦Ä×½"ØÆRK(-ÆO ©(«ÆH"M&ÀÇ=˜$~Ã?Œ$ŒÃ±x%Ä $EÁ¬7%nÄÅû%Þ M%£Â‡ò%Á¥$¿r!{$vÁ®ì"Ò²çV2B¥‡H–[Mj‰&GÄ1«”Xý(²›Pp¢‡ËÙ}]µÎÕ¦¨D¸©Ô·©æ­]Ú¹‹å´¸VM¿a0[-•Äñ>ù6„Æs61 Èd,Ç.LÆâ/ .”ɵ+°*,Ìj+É(¶Ï»0ô(¸Ë`/À(’Í/ª)íÏ€0À)sÒÖ3Ù,ŸÕD4Ð-Ö2$+õ×=7‚.ýÖ!3ï+èÓ°1F*ØÔ›3Ê,'ÕPC˜4OØ,z¨qgÈç7Ó>w¾Ì+I!Å].)…ÄÏ-é+(Æ·0Z-•ÇÆ/Ç,.ËG2z,ÌË6w.^Ë4¬.Ì´4^.Îf6­0èËÜ4§*õÐ5õ+„Í5¸)|ÊÄ4Ý)ÍÐ 1V(ŠÎ 6‹)iÐF7›) Ök:‘*þØ2M9íÕY)ÐRƒ${ÊÐÁZ\dÓ`?W>,Ò"6Í*…ׇSUDÞÑüuüYyÕ(h§VÓÔ’åu…Ò·ŽÊ¦ÔœˆÛÊ^äP1ØÞ:è+_Ó×6&ÌÓ):-&ôÖ-t’gØNõIEÑä47$‘Í1$ŽÌ{2ß$·Ðè5û%RÊý4ð!DF;-Rü vr§,×»|ŠGN(Jm‚@Q ñhÔL&=f²dÔ-2b3}›3ú]­Ž†85f ÞBøgIªýKgo»²üNœpÛºÚVbrþ¼4Yy Áƒ[Ø€”ųeÀ„-Ç5kî„/Ç£n„…hÈjt“Š9Ê_y‡AÍB€T’iÑl‡¢ÌÐ[€{‰>ÌJwU†sÈzk£–¢ÑL–Ù’çÐÛªfŒ¸Î›œ°ŒcÌò–¢ðÅ ‚.†'Ê’Š¦ˆ$Ì{’¶ŠóÍ¡›Ô :פ¹ë°`Û–Ëʹ™ÝêÔé¸MÜsÕǘ#Ñ?­„ºÆ¹yÿ„•ÀDmPŒ£½Ed™æŽQ?fªëËèX/¦í¿HL降ÁQ䶨͹x´ŒÈgÖ® ÀäQÒ±{ÀÑU©±Ã$Wɰ£¿)Pñ¬Ê±"LÓ¤i£ÆGIšê,:1ˆ„\á'.h ôQ˜ÁUb»gþþÁdeŸQd!× Y‡ ¤RLŠžìÆ÷w„—E»nxŽ_°!T´‚¾ªÙI-’ñdKw¼-"µ MÃäá$”ÅŠ!Ë(…ÄÊ(!êƒ%þÃø‚&¿Ã/!&%¾Áš#8ÀDû#’ÄC@!ÏÃ1½#íÁË«#’ÂU/%}ÁÏø#ÌÄœ­$ÒÌ/Æ"h®áD 4ذ™u[Š} ŸUüt”CN†Ü´$X…‘´Pt¿È·vßµ=ÕÔ§=¼¼Ø›µé³VÜ9™Kµ±,iP»X<.'Áã92NÂ0´/ØÅ»..ÌÅ>+Ô-µÅº*œ) Êê, *1Í2.÷,$È *c(¿Í,ù(ýÐ1*yÏœ2y-Ð'/Ý-kÕ'4D.IÙ”7r11Õd4}-FÓ¥1ù* ÒÔ3 +1ÔÙ,¿&±×7eýN}ÒŠhCi™Âž&~!îÃ[.í(Ä,×)KÄÒ/*¯Å'2É,ñÉ4Î, Éæ4.íÊ7R0ØÊo5¼.sÍi7(/ÒÊõ6N,2ÉC6É+:Ëz5ü)áÉÆ4)«Í:5 (ÍÒI6‹*ÙÒ³8ª,˜Óâ7B(µÙ‡Ò­£SÛÍñÁÚ³€Í+Ãà¹NЉ—s•.ÑæIÓHáÔYc}VYÓà‡oÐã•¸Š·Ïu²¡3Ïš¬[ «Ò鞺ˆëÛøp%aþÚÿ;,ÐÕ83G$Ò×C+þÓ—x…“Ûhµg ×Ñ9ä1×ÏO0ü&¦ÊË2‚$aÊß3Ã"Ü«A %dŽý Š.âM.škYvÜ [aò"sçd×2¥klMI'-_s^Q.<^O€Ì6gZÉŽà:…_3žaDGe†¨ÊGnlL²[LŒpm·pQÒuø»%Xš}ÛÁ>_F… ÅéfÓ„]ÄëmµƒÆ¢uŒ<ÍJŠñòËô—H’ŒÎ-Ò‘óÏ&–r͆9ˆ„ËD{8† ÆÐj/˜ÏµŽŠ˜¬Ó–ºÚŒÓÌ¿¥ü†>È‘Áz%ÀxÑzÂXw\vü¾Óp{äÁæüœ§ÔN²äÀ6áÞÖFÊôã™ÝZÍøåMáʲ²ÛCÆŽŒžÈ¨‡‡ Áœn¶ÁÁ i•ªš¨KGÅMÚeô¿üÏ] ¿ ÎÄ[œºÖÈþVS¼~ÊëWj½¤Ì„^g» Ê5^üºœÉ•_|¸qÈ]Ñ·‰Çå\ò³,Ã>Wr©~¼¦JÃDÏš½Ý7!Ý$kx_õ¤`’6„]–dqd]Š"o˜MÃ/iÀ›½'r™”þº¬cò‹¬¬“L~‹¥©CP‹Í¤âVÑ·Ž2Æ'ÓÀô uÆé#P*-Ä!ø(¿Å ˆ%óÃ…Á%XÂäæ$Â’¤#œ¿ŠÅ"Â"!%Àc¨#:¿Ô!Å Ú% Ç Í&기(*:Œz,Ò!it/|fPay[Yo‚§I¿yf©FR»'¾A[ŸŒºXVÉœƺob³HÖ_£³½ôÛw»ˆ¸=Ûp #¸¡Ìƒr¼ÀI¢6DÀ-[.Á·2|,Å**)Æ)O+dÇ{*,(ËÆ›*Ý*KÉk-A.•Êû+Ä,{Í;.Î(çΓ1+oÏ 2›,œÏ+/C,Óü3-JÙs7X1ÖÖß6T0ìÔ©3B,ÖÓX4¢+¿ÒÉ.É(_Ò 3Ø'¼Õ¥{´oÓÂõ4–9—¼Ÿ'Ö!–ÃÉ/+¢Å1+Ä"3*†Æ1o*ÆÈ4ª*iÉ9?.wËÉ9l/¿Íþ6‚-Ï#9 -´ÌÚ:Ú,ÌÇ5˜)†Ì–7(«Î7Á)Òo:R+¶Ô‡:z,ÓÑ™7v%®×?W{9ÑSǰ©ŠÏDÚŒÍ3ÎûÔJÄÞ΂ÑÅÂϧ äÒ{ÒÏF½¸ªûÍQÌW¾®ÍÙ˽¾ÞÏÌ Â=Ñ´¡R•”دtŽaÏÙÌ@/³Õf3’#ÒŒFq3„Òµ£î‹Û…æxEÛ±ZlTjÓë=A0¸Í›3l&‡Íº2Â!UÕp=Ž% ż3…!?øV’A‚M± ö)ZNIhe²q¹n§B¹¥hóuV4T`ÜŠ ÿ'â)GÅT((‹ÇD)ã(ÁÉ—-å+ÙÊ-0*ÅË,ö'âËÍ/)Îî0’*°ÓM0«)úÖØ4K.Ù‹7€/ÌÜ,9„3ã×å3¿0íÖ<4m0ÕŠ6œ,BÑò*Â!ƒÓ{fÜSŒÌÉ[Ç\Á¿‘%¨cÀ/¡)åÂo.Ø'íÄž0®'ýà 0(|Æ…5+,Ƽ5ò,šÉ6r-0Ï7$/ÈÍt8ó.éË(8ý+lËW:K*'Ê‹8\'çÌ™8—(ZÑÀ6Ï*gب<å/ÇÔ¢>*ÓDD,*©Ð²µD—·Îýà¹Î‘ÏIÖiÈ}ÎÔ×sËΔÇó»Ïb±ÇŸèÏàÏ*½îΑܱÏ1ÎÜÞÄÓ©ÐzÞqÔúнʋÀ^×msÒcíÖw;ž)cÕ¿7²$ZÓc^ GŸÓé”>Ø åpÀÙAseýØÀP!C+ÓÈ7š*ËÏo5´#;Íq9Q#}Ù)>ü%(oŸl ±.¡JÇüðT^ M ¢dÑm%n³8ù¼kÊjT,eÓˆ5gg€‘è:†gý¡ B£k;©:Gnpô±ñLs«¹øStÿ¸AU¿~‘À“cç€xÁf‚Â6p„Êp“£š]Ï «¨DÕ¼¡¬ÍØzÈœQÑS°ªŽ¶ËÜ’üŒÊCÊ„TÃÓl¸“?ÇÓw#©Ø×¯¿³îß:ÈÈ¢¼ur¸÷m{l}´^mʶ^º~¿žy¿š§Ò« »â Î2ÈÝä°ÚÈÑèÖαÿâ|´Ø•qПŸ…¿ e‡·´Y¢ìšŸKWÆçÙ½h%¥Ζ`4Ã~ÑÚa¿(ÏÇ_+¿'ÎÈb¿‘Íïbò½êÍjaÿ¼®ÍD`,¾Î7aã»rÌW^D·ÆŸZ «L·JIE˜@ž_=Ë‘$ƒæ7=ŒX*8†ˆ8 "†tò¹¬oj<䘰ºäaÞœs¼·n»‘ѶÄY«À´Mkˆ–¬•Gb˜¢É@§}(¬ÉI¿œ#‡ÐP‘±Ælw¹ÙÒÂì"')nÄ.…)Ã=Ä&­Ó$IÀ Æ$L¾ÏW!›²`&ž(­¤UJï2Û|Ô>ƒ,EV¶2G'a'lž>Œh–bˆ;8Oð5n‚dŽ–DNfÈ{ÈF“J~Gv#ju4¥õKH‚²GOØ}†±¤QÓ•¿ÁÖmŽª ˯޵YÔé‘V§wÊfƒ=™ÖÂønv‘ßÀ¨n畦¤”a-£R¾A+¿—+Â)ÙÁ&U'Ðà &C'MDz*(¯Ë,¦*ØÍÑ.Å(úËi-h(@Ë +œ(SÏi0+CÓC2 +³Ô2‹-š×x4õ.ìÞgC¥:ÝÛ&K5E=Ù L“L¨Ø,9‰3ñÑž0R)XÎn?±1¨Ô5t±ieÃ/š+Wºò*M$yÂë.ü(‚Ä /X&úÃ&1A(ÛÅÊ1ø+SÆ®4‚+zÊ?6@,Úε8Û/‰Î…;J0DÎR7ó+øÌð7I)ÎÕ9 )#ÍŸ7‰'qѨ9ˆ*@ÙAAC0KÖú:ƒ)×TÐ=IÑ,¶H—PϾ×ÁÁŽÐ(Þ_Ï*Ï@ÛeÌÙÐ=ÚÊ«ÐØÅñ³iÑÎ ·¢ÐáÜËžÑfà.Ñ£ÑdÝiÒFÒxÔÎÄ Û@ƒl ÖS:È$Y×Y?&¯Õ2wDV`Ø6›7€0Ú8w!` Ù­huVÛ;I8Ö0>Y,pÐÙ4&"ÙÐH5÷#(ÛÀD3&¦¦ )úÑ1÷CིWA Ó j›Ì5q5™v¡_ä)ép ‹ˆ3ûo®g>8jŒ¡1C¢k«AHÊp·³ O®p6¶ÿPúug»ùXá}ÁQaüØÀßeh‡fÅá}—’CËÍ¢k¨× ½á²AÙ‡ÈØ³\ÚeÉܪ5ÖõÁ½”IÍcœâ‰³ÆdzúŠÆpí—cÊux“Šs¿y‰PÀï‚­DÛZ¿¬rý³;s8f\¬ðX2s¸Š`ö€ßÀ¨s;’yËeä©/Ú|¨|¶`æþ²|«Ó° p¥Eiøbj‡ÓEßZ>ƒ®?qk•°EéŸÓšOLÇqÙslœÀ¹Îidñ€Ò4g˜À<Ðe̾ÔϪg—¾ŸÏ}h“½€Ììc¬¼ Ìo^šºÀ̯_¸ÇÉZXï±ÁÀ N·¢¢®>C#’à”O8™Þlw.9ŒGË$Q}Õ1Ü"¿krô\yZqÊ,VžXÄm«”‰¹Pg5´)S„'¬³E‚¨BŒy¡@´x¸žrAΓ”¹'oD¯EÐ;‡µ*ZÄ#"&4ÄÚ£(#ß$éÄE"Ó$cÁy¸‘¿I.¸3‹¤§{˜f®k"\)6OrÛýHbwM‡UKäq+†CqoŒ?Kqa’«Lƒd§š.F>vf¨ŠU¸m†„wJ9gµ•6Fòa߆@ÐeÿšÆDDŠž¼mb\žhÇE‹[¢´ÊŠs‹Þ´Ÿs‚mµ:[Ï¥OÉ1ݘÜÀ¸kè—¢lUA¶Š4Á0Áví$Ã&ð%ÎÆ^(š&£Ì,"*ÔÍØ._*7Ï].'ÐÌ»-%'xÐý,r)fÒ¦.m*ÒÓñ0±+2Öü2^.Þ¸?n5ŽÛjaúOHÚuQj©ÚG˜@žÒl57+ïÏ-E#’ÔÉ^BQèÁ9w:T¸ %‚ÀF-;*ÀI- &ÃÁb1‘(wÂJ2>(uÄÒ7”,È 7j,¸ÍÓ7.¥Ð 9ú.ºÎc7L+¾Ëí5* Ëž64)]ÍÚ6p( Î:9C+ÍÖH>½,÷Ø—?¦.(Úzc%K×Ó¯¬a’HÏÈ#²¾ÏSÝúÐМܲÓDÐZÎ2½rÓ#ÅŠ«Òª¿Ø£ÂÏ¢ÐJ¼ÉÑ)׼ƳÑtÖ,Ç~Ô.ÀL¨ZÜ lRNÕÖ:9'ÙS5CÚUWK:òÜUó=%Ù}QJ8nÛ*Jx8ò×_>/oÓÁ:})RÐ×3"vÏY8!ìÓ>ã#˜Ã¿1Å÷=Gí?>T hk"Ivt7PzâP%%vÛ}‚/•u¼›§;nê¦îDËs•®JPpܱ£MpX´BO?w»]Ö{¥½#_Oƒ½Â’jB†¸Ã]{n”Ö̤.¬=×çÄ ·«ÚíÎ2¹EÜPÎĶ<ÜeÏY™sÐ©Ž„ðÅÊy*†«Æ#sh‘-Ljn¶•­Ë¨€}pr¶¿`ìŒÈ6•~Íš¨@qg²r¨o0³ïeÝy)¼'fáˆBÈžkûƒZÀÉbñgƒI M¤Tq-ÞP…nÿ8]rŽüFjê§5Ok|ä¹gYešBL…ÈêÛ†rÒ¿åÑ¥kiÁSÓ-lÌÀ#ÐØlÝ¿jЮi¾çÏid\½DÎHd¹ÚËñ_„¸øÉÆY~µ8ÄùQF©ï·(GEœ¯¢=ô”¥‡1š‘OYŠ%V‹™9!*}â!£bé ÆìŒÞ9íãÄo·“ ¸_‡ë±òNH… «bAì~W¦ÃAtsé˜Ç;oyžßJn’Á—u¹¤‘«c!ª¿²„ºü¦Ì— f'ö¿H Á%ʾ— ZºP)ã-ªrž«|lš»¿mª})…nV>yˆ‡¹HU‹-§F]¸}d fTÐ| § P,w²|R­r~¥ K©g˜!C¶~º¹3W…*·’`|iä“ñGÓp† ME šƨ}¢øÉ:Ü“®½4{¤’}»bŠ~±§g¦ÄÏØ¯Ñ¬½Èi“rŒÑ²€Nd•KžçPжQN H†¾Jâ$ÂÂß'”#åÈy*Œ'±ÍW/)ZÌ®/—'žÊÈ.…(»Íí0Š)IÑž/÷(yÓš0þ*ÙÖµ66-ßÛé9ù1ËÛ¾O@¢Ø7qEc/Ø´Y#S_×€8M/IÑq,k#ªÑ‘>Å3qκG½F5º]#¸ ^Á.!&ÖÁž.$&`Ä›/(|Ç,0»' Ê€4K(oËz6+ÍÌ7Â-ãθ7¤,ªÎ8Æ,HÌ\6Ð*vÌ8i(óÌ?7ø'úÎä7Û)¹ÕS=¤-iÛN1<ØÉm¾WÓ…«É’ÜÐoÃT¬<Ñ…Û0Ê•ÓCåGÚÒÉÐ:¾‚Õ쬉¬Ô¤¦„ÔÑlÈ´ÓÑ¢¿¢Ó˜ÎM¼×;¡ó‡fÛ=NU5EÖ—=Ý+ Ù©UÞ8îÔz63&ÒÓ™3í#ŠÕ56š&sØ»A-RÛYEÌ3FÕ¨4s'{Óq2U#Ò>4á!Ñi;#$H×_>^#7c£ 6•à)Qs 0ðhFds·6ÆvÐHÄör=qñ* qT˜E:TmÎ¥ŒF¦j/ªTM¯o±ÙMÄq¬¶­Uñy±¼c]¿y'½Ï].ƒÜÚn…‰RÃW}†›'Ïj­d´ùÚÙÌC¿Ü¡Õ!½ôÝ×Õå´@ÛYÏuŸØÑ—²-…JÅ<|Æ…Ä:pƈ‘ÂrfX™ÓËky‹ŠòÈî7|zºgSŠYƤ“w¦žÙTÁ‘>Ìd¤8zÃÁhÌg… 7LÞO6dµ6=COk-Q¾~,?ÛdbŸO°i¹®ÏV o%´ÕWay »š^šš©RÔÆÍÜTy`ÀÃÑÃpkÁÒÜmö Ôq¾ÁƒÑnmοšÏRg9¾ Θc’¼qÍI`k»(ÊZÒ³I¿ÑP%§ ¯ëA—¬•h9·Œ‘h+-2„Ö>·$J{µ"¹og1 BŸP/Ø»†„aEœëÁÁpû‘Õ·¡ZmŠ•°oMŽ…,¬DF:|A¢æA~op’y9e| ±ND•m²’f·›a»©pT¬sD‹4±¯ XÄ+ t&8—¾!¼ºÄ g"@«©—Æt®À –‘k¬w1‹¿¨÷^ÓwaˆH@ÿhCs 9(…Û¥6KaˆŽ³ RƒE¡“LÜý”¿C‡w"šÙC—„µÚQM{¼Ü[›jOC-dá’aE9–!ꇕe»øŠIU¹øq4©Í]˜K¡›ÅA…NšÁR~s–ð¿b‡d”W´^sŸÅP^r·Êüq»ÑIL3Ÿ¼´)aÆ9,›%_Ìp-(¶Ì©-f'ßÍ‘-ý&ƒÏ¬1)¿Ð63(×Òç1)yØô8j-ÕÝzH8:Û¿T5GöÕÉxh÷ÔÒt«h‘×ðGr=ÃÒÃ1{,QÊa/¾&iÑï@º=è¼w,™(ƒ½ì+^%ûÀf,¶&šÂ¶/E)¼Ç€2((ƒÈæ3Þ(JÊ4à,Ëõ9ô,ÛϬ5Ñ,"ÌÅ6¸*ÂÎ]6q*·Ì:&+YÎ:ß*>Ò*7Ø*>ÕÂ>†-RÞV·@Úàt^+Ôª¬Ð7½{§ýРфÀÑ¸Ú É0ÓMÊW±MÛD‘Òo\׊ŽmÓÛÄÁ­CÔ9Îݵ\ըèXÚ;|P]žÙFG)ñ×ïIc0ÝÚÉLy2½Ò¾4ÿ%ºÏ26$ÔË7€&ÊÔ¸:é'©Öà?W,‚ÔÞ4¨)Ó¤3*&ÑÌ6%ÈÑ®@%.à°GU&ç„¶»(3›NX# 6p”#–øyz7gÐ{@@cêzƒs©/²wô˜=p£fG›qD¬€Mƒq³°œOàp޵¾Rc€¿÷`­xÀ†aŽƒ–Ám%ŠãľŠÄŸGÒf´»ºÑÝ×Ó·Å‹ÞÇÜÃ}ß>Ú뻓ݑ֣¡ÑtµM„ªÄ |Ž€›Änx¿¼gX‘_ÇñsnŠrÆŽ~»z ·¹b¬h ¤ÎYÑ•³Ì‰ž ªßÝX´ËdÕ“ØS´Gþd™3 MÝpJ:šWfŠxF6c’¡ýOÐií®ÖXXl¼´}Y¹sš·©\’v˜¹ ^ZŸqœßXÈ'Þ€zlÂÒ n’Â&ÓÑkêÂÓMoî¾ÒkožÀ¶ÏÐi€¾íÍŸ`ý½uÎ`^¹½ÉUY¤³ª»2Kz¤Û¥„>È–èz×0ŽËEu#»~'Cú[‹Õ†>Q5D"¹é”p­œP»ž9Á[oÑPµò^¶‰p²ûW ¨˜H4r”`;Þl¼Š9_¤"Q(“±.bYœÊÄpè®m‘±L¨§š±ß»ÐE «Âi½T®ðwTžŸÇŠ—˜%±?‚’‰Ã¦^\J}È“´BÃ~¨“›@:{_– C:Š›¨D#‹I¦{GÀ’n©ÌIïŽì™[Dƒƒ‰ƒ¾=Õ„>–C½œL¸ˆQM…x¥‚K™{Y£ÇKÿ²¤Óø¡ð±ì͈™¨¢ŠÁ?v1¶ÅÕ"•±Á Ú~§g°TÌä†Ã¥_Åõt£¦ÉE–{¦É»á|¤³)Ï a¾¢´lQ¶,g D½É&ü")Ʊ+®'Ë*ú'(Ïj0Þ(·Î^/5)PÒÎ0)dÑÔ2[*(Ø5¾,PÝŠMÂ=\ÖàkÝ_"Ò–…Ì}ðÔÔysìØGÐBwØ;6¢2mÌî.s%·Ñ{=28ÞÅb2§/¦½4'é#2ÀD-z&÷À0i'‡Æ)2C*,Æ¡5Š*£È5¬*¢Ëý5±,QͲ5Ú-¢Ìm7+*Ìt5‰+bÉ5 )\Í®97(ñÏ:(*ÌÓg>M-‘ÛË[AÑÛüx¾_êÕV ¯†TÓi¸§ŸpÓλ·jÓÌu³^׸ Í”Ü-ibI€×ý‰gí×W¿b¶Ø ±îŽVÛ½jÛÊTî:ߨ†@Ÿ(pÜANs2?ÙAa1þй3m$ŠÐF0×"iÓ3Ê%½Ó$6&ÓÓ5˜'QÓì6\(eÑ81%3ÐÝ3–$ÐlB¡(“Þ‚Q-¤V*°2¥W )Hnà {,x¼3çt DÑ ²z–uJ1yS˜$Afr£ Júp¬NŽpÁ³8Ttx«¸çYØ~J½ ]d¿Ïk@켸j9‰tï¨ÖÌÀ²¿2ß7ÕÂÇTà2ÜœÆqàcÜŠÄá Ýb ÚÒ'³kƒÂ"x@~¾Ã­nõ5ÄDoxƒ ÀSfu‹¬Åÿ~/i%¥P`ç^â–®RöR‘ˆ C¹YÐ{ÈE;Kçe!4’O7rÐ9 ROƒò@8}· ¸ÅP.O&eÉ¿.K(nÏG0©+@Ï-3V*bÏÉ2Ô)çÒ 3°+¸ÙX8ë.¹Û$UÓEYÒµ£Á‘OÏÕÂŒ·2Ыµ¦ÿÖè_`¤ÚC=Ï5„Ï0<'‚Ï›7]1íÊ 5(6`ºì) !Ç¿I.Á%ü½ù.9&!ÃÚ.©)È5"+gÈd5Ø)€Ë*5ˆ*ŽÌw5à,¢ÍÙ7%*ËÌR5Ì(jÉÑ@#)ôÌ9´(mÎs8)Ö®@Å/¢Ý[DÝ{t][×è•ExÎ× ¬èŒÅÖìºQ˜€Ù䜇}ÛËf›JòÚV;hÜD| XgÝ”Q^¦ÞqMõÝ_ZÏ7ÐÙ®KR/@ؼ?=$ÏÚJP8ˆØ/Dd7ËÍÓ0¯"íÍû.F"¹Ò3L&—Ô[5¯+;Óz1›.iÓ&3D+¸Ò5_%MÓÊ2Y"¿ÓñKÿ/øàïWí4©¯( :¡YÌ >‹o3˜p¤&$"x^G"Vxru/áuw:És< «HÈj¨ïN½oQ¯—P©x¹l[=tÕºnc}aÀ—p<~оƒw6©É\¡e¯oرÄëÂéàž×!ÉZá†ÝÈ‹áÙÝÁàŒÙ/ ÞÒ3² ÂJy¦€ÅSqä~òÄüpPŸÃûn§y1¼}dfpŸ¥\X÷…´IÆL&o 7­L hh2ÊL÷gÊ6õJzmh8¥MÆ~'AH^š— Pæn%¯*XÂqÁµvYq–¶¹\|{°¿Ieu€CÃjÓœÃWžÈ1Ú¸q¶ÁgÏòe?ÂÒØgkÁÞÑugxÂFÑ»h¿¿OÐÅg$½yÌÈ]à¹íÆ­Q˱}»vH ¶”S6;•O+$Sy7'PˆNµ*+1‡0™¼ú-¨ZFæœæÂ`™\½ŠpjH´¼eåŒ<¯Ýd'…¨ßZÌ¢žVÐŒp®`‘ü³þg;—mµÒaœ ¶ŠO÷¨ÈM³µ–å<Ö¬f«˨µ…%GŸ ¶³x#˜‘°wv’ˆ ¡ÉRK€±–@H|Ê–®A΀zœ*BU… ®E›’ß®HœÝ¶"L‘›ë³ßJ¡Ó·IFœH³.I;¡Aº NN©ÚÁºOžC¹­UI›K¶@\Ì©HÁ][&¡ý½€LÁ¤´¾#L¦Ó½ÚHÿ£Ì¹¸GK¨¶½“Ir®íÃ=Ng¯+ÆEQܰ(Ä”Qµ ÆYX‹²#Î{]"¼7°qX£¹i+F'\Å—+ã'}ÇÉ.t'bÌi/‘(¼ÏÖ1@+Ò‚3å+ÊÖ6¬.ÔÛ.:Ð1ßÚ(^¶KšÑƒ»;¦}т֓ËzÍØÒÖɂ҆ Tœ´×rFù;MÓü5 )ÌÍ3Å*˰3¦1v·Q'è#í»×1[%º½=0”&Ƚ‡.œ(Á’23) ÄP3A*FÆö4ž)æËá7Š*íǯ4À(ÐÇÿ2t'ÓÇï9à(‡Æ=5ï'ëÎS5R'ëÖ`=à0 ÜQ#;³Ú.h1M±Úz`lÙÿ{Û]žÛExßXXÝjd„GÄÚ!Tœ;gÚéQ²:ØÝáR;MÛÀK–5bÚYKŠ2Û¿J.~ÙuE+*gÖº>K%9ØÜZ¬DÉÒf:R,±Í$0Ê!ôÏj/û"OÙ7Æ+©Ù‹Fp;èÒ³jVi3ÒxQ{R·Ïš1Ý"ÅÐu5ô$`Ô¬S$2iÞU‚3‚±ƒ)Š9ˆQKÁ·lÔiz@=È$T,n|~fl+ÀrňÌ8?q¯EÜt¨–Lo×­ìMZw8¸E]ˆv ¸’dQxZ»Äg\ƒ¦Á¸¨™‘Ω¯³&Ü:ËFÂàòØÇ&àìÜÅÈiâÝÞºWÝÕÒ› åÓ&°k„HÅI¨ŒÅ(uÇyh¿ùm£w¨Â~fÏmϸ]$Ivzð<ºBÇfG1ÖB¤k¹3 E<]ö/yI‚cæ3dÖ‘Q&…³°b„^|µmxxj[ª«Omi[´©XAs ¸˜]"}¶¼×d«}ݧmMŸÍtT¬ÈôÜët㿬Ñtew¿@ÓfzÁ¬ÓŠfÁÀÓ fŸ¾»ÐŸa…»µÉóX¯‚»NF>Ÿ!œÇ4‹QJ ßqµ9¨I›.‰g0YB:)^ô@tm^5 ò¡)Æßf –¹Ðp0­³ahèŠe¯+`ц„¨¾Y®Šmªæ`³’x³ng(”°´Œaº•г®R ˜³´SHs¨ ÀIL´cÀœJ¯t^R(œ™3N·šC°xg‰½£²aá€h•ÍI‚Ÿ`I逢iKÛ~Ο¢G1‹s©ÒFÉ™(²ºHÿ˜}±;JS¡±·@Kl¦œ¹yJp¢ôºµLÛ¬ÀCNó¯JÄNlµÈËÛgS´?̓vé«0Æ3]Œ«“ÄDWd¯7ÆqX̱MÉ#]¬³æÈµf‚¯Eñ` µNȳa2·qËÔkôºiÍ jÚ·>ÇãQÔ¶XÈt\ ¼«ÊŽuº8F4Àš%ö#}Ç—,±'…ËZ/f(×ÍZ/„*”Ѻ3â,}Ô€761Ú<3™Úle‘NoÑ›ÀùªOÒ´Ý»ÑãÒà¥ØbÑ|ÇiÀâÖUÖOÈÕß5ò*´Í–3;(ÍH/ó+ûÁ,Ô(Œº›,»&¿[.'€Â)/(¿Ó/ô'Ä‚4*sǪ4<)ÓÊõ5ž*‹Éª8o+üÈé4Ò(Çü2ò'aÇà3b&!Í5@&öÖ,=Ê/šÙG(3f×·V<"Úç_“F Ú&Vê>%Ø`K¦5˜ÚwQÚ8ýÚXQ-9?ÛÏOÌ7 ÛŸJ#4|Ù‡Dé0õÙãBÚ-Ù?@¥)ÙÊ;Ö%V×>Dï-ÒÕ}I26žÎq,y!òÎÎ2$ Ðò0T#vÛ!8‘)ÝÕq_iΛ̈́ÂþÒdµ¶ÒjC♇Gös´O]µ³€„}‡1ØŸ†Çvkړзpœ‰_¬\f„m¤ÔZE„F¦DY/H°§e“‘±°Ÿe%’ú¯Uà•î¯ÒI2›¥´aE|¨Â¾‚H‚²¶É Ji°»®IE—Ç–\H‚’O¬ðm(‰¥£\;†èŸPˆn¢‡JÈˆŽ¦ÍNGŒ‘©dNÿ“¹¬H ™ °ûKâ—»°¤Lµ¥ö¹0Jõ§¸¼Lj©[¼•M®¬ÀïN2°{Å4On´ÂÊxrÆ´]ÊÛ‚¯¦ÆH]{±¯Ç€XÒ±ƯV“³,ÊkܶÍö•MµGÍl¤6¸&ÍM”ñ¹.˃uÒº8ÍþtE»ÊI^¡¸ÏÇö\{ÀbÕÔ‡S½)Z×:b¿Û$XÛÌÖ0û)ÐÓ‰4t+ãÒw2*ãÓ5-5ÖK805Ú†;Ÿ4’ÙjT ÓèÀ=¥PÒdÛ$ÌïÒ¸â3ØíÒÖÈÏ9Öý‚†z Øå;Þ0èÍÏ3:*Èþ-Ä)ä¾~. )P´ *Ã'º *Ñ&qÀâ/¾'à¿/è(U¾à3(QÁý4¶)ÙÆ_2‘(ÍŽ7›)÷È,6?*TÈ 7—(ËÇ4Ö$ÝÍ£6Å'rÎX9À*!Ò<«+ ׎E¢2ÛïLs9ÑÚVH 5šÚ*C^0!Û€O7³ÜˆT­:Ü-Ku3jÛF«-šÙAµ)RÙC/¶!{Ó26©'~Ïõ›ò„ ÐæÙ¬ÒŸìÃè:Õt‚{ÂÔ›0§ÕxsêT¾ÝiNµ[,<= ¢CQGDño"Íd{½;(!¦äRV*ó}‘hF.¨uŽäB˜xW¡7KÙs©Oruë³ÏUï}Mºæbì{Uºëg²{÷ºÌj߉Ãh‚I™öÎÞ¬9°ÿÜ7Æ«¿sàbֻȬáyÝßÄáàZÝ}µ‹ÜŸÔ4”-Ì[¨!zL½nsziÁ lþ|bÃtzˆ‚ÄŽ7f*©6U Hõr÷2`[pYÁ-\s4xTD ŸÜÅC€i¾hßεÆMå¼ÇpÕLó@ÈùŸ(Å~ïXtšRFãk±¯ŽZ{qv¸"evõ¹_gÆyÏÀ+rÝx¡vÖ)qˆ£±5‹§Ÿ"3i‘®§U7H“_¬ˆ<듼¬ó>=/‰xžò8»„Ѽ4&Hk¹,y`Ø1‘D92 ø16C@QiÉ:Sô µVD ƒ’Š^–;x¾ºcŸ‘Ô¯ja‰E¦Ù`¤›Oψ ¦0ZÌ’ß´fm•›³a›“±£O^˜å²«Fßœª¸XH¨ï¾™I´pÇ#LÈ¥¾¬1H“f›NHŸŽŸ¬,aë‹Îª}azˆË¦ñUù…Û¥5N„µ¥«L~]¬R(—"²¸åY#3¤½Ü#Œ!"ÍÔ4.tÔ6`.Óî3¨,‡ÏÆ4P,ÚÔ5f,àÝúG5;ÿÚ'mçZÀÓ,´Ä™~Ò[ØéÈ¢Òçã`ØÑyÝLÕiÓ ¤—¸Ù¶G?ŠÐ 3Z*£Äc8 )ß¼Û-_$ÓµÖ*.#¸Õ+«%÷¿¨0'ç¿.¬%^¾ý2Q'MÂ43à)ÝÂk2¤(ðÁ›4Ä(ÅR5¤)¯Ç„7"*¡É99(¡Ëp7À(¦ÌB8](óÏŸ8&'>Ó|>`,JØÈD32’×$D90—ذA1MÚHz3ëÜ@IÕ1ÜÙw?©+0׃=(.Óö:¤&xÒÖ7d$Õ¨48%[Øag?[, „ƒ•†Jÿ®²ÖÀ”šÄãÚÅMËôê‰ÉfÇ#â ­^†¬td‰eX—7J±fÒ¥U›o³Œ_XsÙ¹üfzwm¹Ëi%z>ÁHvÆT’UïdHƒƒ+«blV,Dcº…'*la!ˆò0é`É‹Ý5vmÛ’A5\tÕ–Ø3òvrž.;GuZ©“A﬈Ao| —¢Å§•sm¸Zg+}üÄrƒ÷‚޳?z¶gbj-¯ŒŒ§W[ ªkÔˆ·À¡ß¶À»Î:ìµÉšºÕU–{lr…»HMwE:ŠXÚ“õLÕif©/Z‰rZ·feËuç¹nh |»²k„|qÂUxT^o×(çp/žO7§i¡•÷1^fÉ•á2>e‹”À3d“1íqØÈ3f{l8ì€!§Ä;i{“¬§Bdw]¯\AÓ{^´/FÁt¾³ãFÅmé‹d:¹^Ä*ÐÕF ;gB'‘²¤ßBü›t´ \|˜n°SlØ‘Pª–hŒ{˜XMeƒó¥m[X¨Ú^ †­Ÿ„H¨}Ba˜m²+GõœH·_G\§½àIò©œÃÖJèú˜…?p†‡W9¸€OžÈMú”¡²:oZY®Ud—…O¨‡Q†G©QcU­bR•“7µTŽ¡_¼ÀT-®ÁFMc°^¿‘Ká²iÀSL#¯o¾‘R:·Ê›|ž· Ìt†­´èË‘Ž¢³ÊÁ´­oÄÁ_m®ÃÅ]÷²1ÆôiޏÒ›@ÆŠá4É>É­âËÇ¿œÖÍ«è»ßÑA‹u»¼ÏNn·¼˜ËPSS½=ÏqZSÀÁŽ\Ì´n;Q' ÄÍ-¹+1ÐZ6ÿ.~Òy7-Òü3§*×ÔD5Ò+kÕ@4Z-îÚéB]6ÚmUUÚÕ¥$ŠÒÎF¸®Ó§ßHÐEÓôäžÛ¼ÐÕÏ—È%Ô¿s_hÑ£9¹--Ë¢3k*®¼?,¸&Œµ“)#´,&â¼0(n¼ó4|)P¼Ñ3V*ܽ4/Á) ¾º6*Á¿½0ï&éÁW2 'ŒÄ‰6ò,UÇr7ù+WÊ6(ôÌR9É)·Ðï=+vÏõ<ž*¾ÓÇ>c,xÕŸ@â.RØz>s,±Õ.9î*ŸÓj8¯(eÓ:ù(<Ñ7ï(,Ïù9&JÔM8s%nØq<))ÊÞ4=#†Ë 0#"ŽÑ2U%;Î>/!;Ì8/t!iÓ¨6¢(šÓ1€oOÏçÒ4ÁÓ&ßÐÒ”ÒfÓéÄ Ø-™›}ìÚ ET,AÙñ^8Ëâ3Op4`’å0ö OK‹Ñb •smˆ)x¾=Ì&‚-_—/zsªç;Nq{‘ÛBçoîôJŸpObq@¬EXõxâµcz€Þ¼si„­½Ð}æ‡<¾|†º‰ÔÂuå—.ËÜ­2¸ÜàÏœÆZâQÜÆÀ—àtØu¦ïÖõÂ[”ƒÎ¿®yxxÁM|ž‰º‘x}À„sDG„+¡ZP«dØ™“£´Äز>Ê?ë Í‘¸nМ‘ô`ûy¤=ÊPŸYEZq˜’S&]R¦^X;dõ°[\klŒ³î`ep²¸Àgª~ÇÀŠpE}DÂSyJ\ßvõ)qѧ9Oj›ö7—_¤•g1ads˜f2pa§”3_kœ~7fl©¢qRû©ã2ø$‡-­'®Ð7….õÎÉ4~,)ξ2ª*bÎ?4Î*¹Ó;4m+Ù†:×3aÙîdËP[Õ=›N Ò Å®èÓHÚȸÔ[Þ?Ò¨ÒK×ßÎwÕ7‰˜€BÖ>ƒ0²ÐÚ7r.oÂ-/u(VµW)ö$׳Ï,¦'¤·°0›)ºÚ0£(ؾ52*»§0(¢»Ñ3:)c¾ 4''ž¿ø2­(ÁÃ66<,ÃÈ5‹)Æ34_'éÎ1:±)ŸÎp<Ø)ðÏ:r)nÓ¨=˜+€ÖÍ?u-@Õ<ð)ôл:¥*µÒ!9L(ÅѼ:Í'ÌÒa9¡'$Ô”?z(-Õ§?)˜ËJ2þ$VÇ01!Ðà3¡%wÎ92v$þÉØ1œ!©ÍÌ-8 ÜÔF¶6bÐ>¨æ—ƒÑÙÜÎsÔ9Û˺ÔéÎL¸‰ØÅwÁY·ØŽ<%ûتG.ñÜ¿?8-õpšF[,mrQ„ ÷eÄáqO*ëxç7¸%¹w}P,fo{{¥;#m‡Ž Cöl¾•XE|j˜îIŽjD¢PÅmî«Zuw€¶ lÈ|q¸vµ€ž¾ ƒ´€ˆ¿úˆº’³ÊN©`µGÜ;ýá Ô¼rà<Ô4ªÙ~Ä’™:ÓÚ·7ƒÈÙ³w¤H©‡—žVFš«…Óg‹*¹•Û"¼ÄÅ#å^ʾÂvÛ&¢ao¢7ÂO‰nã9ó\Î0J\aå›DPbj`¨Xho¯0Yoª²¾_‚uƒ»%kÿ|l¾rK€.ÀÁx¶b´nP$ýlhŸû6uçÑNBuü¦Œ^qa®e9NbGŽa.úk—i5q n:Çn¤Ž=r¯B u*²ÁD|o©«EomŸA”]Ê`})><^ù”$%0ñ„‚(¥¶JE£¯ V™•Š êG¢)œðW…Ï&WΈó¤EW‚ŒÒ¦üK‰ä¡ìB±§jBßš«(CMÏ«¨Dö–¢°FI˜C³zHñ‘­”l>ɆÀƒ×6š‚½–=9ÅŒ†¯UÊ—K»t ý±©^êŽÍ¬ÍU’i¯MUÍ–óµfS¢¸K•«í¿:Pa°AÁBWÅ®ÅÂ!OÔµ[Ì{㸖Îhr¶bÍ`À´OÍ’>¯iɲ…•§›ÁÑ_r¨DÂcRB­æÈqfÍ´_ÏP¡µCÍos¶ËÍfƒ¶jÍ•iö½FÏ^ù¼RÌ¢SdºLÉ­Oh¼ŒÍ5SuÀŹQû¯‚Iu,ƒ¿š&‘$8Ð64Ø+áÎÆ2!)`Ð 2h*rÎ5Ã,[ÒU4*"Ùñ<=2ÝéUÿBåÙF¶r°Õ2¿ã¢¹ÕdÔ2½·Õ¤ÙPÇ“Õ%Ü–ÌãØK¦¦–vÚF‰5ÕÓ{5Á+ÛÇ.0G)·±5*•%ª4,È(¦³´0Ï))·³.ü'S·õ/)!º+1…)Ó¸)1})nº2O'/½Ë1@)Z¿ö5Â*PÃ4‡'zÅë3þ&JÊ84)dÏq=Ÿ(¤Ïõ<)bÓ=–+]Ö@›+½Öƒ?Å)¶Ôß;™*t×=*Ë×à=ú*7ÖŽ<"'ßÔS<â(PÉ08Œ$ÏÈK0®!ÍÑ2Ô$þÕ6?(GÎ92¸#Ìš0!åÓs.×$òÔCfïVkÏ.Æn³’Ò~ÚÊ0ÔåÕü½ùØÔ¯upÙðN´8–Õq9&¦Ö¡9=)gÏê34'ºL•¥1HoR ÎÞkë]yk-ãu46"çuCà'înÚm5èlœ„sB‡fµŠ¡Baf“êI„i\šÆL3hŸuRùrÖ­ôaz¤·«t‚¸½¡€,} »|¾—‹Ìë©B³¤ÜšÉé³'ÝöÍ ´vÞéÎ ¤MÕཀྵ”/ÔÓ®=ŠX¨&iÈƒŠŽ…@9 OÆÿo͹ ÚŠ©/ÂAßÖÊSÈðâà¸mp·w ?+EñY--d\s€ºA@\ «J^d” Pihw¥ÁTjfœ¨çV oµÔ`÷wR½3lô{E½no z•ÂW€$^²cp"Ñf ”Å.…tº0g¸§ŸÖô®—„E³x/`x:cËŒÓ2kj]—8kŸ}:k §š?qr·©?@Ëoò¥ÿEpeÓP;†Oþ6tY-Qö.Æ i·€ ‡ó=©¹lf_š¡L´‡¤—Kù‹X§Xí­ÓSԊ褈C1£ž*?ë‰k¦}CöˆÂ¤ôDÿ…Ö£"CŒ2¥äD£‹­¨ÎGq’«¢EÁˆ1‹;dƒU‘ï:â‚ø£ÏC‘Ï·öf˜“.¶‰e ŽÄ¯ÈYü¯VUq™XµsU•£C¹hMn®z¿LL«Ø¾0I¨²ØÆKTù¶»Ë†só¹Öδ€N·_Í—€Ã´ÛÌn‡¯&Ê'~§ÂÃ^p§óÂ/O讞Ç(UÄ®ãȆXÒ´›ËSº·àÌÜW_¹ßÏ`ý»±ÏœVÚ»lÌÔP¹5Ë]Põ¾žÊšO²À ÒæU$µ™if7v¹Ì!t"rÊl3ù*âÍ’3^+³ÏE4C,MÍÇ1ü*ûÍÜ2…)¶Õî:í0RÜ’Jæ:ÁÝcw”^pتS‡Æ×†Á¶c×JÍ•¬×fÌ•¯äÛ kŠÿÜ N;$×;: +žÎœ6™,?ºE/j(Ψ&&¦'¤s'D&€¶_1µ(½»Å4˜)®»±3)V¸Ï0Ø'ã·¦1&i¸¯/ä'O»â3&¸ÁÍ5L&~Å 6á'ŽÆf7£&ÊËü?W'EÏä=r)ÑH;C*¬ÓR@+@Ôž@*{Ô8@õ,@Õ°?‰,1Ó³<@)ÊË.6ü'WÈl3Õ% Çû5ý%%Í\7ý%SÔ7'ðÒÊ5œ$Ï23!ïÑ„4ä(…×tH5@ÑÝ•U†öÐò̺;ÕlχµLÙz¥xƒ3ÝwhAJƒØ#=d)çÒ_4/%aÚT6(ð®ú&Ø,º":œQ>ï)j­®u(ñ¼s_3‚$4r)A*&¬jpdõ4óbÀxf<6b”‹CL_OŠÖE²bÍ”¿HweäŸKOWfX¥ÒTCq3´ kH|_¸grøu¯¶¶p–ÇEš¸«&ØrÀA¬WÚÅ£Þ×1¾™ËÚŸ³¸‘ÕĸŽù‡J‹6@d˜û´0^ü°Óݨ¹–Ú¢³áÉÆé_Ì3—2¡in@;B°4Skõ8¬X¯€£A¸Y¹’Ià]ò™ùLb¾£ÕRkdz©àVoâ·aÁtºélô{‚½ûr¶p’ÅC†-du:R Món+ZË%]”õ¥R±“£ÒW鄆œONÃŒ™§¢R1‰¤HK¥„1Â@™ƒœåB邽ž]C‚ SBW€–X>Ý̘@‚Ø™%?ú<—¼CM‹Þ’DDˆ3‘r=«‡#¡±Aÿô}Wç“`¶aò;°Ë[™Žn®\T՗ŵ«X-ŸN·P¼©$½™LŽ®ÁËK]ª!ÀãQµ ÈE]|µtÊéh÷³<ÊÀo3³FËb{įwÈÙq“©Óÿ[¥§jÀõM°ãÆQѲ¸ÇúQÊ·‘ÌŸT!¹ÂÍKY0ºkÎÊWª»jÎÊS¡ºƒÍ˜QѺpÍðR‡¾zÉ’M•½cÕTU¼ƒ†™B¼ºX%c$Ç<3Ï)ÌD1:*ÎH2—+8Í%3´)´ÐU3ñ*¥Óè5&,?Ú–J~<ÞŠeŽNìÜtËW%ÛÅ_·Û̇cäÚúšp¸ßix®blÞ LÞ:Ä×\9à.´Òz:#-|ÀS0¢(Ùª’'·%Ûa(‰(“–^%¾&7±ª1Z(Á¸ž1Þ(¶×/Í'à³+20'³#+Ø#œ¹,,ñ#åÀI2A%vÄB3å#UÈâ7U&ÊÒ<ž(PÌ:'ªÍW9û(KÏaísŠÓ=euY‹î5æ€ÌA!ŒÑœ9L‹€“@=„²ž@1‰–®ÊNdä°›VZ®ASªŒÂ«œOû‘l°XO­— ²qO¹Ÿ^·K¥©ƒ¾üLQ¬QÂ[N›¯ÂáQŠ­»ÃÕTVªIÆ3Vþ¬mȈg+®É%ni«úÇŒa «‚ÅÊS•²»ÇS#³ÊUQˆ¶ªÌ…Sð¸ÚΕZ[¸ΖV‹¸çÎñTE¹‡ÎîT¹ ÌOþ¼žÈþN¤¼³Õ Tá» –×FG¬Ð#®#ÓÀ‹/Á)õÉD2Ÿ*sÈå2¿*È–4?*¦Ì4Ú*¿Ð®6,SÙh<Ë3xÜEN!<¦ßQZVD¯ÜRQ8=DÜSZÜB,Þi‡OåßdØMÎÞžPC;éÛ[?˜3Öl:Ã.^Ë`7H,·¸2Þ*”­ô1Þ,]”+"ù$w•"¦%R®Ú)'°õ&@'W¬Í$$[¨ª'(.±Ä7:58·Ÿ.ÿ'¿¢2u$âÆl:(Å8l)ÄD9Q)TÆ>:Ÿ*.Æ.9'(ZÆ.9 (#ÇW7@(~Ǭ7X'É–:'QȪ7Ã%[Ë06_$ÌÌY6™&IÑ5;%%ÑŠ7%.Ò3J%¯Õ\E‡7)ÔÛŽÞËÐø¿¾¯]ÑžÎHÁ|Õ¥±ŠžÛ~n¢V„Û=I±0×ä<ö*`Ðf3¹%9Éu/}#oÑô1x$¨X… Ä ã4W· ?üZÒ˜d‡¹ kÞ)†"e–6#]cC?(®hCE*Nd^J×*¸cša›3ègÜvà8P`@yP3rb®„r8za¥’»Ak[ú“çB _™KKgû–’MYs>¨g[á|êŸ^lvJiA r«`î5‡’%E`“θìX.´„Úz‘ÕÀ ß ÀÃdàOÆaÁ•ÜKº»œ¥»5{ò™µ¼ ˆù” ±tŠ@s$‰Ük¥K³gk@BF—u-8£X©‘NF™b¦ ¡R&f–¬N\Jj²8dw¯ºëmÓl½Ã¦hâCºôWÒe#ÕVþe$'W®nL#â\tº(g „3¢c·wì3 X°a%]Z¿gY'LX—g®%ìUÒJ;A_%‘ýàî±q+¯" JOJ +l›f.e‹0¤^Lù‹Š›—JâzmN;@}{–ñ;ØÕž@Û}V–×=_wœ“j>Žt Œ7s 9ÛÕI>ÅŠ/ˆ¶8P‰ïqu+¾†N‰ý;?Ž|¥ßMŽ‘˜š/?ö‹DœË?φœ¦wHp‰^«®M¬‹Z¬ N銩îO|×­¦MV˜¦¶ÜNIŸÂ¹^LüªÝ¿7N¬øÂ&LE©0¾þN«IÂÒQŽ«ÅYR§®È^^p±êÊÛfÔ­mÉØhˆ«ˆÇcî¯PÇ£Xe±"Ê­Sš¹3Ï5V绳ÐÝ]š¸)ÏäWÍ·©Ð+Tô¹ýÐZXÛºÍåS·¼zËfO%»~ÖGWk¹Ó›µI»¨€"6#ü½$.¢)¼Ã–1ˆ);Æ{3Û*îÉÝ2„*PÇ2)OÈO5“++×ëÜ?O<ÈÝR±>Mà\DÀÞªV">lßXMƒ9ÐÞ2F·4­ØÕ<60 Ïc7+,Ã.­*õ·–'d)ò³È)ü-]¡w3$:Z¬ÕOI´khQUÙ©óvZ4µ¡ŠÁ ÉŒ–sÔ›a9²2¶2+#³»$5Ÿ%¿¯7+&ØÂu6'ÀP7('üÀý8Ö'0Á97Ý'³Äh6”'ÉÉ_9w)…Ì”9Ö(sËÎ;á(Ïm:u( Έ8Ø)Ìà8%ÓÎÆEÜ(RÕŽ;ý+mÙbiIXÓº¢Èќ̹[ÒYÏ-ºb×¢ŽŒÜdHØåCý*’Ò4S%ŽÍ§//#Ì}0#±½=)_72¹ºÌ‰H3ßçâ@ÂT±OW Œ®^Œäb-"éÍ[N+áj\,+ñ¢[(£ 0[C0@ §b=æ$_ZŒ6`ÒU=ßæIÆ7kIZJñ$YWÆo 4Îc‚1Cn[ë4fÚVA0¸)lGC0!ñx6l­9ž˜«¶Pj–˜³p[Ì™¾–aÙ¹fÞŠžvÁµßlÅÃߡɽÃËà—À}¿á§o½aÞ¤˜±Á§á™ÖÇ®æÁ²8°bÏN«Ž{©–ÛvûT(›G aјjOjò¥ÍW“j¬Ý_½wŒ¸¯n|obÀñ|GW÷qZ×L¶m\ Q\3UoIyWÚ? !Q4/°‰S72²[Sm/K•R(ïÑL!Ìß:u G9#k˜gp¸g!¶ t5!6‹l2|b3MƒA¥©C»‹Œ¨oJ9|ú›P<„~~›Ö;{Ý•a=›uõ;B‚t½8ï“Yg`1˜N‡'/}1|hƒXŽLsž›ù}ñrð.{ެ²N¨wŸC¢Š†œ«?ÊŒZ¥çH‹-§/I¨©/IŽ=¨¬K3¬L–²ÄLÒž7¸æMߨt¿CNj­$Ã\N±­¶ÀPE­MÂñPÖ«ÅÄ"Q$®Æ{Tï°ZÉ\aÒ®/Ê\p ®É2sͱ÷ɪpª³^Ìg_¾¹ñÏZ;ºŒÏ([(µÿÎÍVH¹ЦY ¸ïÎKU‘»2Ð^R‘ºæÊ¬R•ºÔ¥XÊ·ÿ˜BI= Ò$‚¸ä+ú(wÀG00*’Å„2Û,ŒÊu2*×Ë_1U)SÈÃ0®)ûÎÛ6,-îÕ6}-zÛh>i4ùÛÉI$6ÇÞ˜Gj8ààPMÏ:?ÞŠO»8*ÞQ+:òÝqDÌ4Û@3NÓº7,-©É=JK9ÿ¼Ån.K³k‘%cõ©o¦—mg™G¯ze§›[¼Su^ª"̓ ²@Ö~¹×£ýÀ]˜œ­Û¿*šë£yPìBÓŸý#ï°Š0Å"«´k0ö S¹$6%Á¿6%SÁá3;%ªÆ•8)È*8K'‡Ì5]&,Í|<&ÖÍN:<&uÐÚ9Á( Ð17ž%èÓq4˜&aÚNq<\×îŠLzýÓÆ©j“ÞÔ`»;£rÕ¦¯¨“ÉÛñ}QaDÙ÷H-ëÔ<8;$hÎÒ7w'«Ê,0v$kÑé2v&”…ü s¸.,x7Û›D:Á6Qï , PÉÓ ûLÁ¹Rÿ´ðPžBÿPõ%™ÍI’ðlCGk.k­Rf7˜y—\—4J‘¯1¶j³”¹gM‹ø{C:5r#JY*H‡áFè©*Ìj'µ%Ù(‹»šWÀë^J¯€Õ°ˆ1½.ß ¬ºÀÿß±»úÁvß¾¾Ýæ³x½3Ý1¦ß¼tÜΨ4°ÑƒÐ¡šÅérû°Þ¯ÌÏëêíÑI£Yä¢è_ïCS cŸwPcg?¤¨VFsà²ke¬lù¾t+YݰUJ $X ÒL*¥êHÔ$² ÝEÜD¢ F–Ú F «G6$|-ƒÌL#r›+‚ÕÈ=¯‚h@Jþ– ‹ iN-sroª,cŒô`’(€„ DU˜jN¯$G­ƒs?¹±–tjA—·KBk1×µ #H&­– JƒÄÞv† —d~~ 2Ñ‹o®QJ†¥Iø„1 ~CÕŒ·«=FŒ7ªeI¸Œµ«‰I¾‘>¬L&‰ª«?J^Ÿ®pLS—§µ²KÉ »ÖN%§Í¾Oœ¨”¾/O©KÀœOX­jÄ´P!®\Ç5X²%Êüh¶¯aËw²MΑ>¹;Óà›ª¹CÑ}}κÏá_ö¸õÎVгžÍ¶Um·tÐàWù¹ ÍiQйbÎÊQƒºŠÊ|P“¹‡ÓfV?±–ްCÄ–“Y#tµ..*»á/>*qÂo2h+TÅ’/Á*È%0)zÆl0¡+‹Ët2T+¥ÏC45,1Ôõ9ü0©×.9«.hØn=ã/«ÛEA3Ü¥H„4|ÝaK8ÄÝ#A\0¬ÜˆA¡2Þ¾=X0î­´e{:ÊzëŠME |HÉHl¿Œ°GÖdy‘XCqyºªJPŸ°Ò«˜%´ýÔ]²¹±Ò¦´Bá¬6¶¦àж”ª!«Ÿ«/”!´€/x!³¾5ë%‚À‘8î&óÄ7ÿ&MÈl6À*MÈ,8…(2ǯ6Y$ÕÇ¡6Á%âÊ|8 %Mͦ7’'vÓ9Ø+ØùCô.ÚÑrrWqÔá¯/–¸ÔE¹7¤Ò֯ϖ‚Ú}‘dwÛ*P5`×T@Ù*éÓZ:'OÍ×4>$;Èv1ï"´Ó!4%òƒî‚E¬HÉ%Ðm!d£3Ó¹J -§‹ç9k„;áк8¤÷µ=a 6ÙC Ä{FêR ›Aî§n9å ãöýT 8Sž½æ½åQ9ĘÓsl½PÐý„·®†¸VgQ“íªþ] —eµ[g‹žêÄðgø˜(º_x¬ Ï }æªIÎÔd#º^Þp¦L»Wݬª¹¾Þô¨ÝÃjàhÈØ»EÞ"ºk¹bÜ7­#¼cÞõ¨ºGݘ‰¹dÚw’éÃŸß ºqÃvߌ¼ÀÏõéÐ:ŸÄ¿> V‹dA¡ay ØSêns¯³_.` ºŠiÿGgfc=ö›àI5ˆC8/>'Ê6Öˆp5š‰;0b'u KS¼•dÉï,A}nE-¤“Q8%¸¤v6—#‘­Tnqɧ\ÒqT†õ²ÙFª64ÁÏcÄKµœ>o=îª2(›1ÆœQ2l)3ðÖ¬ˆ±Î“t{±ú‰×Ž]@†•­7S<…ؤIH6‰í¢òD[ªˆF5‘Ú®QI·“<«RJ{’a¬K+«­ÆH ‘²^Lj™k·PLU¦¹rL»ŸºÐMŠŸ™ºÆOu¥±¿kQ«­ÃPŠªÝÄìTµ²]Ín2³’Ϫf·ÁÑ›ü¼±Ó£˜¹©Ñ4tt»¤Ï÷]¹èÍ Uq¶¿ÎîU¬¸|ЧUäº\ÏnTÚ¸“ËÞR¹ÄÈ:K͹-Ñ“Vþ±ƒ–@Áš«F!³v, *$½9+Â(sÃ0J+gÄä0Ù,%Æ‹1›*«È+2¸*êÌB3‚+ÞÏ›3-%Òo3ì+jÓ5I*jÕG7æ+ÉØ :Œ0ÉÙ@d00Ý.C†2¥ÛÞ?¿0ÀÚVAþ2SÜ =4/ć@û-ÛcÏ[Í3vV¹nf: \°qF>]Bv5@5d©C9”g•k½²óÕê¨`¯ Ñ§£¦èÐz‹¡Â¸ÎE²—že:•# ®F,ª’ºQ6f#'Áó7·'4ËÍ8I*?˘8 )%̵8h)¤ËQ9ˆ'$Éï9g%©Ìa9è&ÇÏÍ9'}Ðè7×(÷×'@¦-éØ+Kw7+Ûjq­R&×ߣ}ØÖœ¶§–‹ØT”zmÙí]äE/ØG0ÓÇ7%ÛÐ 5$HË<0[!ôÇe2m$åÉ-""q™½uƒ9D• Îtd‡a-il(õ -‚™2¶Ì•/Ñ|o.—µÀ:ˆž@8ÅÃÅ3hý.Ìôº$Ml3´$1»¾¦>ÜÅFÇÐW¸ïÊHkÀ¸×É3sü¨#¹ _ªfËmvy­ÜЙx_“r±HO_Ÿ\Álw¥SÇy›ÅÁU"ºÝï,»ÀÝÚ® ºÝR£}ÁàÇF¸ÚÞªÚµÓØdžP³Ø‘M·nØú_ÃÞ«`Èõâ&ÀŸÆNàñ¿aò߄ÅÉÍã̼sœšaTü0FhqªeZM`,¶@_æ2f-, )1ĵ'Õ·J ¿"!"«…Ü› õ'ŸÅw^Ö0ôÀV€—JãÇDLÁ2Èž3$5²2]uZÜ ¹k7<¹pA Ü¡Û&s)*¸(HAJ°ê9§95¯ü/M2ƒ¢T›"¾ý Љ à΋` Û‚°1yx V¢£Kƒö±WW„Ô¥îH¤‰®¢ÍA³‰2©"HrŒ€­BJ¥¨ÞFøŽ=«VMTÔ®SM>H¯˜MY˜CµLM•·MNäž?ºéLäŸÌ¹ M×§R¾Ob©.ÂâQYªĶSt¯Bǹ[0²yÎy¹HÓI“ ºäÑ'¸ìÏéeÿ»QÐ%Z¯·[ÎATöºxÑ#Wv¼ŒÑ8Rº5Ïf0ÄÜÀ?‚0.ÛaBK1ÔÙA«1Õ>¾/ ܳכ¶à¢ È¥† ¿9ã0¹¨’iyQ’™³"4c²P3u%¾¼3Æ'¨È¶9á*ðÇÛ8²)Ê7Œ*€ÊÄ8/(…ÊÁ86&Ìß9w&ëÓ^@T/=ÓJ@e-}ײI3¿ÚÜ_ÎJÒÛ0lmTÒÚÂsŽW:Ùõ„d›Ú£zÅaYÚž`©JûØFR0†ÒX7]#dÑ.3Z$Ëš1 #i;0ç$WÅdB'Ž’y¨éPM™|Î/p$=‘.×úŸ0@a0?Yµ*¼é)#Š. ,§'Ÿ®(M(á4²ÁùV-§Î2¼×HA½“ÁõU¾¼“Çã`s¹ÙÆI_·ËYoæ¶IÌäƳ…Ë§Š®«Çczᰫǽq™¤'»ËfHšl¾]©½òà÷¨É¸Ýج•¶îØ”s¼cÛà¨ZµêÔ6Ÿ|µÂÔÌ£,¯–ÐY•ø¼Ù.ŸsÇÔឺ¼Ç8áN¾ÜÇñâI¾Ä(ÞêÁÜÎÀçñÏ{›·ÈŠIO<€-8¿e+£*Q__v®W°|0:„¹T^Dò»G´$$ ¥*ýy6³ )]•а"^SE`"V»?‹–UËLoÀV‘¨Ç+^)JŠ¢ ³‚è9Ìûø~²] ŸwȈ ö™[&C¶ùCæFv· C“?³522ý¤—Ë%ogúÞŠ./¼…> õLjÌû Ül%äµë¯'OB†`´vZÁ‡3©äL‰q£€A—Š©:E¥>«ÝI ŠÃª[I&ŒÊ«HJTŒú®RP@²ŒSÒ–"¶iP'ž\¹:P£Ÿ»]M€¢V¼:Nâ¦gÀ…Nå¨ÂzO®PljZÙ¯ÇÈÎaQ°ŸÌÕrϸ Ò¸K»\Жzº¼Ï›\¼ŽÏ“VÄ»™ÏŒV½Ò¸Wl»óÑ©W[ºKÏ^V‘»ùÏGS¦¸½É¦OƹwÏ’U«rb(6"›NØ!A¯ñ)Ï(9¸U+·(ù¾‹.—&‰¿§,œ'ó¼r*ñ) ¿Q,|(ÿÆ©.à*ŠÊ64õ,}Ì‘6+vÏ;6s*ZÒi5Ç)¢Öº8ë+1ÛÿBf0ƒÞ©Gü3ˆÚ­D$1ºØt?K0©Öc?B1ÊÖz</hÜæ>¼/ÆÝBBš2å¿1'¢aÝ[0LX„zeC^ŒzAÒ“HÆ nÙ¹‘Ûò´9§‚Ìršú©³Û¡ ïºe¤mˆ{šg'ÉÓ®Š1Ø"ú¸2X$Á 6'#ƪ6¦)OÉ9`) ʧ7N'‰ÌŒ6˜&EÏ„;M*~ÑP?K*óÓg@Á-¡ØªN6EÛ´fæFÜêk>N“Ü,iñLïÚg6GÇÙÃc9D×ÖCN@5ÕÇ?»)ÆÑ‚6l$ÑY6~&OÎ4Ë%¶Ñ0/Ÿ% ´ºHC&y‰Ç­ÜSÌ¢úÔ¼}ODÃ;!×Ón'v%*ï/#h)[â%m8$–µ÷(…À½#M[_,Æ&¯0ˆÊ7wÄð¼ L ¼`ÂùW¾»Ä™Y°¹«Æåaº[Ï{uP»Òÿˆ²½ Ø­œ‹¾ˆÚ4¢i»¿Õ–ê´1Ìåzž°ÍÉy£¹J×õ‰ ¼¼ÙŽò¾€ÜwœÌ¿ÁÞ,«nÂ\Ýð¶”ݵºÂHÞ¦¾Ãfß(»ÑÄjà»(Çá ¼­ÆüáIÂÇÄ}Þ¦ÃoÊåæˈªbÂñ’¦XÙy¿4jh³œgNWa›­yS¾“nze,.ž|§œ<¿–3‘4º‰ê¥,ºr3Ux#FMø&áÔ(´ŽAÖ*Ñ®–txdF"Л—¡oÄSZmP@¤Õn lƒ ƒ {iÁ Ñ…ð ¡lƒÛ 4}g X ¦·“@‹A—µJHr² ÏÖV*¸Æ£P¹¸Ì(Uô£ÕT€0"Ÿ½Z#аù(k'æ³(]&çºA)ü'º¾8*û(Ñ¿ã-'¨ÁÇ/…*ÃÃû4Ò+×È73n*™ÌY3Ø*¼Î´1 '¸Ñ$3—(eÔô2*Ù,<˜-+ÛDE¸1§Ú@µ0ïÙß@(/UÙ`B¢1ÜØþB\1Ôì?q0–Ö»C7.LËâ1+'†zBA7_¤’OL`v‘LÙ|ƵW:°ÆÙ‡X²þ×2°Ò¦Ó–éÄÈÚõ»þœtIà5b&`S­h3y%Ÿ¶04X&X½\3ú&,ï2¬%ÁÆK4å( Èü5Ú(Ìð7™(?Îù:q'qц;³+D×B-YÚOâ3AÛqMÈ3ªØdLê1‡ÕÛGX. Òñ:¶'vÓ´6ð$¥Ó’6 %ÒÇ4B&>Õ]8'¾Ò'2¶'ÒÓp1¥$*n(¶i¥ÕFªªóã~–S³S")zh òÜË&é$’i "o#¥T$­E)ä™úŠI]æ ׿¶œþA+Á‹»PJ¼Ù¿äPc¹öÃ:T+¹}È;`º‡ÑFy»ÛÕu‘û½óÖçœa¾'Ø¿cÙFžn¿)Øú–i¾sØ2ô¾ØXŽ´¿ Û½š:Á ÞW§ÄÁLÞß²Ä"ླŊßBÆ—Äáà ÇFÃyßZÅ*Å.à#ÁàÅéá½¥Å×àüÀåÆßqÄfÌçFΜ¨1À™Ž©Pñq¯2_Ž’?IPm¼ŠÑeS¡¾4Ó@Xˆ¾·Ó@Zܽ+Óõ\R¾—ÓX|·LÈ;PÞ¸#Ä£St¢#>à)š/ "Ĭ'K&9±û*T'ï²Ç'á&бØ)€(·Ù*w'}ºZ.Ù)¿ê0Ñ*Á2<*RÇ„2)¦Ì„2=)ZÌö2*Ï‘3·*½Ó¬5n+6ÔŸ8‘-WÖ :o-õÙ¥@…1Úc?`0³Ù.>z-C×Ñ>K.¦Ð•¹`ÏHt‘½.Ô̾AÖš)¾)Öß›¿i×”–ê¼ËÕŸß¼Ö±Œ=½âÙÆ”À/ÝpŸ·Âߨ¤ÂtÞà²Ä{à&¿8ÇWßôдÈàëÖÇÙábÔGÆöàÂË+ÆáÅZÆ—á§ÁÚÅ Þ~Ã,ÍóéÙÐF£÷µ®…öO£c§.·`ãëI Y—›@Nœ—BxÜ,¦±«Û>³¢oŸ :‡>š 6U™Š-2ý“Yo†,¡™=Pš)hÀfqQÍÂ`vícºµ¾QÒD²â6Á2ñ§p#3&‡“%¤‹3;‰:[Fƒ³ƒê}2 eà’:»}²u0Ô7#²¯1Õ7J©Ç%`*•ßa‰N ‚k‡ã œå‡³Œ V­‰E 66‚ZvÛ¢b‚'@Š˜²Påˆg°“Y$ä´ô`›±WéˆâªËIµŒ-¦ÎGtã£ÚGáâ¥ôHV“L¬êJ‘¦¬NK_’ŰÈQ•šñ¸TÿK¸Nà›µCJœ«¾ªMµ±õÆlP•¶1Ë\õçËBb´=ͤhs¼ÏúbIÁÑ{]A½€ÐïXt¼Ð PÓ½6ÐHT*¼]ÑÑV$½òÓ_^罕ÔD[¦¼‚ÑÄS4³õÇ Qð·#¿ÞTÍ—í6ƒ%b›f:!V¤ü#%¯b$`&ö´’(&œ¶o,ú'»›*8'ö¾-.#(ײ04(Ã60L'¡È3c)“Í_1ì)¡Î¹2·,ŠÐp5 +gÔd:,¤×Þ;û0ˆÚü<0yÛáDx2´ÙàB@3Øa@.âÐô;…,<Çú8)u¿3Ž)Òœ¢0T"ìp¶•F@eW‘IH^h˜zHdñÆ%j·ÜG¹0 —ÈË— §nØÕšž½¯¿‘ ÌŒ{*ëyœœ(']¦«+·!µ±m//#(¹-1ÿ&º4»$|¿’4R&†¿M8×*îÄR;@+ÜÄ×6Ø&]ȧ4â$õÉ”5¸%8Ìì12$$̰3 "õÍV69#YÏy5v$íÑ9~#ºÕ¸@Ù)hØEÃ.Hܼ>1(æ¼ +‘’,XSœÌ7*Gp 2ÜWÂ@¤un/Y¢~¡: Ÿ„†8ÿœ‹™ò7ò–ý_*V´$VÈF0½¹}g,¹ßTüL±$0S/ ªW&^(žrÇŒºBlŠƒ uU‰{ –¤ŠÞ^DŠã•0¦á')¸È/$3G±µ$÷*ˆ¡³Þ‹~1tŽî ŒªŽ  –ˆI M¡ˆR2Šb ù¼†Eârnh‡ŠKˆ^8w‰Š·oXÒŠ!°¦Yx‘&¸ËfŸ“,¸«e8‰Û­ÐR‡›¥EF³Œ`£rDü‘禫G›2¥ãI—‘Á¨»I|”­àKõ™®´QÌœ¬·ŒN‡ž¶±Lج2¿&N±]ÅIP2´ÄÊ_=·ÔÏ mí¶¯ÏÞjiº¹Ð0_¸À¹Ó4c罦ТY«¼_ÏŸR¸½€ÐsU'¼VÒ¹Vܾ¯ÔŸ^|½šÓqY·fÎäR ­ÃÇþS °Œ¶Rå‰ó-À#B‘¨z"4¡$"ì%§–&j&Ü­v&+&6³y(¶%ñ¸¬+#&½±-¤'_Âb0J)lÇ“0ý)¹Ì70Ã(.Ð*5(ãÐå3¯)jÒ&7Ë+<Õ¦=Í/VÚI@ó1ÝÝ'>¬/áÚÊ?|/„×?Ø.9Ô;=½+³Îº8:-†Ë›7ö+eÄ­0‚)[¥,! $ri„²B×jéž¾QbR­FÒƒ3½3ZX©ŸÕJš±•Ó@µÄ”§Å™s ÆÓå'½ï‘ãSN8n‹jÅ›<, •¥O0Ê&¬71¬'¯V13$³Î5K$蹦1 %འ2~&N¿ù/J$Âó+{"—Æp+i!‹ÆB* !aÆ×*û Éõ2!lÏ8}% Î 9a!NÍ-3F7JÓâ4PKéÈ×1%HFK]],˜ƒKõ!ÁDo¡\O,¯k![“+7n\hS0Abú;W"–4‰¶²2°Ç=Ô@" ¿(ÃZ,}ˆÀ਒H´J®ëJL±°´ˆL²J¹NŶÂÁJQ÷·€Ë`ñºÐÀu›¼Ñæƒ{»@Ñ›‚Í»Ól‚y¼ÏÔÀ‡€ºbÖ‹ö½ŸÚFêÀVÛŒ˜×ÃmÞÿ¦mÃà}²€Å,àÖ¾.ÇÊá*ÆæÇúâZËËÈZá•ÌtÈñâ7ÊaÇ•âGÅ]ÄäàöÀ¬ÃÿÞãÀØÐŠíŒÐc‹d–ÉhqACÚ(ˆQíqƒ>RF‹)G{šF|B0¦Ñ­!?Ì¢:Ÿ‹;¢R¦z=b¡6{/ú±Lü9 ½®u…^ƒ¼fáQÛ¸n>w<)µà)-†£¿n—‘1oú‡j¹Ї> y†8 ll„ëë«h®A%N,h¯y%(#k@ËžŠÃ®½­‹œQˆ/ a׈v Ñψ¾ Û!ƒ+–RtV åZ˜ã@›ƒ¸ôbŒ4°3ZD‘·Ÿcæ—¯»‡fR‘ µ>X ŽrªßLލ¤ÚF=ޤöF’A¦&F/”§¥VEÉ”U«Gš•Û¯ßK¥–²KÜžú¶‚O'«°ÀÏN¾¯0Ä‚R_´wÈ·S ¶ÀΩ_o·Ð+dp¹IÐ `/¾QÒ3`½#Ð+‘ÄâM3ÇÁºK¹=íÁí8m4$ÀÉ%Ð$‚¿+#0ØÆ*ÿ3iÁQ+Ž?"P®  ƒ&¹`Éôz[I'B‰p›~=žŠ’±ÆH”€²2J¦{Õ¬TF×sh^C@kSv 5¯]´Yu*AOT/qB1=Ú5ŽžñT‹-¶c¹–¡œGG®A¬ûGo®²~IŒ­÷¶LïºePº±…Åû]‹´ÌÊl´·ñÎv|µ¼Í¢uâ¸RОtÒºtÒ¤{t»¢Ó³¦»2Õ熦¿ßÚ“ûÂ:ݱ nÁÞY¦ ÕàE´”Åðà,À]Æàá$ÃãÈÊâRÄ’ÆšáÈÃêÇFâeŸÄêáÄÀaÉÞͰϕíÌòszu JiDÅ;žTXÌtž?YÇ…D5™t{ß.B¡ä¨³?i ˆ¦OÜX¥7K„* ßJû“U¤F¢–¿©%J—¹­ HŒ˜–±¥Jî¥Î¸ôPG­·¿×NJ¬LšN*²‘ÈRRQ·ÐÎ`Z ¶QÎh\²¼PÏZ½½¸ÏXúÆÎ VÈ»=ÎmX ¼ÚÏXì¼­ÑZZs»Ï%SÉ·zΗR¶§Ï7RѬHÍŽVΰ¸®M5‚"J‰ÿú͘,E"å™®#/Ÿ"R!j¨A&$­®-$[$£¹+'£Á.•(Á×As+üÅ 15(ÛȆ/t&¦Ëß1'SÐu1–)‘ϼ3»)9Т4K)NÈp3P'†´ '-$§ 5%.¶¥L_ú@0™6u–?–‰ “Kù¤S€¸»2f‰rÙ›™Rÿj¤QN…q÷¤ W"cPŸºJçÓÃßmt¿fß*Äì•ÇÁx{ýªtØÜœA»û¿5œ#€f(·’W'W*è!i‰/+#Ø‹¯AD)«Ž4Xõ1ˆÄmÓ6„–‰?—â€*;Bx‰6¦éŠº9”®Ä™D´µô±¿eU¾M±(xpÁ~‹ðZ¼À‰VÆ8jµ§)Ê"Q†–Ô.­d E €SZ¬)®ªiGT’ð³GFe¹8J‡ý¿aPXƒ¡¼‹Oý€î¿7QyǹîL¿qW«IœjâtAÐb*c/->1‡ªˆNC?= T¯þ“A%©å¥>G«¯ÜJ‘§ð³M}¨ÿµPRD°:Áü\.´ÕÈãf·TËíp·0ÌŒmQ¹Ïbp¯º¿Ñ@u ¼|ÑŠu¾Õn}¨¿Ø®ŠüÃÛö‘”Ã6Ý™tÅXàÊªÑÆ7àÕ·ÿÆWáo¾þÇáþÀAÇ@áÚÁÈ#âŒÀÏǯâïÀHƹáZÅ®ÌíèkÀ(ZØT",¥D—3Á®\³qä;ÛZË€Ï?³œÉy”,¢øª^;úz‡y/G§ D×)nº/_[N ¼6s¨]¼E\_LºŒDM:n´÷'¬)[¨O>t—!†:‘RÛIÉŽ¢«pÉ7Γ5[šÝÀ¡ÒðËštÊ;’²m”‘JìfÎèÅ‹s 8Ð[ ż æ´ˆŠ çL†Ñ {†|ÁÜ H}ÿ+ã ’߯”M&”ƒ»nià—¸½Ln¢™™¿n%•}¸`“´–Uu”´>T’ü³)Vo”ȳvX/”°V{’'ªäRW“d¬ÂNꘄ°iJf˜[°ßLˤõ¹„O«S¾ÜN"­"ÂçM«³gÈ6P»·ÏÌãS!¸ÎCYõ½ÓÑrWÞ¼)ÍÜX~¹kÍÃ[¨¼ãÐÒ\ɾmÓ.b໙ўZ‰¸ÓÎÑO.·zÏÕRŶÉÎ¥Te«^Ð’YÙ¯Û¤¢Jû}kã­…Ç:Á’ 6•VÅ âžÂ!@"£¡ž$Ê'‹£"ò#©G$i#û³V*-'W¹K3B''¾Ò, 'e¿.)&|Àb-g&\½_,~'Š·‰.S&þ¦,&B"æ·J‰ò(%&«w_»>„ÆŠžKņÀ•ðMXƒê¨-W/ˆ¤³¬\ÆŒ ¸ßföw¶m¦gK£ÄIÁy'¯Yr©+QŠ!¾…^d¹Û÷·‚¦‘Íé”´Ëø}<Ć᳽ ƒÑib?oo€5p~kX0C?p§<œ$æyU”,@~ëq<6…ˆ/‡X=™…Lz_7…ƒÃc¨/“…ÛeÐ.¤@ƒÑ9/—å¢pLº¨.MÚT¯,Qpv·T]á¯=º´`謎ŸVbS/>t#3Å\¼=E}Ž‚´4®‹“°F‰_±$Eh‡7·aK{†½tN‘ŒN¿7N¥‹‰Â“S܅ɾLPqzϵ•K†sî©mH)qúžæAYcå`+ç<èø²5olh« “¡>b¥Ï§`h³>ÇÞfT¶‰ÊSg©¶æËhiý·ðÍ¥nV¸sÏl0½ÒXq¶½Õ}ѿ֌ÁþÚ´Ž4ÃÚßJ ÓÅ‹á$²$źâ@»ÜÇoâ¿»ïÇvâ½kÇÏã¼hÆžáó½ ÉÉåóÇ&¿9ÕF¤á?p.C Ó:Ïh ÔVúG)öUá`4Íšû‡<2 £=’66Фö@l+â¹ùZáH3»õqÃYå¿qeBSž¿»Dv< ¶"(8(¥ ›}>’G%š’#—&“!Ï™+.“d«“”à¶›7¥´Ø^”¸øDß©ŒJr@ŠD ²¿‰ª Y?„~ Ý뎡 ‡ ”Ù(7rýìyRAæ¯ßIä’·ueê˜&¼çoç˜9¼ùj –ì¶\^Õ•q²ŠVÙ–ý²‹S›˜&³!Ue—X°×VÝ•X¯«S—)¯ÉYž–ø¯ÙTP—»°OG™ï´äPÔ¦Xº¸Oe¬Ä¿OL̯ ÃÏQ1·LÉ”R˜·ÞË N!¥#."» #™#ü£ô!!¥ŸØ‚šßRŸ³­ RެÎO|ƒ0…¼&C'޾b±<’‰°ƒwK~˜Ž‚IÂw£¢ R|Á²¿]‡¹cdÝŒ<Àøoe=Æn€¢jò–¶Idkù¤èMdjiúJä~ѵ>S9±µØÐ£ì°?Óÿ¨û“Ãài·ÂläæÀÁ ¨¯GvÓ^àHR#EoDGH)x×VQ-zìcF.ç]~h¥#Kr€S1¸ƒR©úBø†Þ¶ÒK‡F¼ Màƒá½P;‹¥Â*RR‹OÂjR׈ À,PG‚/¼öR™€ ·/Ot.§DžiÌü>DcR7/0•ñ%cƒ?š”…X:¢ " GU›å¤ÓG¤Ÿ§fJ2¤x­ÄM̨յ TFªð»OX¥¯“Á\ä°ÔÅ_峜Æçb¶¶ýÈÔdD¹fÌi„¹øÎ+k3»¥Ðátè¾ Òß|S¿#Ö‚ÂæÜh—ÄŽßD¬ÕÆFáÖ´ýÅ&áݵ»Æ°âÁ¸ ÆE⃶2Ãà¶Ìì[㟹­ox½$ /81g ! f:(}ÔKó&Î%™a„'έH[~< ¹[Z¸H´·{^ÝFã¸&aùNB»}O¹?M³ý+g*x£³F‘CÀ¶‰3 -¾ƒÈð Œ ˜âŒã £5A‘s w,• ËÅš5Ïš4å¿—À&“æ±¥”+ ýè’·S’ÞøÖŽå ’ŽŸ :yÜ3ɉ¨ 62r™Qbb(ã‘̵AN§µYai—â»­m$—)¼biO– ·•\C—gµ TÌ–}²ÆRʘµ³(T—Q³vV’"®FV “H®dUé–å°ÔUΙı¿Ržµ¶ÔR«©'½½Pe­5ÀMò±ųR¸‡Ë>Qm´åÊèPæ·ÝÏV¥½ôÑUǺþϼU‚ºüÒ`_ÿ¹÷Ñó[ ºÞÐ!T¹ºúÒŒUܹÑ_S½ÒÕR¼¬ÈÉR®üØ^™Üƒ==K_uÎ Ás—Fx~£¾~½CzÓx|m¨ׂJí-|êtXÒúo° ºèq ¸{3 ‹5“ÔGRŠ¥tûlº &Ï{½&$ó†ë\P6¾Šw’Júˆ˜ *R·wᣮUr°©!V†v ³^\‰»½jhÿÂÅuw˜Æù~gn›M)h‰¤ŒM÷iäšLl*¢ACb£Ð| ³ ÖR­Y“öÅ q鳫١¨»KÔ ¡?hÍ\Ä.1n¬K‡'uVò.ùrÓm³5ryj…×@¼zÐk'7AssVk+wNX<,I{¤xn8v†Ûœ1F¼„ò ²K‰˜ª T ‘²·c]g‘/¹òabŠƒ¹`º†Ã»‹j ˆÔÀËlo’ˆÏ”nȆðµ{f‡k!ƒÅ=rx:™l9Ɉ“´ÄJ8Œ>½1N5ŒCÁEQŽŽ±Ã…S‚ˆmÀ¯Tˆ¸ÀÒR–ƒ`½´Qð†è½jU|µM†pЦHzdéE=ßHò%áà!-¹ƒœh(/ö†H–Ï áG˜ò£ÃHžµªìOBŸ°°ŽP÷£v´gUùªß¹VW8­0¼üXÕ³0Ë[ýµGÅË^¶üÉdN¹–̵eÚº×ηjL½™Ï›l{½¾Ò½u;ÀaØE‹Ê´ܢ¤BşফĘቬ6ÅBࢫ—Åನ#Á¸Þ¤¨iÍ"íè±KtTyBFpœ4@Œv3L¥2¹$eï7Öœ8x.Ò¾äcpMºÍZ+CѺZjH­ºÉR=GÛ¸.2•.”°† r›+=‘Þ £ý‰S ìã F Ɖ E‹Å ò“ˆ 2 àŠ }s‘êm*•b‚•j Ë“”CŒl€Œ´ ¬$‰õ h\_ É2{ ˆ‹Ð ñd ðTµ ¼œuŽ¥¹Œ°…t7C‘‘¶ÕW'•£º:k¦–z»zk¹˜z»}k–p¶Ï\–c²ÚUk•q²·Um˜«´“Uç•C®€T“”®ÈT•h²"T–—O³‹S•šóµQQà£Ç¼zU«<À8RªëÀP0´¦ÉRµí˹T²æËÔU£·èχX¼KϬUšº®Ð3Wœ¸¹ÐˆWŸnÎ4TqºíÐiT>º·Ò|T4¸RÑØX†ºÒÒ¼W«ÉýTw´{Ùå`|¤f2.+IŠ`‘q maÇ * Xad3 Lb9— ÿaY ze„É þgyŸ SmÓ ¸€~|å” %ð"¤Ù1g(&¨]0ë&ÐrF „wT4Ä*•€^Ð;wE€ÎGæ~·¡T±€¶¬[7ƒ µngƒ{Ó²¦býj‘­¬[“¸óg¸™ÃÊtÅ*z lòŸqP¡m}¥RMPnÀ åPdb*–)@õ‘ØÇrqz°Ö¢…Ÿ"Ì—†º¨óÑ—‘ÄxæEÁ.­eLKY:*ÑpZ.Js—uX6«tw¸;r™X<.©t„Z%+µsPiI-Ô|iˆæ>=wâôA`|¨ =JZ‰°æXÓŠÔ¶ ^v‰#¹wb$†{½»lF‰3Ábs€ŽtÅÑsóŽIÃphÊ„tÄŒùÄÅpàs¬šòE„{Û¨èC׈»¤N™Ž}—RC—ZÇÄUç’EÄ‹WÁ‘ƒÅq\Ž‹.¯a“‹¾¿ø`݇ù¼bTõ{`±0Nðjˆš0GÃY¦PQ%Ã'Âk¼?S² È”tG™—¢‚Gÿ¦™IŠ?«NM‡œ#­.OŸ÷±[Q€§µU¬š¹hX­ º½VDZÞÁS[8³­ÃW]5¶ãÇà`þ¹¦É³`^»cÊNdr¼™ÍÓn–½¶ÓÆ€xÁœ×b“GÂôÚ铸ÀýÚ¨”ËÃ;Úð’¹Ã%Ù–ŽDÂÜU‹¨¿ñÒ¸€ @4s½MEGm+¡¯Š´ºhÛbÉMah¤éf£5’¡Bv4»È]Jb¸ýa¬Nß¼)^³M㺑;Œ5ë±Ç"ø%ò¥Ì,¶“Æ SæŒà Àް /E‡Ú j‹S  „ù ‘ À}vG Ÿ—#ºD˜—ÓÅùÛ˜X… ’¢ !Ø Ë¨Žû fp‹×› 9 W} ú7ŠÓ mœ‡k jCŠËzÇ¥ ‘Ož4B± ¶ú_§™sÀ¦t™÷½ëqÆ–¥¸Øh]“§³“Z‘“j±¢V–7²öRQ˜m²ñQô—¢¯UK—%°Sêšz³4SSšéµoT¡Ê¹[Uf©ÒÁ^U¯ÛÂJNزƒÃîP‚·¾Ê—SÝ·ÛÌüV̶ìÌöX¼PÑËYƒ¼ÂÐ"V*¼NÐCU©ºÀÎËS¼ÉІSø¿EÓJUu¿ŽÔ'Wv½øÔeX¼ ÒÿUFªMÊwV©µBÕˆ`ÚnO%8;'§NÐW S,þ V]Ç 5 ;gže'hmÙ¼l>˜Òwd8÷.÷P˜7g…IZÔ:\‰zZá9±a`;›`bA;Æ ‰Tœ1  àpR= £÷§Ü^ŠÅ£E^Åt²PRåyü«<\vŒ"¾ÅmÓÀint¸jjèy¶pl¸…ÑÀLwþ’ÖÉ*Št%¦{_óh]¤ÿKywþ¯PY&gý›/Iƒð¹”[»¡@ωI¥7З'ª_Ñ—yŠã1ÄÈ¡³~ÜSAA]gõYh*æh5c…2ÙjJf”5Êu=Un(`sU*tûx{5%qôа>WnU¼>2{¢ÒJp†¶ªBQÅ…Ô®W7ˆk»/f…×Ââví’0Åí|†•ÐÉ¢zð•ÒÌey“•É=vß‘¤ÉšpÙÁf ~.° LŸö¹œMçŠ.ÀóS†’úÆUU—ÇÉ `h—pÈ·v¬— É†¨¡±Ï¤¡t‹Å¿ûlûÓ·ùSPqªN ZVrÑ6U1‰ ^fB e ŠŠþk7qŠØ@ë”ožöG†˜¦Kœ–Á£L š5¦¢MóŸ/¬¨P5¥B±XTz¨‡±'Rc­ ·eSÖ°»{Y²±¶ÀAZz´ºÁkVò·™Å2\Nºö˹f½1ÐòpôÀÅÒyêÁÔbužÁÓør*¿ÒÒ#pœ¾gÎÎlµ¿ƒÊjbµžíš¾Pty“ùUÔל曀yÓù½ù_§ÃžP>/–n$)$þ¤D6‡¼ce³RM¹g€Vø¸ØJ>>¶Š*—*]¬æó¡T8y’¹Oµ ¿ މw + i†I y‰u Ì Ò‡ sõ†å  Ô> ²W’Y¶–¸s’g¡¥Ž ¿ö4 X¾Œš Ѥ‰ WÞˆ dÀˆÛ q¶ˆ éЇ£ ~GŠ„ts†3Ö•‡¬+J>“¢·bÆ›‹À'p™ª½½mAš¼Fh–-¶­Yˆ“"²ªS+–Í´aSu™O³’UÉ™\±TTÑš£°}Ušà³zSuŸ·­S§¦»œU¨­7À¬R´QÃLò´”ÆcQ‡¶æËqR¸¸ØÍß[·×Ìß[¼Ò`]ѽ#ÑÄX¼ÏÎWW»[ÎRð½~ЃQÔ¿ªÓ9VÁÕYb½™ÓVf¼sÓR¢©âÍXy«±Ê \ù[9 %ª{2½€üzƒÃ§ ÀuI(tn‰I…2Öf,lì>e0‚yEòhSŽ›Los‘°Nãu”PoмOkl‹v—FGj_S66ThX=)¾yb_—3ú’`¢Z;‚£Ð_p¡•"Sy|™ŒP¥ÀŠ&I7)²°^*™„ËÓ}ìžÊ£’E§Õ ª,¦Gk™\–™GDté­™Vã^R’³D‹s° T‡›fËz¨ËÑZ \¥Î#Š!´ò×ܯϼÜp±ÈmÁh·7ä[:Eÿ®~•µY߉¶†É\WeÑAð ÍqzYd'ósq‹1'hn„u:pk—A-rОšF0q|¢II~ö³CZ°ˆµ½·jÞ‰•¾ûp˜’$Æ…|"›ÐÌ膞œÞÎã€9˜S͹zì‘ÑÇîm1˜×Ìœn‘“—Åsf#?¶ŽO ‹Š¿ePô‘‘à RÁ™ÊÍm¦§ÞÑ'ž-²+ØK½:·”ÜÎf§þÒ@³‰o¼åmÈ|v²¬Nˆeq‘D&A[*¬&1£{wI=y"ËŒ”m”9nŠL{¥9­Ö•÷DG“îžÞH•¡wK—‰£ãJh™c¥­K[Ÿe¨ Pt¥¬öO®¦ù­¿S ª-³#R©È³1QÚ¬o·–SI²«¾’U´´$½ÝU ¹$Ä8[H¸ÔÅ1[?¹‰ÃØUd·Ô½)V|²}°ƒQ³²Ç¯IQ™ÂDÇPn×ÔΔjÇ¡>ȸ:/Q%w¸Ø0#µ›&1%ñ¥ìJ<9½Âj@W…¹¬X­F¹Ã:4ɳ!#&˜®,ø¤dn÷›ùH”= ÃLÐ ª N‚¦Žé ZýÊ kê– ytá ó ’ "Z˜qK0”i ÞW‘Ò ‰ÃD °’³ôjŽT …ˆÝ hú†ì ôŠO FÿˆG Ôç}® #‚P‡#¬“o±•Kv”p¸„aVšñ¾os”Õ¹¸f–-¹bW–oµ×vƒ˜OA.q眎Fx•«,R2}þµhb ‰½Gk’“$ÅM~؊̃ÿœÂÌÖýžǪ̃tq˜ÔÅ'i‹‘½²asˆ¯¸kYžˆß»¹]ÅÁf\‹‹Ã0S¿–ÏÈáR½ÁÌçt²KÙ\¯kºüÞáÉ4»RÝ^Ì̸~ÜJÍ‚¤“Ñ9µÒ„û¸Hfl÷§cJ˜TwRo-d/ ÌÛ[–ƒÁXT1~‡Èe<2ôˆ}U:øw‘¼E’ —ÊGŒ•2—˜Ft—œG°›+žWJG©¢cMPž àKŽ |Ÿ"IžœÇHæà›àHþ¤¢¢@Iª £BG׬‘¢çH—ª‹ ÚGý§ô•–Cƒ§Ù—EDz߫P×Âj¾;`]É]¥5Yo¼ÐMÇ/=³ °!‰±ã"Y$½<'h'Ï–(Ø(¦·F9çÃÿ[L6½Fc=I» - /6µ &Æ®¡ ~’d@Ž À‘p y¦Ž­ |OŽ@ sLŽ‘=Ž> ’Y† Ñ?•kæ“Çz6”Œ m•Ô (O–Ç1ܘ} |–2 ø§ ÏC‘8 r H R9й QÞŽY ®ÿ|4† …üj*h”µµ/M•3º:fA›ã¾žpï˜û»•hÑ–Ó¸é[–6´[U—æ²ìRGœNµ§S›š¥´aVwšè³MU—žeµÏW”¢É·FRë§_ºŸR/¬„¿P®eÁƒMaµÈƘ‚ò¹BKn~mH0øepþ/ u‹•ŸCs¦£dPsw¬W€‘·j³Ž¤Â¡yžÄÁdp®÷X­Œ ›Ij‰•Œ‰= ®V:B¡›Aü£ D(‘k¤²EË€¶¥‡Ht€ñ°¼O’ˆÌ»»L ûÏex.²ÛÛÿ©L»ÝÞ×ÇâÉà«Ó¨À Þ‰Ò¾6ÞLÙÿ›£Èöš¢m#±_NÆ\µwË:Â'œíV=uÙk5<‚"žb=3Œƒ!u8Ûˆ¿ˆ@?‰×޳B玾B|LBî“ß‘¬EB—W“ˆFÝ–¼ODg–3…`As”u|r<¿—Cw“;(™ëyÙ?¡Ÿu,=šÒZ¨5˜ÜRs1G¥±l 8¥¹H›xFµÅ)Ÿ´HòÉT“¹FFÂåOd0Ú» &$¾¹*r'é·Š&%þ %‚%Á™Ø)>&Ñ¢â:M/†Ç:I^A]½f<Ë4L¼²+Ã)ì·‚#À$²« x›–’”ù믖ˆ ‡˜çŠ@–l5“0Vl‘n =T.ŸI’fj铘 K–™b•Xÿœ—B&¼—µb“æ´,‘±“š“¢6ï„'ß(±Ž— ÄyÍ êƒYp¸,-“±ÓL¤–F¸üfš³½Êq°™»Gk™˜Ž¹9]蚟¶ÛUº›,¶ÕUŒ›rµVS¾›A³'TÔœy³ÛW÷ é¸(UÈ£›¸ÛSΧ¼ªSK­ÖÁP¾®ØÃŸOA¶ÞǯOQ¹îÌ®PW¹eÏ}YW¸Î¢^;¹}εWŸ¾—Ô`ĽÓÒ›Wê¼ïÐT6½FÐãQØÁÒôOmÂWÕ1W\Á"Õ¿XçÂÖSÊ´¿ÍßUœ#Çç\Ulq7Frµ f9…jp;k%`¦—[Ih ¦+Nºi›«–Ršl5®XR¤})·sdòŒ´Áv{zŒ¶¦e¼xh·La-{‹·¬g˜{Ƹ8jQxøµh"y§´êk:z¾³¿tkž¨èt}__sŠNÐLþ1šSp2AºLʱà}‘Rr*¦iwa 3øS¥F¼%B@º8<PYƒu~:)d˜/GänXªeV{±´^dtšª{SÞp¥œNˆ$¼] ¾Ì~ä¸ÔÙ¬²Ó­“Ôd¥j¼OܧÁó³±Ö¶ž}™ùÈÜtQˆM¯>ožJÄA`ðcUfs.{Šš¿¿RË… ˜HFs8f8*xp`’³?‰sŪTS^w4­[a‹²;i£B­WZŸu§b; x[Ý)#€…Q%ö‹Pó&x•ð]!+OŸƒ«;9¬! wGÖžH£éF‹½¢ßGªw ¨-Nouq¨“NzV¬ýX‹–íÄÒyõ½â¹ÇZä!ҴÆà}Õ.ŇáÎܬ·Ó¼®µ|™¸¹TwgÜ‘´E 0ÝZ á-’^¶"n)8NÄ0…€zh‰5Õ‡@|ü<¼Œ~œ<팫|‘=w{vW:Š‘¥x²;o•šza=Á”‡n9÷‘üa’6“’]#4Ë™\ö4³—ÃXp2à”ñ?_,`Žn1f)ô¦ãM‡-É¿-pÃ6gÃÆpA7Œ¿æYý2³âL-i´÷'5&‹µU&!%Ŷ–'N%~·^$a'ÁÄ$ó&§š'ž(=«0Ô'®Â<’3P¶à-e'“±Ï!ŒܬÕ†‘¡²Fê˜x¯•ÍÂi–¸JË–OÏ+˜Ó˜¶D—”j —“•ªô1•ýL1–›j<œÕíϘñ Ûª›ê¸žÂ £o§žr¦D›Å½ï•ãór•t ÞW'ÃwØÛ↘wƒ,Ä‘o®AF噯¾ôe‡˜ß¼kD™_º‚d4™¹:]I˜Ü¶ UZš¶µˆUašüµ|T"œ¬´¹V¥ž|µïX&¢œ¸åS½¨œ¼LSu§ê¼ïS&­Á>O~±±ÃXP/µ(žOñ¸ÇÌXP®¹CÎí[ɶúÍÎ]ƒ¸zÎTq¾>ÓUXÔ¾~ÓXŸ½hÑU9¾oзN׿ҷMüÀրRÏÁ%Õ’T½ÁrÕeT°±ÎX0p²•V>fÚ7* ¥e„H™h$U4Zœ†Dld¤?Q¾jIªRhG¯EU•qù¯¸Z¥–´½Ñw÷’쾩tŸ†¨»4mªlºBhô„á¿ n…¿Ôqå‚3¼zt¼)ºrºÌ‡%ŒËÅQ§~Ò¯‡‹mT'Q«1^IÈ {¾/Û$4MqU¼2ð{ƒ-çP9©kw’áIÖh¡¢GKtr?¯¡UH€4¹ª]Ív¯2V“sh­½Tc„»\P•‘Èáq¹µíÚ1«X¹HÛE·È¹yÛš»¤¸€Ú:©òªLÑùxÙ…ÙžÄR†N¥Kæ$“v_¡7D5ˆ¹‡X낹Ë\‹xµ¢hA*sA†À9cjùfA´…±ýaK‚\›W‡c HË8nÁ5ÞwÐ5"…=D$GH'r–ÃcÙ,êššŒl±q™ l®þ¹ʰe‰ø¨ðK¨’«¥>ˆKe¢¯•›qÍ•x A%Ï Ã “†C=‘‹³ú‘|þ‚^`—ô»è–g ž–øsÓ—:©®šÝ •]˜ª «V˜B•hy‘ä {UŒt ¼¿zð´ÌŠŸwÖ.k”¬¯ÅIo–¹Ò\O™É¼Ýiã›6º a šæ¸ÙZöœ=·ÄVaž%·?UçžÜ¶VÏ ´ÓV*¢û·W­¤¸mTo©†½R)ªó½¡QŸ­¿èLú¯ ÂØKí²ÏƬQ´ûʰQ#¶ÆÌWÄ´Ì5\˜¸DÎ3VN¿†ÓzW~À>ÒÚV¾ЄSä¾ÂÏ…P«ÁˆÓeR,Ä›Ö.UcÂÒÕ¿WÃO× Rê¦^ÈeW×y_ŒÞF%Q\ã SžXÆ[w0m_7 Måj8£On²®UWo¼²ÄWb‰ ¹@ik÷¹¿oè ¼IrŽË¾“rŒJÁÖy‡¿nt½‡œ¿ot‡ŠÎÁ¤~ë‰Á¡Š““1Åë¥øž2Í‹ºÛœâÏa´—T/So8abF“'foÿG³1êMÓ ‘óFÔ»!46ôµcÌrù5qx/¤mMïn¥äJ{¤±cXP´z[Å{Ä´tWü}µU掔Ähe’ÊÍ|N¨÷ÑÞ™„¿dÞþȺÜš»Ø¸BÙµª_±4Ò~‡µŸØŸ~G‰µ¢­]~U>q³*É““Æf|œ¨^WW^v-@r¥h^7«vÛ‘ºC²Š3¾V€î€öDŸ^I"»)sÏ0Ý©/96"rˆEu&½‹ ]•,Žp}Ñ68ˆû“t>5ŸHF›|Ñ®ÂT£:µŠZ̸î^½†«¼Že~‰¾eÛ„z»¨b¤‡—µ[ •¹×c‰¼ Ù(¨CÓâéÉåþ­’Ò†ª²~F¹}Uôx·²ßQ­E†8)P33Ó.¥^ö ”šwªEY.û‚·O70¡‡¥P0ɆÃMk1yˆ>NX0K‹¥Kr/YŠ‹BÍ,É…™8˜*Š2È)ÚŠÐ2+R‡¸-§%˜(Z'z©:3·)!³"1á(¨·%0õ(ý¬$œ% £U«# ¬;"[%]²%¾'ª¸¯%('ÃÀà)Ê'cÂð*¶(¶Âô&Å';Æk%Ä&+½Ü*î(LžØ$¦¶ñ##±¥õ z®÷[ÿ®)9]­n›è«ÏNÔ©›<§¢âDÄ›?-¿“B Šl”"—–tO•¹ –Õ ï²—>¢Ï pAÒx Æ œ7üè™j÷J—ï òˆ—3 ŸL–jVšü ð 0“ÕÏ0í ”Žr{F.Å•]­øGì”ö¶TW˜V»f·˜1¹4aך%¶Xk™ØµUœE´ÎW œi´áT µkTÊ¥¸,S‰ªP¼èT+¬å½QRì¬Û¾ýRp¯3ÁNy´AÇL´àɱO·ºÍS¸|Ï/Y ·,ÎBZ캮ÏqWh¿ßÓuU²¿ÕÒURc¾UÐÅPì¾\ÑßPiÃ4Ô¸RnÃÕKT À2Õ$Sà ØBWE˜R¿ÍYæa=Y(0TCâ™Eô (hWäŽCïa½¡P0gB§ÒRr¿°„TEvS³BXx…i¸£b.†¸«`É,½,g‰]¼ïk‰•-ÀypV’œÄ´yv–æÅ<€µ•<ÄA‰J–0Åj›¡ͤ¬€­ŠÞª¼xŒ¥r…n[¥]88‹µ”^GnƈRJ“Lµ2‰A8ó ýC®+¬uhšoIûs‰¤žNHu­­¨R/p©ÙRœ¯·K]¤vW®ÍTÓ}µ|U?ŒAÀ/bÍ›qÊ{:±!× ¤ò½ÝϽlº4Üx¹U»8ݵ£µ*Õæ•°ª÷ÏÎu²UÔŒ¤e¸tó;ãuY™´:‡U¢WZm]iMa…:Å>fîuС±Lù|+‘r=K¸+ÅÔp2WƒT9C!*…z=Ñ"¿„rNÄ$3‡»y>2\†Ý’r>R‚¡ÓC°€þ°fMÚ…4¹’Yˆƒ¹¼_ç‰VÀ¸f‹ÒÃfGŒ(ÂAghŠÈÁœhË ¿Pgw£¿àfÙŽü·Ç\¼4Ø•´Q®ãÖá«~ÿº¡Sâ{'»V&NJ&p#­*/ê’N™ ºpî-V$‚ð‘ªSÙ˜„°¬¥ÍÚ… Šá¬Ch#NY=$Ê5qƒ Ï4z¢Ýf ×=Ëx$ªšO5‚zµ¥Z…7·\â’×Å•f]~¬¶X)‚…·¾V¢›½ˆZ£oËíyH¯5Ó’N¼ªÝm·Ç½¥Üð²Ó®ðÒÄ•B±[Ô\€ú³.׌ǴØÖÁ”ƒ„ áY˜_V†2‚¡ ˱o‡v¯lÖlƒžéN“qV}Ù9¬pçmŠ1ÞUY&Ów–=õ" {\Gá%Ky{\—,„v!q07uˆS6§z˜ôBÜyâ¤pF„}Ó¯Pnq„‡µ‘`¿v]Ø‘~ÄÂf“ûÅÔi„“.ÅZkÙ”®È‰lŽðÄûn؈X¼´d•P¾»dUšUÂrxŸBÌ3‰J€ˆ½:S[{¿¼TL­Fö"G#á.lS,A hgo?GvÉ,K#Šx–0x%SzÞ/¹%Êï1š)&€z+ó'Õ|Ò"Ú#œy3/"êpÇD¡vÂPIž"Ç%<£ð!U#^¦!Q"ϦÈ"§EÏ#­Æ#q$2´ß#$̽ú(³'"Â*'¡ÄÎ)'IÈŠ)Ø&È¿*â&;Çu)À&K̇*†&±¾’*%”j!z½îs Gº^#K"1º&#ð"ñµÔ!D9³bȳ*Èé°ú-ï±0Ì}­^_ë¤öë˜# «’™‚ ùؘj‰˜ •¡á¦ªóóת‘Z¡ S˜ûˆ8•" qG“ Ìø‘Ý  ü– øû’N ‘õ–J ÌH˜äßp³~µ6 –œ²´I]‘ß²ôP•…¸F]ô—í¸å[˜Ã¶óW̘û³`Tßšg¶+Vœ<´ZVËŸ ´ÙT3£Ó¸.TÔ«¾OS—¬²ÀRþ¯ ÃÚQþ³ÅO´ÝÈ+Kn¹¿ÌŸQq»ðÏ¥]?ºÒÏû`ï»-Î]}¾$ИUV¿ÁÒÍTö¼‹ÑMI¼äÑ0Pb¾tÐÀPµÁœÓ¥QsÁFÔüUk¾·Ó­V ·ÛÖ`^ioc´0Ü6Ý1q ~Ø_&|ã9_f’¡éLOrÌ®1Rwþ²àSÒ}µ6S‰¶W~n­úQô|y¦N$¨@On…&ªûU#‡Æ«÷ZŽj²Š_€µ'c¾‹¹_mЕº#tï‚¢œ3f6F(¤È2žx…töœ¸AǬíÚw»¤lËœ‚éŽÇ·\rax—•âZ|NL8Â"µ@3(Áoª—J.x¸ªÝTû™ÇSs$šiÉëeŽöÁ3^¦‰¿Œ\)˜:ÅXerÇd¤¥HÇnw¼*Ù¤¦Ø´½×P•§¯ÝÐ …FžÄþf¾¯ÆÖ6†Àgãñ®ÖË®¥q)hV>Ú„Žµ¹Xkº¼7l2£ ]÷‚‚¦{MŠb IÝaš0 |EUb+tuƒi;0skfw94ne¼}¾4ý`7â6®i¿–JAqjI³E+px¥Î^³yz±‡VX…‰ºÙYO†c¾é^h‰Ÿ¾åbþ‘NÄij—¡Étnñ—ÓÉ~r߳ånÒˆ˜À iAUÃm]ŒË¸Z^Cy%µ+PGwæ²üNÅFÇ9!Æ 4%E*”:a àl×å uŽ%™"z|(Õ"‹xÂ(a"x5"ø#wv¢Å3nçÚ8r~?šéö!¨ž5 ½¡ª!¿"þ« "Y#H§ÿ!ñ°Þ Ù%=¹L'´%]·•%¯%Í» '€'Á¿Å(&iÁ˜'X'ÿÁõ('çÆ`*Ž'ÂÃ0](É`)š'™½$0;(¸‹3ÂT½‰ K\´'SÁ¹!J!À»¼!ò³Ì*›´"¯¯¹%]­›Šó±/ò®¯º  a¦Кê˜\ ÝÅ™× •B§Süðº*®ù œ­^*ƒl’«˜¥ §ù™N ö$˜:ÅA™aªK˜Žì6–¸ š‘t4ã• ‰ß8–ͲJu• ´íRЖë¹Ï^˜¹n]™šÕº]Z™™ü´“Tj›ë´ÝW™œ%¶'[5 ï¶W8©ÖºQTÏ«ÂÀU4¬äÁ3U±|Ä`M‘¶hÇpLå·6ÊM—ºLÌ Tȼ\ÏvZ…»˜ÐäZ¡¼‰Ð Vñ¾?ЭRÍ¿bÑ!Q¸½¢Ñ{Pº¾ŸÑR¿ÒtQ ÂzÕQMÂÔ‚V¾—ÕÜWY¨ÉÑZóRº4n+X 6Ê$È[9•GGp¶­·RCv¦² Tu ²ŒT˜w]±OS6zI²gURrΪ-QDuí¤oO-w€žÎLÙ}¶¡àSÁ»¬uZW’±R`³•¶´dV’(µÀd(¼¹¾p}š¯Å €“ °3½Mò4‰-ã#Ÿ\\tÏ%í•UÁâX¥œâÈhhãCÈkgµ‘ƵËqc2^5k›uLÔˆ¤½÷f”Ò»Ás\tî¢Ky¥ª¢P͉™·¿YïœPÅoop¡ÈJq5­–ѽz%ÁÀÞs¬š½%ÝŸV¹§×Ö£ˆ¥˜ÎÚˆÙž^Êþ‡¬xŸ›MNo~œ§OUJÄ9hú—ÄKsÀ“ ¿gstŽÐƬ][¢¸×¿ghXb‹1`uDzpt³s¦3(k=} 6ži8‚„7"p'ŽÎ;,n‰’f=ùji•»?wr5£ˆD*zf°G'…I¹«3Ktw&‚ö7ú‚ýšxEš‰¯)Zþ‹ÈñZ«—‘Ï/iÚ–oÌ1oí®¨Š[^!¶; x;¯1Y’.ÄR}ךôÇvR(ÃÞ|œÐÄv=©iËȇæ±Ñe…E½–á2°{‘#¬4}4[ëz¤8°g”ñKÁg˜B8“ÂÃ#[¾´Oà…ǰiÖɇº}V”[,4¯*4\1uJ&aMrN0µiòŽÀA°m³>#kW‰"7˜mz…ú6soõ…24š~še=T~!ªH{“³XP›‹ ½JZ¹ŒA¿AbÀüb5• ÇænB–É vç’}Èyb‘½È{~’µÈŒxx‘ÇØs)‹×ÃÕmQ±Áˆh•…Ú¸PY3g„‹I<î5…™ M"¬&Èç0%‚CžTI Ù Õ]¡Õ¯e?•µjM6C[C ¬ÒX@~úÆÂ’΂!À™Bm!¾¨ÜZ œ« 1"‰®Ò&;#Õ¶J(Š%i¶‹$µ$<·Û%%K¹&&õ'$ºÙ#”&¿!%Ò'ÀŸ"é'jÄN$®'ÌÄM$£&bÇó'Ú(cÐÈ+§*[º§-¹+õƒ|I¸€Ô®W›a Vg¥5©"¸¥‹¼þ $·T8³°8õµ¬¢ 1µê !±¨V¢MBvŸÏZžüàd©yÔE¶›#¼°§éç¡)Y¶›* õ —7Þ–÷­§”ˆ ¦µ“2u*Šª ”…ÁR J„3+>Ñ”W“—<þ’ã±L<™~»Çg°™ººÆg‹–óµ\䙃¶CWµ™¹´XSÿ¶R[Ÿ¶aZ6£k¶ÃUy¨«¹:U—¬ý½Uo±ßÃ0T»µÖÆGOR¸ÚÉqP4»AËöOÆ»ÝÏ3QÑ»qÎÉY$·ŽÏaXÈ»ãÐFUkÀѹTž¿„ÒBR¤¾…ÑLQ7¾‡Ñ]UM¾ ÑMT¿çÓ6R{»óÑV4«„Ð\?x=…G?™4%Ä,Ó 0«Ošc4un2ªuR /¸+\Ѓ’¹/aÒû¸¹a6‚ºƒgB¹ûev9¶Œ\uгòZs$´Zu9³['x±Q\ €I°Ú[§‰Ã°EWÑv¯UVB–¬³.^‡”H³@^Â’ ²#b]œ£º±r”$·«qgŒa6ïVu>Æ"àdBRi2íiñjÒ?×kîaB‚n$|-@¾t°d§9¨¢LMÓª#ÐO‰\˜©ÊåksŠlŪe#Ï„ƒô¯‘Ücõ³Ù¿ HžäÉ—}ŸŒ_¸ÕiêŽJ½fj§PÓ¥³…!ªk,a"M@‡ˆ¯Dj`‹å¼/r£ÍË­w6€-€lOuîoN:>€Ó~ªb-o)‚H»Fýßags4³hiÃ08m3bù+ûvöe.Ÿ‰,03ö•›¡•C(‡…¬@G€¿µÑOV‡Ú¼ØWYøÁ÷a‘Århº˜XÉmq/š6Ëzú›PÍ%ˆ™’Í<™…˜Ëê•5”É ~Š“ëÉGtÅŠ•ÁKkDˆÞÁdá]¸rK4£/=°" &Н0X«J;v”QD¦Ï R¢“ ÃVŠ Z±Wª Í G,å²r§‰ýšw#a ¼ü!N¬ú""Û¬ö F·¨˜+ ¹´%#e¶Q'°%I·ƒ&Ÿ%ð»»(j%T»´'E')¾$ç%ÊÀ„%ê%úÂÿ$ô&¶Ã¿%œ'8ÃÏ%î&¦É¼((~Ή) +2¼-435®‰À a¶æ›¦°–6ˆ¨Í0v¤,‘H«l¹¶›îª·nÿ·”z²÷kk´aü"'®{›¤þ¯ø›‰™šŸî¸£¬2!B¦©uS˜­8˜¸{•ò{W•‹ ƒsM|\Œ¥ ô†n ´{F/öƒÍ?aš®˜XB9’}­Jdœ˜¿Ÿi»8¼@eì˜ÉµZTšC·^Xœµ+V0úµÚY\žý¶BXŸ¥‚¶¯W³¨U¸¹U|®¾_U¦³zÄ V1·íÈ&P¹ÆÊ­Nk»ÀÌO‘¼ë͈Q¹XÍ8U¶9ÍÄV˺Î U—¿•зU¿|ÒxTõ¾hÒ/T%¾®Ð‡U½‡ÑÀT¼ÑîUJ³åËXWÕ—+¾KW1bL^§/m.‡;Ï6uÎ^¿›=Lýww°®W†%¹'b †\º¦h߈þºZj…G¸mkÍ‚¸óh|sÕ²ì[ƒnh±ŠXàq ´³Y†u8³:\x¤°§[–v)¨aTÌ|K ’N!~c”¦IR{¡Ž÷H4GQEÒƒ‚ˆ´E€n€u=¦•šuQ/ š³‹]«œ›»ðbš“ À~j7’]¼ºmæŠà±áhžêZ^p¨ˆ¸Jz›¤P¶ƒ´iÏŠV¶žfᄵ³Û_z|É£èT´o+pE*‰á­þYµ±ÕPØŸ˰|Ÿ«¬ÐÕ‚¦˜ºbs<ˆÌ›1U4wp” BF‘qÀmen§÷·^s/’½˜êIîvèw¢3”xUs¸3˦9²È\Lvªt.>3WqH€%²bÅWt/‡qôuï9n…F‡BbŒ!ŒfD䌘LE‹Ù£{D‚}ߥJá|o°¯Oç}ì³­Sôƒ6¹QW‰M¿d]ÚŽ×Ä™i—­ÉQrmÖÌk…/£0Ñ—›€¥-Òz«£¸Ð¨Q™Ëô’¼“œÈlxzŒÁãkŽ8Ê'kvgap9¡*š"©Ãk%Jgf+kƒ2§ÝS&¬E}¯ŽB³¶  E¶CÈe·æеë“|«›QB@™ÍGhžúF¦_à ëàs“Ä[’3^åŽ- .‹é ¨&†§ =£}¤UuÕ Ñfy®{ÙK‹E—b›îBi‘ᯄNñœI¾™iYœ¢»`Û‡µ®X_š¨´%V(Ÿ]¶MWÍ Ö·X‘Ÿ¶JXÕ¥‰·ÉW¯©ˆº”V­~½oSn³¿ÄpS%¸†È”R¬»\Ê”NV¼¥ÎGR·»àÎVVÅ·šÌÐT¸¤Î9V¿»šÎbX2½üÐ?T€½ еUh½ÑTSμ϶Q¦¸Î*T&´NÍ9Vþ§LÃÄT©ƒa¢ñMÊNü1n,õLøY(×k¦%P£;µÏc£ˆ·hS…²¶YeÖ‡º{iþ€µ@cYtQ®±]Cm­lYer ±æ[åv«²™Z!v$±^YüuDZ²Z{u欈V sUŸÆO0r€–ÜLÆp5‘ëI^r~I„vŸ“Ká{o™¥N¿‚¬cZH¥­GZt~Ù°ô]Mzá®Ë] O³Àax‚¯Œ]¹w«¬ X+{ʱ Y(~í¶]Òr_²¥\}è·Ib§…7»ÀfOŒ4¼ÌuF}Ïšud;ZFU…3Å!ÀJ0¼ FkFQ m{³ƒO?ma…©=1h!ŒZ;Ùgº/9 wCˆë5ð†ƒ›ÞB±Ž˜¯ßOèš´§W㇖ª›Sš¸ Wá—ÁÊ^óŒº \/ܶ\XˌⷧV>ŒÂº£X$³çQ!{¯µ*QD€7·™Tq¬¹pV³ƒ›¼Y]ƒy¹…Wÿ‡8½{]‡yÄlŠ–;ÇÚwü¡ÖÏ[‡ªÔ´›œ°ס³©cÓx²™ Í0˜’¶Ék€§Œ¯Ál„üË¡l¼m½„hBýo;$Ó"/Á'Vàq1à1;7E5 5‰79‘í$@#ƒ¯['¥'¬è#{$ʨ"˜#\¬åÂ"“¯ð#€$'²×#h#ƒµO%\$¸,&%+¼ˆ)O'#Àè(A)åÀ—(6*ÁM*(¿³*(ÈÂt'ä(YÃ:'‚&ÑÆ $ƒ%ýÈ`(g)Õš=‹>D¾v[½V Škïæ¦(Ï©— ¢> 7÷H üµœ‘\Ö¢!^•ª}ïªâã_­?ÍÛ³"J°4?æn6›ªc¯•u Zš{¶`¢ã‘æŸëHˆ”š»u˜x!¥’g í>‡‚ ÂÕƒ% 4Ÿ~wÄ ~w Ø JfÙ$€ž[ª$–¼Œ?Õ–a´êU‚ŸoÀ-mŸ¶º}]~R·jWÇœçµÛT7¡u·¡WÈžâ¶;V¾ž÷µ¿S2¥7ºkU¾©â¼ýWl±ÁŒSºµ_ÅR÷·žÈíQ »;Ì0P»ÀÏTW¹˜ÎqYV¶…Í Z#¹‘Îßa ¿ Ñ3_­¾ÂÒX´»XÐOVWº1ÏJS½¸ÎîTµÍGSM­>ÈTÉ–µ‚RêtŸz¤>7=  Y/„u¼Uœn¾27qè¨ùP¿¼Gmt‘ƒ¾=s¦‡ƒ¶sb´€@²ÿ]t“ªêUÏj”¦£XÏp¬õXôo€©³XupA¬µY wû²ÝZÛz]±XŸp§[SdqÓ«ßT•pΫ´S®mW¦wSo/ªÓWYrÁ¯[›s ¯DZm~­“[§pQ±8]>uеO] t¾´[ùtÀ´œ_ŽlH¯¬[èlD¬-Yùoرe\µrµÍ^up¹0cÏz'¶Ü`Õ}\´ú[¬‡t½{gÓ•NÊßv(•jÅ€z)NóP83ãÀ/­ü|c¯hy1ŽiJjR4à`wÎ6“X…ã;_Ó›Fp¬«O/re°±S|¦¸µaj„û¿¦f›xCµ»Z“~l¸Û[Õκ#\Õ»ò^6~ʺ]n„½s]‰XÁA_†à¿.]ž‚»,Yi…¡»´Z|…g¼è\‡#¼Ž[s‰Û¾_`Ò”zÄ­mç£ùÍvŠm–È{§Ò]š¡®×󵺲nؼƒ¡Ðà¥o“ÎÉt‡jŽGÁ¶ox‰Èl•w°š×N¢" u™ nÃH ìç&n+„+l$WJ)¯¥x%}t圱L4š/³ „#¸£us%t¦C%&°¯ó$&˜²„$$%Õ² #ä$¯¸m#§%¼¡)&(À +(ƒÂB(ê(Â)¦'Åö-)IÂú*P'îÈ*)ÊÈê'+(ÇÊõ'p&öÌ/é1ÒÇZªZ¨Àv…ž}—”!W©ÝnA—N<,–óëÜ–ôç±¹^¡húÆ¡_Øz«V ­yoñªøí© „š¦­Êq¡úÿ› Wd“ømV˜㙦Ï“è& LîŒÆ wlë´}… duß' ¡xIl c½rƒjû)n”Ï@ؘ]·-\t¡›À®j^ ˆ¹¢[lŸB·çWœž†¶…T6Ÿå¶™T®Ÿø¶ETÊŸ5¶sS §ºÎU]­ ¾³ṴÎÁ»S±ªÄePÔ¸oÊ´NZºÜÍ*P­ºÙÏ4UT¹ÍÚXßµ¿ÍX\u·ÞÏ¢`½UÑ \½´ÐeT_»jÐ>Tæ¹Î$Sa¶˜ÌÒU°NÈ¡V9¢G¼ÝQ5‡g¦ O‹axSž/u6' …?ô º]G¶<öuç©5T†¼@r×k¿ŝ۶ra€u>§T­oBŸÝP(R(ç¾ð3*iÂä.l(ëȤ-ª)xÅß+:)½Ëœ)v)YÌg)a)×Íù+Û,ÂÏvSÇR ͽœp‘¾ë´¦é˜þG¬¤Ó:}”AŒ¶•ŸìH–¬žb›mÅG˜ï)6˜Žs£BÜ©1 Š©‰;§¡ÿ¦†{˜¢÷WA 8ŸE;š0U¸šÕü¬›¯¾—yžÏŒÕ é&†L¥Ë€Üx‚Ç qKx~bé®»ŠOwW/•œê<—œ±º¢^x£p¿€jÞÙµÌVAœa´ûTÿœÌ¶³S8žEµïRsÚµMS5¡·‘S²§(·òT¬ƒ¾ZT]²ÂjOµ@ĆP'º,Ê×N›»TÍQK» ÏaV(·ÈÍ‚[<³AÌò`8¶’Ïjba¼Î¥[`»AηT„ºÏBU¸MÍÐS#µEÊÿW!¬_ĆXÖ—5°´NÚ|щjDgVö-_)3*.Er+·ôf´Œ„C,y«¨Sð‰“º‹p]ˆ$¸ÓiØvª-V#o›žîSm»¡¶X™rɤ>W¢nŤzTv¿­òZy0­ZÚtI¨ŸZ×qµ¦sXðk ¢©UÄhSž·Sl¹³ë[¦sÕºY`“yE¼·b‚;¿0h\}¦¾cØ}¾8eŽw`»€dDzŽÕd£ë¾ jÛ…j¿wtÖ‹9Àay|;Âõtk‰P¾õlæ|Þ­ì`¢Zæ\µ0ž_ yõ8âav‘D`Y‘hF `•rGÅev¡}Oaø£JlkаOÿu7¶ÇU?}ø½\lƒÌ¿ña†]¿}a'„¼2bŠ÷ÂKl×…ÈÀÊlÀ„¸½‹qí†é¾õu鎴Â!zl“QÞ€û‘lÞ‰Œ˜Á1…E)¿ì„û¡À{Uv¿õmë•Ä?sy¤=Ï…S«ƒÒšœ«ÓZ¦å°tÖ³, s΢¦•ÚÉHPœ²Ê¦§‹´ÁutOײÌ]l5!Àô* ØÕ¿$sÊ'«., #3’ll™|"&8š–!°$\˜mÆYdó"z¢õ!&#â­w"Ù$Ó±é#¯&¸·)&&Y¶N$ü$´»¼( %޽.'4&Å»†(&ÕÁ¸1*IÆž2­+”Ë/â*¦Ê 0æ*CÊâ-n+aÓ3>1ÒKŸE‚ËÚ›<ŽÊÌ]Æ”ºy¿ýÌœÂÙ™#š ª”¾˜¯31˜ñ¾Tú¢¬µÍ› óó›ø$Ÿ’Ź£ªØÎ¥ör_¤¦Åq¶Ÿá¬ÒœÄc^™·Éؘoë˜j ãc“>Eþ‘¿0ý‹!/€þHyù YwÚ+ ¸hA`y ŽÔb€±43™Z›æ<ôž¹E[‡¡S¾Ëh±žá·ËTEµ¹P±žq·PÊÞ³¹Q6¡n·Sӣ͹`SXªÃ»×SÍ®l¾LT¬²ÁOç·XÆ–Nǹ^É÷OJ¹ÚË«OŒºÖÏþT–µÌ\[]±jÊÌ]—µ¹Í aµ¼>ÎÞ[ÛºÁÎsTº‡Í:S'¶ŠÊÉS°óŪX,¸ T]†!¤JžoZoI:VO—ÑÊ4¹MÈE$•j“‘ÅDçw$¥P€d´†`Ê~ü¯±Zís@¥&Qt¡*V/rJ£Wvp\£ŸUpd¦S¬s§TBtN£$T‚u‹¤’XÃÂnóÄVxõ–)Èm“S˜ÚÈ£F˜£Ç¥d ÃÊü­BªÓÐ+µ¯–Ó»é«¿ÒĽ”®ÒåÀ[¡kɳ¥ù˜Âœ€{”îÃØt¹˜bÆsT¦ÐÐÿ‘«yÓL£¬¶Ó|£Ž£\ЀŸB›'̇”P¢°Î™¤5ŽÁsˆˆ·ùZé>K)W-È! Æ×&´Ç­&ïk %Íû‚qÛt è#„#ó‘øO’ò‡u˜j  òŸyÜ"ªv"®$g´S$ª&«¶Ê#h&7µ$% »£)Ÿ'Œ¼ (B'ö¾1'['JÃ|*£'¬Æ+Z* Éâ0(æÊ,ÿ)©Î|/·-rÑÖ;g4yÒ s$gÄËÇ©µЀØbÎ5¨ÞFÔr‰¨œü¬Yžoš56Ù˜}GJ£¿£pžDJ•Æ‘2‘û /påÈ0ŸÚÌž§6z÷£’ûž s ŒfœûGX™U›—ÇQe–é ÷S"RÊ &‰«ë t› ctæ t‚Û !bé a[j´ “ã"=`“DîAÁ›-¼/[3ž[ºìa[›ŒµeT›åµJSžÃ¶¨QÉŸÛ³ôR|£¶ÊPZ§V¸ËQä«#½]V8°¶¿Rõ²sÃ)P!¶úÇçM–¹nÉðNBº³ÌÍR¹TÎ/V̵ ËNYà´&ËZÔ¸‡ÍW\ɺçÍ­Vu¸ÁÌbQãµË>Rt²6ÆQñ¨¿VO®•õ¯ªN}*’JFùd5UA2F½ ½ ×9tËTVÀ,ÆfU‘ÉE&oŸèMmx§So›¥Lj/›RR·o%ŸaWmnïâTFrM¡ïT|Þ™‘Æ"xx¥aÏ‹^­Ó!Ÿ¥¥{Ï^–ú¥Ïy“G›åÉPÙŸÊ–øý¿^oŠ„d·g\ Cþ/Öb'4}#0õW6gð̇Ÿ' %@Ž»N ’OKh”*µ³—ª”P ²ã$ ©"É#Å·w&f$Þ¾U(Ÿ'ºÀ(·&;¿'J&e¾Þ%3&ÂH(·'mÆ:*Ë&ÈA,'ÆÊy1ˆ(ÖÍ>/Ô)PÓ<6.Ò!JßCõιšã[ÌcËóÃQÐÉÞþÔ¾ÄPàïÖ'‹çûb¯¥ºš²Ä¾¤»;£¾Â ™LPˆÞLŠˆ}st¨{ @|Ð + óŸ&—_ ´ 8˜»W˜Þ Çd— AÍ$ ¢GŠô A ̇þ | †i Á΃# Ý ƒy œ nîLJv< [Ußcö7П—Ž›k?~‘¨ð?üœaºZAŸ6º’b|w·Tž›¶!P  ¶3OÜ ´#P;¢—¶»P÷¦7¹¡S†«k¾?S²¯Ð¾¨O´ÜÃÖMÍ·ÿÈ O™¸FÉ»P¹±ËûT¸$Í‹W6³¹ÉtXŲÐÊ]ß·÷̪d’ºIÌDHu_‘YF…uÊ”òQÃv2œ8Uôwé 8VÒuM¤pU[sá ‡UHpܬ]3t– ‘czv)œn]«xœû_ƒqe—m^1q”Â`Êrɤ`nu¤2b8rÕ¤Ãe%pn¦Rdn §Èg«pî®{l0v·²öl±o´³–gÎpÖ²cUqŒ³ë`bpÛ¶ú]Íof¶¼\‰jö±Ú[ès˜¸Rd¬x¸íi¨~uºôxO‰ëÀc– ¨Ñ_»ÄRàoÒÖÉâ˜Ú€Éºã>ܬÆÅàXÛ@Étæâ”—¹Æ£½Ošm3b4‡¨HfdOk4—‡OShWœ_L`—kCqcÊ¢ÙFƒf’§úIìqX±öRž{·¹¼^W„>¾šp^‹…ÀŒ‚+ŸÁx–•}ÄŒ ’°RÑ„ºÕÃà ÏÉ ä Ö‘È\âçÕaÄëá•ÒyÀªßsÏ„»RÚ]ÆZ°™Ò~¶˜sÅŽ’ì¿`rm•]Á§sž=Æ×us©›Îy‰T¤~ËqŠwšÆyy•rÄÌz˜•žÄz¾†õ·ãc¹ˆD¸Ž^ÞEè/<.#ô1G·Š0/E{[3èŽ.¯‚ìû\‰ÍŽНI$”$ØX–­ã!,£©!}« #–#0²o)¤%§½â+§)ëÁ”,Q)°Âa)Ÿ'©Á±'¦%ôÃh(„&˜Ç<,'%Çù+—'ëÉó- (¢Ð2´,zÒÎh]VœÍµªw–ÊÔ¼³«'Î;ÞxÓ‹Ò®á ÕåÅdÓ¿p–¸¬œ¨ñ§ —@€N–Aî|ž¯Éžã«œ¤\<Pgª‡ù L "{s éb³ÑS w Óš”M8”Èÿ•Ú*4Pyï _è€D^„Mðä·làÈ!m <¬cÑ&ˆZ§+ ˜)ÀnDc>"Y™/ží@º“—£¶?Aš/·6S£Ò½^ }·lRn¢¼·¨O£ü¸oNƥǹN«§N¹FOX©‰¼±Qú®o¿¯S®ü¼uL˳áÃM¹%ÇwMû»ʵP˺|Ë„U½·Ì–^¸³;ËÁ`¤³)Éßo7³_É~³ÙÆ`T`°ŸÂçPk©¿ÎSa—гMõн£ HÊ}Œg@YlWý2RÞE<3¾WG÷ D½d¤n—8hè‡i@³oµ—At>ŒµHPv–V(y+ž®Y}vŸrVYt†ŸSUsAžÝ\÷s9ŸNdÃw Äg\r†žb§oÅ™3]xwŸ€bÝs Çdmn–%_™l‹ì_Nmž¿bím¤¢@b»q §Ãd‘sx¬CjÛwR°Çk‡uq³iBr„°aq'²/[äu¹R^%mø´BYj¯²[¶s_µÓd ~Ò¼±v1Ž‰Ãµ—:›^ËÔ«½­WÔ<½ ¿TßdÎÃÄÂâÓÁþâJÖÇ…áÆÙFÉóå£àÓ¡Ær²tQ™kž7Z€%B·d?’]Nš`š‘,H_<‘¾@ß]ЕA0* ÕG6—/NÓ×i@T Í¡·¢<Í(Ñ0¿²ÏÁá§ÖXÓíÛëÌžÅG¼KžÕ™÷eŸ®¨šx¡<Ÿ½O¼Ÿ#Lz £d­KÒ ý§5ÃŒ¬ ì‚y »lÇFEL£ mÎ àŠ» Å=ƒÔCwæghï ÔlÈ*xazðFN(‚¯Mß/¡{Ná-.…x„;Ç„Hq7a$)ÇÞ$'úwüp*ÔÝ“*9¤”R¤Æ@š³AR{£šºn] ó³dP,¡´´ìNµ¤m·ÃO¦y·.M ©Ïº[OZ¬¼æPì®Ô½Qt¯å½L´ÙÄL†¶ïÆ;Mž¶×ÅõNî·üÉìRÞ³>ȧW"°vÇX+²ÓÈGY±ÓÇrP¯¯¢ÁêQÿ®¿,Oh£+¸ Qǒ몤I½…4™ AÅuóú<ãitO-ÅR§¦86˜„Ql#Ì?bhÅ6_e΄¤>¦q©Šˆ?2t%‘žH„w¦›ëUìyž,ZwžÉVætSœ6Wºwí ©dÍ|N¤fk÷xõ¡hÜv‰š?` v|™é^¦sÌœÎ`€qœŸ~aIqšà_hqÏ©_ôsמÏaèsg£àcƒuý¨bÈuX©›hvÙ¯jÚs®Öcüp¬:]o­gVèoŸ²$[án“³\wt;µTdÉxǵlˆúÁ“ŒžzÌÓ®ù¢-Îò±}ªÊÓ’¸µ#Ú Â‡¼üß$É›À=áTÍEÀ×àžÐóÂá³× £„͹ËZ[z¡FûV$t¬8ç`B‰òBò\i‡+‰§A `qf õR/Ø3:«oÏïŠa)̧…UX-ªwŸR-Èd&1¼¡pb.{û¡tkÔ{¡³mòwÇž.jtE•ía#t#˜`^érz™Î`àr.`%t¸œŒ`t¹d`˜w¡`ŽtZ¦{guϧ_d?t¦Ycu=­bgn «^§iE¨ŒY jæ¨ÛRÚmJ²IW–s“µŽ]|ý¹+kj€w»°wãŽfÄ|˜žMË¢§ê€Ìi¨' åÍÇ©œÊá¦Q¡=Ί­X¨{Ò=· °–Ö²Àt´øÚaÉSŸlÎÑ»eï–^wN _—t@]ÿ ¤Bøfî¨4Gïoq±R‚q±Ñ[¢r1®[Åzª³écüˆŽ¼›vÍŠ0½z1”bĈ‡¸™¼È ”+˜ÆŽC‹Á ¨’L½Õv™“Ø»£rØšaÁ t}”ô½m㎈»„g;•KÀ(f€—!ÁÄkšïÀme“$Â1lÿ’4Á†lŒ&»ak%‰¾äh”ˆ–­¿Z8µ ;ó1ÛYo:ÓörÐf½wBû@†4GŽóyšC$"oŸô#[$먆%Š&Ÿ­O%Ç&H³^'ü%ô»ð&‘& Çš-<*¦ÅÝ-‚*âÆL-…)íÅí*Í)È+'ÍÌ€3%*cѸ3è/gÕ7d0ÿÔŽRÍH4Ñ8XzæÎ…»Ù¤{ÏLÆÉ³.ÒÐÂþ©µÙg!tÊ4AC6%¡¬¦ª” ½¡B›BŸDb`›Z›Ð6]ö"lœ­Ÿ¯Šæ½ {Øä dùQ‚äd í¹€êJ #®nÍL²!BgƒU'Æ[þ$Æn?ñ!E¼Ð x[á U?oÿ=þ*9Oï’Y2ú“.*§U<8p‹®•Û;>™\>>œ<¬ÄD·ž4µÿSQ¢º×ZÆ¡w·aPê§ ¸ZN©¤Æ·+L®¦·RK%­S¼®Nç¯R¿‚QP°À¿9Mæ³ ¿ŽKc¸%Å!O¸¿ÆÄNW¸sÆÛO¿´éÆrQû°JÄgS™«HÂÃQv­ÂGW£±DĦVú¯¾4S¤"´àOřޯdM6Žq¤I§S“@BÉz‰t ;_nB),äOh õ§6•Ì[’.Éj¸c$6¶jS€¦@*lzˆòDq’ìJ+wž5W‚zŸ¤ê_ x6¡ã`Ù¡£ h}º¢änzÝ¡InizÙŸ”j,wš›BeuR›kbpuà™¯ags™`mr™{_1q¶š_ds|ž˜`sö¤íhYu¦tg’uç¦~eùr”¨bb”kå¢vYbËÞP“fƦOR$mn°¶V.v ·çaN{‹·òmÛ†-½ªz$ŒEÀƒŸ‰Â¿S‡…åÄ ‘PÃm7Ї½Û†æLÁi”%™œÊM¥¬£àм³p¡±Îúµ™ÍÌÕ³pµ¡DhýOrÒ,4Xd}Ö5/Yj…5[Ul€ï0 ^³‹õ7$^ÛÛ9e[Б*>‰^”› @ i6§ýGdj?¨äJ¾kª¦Sœpެ‰X pî­%Ww¢±ñbzÀµxf俵 hð‰²½HuaŒ9¾±sO‘`¾¤tü’k¼³to‘tºžtï”ã¼Aq‚’лúnXŽuº‘fç•"¾Oh0‘ ½½fõ’ÈÀh†ý¿NfÏ<½Ke¶‹Ä¼iÚ‰:Áëiê}äŸØP. º4'=†eèrüMYoJÙ^wý “Ž~Õ<ŽÚí®›h!ŸÑ!ù$À¦•'''=«¶&Ö' ®,%L$¢¸Â(^&»Â+É*}Çf-/)cÃL.‘(6‡-…*3Ʊ.#(qÌì5â,YÏŽ5O.<Õé;5ÔŠmj]–Ïì¦n ÏÞ¶ +Ðu¾Â©¯×I^„ÚOq?UÈ-·(¢Øù¢¤ïA¤&«_¢È#—¢a}#Ÿ‚@¾šÝóÖ˜g ‹2 KOx³}¸^­ Q³¹T+3I<)“ci)öúC•S˰¢qÛ^}1–pmc>1oUH(Ù[[6Ž!òpÃX«4¦_c-¼×I¯p ?I[X;ç4Œ‘›£>z8™5=6š0®ÀFÄ ´T)¡’¸?X­¢êµvO(§µ‘M¹¥ ¶1Lǥ¶Np¬ºR̰¾”Qa®“½L­¯“¾‹N鵺ļN1µ™Å¬Oj´vÆ*Rá±—Å…U_«¡ÀÍS¨Â¿*Pø¬øÁT¦¯ÎÂ}Vb¬W¼\Tƒ¢:²ÍN=–¬«RI:‰ýžèF~[Œ’@êw qz8Bp8G.ÉM“2=B[¦)ÿÄk[_š5'gÊzæ=‘h‚‘@thíŠÇE¾pß•ËP£wÇ á\/u| .^±w韥e‡}'£njî|J ómy/ŸièzŠŸ fux œncéwýšX_µuštcvÏ™`^ui™î\¹s†Ábxtº¢ãbzsî¥7b—sÙ¤`±qè¤e]‘hžœ†Pxeð iOJlë«ûTno¯ñWºqù±]v™´ghz|¸o |6·Ýqrz ³¡mS‚¹þt{ƒø¹œvVˆO½·{׊-¼Ï¯Ž}ÃR‡~ŽsÂiޏ‹¿—”WŒý¿;•ÜpÊ ºb}VxÂ1ÂSøxú2 T!}V24R}¼0ëXtˆ­4¡\·Õ7Ã[æí;•`2œ Bpe¥£åF›ih§öJðiãªjP˜nO­Ukx«›RÃox¬(V±t0°o]K} ²Ï`Kƒ±·xd\a¼+lê’h¿uNÚ»Çs«w¹0oö‘»žp…‘¥»¯o)й e’1½+fûŒ½kdo޽ dΉ©»¾`sŠf»ea+†œº3i5…¦ÀÔh6uœ’KÙ'r \DdÀk] škz zžzˆò.5å?³…]3m!T¥á$2&¥ª "“%?°ê$L%oµK',%࿇,³*hÃ!.`*QÅÌ1'+‰Ã»-<'éÆ)-)'ÉÊA.%(òÏk0À+FÒÌ7F/±ÖòJ0=ùÓñ‚ïoœÑ­ªÉ”†Ó7²(šwÔF±í˜U؉o¤]YÕê3Ò-þÆ~/W*•«2 ]¡˜ïÆ›à‰࢘wEÕ­Fœ+zH“0]ÝŽ{¡ý€Cu ägº _D}h‡,U=rJ3d„&÷èG&»bS;*YãtŸ~¢8²uÇ‚á:æoÜjŽ1RnµN &syÛ{':š^Šì@ ^¥6¼??:L3µXIvk”µ¥EÇ‘Ðâ>¾y±ÂH› &·W¡£a¶\X†£Xµ>RY¦ÿ¸OÚ¤ô¶™M‡¨ÿ·ÁN)ªºñQׯ¾ÁR$°o¿#P-± ÀÄL3´eÅHP¦´MÄP.´2ÅžQŒ¯·Ä÷WÁ©‘ÀÂSÞ©t¿¢PÀªD¿$Tkªr¾ÌV[§%¸ÒR.žÆ¯eL­•×¥ìH·Šˆ›pFÁ€Š”A[{æq®< på>,ŠVª ï PE*Q?`*!1oOZ41ºj$u¬:k}ˆ›CÜl܉ÑD_mÝŒ«H—qÞ˜,P—s¥—õY.v–—[bw¢›‘dòzz ÿilyNžhdz¹œ±e¼vš¬b~u#šicfp šaTr¹—O[‰o—]pÜ›æbêm¢šÿ\xjΛYZEoªžÛ^/n˜žzV/e’öJ'aå˜IBm¨æSnD¯q\ñr!°˜_Æt·±Ãdty´EeÝzY·1ióyr³ùgì|ž·®h”~]¶Ri/ƒ¿ºprعjoy„¼ rn†B»ÙuO„ó¹|y…~ß´y&j0ž[(Vó¤9Puã.”Oa{²1ÂR‚a48Sžˆ¥4C[K”h<0XÍ‘¶=S_r—y@¾c\ ³HÝc$¡†HGe;§M¶k§©kQ±l§ÌRÏpÕªûXÛr]®[O}гÂ`‡l¶@d’‹,¹gj›%º:kÊñºmžb¹1p/¿ºm´$¹@hêŠUµ ^ùŒl·Ü^X!ºú\ļæa‹·àZ2Н»K`Yƒó»&kz†=Ä>iÆtì†ZGö#@p"¼SW$  h‘ P ²hÓxx.dx„I§’ÕI Ù˜{Ä#¢L!ë%T¤µ!Ô&J©˜%Ï&´ò+5)5ÀD/.Á©0…+´¿y,)ëÁ—,(\Æ -Ã(¥Èý0M*²Ï†1,+ÖÕf<Æ3ÑÕ=XlK©Ò®‰¯všÑy¨‚ŽoÓ«¤œkׯ‡rq¥Õ«Cˆ8Ïð.Ã+*ÅG-*Š< í›&ÕM˜-›ßTb™¼³É›F°” wßwi{ºy.0L–väS((°X&Å ÞEäšÛKÌ,µÜy¯6Axmjc}0 QÞ-è®S$&@“ ÉT½!N´`'„òQ¸{.=¿¶$CÄ ŒaV]Z i‘3¢zCW“Q¡ê>áµ7Mô¢#·‹YJ¥¹…Vû§ã¹#Rð¦ãµìNw§¹ÛOE¬º­O¯¾Pž®sÀpOα›ÁPÀµîÃ8L¤´.ÄšM/´êÄQJ³KŧS~®óUœ©.À=R:§©½ÎR¨ß¾½W½©V¼‹V«¡kµ@RÞ˜äªK*‘ˆ¡£Fø‰Y GExn8o¡9$({GU}B l—_7'Ÿ±pöZŽ3/l™qã;Zl''B¶g{ƒË?ßl„?AÉnæ‡ûC2nR†ÆIëpЉ­RÇw©‘òU*y|™é\õyúœdyØ™«`]v·›w_Ùz’›ž`Ñwh˜¦ajrÁ–ÐZósâ—9[Ñr¶–í[pÄšEZtlòš†WÎmižª\¡k;œ&TbÔ’&J^ˆ•¤Héf2¡2P’l“«‘Wqr0®W^gpb¬¸]0w}±àc=xO³ðg†w³od»{®´—d¾zȳöc‘zÀµbdy{X¶ f4{¶µuc8·Ìk €³l@s€ªfddý—O€Zრ73T({¸1 R8~.5˜W×…s5Q]F‘ö9Ö\^“Ž;¯_‘9Ýdë™>?ábWA–c »Dqg€£”JJi†¢GŒl´¥ïPˆr²ªaUtÍ­óYs|ž²·]fˆn·*e‹–¸ iy¸ti¨Œà·³i=ŒAµ‡k ϶ðj)Œ´ðc¼„ز6\…€²ËWq‰4·æ]‹ŒÉ¼9bž‰4¹!^‰ »jd×¹³gi…—Á—fFlnV9ˆ$E'ÕçJ[¸ X fA ÌOmûN‘L€ȉrÂÕ™W¾FœÚN!¸£å!!"†¨¸$#$û­É%u&޶)o)XÀ4-í+üÂ.¹*åÀc,Ú)8ÀÁ/&êÁ‚,A'È).+)Î2ò-–Ò$=›6Õ†`†S9Òm’…~uÑöší‚õÓl‡ÂwÖ‘^NRçÐÄ4Ø.åÌh+ö**¿½-T)~á  —ô¢“º4ºOß е >Š b‚†Ž ºwØÖnUÉÑyQã'Ieó9}S  Ò4‡k&i)Oxbg$1”H®Ù ~xÒ…@Ñw…r?JU•[C^Œ:² ¦[õ,5@sR¶ÿžGˆ|l•mº&E’£¢dAZ”_¢³Ag¢Ì¹7Q£€¹¬]㢔¶·Vö¨Ù·¹QJ¥/³šL¥ô´„M?­D»oO1¯F½QW¯¨½IO&°Y¿¢M’´ÔÂèOõ´£ÁLqµ1ÃjN¸´pÅxSh­Œ¿-S¦¯»ÓPƒ£o»Ok¨X¾RjC‚kB«mq}AêfµŸDeÌžIÉf3ž¦J#lo£íLdp6¥ŒQ v÷«˜U„|ð¬[~†o²˜b{Š$µÊdXމ¶Õg¥Š²õd~³¶7jO¶»gÔŒ=´òa„ˆP²[Q…¸±,Sû…•·\ZˆGº~`½‰|»»_ ‡€¼ådC…u¹w_Û‰¿†b‚`[>/;* ,- FíT.É 0dÔ Ò q\ ñ}ô€e‡AÀŽ÷!º•Àž!Úž¨º .¦«!Û$±²:&]'»‘,[(澋*m*Á¸,¥*Á^.A('ÂG,&ËÄ.<']Ìy1 *8Ï—3¬-ÄÔO=É4M×-k!YêÒ•rLÓH†vÕ™~vs–Ø÷\ÙT'Ñb4·0²Êv-´)-¾}(¶&µ‚ó  á“3p‘œö ó‘?C†¥ b€ä Ü Ì|i3 ^u‘üwz¼_>(Ït“Oe!¦]ô{]MÌ ¡ ðI—é ®xSz‘5ðX}&ä×Hæ$37~û‘Ü@ztEp _16„pYe§/¹[è+òéFw4îb–+?*Qzq-r»,Z•œ¢˜CÝ—¤)A‚£"¹ÛV#¤´»cW£Ä¶hV¦ø¶ÔQv§µ]Pç§l¶OÙ«£¹ŽQ¯îÀîRÛ°æÀ M²ÀäM±îÂvM,´9ÄmOé´yÅÞS\±ÄgV૘ÀÛZ` èº@R¿Ý¸VQâ£ï¹¹VS¥#¸¾Tø ƒ¬ÿNü—>¢{K1z›RF‡œ‘/BQƒ#…ÕAi{áj;ýk$(!©?P<6ܤGl ?lMA³*ûpîjb;Hrcyc?kë|@%n~P@ãpûzæ<srÕ=–v1gA¢vwoN<ÍxZxB?uˆ¥EµxN‡\K…tã…®NÀpÙ… O o…3Jùo‡†˜K nL‰KÄnÉŒÑN`iN‹ïMÔfDˆQHqgÒ‹lI-dÄŽQH*k:ŒEzi‡’;F~a˜Mke¦¿Mèmð¦BSpt{ªðZŠtX¨6\Û{"®3[Àή.^÷y‘«B[Šx¢©ðX™xĨÎ[wn¥ÚUˆyòª"Xrye¨_\¬xK¤à]8sbžíWŒgWüDd`¹…d9§^O{D4jX‚|ÿ4ÖWÎ~t0ø_FŠ{5\_˜ŽX7X]oˆæ5Ý^Ž!6óe³—%>gÔ–ì@±iÝ›,DibœJAp"žÞLjo†ŸCOÔtK¤ýP:zõ¨VU õ«Wps® X̆ɯ#^ljl°“aþ‹±³½f9ŠÝ³jbc‹–´¢bÐ…ö®ðZb„‘®·U‚ˆy·Ó_§ŠÌºW_ñ„Ý·;[∺ûbµ‚ñ³X§ˆ¹_\pUYC æ1 b6˦_V„˜ðq-XÌx¡ñ7„_µŒÈ ”ûE ˜§8 ÐM ”#¥Ž% %Á²›'¸'2ºy+»);»ñ)")r¼>+T)¨½€,°(!Ãð-Þ'ÅÄ*/(öÉ4'*ÛÏ2<-ûÒÝ;ƒ0«ÙUfßUtÕ¬‰HwÔu‹ëx§Øg2}JÙ>W6NÏ}/t,ÆÈ)T'ʽV%y&º•™“{¯#ûWžNü–²‹\a9ŠX ‹#{e– Yw†9Fài¼5:^ñ °Qs Ë ˆ?ó±ldS«#µ‚¶’ôAxeq:Ì!šh£>Î"îDo03¡x8€s<4wå‰ÎAôuyq4®k8<ª _`ÙB?K„~ &/'X {¦‡2`‘žhCQ“î£ Aâ¡Ë¸¦YR¤DºÞ`-¥Ç·üT¯¨"·ÿPѦç·R;§ø·”Sa­;¼©Pϱ8¿¼Pí°Õ¾ÙN² À Me³%ÂEN²”ÄIRŒ²Ã]Pï­ÒÂ/T©§w¿ZŸÃºAU¡ ‡¸ÉVÖ¤èºR^$¡²·LYÈžå­Rk—1¡»I²’XŸaG‹ï•êFi‰LŒ”CÁ€—o´<g(C"B]Ìö;¾ÙxBÒE Ûh4{$¹p3\9ålÑo[=ojdul;Tjz¢=ìjPw:8niv6ñp'c 1[v`gz8„x@er9&wcn/9ÖwÍzåB½rH€NK'n'xûFAo¤{öCom$ysB`i½€æGþkF†`F`f؆F?d‰†îHcÑXC´dÍ‹¼Gçf¯Ž(F3eÙ‘PGsgw“4Hgî—>Jp« ®Pu¶£aTWyަX–~à®\cƒq®c^|r¬’\@t©0Wït«\štC§èV©vˆ©šX—t§ï].q˜ŸcYËlv—ÄPrc9’ˆEY_þŠ+=–`Û…í7ÃY¿€”2WfXŒ :FhŽå7JbÕŽP5!`#Šƒ5odiÙ7re†›@<‘k˜B??n}—IA mž`Fopf¡ZHutd£wK•xñ¨8P ~ª¶S­‚ÿ­•S±ƒ£«éR …¢¬™Sl†Y­§^Lˆ÷² aĉ|³\ü‰ ²B_ê€Å¬ÄX-ƒã¯@Uˆ·Zµ‹+¹±\M…]¶ˆX9´µþ_Û~µ£[ÿ¼­pZY?É#ÃL5æ2Ž:§;X›÷uk· Átß9*‚“~T‹ Ÿ‡(øášK¦!ŸŸá £#˜¨¡"î#}²‚&/&Ô»ò*Ê(ó½#+¨(&¾­*¶)ÈÀô*R'£Ä/-}'îÇ:.¾'¾Ì1Œ+¶Ðë1¹+£Òh6v0(×ÅWÜJ¨ÙØx¯iE× …'qÖÛkó]Òí6G3SÉW+Ó)ËÄQ'â'X¸ &,'B&U²Ã$-§[ù³œebx”7oëšåi –=æPƒˆ þºk-1\ þ `;ü_GÈ(ÑrgK§$,v›}8pÒRr+/dá59sPeË/Ëzp~ý;ðuÄ‚²<p…`-ëyRVy+‚|ÐU+ÔY‰( RÑÔ ï†,ù9¦‘HŸBΘ©‹Bñ¡×ºX[]¡I¸2Za¢w´¿Q¤:´ÅQŸ£ÄµŽP̧ŸOÿ­ºñP#±Ð½ÁP²Ó¾-M–²äÂPOX²ÞÁÍQT¯ÀøR8²ÅU"«6À£U·¡‹º¹VÝ¡T¼—[ǧÏÀ¢e™¥›½:bLžÎ¶¡Z™Ò­CP<“›¤H‰“"ŸãK…Œçš8FC†:2@¢os§?$h½(Ô!ÂPâlL>`x9peÐ&ø"wu'Sˆ6Ór¦qŒ>£qk–@EkÞ}<@iˆpÔ8lmAf›2ßt"_¡4xñWf3´|e["7y™hÞ:‚{ðt?ÕuMwÚB`oqU;íl×qT>mSsŽ?ng v ?·g xK>Ìd^{:AácûÁEåa½~âB½`HƒüD|_¹„Aºf%tEÅk’‘ÂFÍn•ˆHÄrú™ŒMIyÏ¥¼V¢~ãª\ˆ{µªCZ²~R«A[µy]§ZWšr £ðTIq®¤NS0xW¨îV({x¬Z|z¢ªž[»w;¢ÙYzqM˜ÝM j}”óBVg ±>@g&Š:;¥^÷†*4žj”“¸?9l.—{@Çh—•A9ÇaŽ‹6reŸæ6eʘ{=Üg{”R@Xh™”A"l)šáAŸp»ž×H qÍŸçH1xV¤ MzO¨O=€}¬ØP˜}ªRA}¨ÒQq~¬W¨……¯yZ?‰RµÏ_ƒÈ±gZo¢¬U*†{²®TÓ†U¶ÑY… ¶šX!…»¸Ã\|…¸®]߃¹Ù_j~žƒP./t «‰4¥¥Ñ6C¥=R¤Øo= †uzÙ“Ó„B}‹ŠèRøI]šà½!Ež’"Ï$9¦+!›#•¯%!'c¶ +”(ö¸œ)ˆ(m¼P+)l¼ß)ø'Ƚu)m'’Âj,'bË3Ó-˜Íý:ä/ºÑ6û2%×!U[G3ÚqwVeF×ûk—\×™C==íÐ/O0$ÅÂ'Q)ªÀ="!%Õ²Ú(p(T“îN ¢¥ LŸãÆž753š‚ãU›Ä¿­˜Å{„C 92 t kp,([YEõ¥W€` ÒnÄAÄk#@þ" jÞ9";\j$AtvmG¤&îª|B;€|d…@;Žt¦b1„}V‡r<òvç[Þ/ÖT£ 7 /L)¯ÛŒ<–á=MŒÕ UC¯•U¨>EË¡á¹áY¹ Z· Z¢(´ïS³¡«²ÕPÈ£¢³N¶PB®ß¼ÎS¯³fÀ÷OÓ³!¿ÕM²£ÁwP´4ÃP8± ÃúSA¯*ÄPVا׿ÙXŸS¹ W^Ÿ^»:Vµ¥á½õ\<¤×¹Za µ®U/ E¯Nj—¤.Hf‘èŸÆI:ŠY›(Eñ„MŽ»CØ‚wr8<|a ðDc3©<«\Ä9®„ÂX“!ro}LC1 pègò: q:{?In6{Æ?Om{| Aðkål¯6Ðt3f¢5ÏxZ6~WÛ6Ý|L_07:|÷m1:ºx†iÐ;×tb¼6síj9ìsól9Lnœkd9 mÑuÑ=2n´{A~l„{œ@Cl%˜Dîhœ€‚@|h6‡×BhI‰©@vjúŠcAÉkí’Fõu>™ALÜz¯ ÅT¤~s¦~Z!{“¨Y {þ¥GX/xf£ÔV˜s=¡øQÙsJ ·Rx©¢™OÑ{¥ŠQ®{_¡ìT‰t¹•õO²lÚŽ³ExiüŠº?7dxˆ<ûf9Œ*<ïaìŠt8VgçŽØ9éh—Ž|=h3ˆ?7gdÕÉ9ôgx49ghç”:lmM”ÜBoM•e<Äoë™’D€už%GˆvBœÉEEyŸ¡\J1|E¤xL€k§'OAz­§ˆN;}rª*RÂ~š¨§W¿‘®Q[á‚ϱYx}[¯oV±~]®1V5䱆R£€=³Uç}ö³;VѵÎ[K‚ ³N[Iþ¸[ƒtI޶HŒ*<u2&ož8Ï€ÈM÷ãsS„$´³Ô‰éߣ“$2퓆à› !£ù#9#y©Ž"à#ÿ² &G&†¸q(J&»5(['_½))¥(x¾(%o¿–-'·¿j*½'ãÆ†1»+IËk/›-{Ñ¡3þ1¯Õ1Jã?sج\ýMÕÖ5I›AÒÒ£3<5çÀå(ä.4¿à$X*ó·>#²(§?$›(É„‰å ±Ž ~¸’Ƙ:”¿ì¯“\@¹Üc‹6 K; œnY ýe'›zX%ù!DD@¢b–,Eˆe$­ð_8úmâLý*IwÌ^80gøz:8€2xz8Z~Îx:ôˆº˜EýN;ôržM'vAn$;.*&ro`7ds9u’>´qyí?ènêy£@Ïl¬oî9 mtkü8Úrö[T6¹zÑT"2°{íb†7¨}do²<ö~–jÐADy;fÒ=reÔ;OqÒb©5ìoöd7¨k•q:upàyú?­q/~C6rc{½BÒm{º?°p—‚;B‘ná@fnȉÝAÄp,‘`HÏv”@I|yÛšÔOz}"¤ïWâëªoY1{à§1Xìz4§^V={¥ƒV€ó§¶Xƒ}‚£"Pþ~g¢ÕQ¦ziœ@TLw퓘MÉmL‡oB·k…Ã=žh&ƒË7Õe·Ö8B`µ‰9idHŽW<«gZ•¶B­h‰(<d#“9=efO“:@Ueu”î@lx•þDiþŒ²<°k4“ÔB:t‚”J[yd öIˆzߟ›Iƒyè¡KOy€¦PÙ©ëQ#ª%P6ƒQ«êXí„K¯ÔXb‚|®ðT ‚á¯îVQƒµ±úWSƒ›±ÔRX€"³ªU8‚K¶ôXtƒ µZ[r}í®vWs‚y¼Ô`%q ‚QFf'†3èæ8ÖÐBÕdîoP )ë}°Ö*]¿¥Ç•‘^# ši!#·Ÿm!§# ¨¥!È#´®w$ê't³W'±'ĶQ&Ž&Òºa&œ%»&(&Á—*Ó(` ,:)ÑÄÆ.|*bʯ0“-ˆÐ{5ù0¤ÓLƒä”'FÖy`f <€Vù£ >è ¨Z×|§¼['vä°[Ç{Z§ä]¯}B¥RZ–€U¥ŽYg~2¡¹UÑy‹œ·Usò1J,jü>`g~{r7Ãd\~R4èe“†7c¢Œ8ïgR’ƒ?¾ia™jBnf+”6;@aÑx<iÚ–B™m®–ñAUmq”ALp·j=\o,–¨BêvåœÊGly„ ›J¥yë¡éKN| ©KTG¤*QzC¤èLÆvТDJ7w¤ÏK”{óªAQ ÷®‰V4l¯.WÛzÄ«S‹~È®GSK€l±RÇÒ°†TI4²—[~}ö¯ø[(‡UÁ cUh¿u>˜#‘7™áˆ@^ü|?…‰0j– ˜ÕÀŸ/’Nßü›d Š#h™ÜJ"Ü™Ü!Ò"%¡H%“${­‚'¢%ë±ö&Ó( ´Ô*¯(¡µš'&ŹU%&Lºú'`(¼B&%ŠÂ,+(EÅ/d+Èf1&+uÊ4/Ú+ŠÌ«0‰/DÎé6®3~ÐÏ4Ï3|Ìi1l3¹Áœ*.,¹ ò*=ªïR&•¦€#·Zs¯‚fNü‹x7  R€ï k ʃŠ {|( óX{N îta“bs{%N¹.»Zr% ¢Y\‡ ËB[¤ßhÞèîT³ºBai+Jžq‹AÃ%¸fn1{_tK "Ç{û]˜'An³,LQ_ºÀ˜v”6"Txg¦(ŒŽV¢ÂCò‹Üž@¹’M¥xBï¡ñ¹ÆUɦG¹#U¯¤¾µ¶PK§Y·¢Pèþ¸nM¶ª²º¿O£²V¿â]8¶sÀÚN¶7ÁºL޵ÑÃëN?³èÄJQÚ±ÁÄS>«tÀTê¡w·~O9–´KLõ¡¶tLö£Ê·ZO¡£Ñ·1PÉ£—µ,Sj­fO‚‘Þ¤ˆJ¾Œm£TK ‹Ç›~F‡…È•!Gï{N^Q9ZS”ú/<˜A\;P¡8=2F>_~V°­oƒAy.Úp$X1énÕhÀ5ìq÷z”=Tq÷yu>ÝqKt%<¤qqsØ> xe{;z"hÓ:ôƒ"y¶>L…óyÖ=’ où=ycae8uˆ\œ:AuÊb 7Ör‹ou:àu¼~×?+|¯‡\F(}†ÄG|¨|ëDËw€y>Ýuj~q?§qs{ü=mà‡*AMpQŽØI¹q6”K>x‚>Qw}§`Y.w¡ ®V>y㨑\X|òª _J{ë¦p[Œ€Ä¦ª_6} žœYxµ–ÏRqzˆ\GÄhðz; `nt€5Ÿ\òuW3Ñ_bQ3I_~„3‹e¥R:^d“×@0a?’š;lc䑊;§iö”yFlß“pAinÈ•qA'q ‘As_“œD–uª—³E‰wèžÃKTwd¡Mz«¥ N‡}ü¤•N³xÚ£ßJ¯{—£MIv úI”y½§×Q®€X­ˆU1}¥­hT©yü©OR}*­vU¦´±öT4 ±P[€/´\Ë~˳ _8†}ÂwgYZAbÑ1ä!±1%J0Dð4×’\\^ Q€ì”Àˆf­”ö °$D–Ãå$v–Es!6¥!N&ªt$8%²§+)r´+(–'µµ!'ð(¶š(Å)ºƒ%Á'ƒ¾6#$–Á<#Õ%øÃ0(ô(èÅ¿-l*7Ê“.Ÿ*6Ë¿0*aÊ2Y/ÐÌ”3q2Ë!2è2V¾|.-&µ«$P*I¨ (}•J$IB\0zç1Jl¶Y•û±_j¡èdH«Ö_NèÌ\äšPÏN#,g{ª€\ÍžÃDx h`mOîv~8ÿ!ýk5¾Em”8â!‘mö<ê$]q9"zj‚+Ý­Ué’ ÆEÛ¦í3DTYZ1X]¬•߯FHTÈ¡»E2”l¨üDõ¥I»›S§$ºüR¸§Å·ñP³¨·ÊO›§·êOjª…»¯O¨®ä¿GS³0¿©J÷µÁáLëµVÄTNþ´¹ÅQܳ"ÅTw«ÀäVÿ¡xº±T2šj²æNž#´yLÀ¢x´ÒP  Œ²ÖQk Ù²ZPΜ‚¬NË“¥¦Kz¥LIP‰ŽžOD­„3”aF.uòJ?0IR` x=Eˆë9Š(HA t@Ç^ J( #nc2¸'šoéE¢.èmëTD/8o8nŸ:8ri|š?6r2}=;æsay’AquIo€?Vy kv:Í„qt4<›ˆ8w–?¸‚pÆ<Ö{œ\ê4¯y[|2Òtád¤6sšuî=“xV…oBŒ|€ŠºGV{O‰ÍI6xY·F,v}{ðBPq]tü<¹k!wO.fô‘Å;¾nù‘‰<öv‹˜*B¶s£˜+A|o•Cxo_‘VB´qB–„F!qŠš´H s›ëJu¢Ÿ²H+që+DþxNŸßJ0w Jy‚£åJÇrTŸÙL\uï¢÷LrxâªGN¿z竲T{©>Rü€:±]V´€ý³pWß~í²ŸZã‚¶_XÁ…ªºòeÉŠÀ'cÇQëKû$h&´Ž´8ÀR»1ð¿âK™O Õj¶‹H{ 4“ø ìœè©$!>$ ›¡þ#E¦$%ë®_((²7*˜(´&*C)·Á*T'͸µ&ƒ%­¼¢$t&°¼a)@*j¼÷+**Â2,È*fÅJ-*ðÅ=+á)Ç`-Æ+NÅ¡0=.¹Âo1X14ºƒ*Q-”²‰#÷*þ§lÚ(S”€n!´DÔ 5  Ú Ñ-ͪ.÷µ+’$+qCcÙuNmJº‚ H ¶™gg_–¿ëuÜç>a ®‡XßæøZ`j £g¤%8òo8>4rø= ÝT=e UZö &8QjÛ h<fUiª%,‘¦¯FÅŠb sC‚•ƪáEq¡0¸€Q¤£’¸•T*¥2¶ÄOâ£4·ŠOL¦î¸pQù©µº?PO°‡ÀÓO­´­¿€Ju¶AËKǵ¥ÄÑM­²õÃãRp¯ ÂøSœ«¦¿{RH£I¹©Oqž´ÙL’ñ¶tM §ˆ¸JNÀ¢8³õNÇŸþ²•OÑš×­÷O=—3¨¹K‰•¶¦H&ŒÂžŽD„¤’ F‡p[@(jNNW Î:±H”=C…:¸:ÉBúk<(>Û_Í!²wr39 ,×gÃB®)Hi¼ZŸ0Élqø:Uoj}ÿ<%tA‚æAçuuxoA‚vKo@<„w>_‡¾|ÂB…usk>1òf­4rvºXÓ.›sÂ_°1UvKrM9PywA_{ÇŠTEp€‡ÞD}xy}ÍD^vÿ~dBHq}s90m uV9fn*y8;™oÝ~¶=Âp!‰U@¯qº•ÿMy|ŸéUKujšJP4xƒžìT7yú¢ÁW_†¢ Wâ·¡ V]}‹šÄS"z3•¥NŸrœ~CYl i6$kþbç-äiJoJ/éeysá1¿iR{¹2±iÙ‚%5Or|’ :BoW:÷pô;îuà“ý>Žsœ“e=OrŸ”Ø>suÅ“=s§•%Bªwr›˜G2ušFEw›ÐEoqò™ÁB)vÈž°E'yѤ6IÙwa¤cIËt2¢HHùvÍ¥ZI|+©ÍO„yb©4R }C­ Teƒ³…Y¬~³VXV€X·-Zk׸‹ZË‚Š¹­b†…nº1[ÛL*D½N‰)³G7<‘¯?•º!1CXtÍν‰^v"ÑÞ –ºž$™ ¸!è%êŸ ÿ$¾£  G$«n%'«²)%õ&©³„(\'a¸ß'É$Š»˜'µ%r½ð(¼'¯¾%&€(:½þ-ž*ôÀ;-’(ïÁ)€'µÂ†'Å&¸Ã)‘'óÁ¦-´,c»1*€*³µc%¹'‡ª§ &Ýž†}%“Ú }OmE=¦6ð9.-_/+­æ!#38ßDj9|t[ö ”| ö@‡¶pg‹/ûÖŠ\døf Ó(U§<8n…(fr©+ä H`j‹‚SÖÝ ñY: –W%ñ>EŸ s>¦ ÑÆy„1ú”&®H¬Ž™¢¬A–©oAµ¢‹¸öO„§®»Tƒ¥É·BQ_¥•¶úO©Z¹JNžª‹»‡N@°ÙÁ;O“´-À)L ·ÏÂ…I‰·gÄ6N´¸Å/Q-¯§Ä}Y«¯Ã5W¿¢p¹mQK˜”°¿J´ ÈµŸKº¨v¸NJ§E·BR%¦[¶‹Qà+¬æM‘—«ªmM‡¥¥ñK›Œ-¤PG·…Ž—Góp¥4 /YINç;®YÑA–u=â6C?_^ú8àÁÏL-Õ4nÆ7Ž0ui4AY)h]I+`k~Zö13mhsÚ:ˆs(>ˆs½‘BIu5v©A´|\q•;Ô„/yDƒFxóB1}¸l¾:&ua6[mÿa<3&pgsw;¶rl‚ÂBär†…SC&wœ…CiuꂽD$t¿~‘CåpDq3;Ñnlm´7 i2pí6mkq}¸=jm¤€=:t"ÇGõ&£vT‹|+žüV(… ¾R­‚õ¥SÖ‡¦†WCîžÂR³”šÈQ“~ŽÝG¨~ª•@xˆdq4xsbe20aqeà+Ýo4r÷.ôp‡v/‰n+wÀ0o]ƒÒ4pÁŠu6*m~‰‹6ßmsŒC:óoº?Gq펉=Üq˜Œ-=Hp+’r?9tø—½DZt6š]HÁpL–`Doã—ÅB>u³œ^C{ ¥“L4uþ¥Mmsª ÷I­uû¢ÁI™|ª+R…zå¬nWR}Ÿ­2T.¥²=Y¡€|´ ]r‡ë»%^ڈʽWb+㸙c„†Â¼]ÆLÿ?Î#Q$Öö+ìu@ Å)òpV>i ŒUÙ Šÿ… j˜ó3$I å%q¡!=&¤‡ Ú%ê¥åC%øªÜ":'®–$È%³æ$m%l¹@%f%Qºÿ(h&¡¼©#È(¿Ú(—*Z½Í,é(‘¾('J¾v&›%¿{+†&νé(F(à»8'Ý(lµ #8#÷«·&£O%Fœ[µ!\etÉY\7QQô;•2x/Œ&'¯78KN/=qs´uò 7~ Ú üw Þ ¤ƒ` |áÊLsî0fj|vh@1è~¦T‰,™_M!KŽ0ÐRh€ ¿WaŸ=Nfv &A/»…¾“î8G“ëH¤oCá•{¨}@ ¢º¸N©©0»ùUꦗ¸™Q ¤é·1P©ï»rN䬳½˜Pc²IÁYM´AÀÂKË·lÃI©³ŒÂYNe±´ÂQ—±ßÄ”V`¬5âVx¢»\RÈœ~´¶bUxŸÊ®¢N—–é©wK󑤥ûI_Šh¤äHЃ+ƒ5C…i6 Ú/?²/þ6wIë;k}G:N ñ9mÀŠ>NT’E €8`F%kjg¿>°*¦i¡BÆ*Ôg:H[+‘kôdN3WnGxaýˆå€9A7‡Ì|‹>ê~JlX9Au}_’2‰rÒk~8‡vW‹?ÖwV‡’Exø†ÛE~wO…wBòw+…ƒFóxwÿBjo‰oÍ:(o–vÙ<Œo¥z`>9n"}Û>Ôr»‡¶Aƒv6‘E©~Æ›ÁP¬mš4Pœ~sœÂPó… —R€)«Q‘L–¶Mü~ˆ/FC}ëp(<~zN]0Æw`[»+ov;e‹+žvÏrr.frzÿ€',ˆs¾ƒ'69t~Šû;Su”Œ9oh‰Q9”r”s@¦uÉ—­EQtP–µDìtö«G u{¡©HxÁ ?CÍ{T£QF\uœ¢–KÂs3¢ÆL/v_¦3MŒ}¯X|«¥VG€­¼U³é³{Z̅и­_׃ ·K\l‹)¾Ðjb„•¼7j‰„ƒ¾Ñb£E :[³„,~8–+t9@ü©f8 fê(>X“w¨$’·†Ÿ+%£ÿC%Bª¡#‹&ò©Ò!%öª¨!â& ­—$(&ò³!$& ¸N'Ò'¹š%€%G½(5&ò»Å)T)¼ % 'Œ½Q)½'ö¸Ë(’'ò¹#)£&‹»l)Æ&‡¸W(Ã(dzœ$å'·±Ã"@&(¤t%™p$0‘k^ BiC Ân4—&n½©oÔ4„ZnÍA &ª%ÎjYh{pT˜kû nÜ| y Átß ïvó›yÅBÉ#[sQKM»ÎYL#3yr~Kµ&Ml4Y â`òñK (W ºŠ·£ @=”G¬>H v¢gD–,§Y@’¢³¸$MÖ§€¼aT„£H¹´Rö¢s¶ÕPÕ©øºR¯_¿„P`³ÓÀpIÓµÂ.HÔµ$ÄJ³TÃ3N‡°öÄ1TÓ²Ä~Sò­e¾tQ= -·uM ˜Î²½MI ¬¸·Pv¦~ºÙSrªi¼gV‡­ºVU£]²M š4®€Jø”©¨2Jކ¤˜HR„ªz«=Ïc}‡8ì•W7[ƒV;ç!r=A†:æŠI<^²”9ð‰U{sk:e*ÒlCA.,jùH«+Øi Q-j;ié6±r/>7rkyb>Îr^hô8S|Ég/6éƒ^w¥<¥ƒÛ|;Š}UlŒ8²v³_6ºm7`F3yst¤:’zç…îB:{‰ûE†xSˆ@D{yЧE}'„ÓF–v:w°=òq1uº< sÌpø9­v%yè=šw\ÁAGzŠÌCr~C’¯HŸ‚À›’Ob„&gR —ìL¾„H˜ÊKJƒ¥‘FGž{Ø~ÌAîz´h¾87weY/ŸtŸV()gsEa2+ètµ_ú+QkdgÒ)~k·l†/ûo‹|{2]jDz.02nqô,gm*qa2†lÆ€´6kÓƒÜ6jlX‡#6Žqõ=^qד CQrÌ”•A\pE™mBÙu{¢4G vMŸ²B~£õIyª¥I¿{(¥#I­~à§IN¹„q¯ƒVJ†¸±uWî†ß²RXo„Ò´WY4ˆ*·û\±„—·.[¥‰l½àe<…B¼!i¢„ø»¬__Gü@nÈõ4$Ƙ5XÑúF 4ÇM« ç „$:> Ç…ˆfRÇ—> $%±e!%°¡û!¿&E¨Ú#Š'"°#å) ¯õ&E&“°¢%'j±²%ø%ܵŒ&§&2º‹&Á(¹H' '±¹!&ô'?¾g'¥(»>(*¹Ö'ü&<µ˜&ý%A³$T'>² #¬$ꪦ Ý$¯"ž“B› Ud~¬zèÈ…}$ÇV~»(´S‡.*$8…‚!@Cx«S\~Áç0¡ÿ1.\iÕàb*Y`ÃM5lÅ 7c¿?®k°Ÿ ÔO…Õ9R<©kp¶9%>zŒb+/v¹M°&0^pö‚R':SA’¬æEÄ‘®¨ÑG¾‹Õ¡“EÒ–á©C9¢Ý¶ÆMu¦ºaTÛ¦`¹ÔSU¥c¸ÕQ‹©½¼ôS'­LÀTP²À I“´}ÂCK@´ Ä Lß²°ÄwQ¯±ÃÒSè®ÁáTͧȾµXAœ*·«RQ›;´¶M5¡°¸¾Otª0¼ƒV«þ½G\ ­ÂºôU$¡Ø²ýM•¤­„KA¨çKùŽÏ¨ëJ“}Ói#9ŸW]î¡4íÂÁ7ñ`h=4÷;ÊôDl•?Є9 _bT·7j-®$œl­9å(Mu…h¹8cy‚]ˆ2ók8ë…Wvh:^„Þu-?~vbò;-n™^1=tn[99y~H>¦xÚˆaEÓyÉ…$DÏx܈CF{¤ˆoF˜|„”D¹uaxY?pnehŽ8/q‡n&:•oþwÛ=óvâ…ÒA§t¨†ó@Þ{‚•K‚€}™)QZ†—=O‡…;šrO¸ƒ —_KÏ}.…óD±|j9 yX/Çv™[Â-vTbË-Ìs¤gÎ.Np»k+|o!rÏ/Âp÷‚”4­r… 5´oÕR3ksà0èp!|ë2Dqì‚«3j„‰ñ5öpe<áp~’EAntf—HBåtÂEzqß›¥?÷uIóD¤|`©=P@y¦gM˜x9¤ÖLª}¿§ùN$ƒX®Uăž²C[^ƒ©²iZ·“²¼Yè„K·‡^ìí·`/…Jºÿe1‚òº1e톽u`öM?L×%*h0µªø2:Ÿ¬Aq;-Qn ²ý2¶<#ìGAÍ’s4 ¡’#I&’¢Z$d&f¨%&*'Óª¬$®(ª­™';&é®.#ß$”®m"j%¯Ü$&ÿ®R ÷&î­Á ,%'±(%å'b°s( )¯´$%ñ°ª#­%,¬d%ƒ'©É!E% žÍx%0˜²k$P“¹#j¶!ªˆAå!ºjÍózá,¡hÌ9°…z:ø"kˆW+_8x‹Fç¿b`“´ehÒ5"(pèh“.dl2n~/smë{‰37r^…¢6ìoÙˆð:ùqʃ67ªh²{–4£mô|Í5 t5å6†ni05­ns…47)q7‹Í;*s»¦A™tr•ÿ@ÑtU—Ø;ý}££GQ+¬¡På~¦YIl~5¦±Kç~î«´Që„é±8Wð½±[%…j³ [Ê‚e´{Yäƒñ¶”`䆸abQƒ(º;`b€î¹)d }½º^ŽVwR‹&}$æ.܉¸?zÒsIî ¸Q[v@È ë1õ' 1LE]ú'Ò7Ÿ„#­&Ϫ.%é)­0+$,j­¾'?*®—%h&¿®,$ &°,$('®ý$('Ô­"ç&¡¯Á!ê&W®Ç#ó(0ª¯"‰$§§b!Š%'£G1$Œž«w#f•ãâ!6”íyË“É#o•/d ëŠI "ñi c€t6.JƒÞ;M¥~9ø÷…oPy$ÿ„ÝEä$ëƒÏ3žFƒ”&^ÝŸa _ ¸3ž©?ØœP=äÔQ§ Lщ8IŒ«¨Fæ<«V d¬l‹ø qÈ!¹z¡‹ FjDœvab%!á—%·"J+«wI‹ï¡@Õ–D¬dD2ž’²ØKð¢´íK)£³•Iò¤²·óMª6¾OQŸ®ë¿ÊNç´¿®HÚ·3Ã3K‹µJòO±±dÂ0Vƒ¯èÁ[W7«D¿LXÙž~ºuXÖ™+µ÷P€¥‡½šW8®„ÃM_M«ÅÀ [¡¬>¾W0¬Ô½ÜSž¥)¸„P\šI²QOó”W­.Pƒ]¢ãKzsP@s+˜>{Ö^4NÒ=Ri¬=e "<‰: Œ<°äË=DTF„s ^&jt.L$Ämt@¯,ÈnÿTÛ4Çn•W4Sq¹nœ:®vy~1A;uÄm“;¿{\Ð5åz­]_5Ѐj 8)‚Ðxþ?ª…«wÙ<é}Èc£5oq°T/pw#c3ew‡rÍ<){'SAÏzz…ÑEý}C‡ßGV{†ªG¤wy0As'y%=1tirm7Æosoz7:pí}Ñ;EvOˆ³BÊ{pŽhFNy8’I}AœFR)P˜æQ'†ª£[‘ƒ)™ÐU6|«ƒ|GÐy0q9mw8fs0¸siaM,Ihº_É*hÛoÕ-ülS±4sª‹Ž;mIŠ 9©m†Í:NmP†º:çt2Ž8>æq ‹=/o…[=iK‚ê;@hy…J:œmlŠJ@ém,ì> q•¦A$u¡œ…Eü|=žŸEÓyÀ¢LFxz&¤­K“z§ÉQƒë°½W„ܳ]_I±]؂ô[©ƒ6¶_~µYýý¶a[Ùû¶0`œˆ »ªYvSâLÓ##†5:8¶ú¬HŸ Å[ÅxbZq×ÙE†à Ë;.(¡°9wx s‚ß^¡FÂ%z®+k.¥¯m*<+â¯()©Â$E()­u&Ò'O¯<%h&âªÄ •&Ö¦Š"{(¦—!n'5¡rÆ#þ›™"‡ÙÆ!Q™4!‘™2!tŸí+#"Ex"ÒŸ9í»’qÖ!wf7é }6,†A;S…·MD"XŽˆh6/åŒj`Ý-Þ^H &…Ï4”‡ò1• Š^(úw*oIK.Kq:S£B±ÀL@À%T>h G9=fáælI‘¿ifKUf+Ÿ‰f4÷}¿|ñ-•’Þ¸ŒNýŒi¬‚OX…~¡En”%ªøFŸ.³;K¬¡_±^JR¡Ã±§Ft¥P¸°I«öÀXPJ®Á÷N´±@ÀºIµ]ĦL´ùÆ5QŒ³HŤ[›±Æ ló®¯Ç#€s§ÙÁKr÷Ÿ¬º‰YX«­Ã’g†®„Äôn}­ÝÁËc ®³ÀˆYª’¼µR±Ÿ µ¯Rߗ⯻PŒ–±cRÒ–›§K·l7)þ!²<ö<èUy<8ç26Œ“6u€:#i¸7¡Ž¿k31)làL;/\qY•63n1fÐ9énAxà=Àqx@”x-dÓ8Þymc·7Ô†õm;?ˆ$w¶A)†µra;l… l¿7$|Ý[”2ßwžWï0xkf8<|ïu>£|…ØCu|·‡ FÍ[‹I{€•B—u÷zþ>¹rémÖ7n÷d4¨nµrV6(p¸‚‘=ªvÆŠ§E­{N”(L?~Jœ)Pý€ŽžqS‚ážUt€É‘”QÖ{VNG›q€k¥9)pphq32j%a+™ihc¯+~knÑ0€iÐ|®3âp>‡8ll_‹;9m>›uß“ØD¥wû–LC¯w“•LE&v •$EÜo!ºBvrb’CsŒ”Aawq›ÖDwí›iCëwóž€E}yØÅE)zK¢µHm}¡ª7Oþz™©óRþ~²­US3‚Þ²â],±0^³€²0Z÷·‰]óp¹Ûb3~·úZ¢~ã·.]†}¸éXåOEC' Ð!Ÿ2=îµ=–vãVqa3k&1q(ßf+'×" X9ÉrI5  ¸6ùaA(²"Ô¡@º Bipž-m"i#Ñ£€'«'~ª&$²¬¸";"žª~!/'#©8H&7¡V§#™|!ñŽdÝ ¾æ"p¹À"ü—ߨ!¸š5 z¢¨+%&Ÿkl%Å–êm"ã ´fæ évÌ#<3pÚ$ÚùuH9Ô˜KZ2GWc)BqXÿ+Þ€Ä? ¿‚ 0©^‚%3J‡+øØ~Ò£ÌUß ä-û‹v/Ü94Ñ@ Z«dëëÇi¢CbÛTYs;1‚÷14ÿ•¾·2PÑ‘“±PU ˆÃ TF/š7®}F ¤´ IÓŸ@°ŒKœ e±4ED¤f·J‘©H¼ËPܯ7Á£N¶°–¿‚KH´}¿M£²ÇÃÐQi³9Ç|[1³ÛÊ©o²²÷Í‚ލùÆsv¦£¿Éa˜­žÅúm1¯cÆo®ÃcS®ÎÁWªb¾:R—Ÿ7µùRÍ–²¯‡Q¼”г¥Rß‹ø‰ÎF†[¿§À6 ;g~Ó:ñ¬5)™\<Ð[*>М™>N<$‹Ý?ÄÌO³ »bŽ!æ!ìj»-\&¾iÌ@ *Nq€\O51oæ`o6ðkøg£;nÚl‡<Ü{toê?Õ~Âjl:vùm,;΃Ix²>mƒEt@;.k~9AwÀVÞ2/s6KÉ+™wàZ¥5ayWk»tUoŒ6ˆpTkÿ5:tûsî7Ús{z˜;Kys‰fA:}k“ÍI²·š™PúHž¼T‚Ÿ0UƒÀ›–ZK}$†)IQrÚi“3pi¸3Ïpj/ëkÀg,Õe¡k¾-êk‹}Ð5ØnÕƒ24Ìk=‡Ó96j&‰m;ir·“3DÄu˜ôJ¿t…™ôJ5rc—bJv'˜NÄs÷šhKÎnà“&BguΛäF‘z ¡ÒFw þF!|’£±G†z¥JT{¨YNƒ{ꪄOª}ƒ¬úQšƒÈ²\L†{µn]Ö„õ·r_¾ú·9[›„”¶~\¤‚b¸ö[‡…ö¹]]z†´¸WG(:>"Ç4ÕïE düX ~nÃA-kS>X.Ôfz.6%ÑWg¥9TÎ)ñ6"¹òl0• .²Õ5G>âŸ^¡… r’ ÄÂ#ñ=†ñG †„F·Š‹péûŠm!õ’y¯„”Ãc à”ÆÉ"&šO»çGz"õž¡‡#ÚÌï"ðŽú u^?P«‹aV]¦†QE;è9$~¤6}2uR+wuÒ)z'§Åy%!œwt…3z»&×n}@#S–vz²MÁèc&k „,ú¡8"žEimLÿe–Wç©BO}i?Q¦õž‹›¡kn”il3Ykf 2qRp2Hms"6Qs.€l?su®Œ}HŽzE•iK©}—–`K¤~A•PN~å“ÐOx¦tê>Mv$[¨0sd^s+¼r·kŸ0Tm[mè.Èiéoƒ.¨ibxƒ2¶l¾‚94LnÍR4Dm˜ˆñ<tà‘f@`z™&GPu˜]C5uÑ–6Gkz¼š L!x^œ£L›y,›ËHóuˆ›¹J w+ /Hïw ¡(HÉ{ ¤øMšvb¥FL¦{¨ßL«u.ªY˜®·9Z…ã¶_VÜ:&-»ÐÓ+ô#8òbPsMj¶6K'@sìP!2p`E|/ˆpÁ8a.…DÛÉ Ž*0!N_ "4z¯$ÓO4Í´;JÕI\Ê£ bs] ³Õƒ“ އÚ7 ø‹•"0Œ‡"^%æÜ2d˜g'¨’‰˜ ª•´"=”3W" • ¯!)•¨¥"€šHâ&‰—¢€'ísÎY³ÀŒ>wü'Έiô!À„‡^u…çYŒƒûQ©†ÚFšÈ‚þ<»w:(Œtr áðjÙâék¨ Pf º Í^çî_4Æ¿#ò5™>vBQ<ÑNÎ,7 ”ϳeF¿”d°éL¾‘­±V6ˆ­¿DF›]®#F s²*OžäµPQñ e·¸RئJºRP¨¼O ­ƒÀ©NU°ÀÀ­JòƒÃ~M+²CÃÈN?°¦Ä£Rµ¬eÁhU˜£Á½ÑY78?ý«AÈG='CZgê>lÙ2c)áz€uB¦z÷}øEå{†ÀE€xg~•>Öu‰nÁ7¯q†l6Tr`Æ,/rjp2wšx^9h|à‰ÐBu{¬“IQ}¹þG‘ÛŒöGØ{‡ÕDÓyhâ9çv¦X 0­oÖW,ÌnbÄ/fker®3èiÝn‰3]eàvn6½i‚@9i“}Ç6˜nT‰¸?o·Žç@.sÝ“vCÛsõ“YDot5˜‚IxtP™mK]xøž-NOyuž]Nâv¡3NíyŤøP¿|¸§S ^©YS¼{J§ŒL˜-ªÌP‚|ß­äQë­2Q‡¶†^:‰:º€gñ‹©¼ÑcFèµYn…­¹b[ƒî¹ïZ¸€Yëƒg«UQX6Ž b c$ E0ÎxG[b‚_K!»UsDï.[o1E *xƒi‰Ç`£\)2N7'™'(|]"®Li/-J§SdȪjZÌ~R ´v‹±|kŽúq#|‘_~ ¬•oy$˜A8%%™5c—? ^,˜Ëco™d!U™wÇ#‹OßHšÊ•";—êN&¯4f$íz+EÜ&•sZ¢=‹ÃHh°J¦N€JPnŽaE,kŒþD#dއ@r'Œcíœx±wHÉ ûµòQ¼ <´—P! B¶CP,¦²½Q§ó¼%NëƿÆLp°’À€Kr±+ÁìJÒL—±Ä•QA¯ÃgYX¦NÁ®\±Ÿs¹ÜTN¤¡»Q˜«ÐÀ U¼°mÄÎ[ ²ÕÄ›Ye¯ÒÁ°SÙ­¥¿øR¥¡<¹Sx—n¸ØSÞNœNJP[–˜Ù,õ;9C Ï:N±C:‘ 0>LS;A8KWCÓAKÒúD\ÌjI5[ãHQ¤ ƒ[ÂÿPr¶6®-bm§9,.qFÿ-ßts\–7åt­må<àsÛjg:¦vÑ^Ï8òµk¾;_†ûrK=ð…ÿt4?R‚r£>H€¹b“9ýwîQÿ1žqYKt+ÆpHM•/1q6_85oÒo’?Ÿtÿz5?{ ‚°D y™äGw~âAét sŽ:dp+q9irc³2ÒnÙc2¯u‘x©:*zÖ‡½?¤~>“VI¬})Euzà‰tAp|t|A{’i§:“z„W‚-~kqRá*ÈpŒ\‚,ìp‰n_2(khr‘3¶ièv64£ÓUawÞ¡3SÛxš¢•SÉ{õ¨üVÎy¨âWyy¬âV«zn«cO¨yލ›P"yŪ‡Ê¸`䉺#fg…¸E]³}óµWj€Ïµ•X{ƒÔºVX3‡»ËWu}Oš!I+`¥ã%~¯Q(23kÂåMpm^ý#Îj+"‚*ˆ¬X­‚‡¸tQ$ý'%؈( "÷FÇkm‹Þv- œõ¬ ÚäŒSxS’4°!µ•b‘$¹“¯Ô&Ì›bÈ#’™¨“!ë™ü"<—Ø`$–m²!âš#E"–'š• ˆ#Y’&ò$…Œž8jŽ OX±¥nü%þªãaÉ«)aÔ§®ZО¦:Xˆ ¢‰Ox ( iL ¯ŸI¤%›âFX2›¢EQÇœðBà Ÿ®Hñ!R£uM'OžECÔ"øŸ=Z ]“9í"±›t<(! –ï6-‘’ª0Û+„Þ"òˆ²yu/¦’¶¨S¶“²ü^ýŒ?«NWÚ‰ ?(›ˆ­nH›÷±xO÷ž¯²›Qúžº¶O𤋹ÍN¸§ÿ»ÑNï«w¾ÂJ$­í¿CJc¯ÅÂ$M_±IÄ L°åÄzOj®dÂT^¦a½¹U¤†¼UQɨԿRi­PÂòW²TÇr\¬´wÅIV„¯¹ÁbQ´¬˜Á[Ta£õ¼>UTœB»áV…íqm;ùHŸ& ™0>+ö8‹‰4ôËÎ;˜œã;Ÿ|h=Á)—BñšþEYDÿM—Cs‹»F„ T'Œmö.5'Hmê6Y+‘qVE§2Pt-L©3Lr \•77r4dw8lwÚXá5tyC^Å7K€·r*<¢…Px!>Ä„p¹9Ä|![å3$s@N<-uéQ˜/7oÁM¤/™r‹Z.5†s¼cÓ8™sSwM>vxê†cFæ{ÁpGDwäB‚vVr²9§pxi¦4sbm3drþp³6·s0{Ú;îwT†/AyjŠþDuˆCav›‚ÉB„zØ}?”to[ë5ðoyL@*lñR-4löVŠ-)lwa<.„iÃq§3Šl{:iê28ùi@‡=‡iÖ“B¿s“bFÜs¡•EHr½•†D tqœçMÉxz >PçuÛ QÅ|ŧkU(xõ¦P\yø§O¾{™©Q[{i«Os|/«Nzß«ƒOõ{­7Oæ€0°nR†‰yºN`°‰\¸ð` …ݹZ~i¶ŽWá´‘YrzƲ Q¾ »X?n „¸@B!A/ D—n#ðC'ÐÔ"gLª3“ü K¨ÃU\ôWVsU~ýv³[=;ó _ ´‡2ÊcŒS$á os«·|׎.…¹™W“/Çý•‘%<ê&™Ÿ”'à¡®F$ø¢Öõ$w¡Ö#JœJ"´˜žð$P›¬ô"3–„Ÿ"’½!ä’š# ‹ËA"A“wq&$Ó´šù3ñ­„Q."®0-h¬c€Q, ©úvˆ):¦_jÐ$+¥‡a#ÊŸ&W: bwQÞ!QšÚLÌ"p•ÓEŒQ“RBKv–›Ec$6•'Cl!Ì•f=Ö”“7¬ >“Ð5…Ñ“3Ìš`*i÷‡T*Š[‡<Å5 ”·ŸT“Q²Ý_0† µM$ŒÚœÑ<¨œà¯ûFn›N°K؞׳ûMæŸt´GN!¡!¶ÕL6ªˆ½;M™®’À^Hj¯nÁÙK²¯išM¡°9»NF¯?ÂßQµ®ÀÌTº§éÀ#S‰¦ˆ½P«¬ŽÀ[S°ÄÄVý³,Ç×Uÿ´>ÄßSÀ°öÂR¬ª1ÀÛSR ··žU†—ݰ"PÖsûBF(5‚ò2c(6Sd 5Å(<­|{>$5;˲\CÂH'DÉ•DÝEG}¦³E±öOMÚ „ákw'Á#8kÏ/)@m×@–0ŽrFMÝ2øoÕR4JqaUÎ=Mt4PÐ4·uU”3}°dM8y‚u>Î|-k];£u=W&1£jFþ*Ÿl\3$oF_e5{k*W$28qJm<ry|@vx‡ÙEãwÔ„;E¦tzO@rËq9p×eø3ÈnÏl2 t m¹3¯v²z¬8‰yB‚v:Ÿz„ˆpBNx‰B¿zi†áB~|æ}¢?4w²_6^nKÉ(qmQ·,em§Xœ-³o›WŽ*7nk.ål°yÀ7ŠmÐy5ôjW‚^87mÆêB=rÏŒrB,q—‘ C0s¥™èHeq&›°HÉs,žFNQqÜhM tÍ¢ÖOlq”£nL2q¡.Iwh¨Mëz²ªOà|[­8Q’yú¬_OâxªuO­|ì¯åSóƒ>³ðWu„M¶šYý„µ±Xz…µRܰ§ÆmUØ´wÉLUù´1Å-RV±ËÄ&P.«7ÁS'ž¥¼#V˜’¶™àJ_!M/84 è3k+9Ô;07=a!9DGÌDGÂÃÁI7)µKñjàK‰À ûJ ®ú[Óôh-'ˆiá8 *OrCGÆ1˜qM˜2Ÿr:O½8ŸtU 1Û}¼\‡4B\by6Ň$tÔ§xhb;7YpÆR›02p„aõ3³suzUé1ÐqL­)nªS´,fo(Tø,rp:Zô+ikÿfÖ/_jŠuÔ5q uÄ4Zm {É4óvL‹á>QxŒ^@¹t‘Awš–Bït]—ÅE×s8œ§LsbØIƒt¡3MOsÚ¢ÊHûpŸ´GYwª©O {û§ýJOw«¦$K0v˧^Lx¹©ÒLÆ|ϯ$Pb„J¶xWô‚δWã„£´U~€T²zV€‹±ÎT‡{I´\Qß]¶ÅUÏE2jI| $3 "n#%Èõ$ %û 3-Ï-¶0.*Ý`>c7–„xg! ¼`|jôÚ‹:—![”Ï·$ž)œ'£[!5*§&!U*R¥c!a+©?!–%¼¤fË#š .ë#ÌŸ/#Ö–ñ%–”Å¢ Γ7øÀ•! #’& ަg$]ž$‰í.šÅ)ÂDؽȵÈ=b»\µm<Ù¸«9c¶e¥J6y²œÄ1L®$—b1ý­Œ.,r­6€Ô+:¦Yn 'Ö¦½f[$Ê£(^g#Ä |SG"mŸWJß$›ò@g! ›ÜAŽ!^›¯<Éœc@‘!”,.߉jT×#uö©eD‘m²SÜS¬ìS‡Z–<Þ˜å¥ôAKœã«çF!›w­¯G›´Mn Ï¸¼NT¦»kM¬À0O%¯=ìKV² ÅBJå°•ÄCMͰrÅAO‰­ÃGU‰ª±ÂWy§'¿‘R]¨ëÁMô¯µÅŠSU´ÁÇeX&µŒÈ;UL³ìÅÕR€³¶Æ÷Rô«úÁMTn  À®VÍ‹ yç>ÏEã Ò/9;‡i=ú»<‰™>Cê :B€ž F åÉL7PêM_aŒS2ð -T+† NSOv OMu\ ¶VEµg®*#Ój]1¼&ªsùE0ilK 0=o=R¼1"pPT—3Tvè[c69dß8Þ„#o8DƒúzÆ=õ}[mˆ;rXWb4rü[¿41tZiF9‚s™qt˜vA‚kB(xs‰oD|9ˆ“FŽ}Þ}±@Py z<¢sBnÑ7Üs5rš77qKx28Jso~)spÙBn'E™nܘI¯o±œ˜K€wü¡ÇNtï£ÒLËrÊ¢^Jtï¤IÍ}÷©-Jåzœ¥—HÐuú¢E“z¥hHÑ~«®QíŠÈ´–Uº‹¾±sOaŒÎ´µSŠF°eQmŠ®þPH|Z¯£Q:€šèP$0D|Zr(Eõž$¨"%i&Öô+H‡#(V*#Þç(?œ/º®¼/Z;¥&—8n9$¥e`ý ÐÎ{Ì #‡±D†˜„s$%¤ó$+¥©Â'W.©ª¨#2,,¥ C(Z¡ø$¦ l4#M¢ç# -Ó$«—–#™™n¢–³–©–lÀcœuÙ$Ú–l*'Ÿ“1×ǬÉåJ½i½D¦½Ä¾ E[½Å¹HAä¼!±Í<~¶ªI8ȱ¡£/5D®~œ?2©®,‘V0fªž½-§xƒ*O£Pl;*¤Æ_Ò&_šÔQñ%\˜JG¥#£•cA@!f”ã=#†’„:¨µ‹W,Å…9kA(—Ž©BJü®KpˆÜŸD«‡“á9ÍŸ´­èFÈž>®YG«ÊCêœX®¨Fr úµØJ"§Ã¼ÞOƒ«°ÁoN•±ÄeK(²`Å®J|°ÓÃýMû¯¨Å¯Që«öÅWÄ©TÂÊWÌ«Ã#R™­¶ÄÍNù²æÈ^WµéÉvZo¸ÊS¶fÈ€P†µ_ÈÔS¬˜Â3R·¡[¼ªU»v€M2)‡.$0–œ–;£MC¬]4>ð³•BØŠH¾1çI¼‚eH+®êP´ ËUw ÀTþ OU%á ‚N¡é®Wžäc¬&· Jkþ-ô%†t”Hm.êrW.3]sV3p–O51Ðx)S‹3WK`u8pƒËp"<׃:u <ÞWhx6v$[?3ÀrTc/tBd 5µrzmî;oqvP?:q„6DêtˆŒ Hµw³ŒIÃv{BøqGt2=&qðv(;0ptÆ;9oæzp=xq}‚¾Ct©ŒùFVw‹¾Gkz¤‡¹I’x#zæBˆx‡fF7zH[:2LvòQ6--xqZ÷/'zY[h./v“Sš(1wv[¥,wuEc‘-Žtfg^/þu rÅ3oÆp»2Ëpq¶3Qq}©6Ït …ª7Ásr>t'–!GÏq€˜jIìw ŸGu9¡H"p!¡tH²vO¤³H y+§†G|tH¢šE†uÇ¡.EGxj£:G$‚‡®T2¶žZ®J³UŽí±ÿQ–Šu®ZN©ˆÉªfJ·‚{¯ R ~4{´IR!'³u'Aó)@G/'å"ž&#¿ö'L‰&Š'‘!'Õ}(6) 0(‹ 5»Ñ”dG(¨‚zÑØŽ~"0šbw# §í(Ð,C«¿)¿-Gª"#+\¦<#c+Šê'÷›ˆ,$¤œ¨"è— $‘æ¹"â¬z t’bC {–LÕ"c¡Ê$”žðð%´¡”w6ÇÏéR½ñÃK†¿†Ã(Fß½ÿ¾—Eɺ‚¸D$µ‘²5>2³_ªÂ:w±¥¨7®“4«Ø•Ù2ä§«Ú1ž©o‰µ3Ô Ðs›+Ñ›1^' ™$Ka#©”F>*·2¥¡¼1†-:W†<€R2CŒŠ ý@ÈÔ¨ Cd„ñ—~<ÔˆR–C:œ:­H_š€ª»G§˜üª—F”›®YFPŸ÷µžL&¥UºRO®ª¿ËM ±ÄM³ĤK«²lÃ×L7°¯ÅÑUø§æÃFVÚ¦èÀSk¬pÄPR½²ªÇÌRζ<É^W¨¶@ÈÊWz¸ØÊíQ€¸ É0Qö³ ÆÁT=¨ðÁƒTê¡â°PØYÆ$Ť+<9A«à=¢3ÉCˆ3)G½¥ÃKb€_H× ÇQÉ“OØ vLö—Svë PR#ô 0WB Œ éPªÜæQä@[ZPòÓj™*´# ok<;)ñs2P”0ÎtàVv6Åp’O72NuãSâ2<|Ba7 Kp<Ê„rx‘=î~_f{6‹t¾_f5Ôq…XË0ªq_ew72sxª>6rE{Ü@BqÝ€–B;v^ŒDHÆzQ®L²xñ†}GÉtP|GCnvp{â=Rtæ{Ó> w–·?Îr¬…ÝFgx'‹G°zÈ/K‰x`„ÆEGu’ph˜™HèwbL˜vœªH\t½¡ÞG=y®¡ºF¤{ç¤&E{¢–C#{8¥G}ÿ©”L|ˆºµX/K¸!Yvݱ"VðŽ×°CP_MI„ȧ«JåzùŠ­EWMÊ.”³¾Ép"˜I r($ÍWu{­^ >•¦Xnº-%ƒ%; #Ž%-LW=_¨  €ñå‹„ø ýš¡›# !1'›¢½ r)¦!k)j¥ç&æ.Å¢÷ Ž+mœ-$˜S%¡˜ @!— G#€™Î·"vœ›d!ü¢Œ•%ü¦°õ'Ô t w&›°²”Ã9ùÅØÐ%SLÂAÅ K ÀóÄÚIB¿%Á9I²½¾±K·%µ¸Edz£¯D<걡ªa:¦¯Ã¦8Þ©¨š–4Ò¦ž“Ë6E¡º’µ8ž±{ª/L˜âbP(cšFQ2$Ò?f ‘h8ñ¹Œ7(Lž}?8¹›ˆN”8.Ü¡ Bp’i©ÔEŽ…—• -Tƒ¥ ëTu™ yZÔw ÿ[ ” |T³wDUþ1f&Þ!èp /U&äp*E\0vsìSù5©sO@3ewS14ìz^'5É~+f÷7¡‚!vt>}þmô;örWV2AtVÔ/Uqfí7ùomrw<ÑpÏ{lAEqúF5v*VI¤vŽK¸x±† G³t°ƒDuvH}A'uTv…?Dp5z:<_sM„äAgw°ˆ¡@œzDŒ5Fu~ä…‹CÕ|cxœ>bi#:Ñu Oö,oO=¢!,pH6$¶t-Mg)lªDÃ'[hˆA"*lìB&"m9D4"ÐpOÿ%jSv(ltQé'¯mæ\š+fp&q[2ñq%}Ø6Kt‹ª>zt‘Cq˜OG_o ™çCSt«¡mDövÚ äH¸vc£øFøvF¤kBšx0¥ÛFm}ެOÄ‹¶ËWӋϳÌQiˆ¥°cQ ˆ¿ªåMœ‰À©$L»…Z¢ÕIéz`>5Å#t.)³e*ÄÔ› ^ õS}"»†ˆ ·0%P"Ì{#ùP= ©zQÍÀƒ&‹Ç‘d2#––ëÏ$•õ•(¹š¥>)˜™2,‰œ×"(|—†O#]˜u»'h˜¥-$–¨ß$a›µ"bžZP$d§r’&ª÷ž'2žN}$E±k”A;HÅÑkWÁôÄÜP•ÀÁÅòL¾ÁİLHÀðL·ºž½`Ltµ ³oC¨µÔ²£B!³2ªh=4­y¡P:“¬;™“9£Œ’ƒ6Ž¡‡†.0`p>*š˜^±&‡’­H†!;‘g> 0‡y+²¼yæTº"5„§›kQ¯7ÃüT­É…[ˆ€•hC1Ã:ÉæEˆ“ÖL[.ÛOkƒUAC/TóSp$CSä€àWϘ -Z ðQ|‘ &T ÷ Y Xª[… êGVê— Qº ?NQÅh` ¢ 2i&,2'kó7E+ûoéF,,(qúFl,Œ|¡Rþ/j#_5ЂícÙ7ƒ2vš;Þ‚Q{z=þx Z 4p O‘,Jo…`k4·m q(9µoîx%@~wo‰DGþví‹lJ{QØL}{%Š1L;w†ƒïHæwr~ÄC•sÖy?ãs({2>“p¢ @Är„ò>¸t÷ŠÒEÜz†ˆúED}}ƒ@Ѐ·tí>}xRa.ék6;]#£j]8¢! o›:õ%snÀAû(l8>F"~o³sl A t£1FxxU¤ D!xâ¢_@^xn¤C”C±bŎP³÷R[…c²ÇR|ƒÁ±ïPéˆ0­vMV‚«ØL}o„‘;~UÉ.vÔ<ìR-šöƒ¥b&º! ¯½(Œ!»°l(Ê!|¨$* !‘9YaÄÍu:Ÿ ƒ““¥ͪ¯ê^‚Ì80:qop ÓSÿ¥‹(rl•~³"]št¢"¼™F§% šÍ»(¼™ŸÛ%–·$5šÝ7#±œnn$µœ’š%¦ŸÊ#U¥¯î(Ò©W©'¯ 2'+¦o!Ä'3°H•-C†Å Ò0`ÙÀFÇ;YcÀ«ÇIR¿ÀOÅ*Må¾:Å Ol¼äÁƒSéºG¼¶Oÿ²Ê¶7Cx±Þ±@ì®¶¨€=+­Š¡É;£¥3– 8£«‰Ä1ëœèx.ašyfå(ú™#St%ߎ1:ÂÓ„§,Ûð{îj@)‰óžœ>溡xD†ê™È=„“:Y—Ö«2D~›¤®E✬©A[žµ«EDG¡®üDM¢7³}Dù¬›¼cI ±mÂÉK6± Æ3LK´ÇÅN]³üÈO²:Æ+QCªÃà RÁ­UÃS ²õÆ®PÒ¸#ÈûPî¹PÊãT̺îË1Só·³ÊSZ´‡ÉRä® ÈqYP¦ó¾xX¬_Ê1óz9&;MESð=M8oDW<BKVÏfÂW×?ÚWuÅV¶9­Yl–T]+ IY‡A ‹V$¶ Ÿ]) Ëq^ÄYN ‰ JSÍ‘òKÎ P'Y¢_dƒ'#!Ùk„3‚)–kµ=)–nQ>5)ôsˆFe+Ñ{‘VÛ5š€€d”;,tr[>­ßxH=¤v[_74n{Q=.»j©V31]mmj¹;ÞnZr‚; rg…WD!v.‰K;}˜NÙ€Û”ML¨| ŠâIwy€ Bu©y9æzõ~å?_w­€?²yN…>v}i‡0CO€-€7A=€1|‚@†‚n|;L}/Oâ.†lŠ5#ll04"`lè5W#çlg6N"nk/3aþl?ú!8qÎCn%Ê*ÂÍ!8")ÌA43'ãÔu úJØyDLU  Q…ÅÖRÐ ýW…ÐpVÎjÄW†}9X¸lˆY¥ SW³» ƒUÖ€ ˜Yg AûS  žW˜ 5Q[ QHT ËOÔÈeq"«akÕ,U#In7:2'µl›5C&êrŒBß)õ~)V5^…¢Z¢8&ˆ“l0:7ƒ/qS:Ë{ècé6q&RX-½r;T-//s„c#4 pún':o{Ç@y!‹9H<~9˜”O }”æP.{¦’|L‹u_„|C u´~q?çu|¥?7wV‡—Exùˆ]CÔx߯Aßzo€ÙBïS}?³}abý7œ|4P0Ôtø8Ù%|n*2*#Bo’3×#‚p§6Ï"Gk¹5r!Ükô9!ÝnO;® 7sTLF$þwìWr,îzßfœ5qv]ÿ/tdE-MoñpÍ0ŠqŠ„8 u‚“t<žpÏ•‡@çpëœÙA…rB @?Ls&ž¢>csb¤BCäv¥ëD@y_ªJ({H«õJ?{ì³]SýxÔ°$P€v™­ùQ|œ°EþYì;X®Bî¾Ä —&u!¸ *l$¢»ö.ì&ìÇ:<Ã+ÌË8E*©ÎˆJ*çÐL *ýÎðKø,YͺD‘*RÎx;r™­¡G8•b¥ØC˜¿§&BŒœ¼¨ÀC³œè­ÅC(¢´:MŽªY¼K0¯KÀ›Kûµ ÄîLܶÆ O–´7ÇoPÖ³­ÇÈT®ÅTM®(ÃGPè³ödzRú¶.ÈÛP2¶Ê/V5·ŒÊ„U?· ÍRi´žÉ.X~²pÎ-`û}-fÓ2î8cIåáNàÖTÝ&CW¨ŽU0xZZ¡ xZgÍ ÇWFÆí[qp•[Ôí )Xh† …WÑÅ DT·îêSk q[?A ­R<ÖãMÑ—¿y††/B xÂ…,?«~)€ýB.~^|8AÜ~ÿv¬@a}º\G7K}[Dm,5wn3Œ$¡s®/à'Þqù/È"‚p„1j!×o‡55%rY8P%—rR;#âv{G1%OuQTƒ+÷u[^+YqdZ_,Ÿruh 1Xn°}l6÷t܉%:¢w"“”@ vÏž‡H€rž™DqtT£ Býy ¦]C%yg¦CBtv ¤•Cuxp¨òJ†z¯WNÒyò¦R'y>­ÇN™q°«{Lk\aQ. ´"eL)Ü㕃ˆ´´,+¥$<Ãû5¹(ëÎðSÃ1÷ÒFc¸/²Ó©nñ3†Ò¹p@4Åѹxì3ÙÓüo‚1wÔ‚[‡-ÚÏžGé* ÍÚ=d(êÏÏ4ï)Ô*4Õ*¯Ç/T*A›ø!–!"\g ,ò%QV"GIc¤= „}#ä\‰önïo M”Þó"‡›“±$â£R·'æmÜ'º¬« x(/¯$(¯²h""*µ#)¥»³"»)é¬3#,(y·ã R‰¬ÈTãÄÈÅ’ÙôÃgÆ×ÞñÌOÆ\ÝïÍSÅÛlʽÄØÂy¿Îð¦b¸ÂWn ³4¸«O®8°²Aת¬¦™>²£ˆ™ç8ÑŸ~…›28štne,.”pV­%ˆ@ß!_‚ç!ÀÈyËA›r4W†®’9ª…‹’Í:µ‚P‰ù5Måšä<…™‘§C¦–Y¡³>՘ХRDôœªsE7ž0®ÒDÁ¥è¶P±õ¿÷Lʲ$±J2µÞÆIoµ^ÆMS´rÇNÁ³+ÇØRÁ°ÖÆ3Tǰ2ÂöP¢µÖÈ"Pظ"Ê!ROºÂÍ3[»5Í€Vú·õÌfU.±ÊmXð¬#À>WÄ\¦*âš;Æ>fL‰+R‚z%U`c—[ÏF¤SÙáY'é\Æ 3\qØ êZ~ô îaÙ ]˜ Wˆ ÍX0P![ò ^×]n¡ ¬]È S|" ·PÝ Y êVPb/'Þtn),Ö%llø2'Äs <'+£yžL….N[œ4x„8`´8I„Êfï7?a16 wFU>1ªnÈGÃ+¶nøM÷+ÉmvW¼0Žw[jÀ5àx°€\Aru†ÞF3|‘5JsxÛ‰4GUt5ƒcD_sbœ?õv,x<w@€+=›|•wü9Ÿ~Ç}À>·€Œ€—Abxwjë;€u£U7t$<·)iâ)év)É!˜lD!¾ðq¸(ã 2tÍ,§!Þx2“ ¨z48L#JuÚ=R"‰wF@'NuÇLâ)VvZ£,Lu“fy/Ôp瀞6 r‹á:Zq›D=8r›WA°u¥:DCrf¥bE;r-£WDgwo¦HD]sߦ¨EÞpRªðK\r°ŒOVp²OSp¯ZJÀ]Jdn**¥¾.f 6ÒØkµ"#»®1'Æ >R)̉P\-¾ÐŠj‹16Ó‡Æ9…Ðá“Y:ûÎ…ŸB>Ζ—>\Ò}H6}Ðèh±3Ò´Xé/ŸÏåG+¡Ëê?t(^Ë >ã* Ò=Î,7ÓI:˜/¸þ1q)¯„ÙO[= \HqP箵“Ÿ [@ü!Ê?ð“¶¢ÆD–¥îDј-¨ÍCZ¢o³NEL¯K½Kœ³BÂJI·ÆáI¦·ÇÇLW¶ÈâOѳǹR2²¶ÆØU:´ÎÇ(Q¾·çÉÆPç·¸ËÑUG¼TÏPWÉ»žÎ[S·OÊÜW²DÎS_ö”ÜB$=®Ò\@±›Kj^QÚiäS¾Õ[ÏÅ\ *UÁ¬¤_`Q Ì]ôï /Z1YqR \Z^ ýQÍ"´Qá¿”WZy 0S¿d ¢VgE $V»Ä ÿMè ÄM% 6 ÆZʽ'f(Íçjø1¬% nÏ5È(w@Õ,/ƒGUº1ŠÉd~9 ‡Žpy9à…\f×5¡|Xi0t^I+¦mèIV*›pÃT-¯sÙ[4u h.6my }{?S{Ê…!@¶z²„„BŠw‘~Õ<uïu\9f|{Ž;ž|WuO;†ny=‡|z5<šuÄva=kpŸPz/µrüC70Ïpî7^,ukÍ$ @n¢)gžCÊeóp‡gr%ÿ™nR'MsN00¬o×1NÒp 8$ItC[%îrdI8&»pšNë'ÊqNj-%oÜ…Ù8l(ˆÐ<ºmb“‹= qʧËFÑyÓ°ÜI°zk¥ÎD¨u.¢A¯rx§jE°tô¯²Qts±yPAj÷¬½Hy_àv°-¦0ö›G=.©°jMQ*Q†W+ó!û³Ô*r%пb4@(OÅ2N¶,“Ìxz[6*Ñî”q;£Ï±ªCA±Í[³TPXÊq±ÌišË ŸbúÉ«‘ñUÏœvÒ;Ñ4[¸/µÏMF/Ï6OÒ/ËÀGñ,)És@“,NÍ—@²+bÔ€<^,<ÏÉ;!.*¯¬,Ë&‚†µ¸gEºiö»!‚uóÆ”ë °™}e#€¥‰ Â&v«%"’)o°ƒ"k'§µ†$8*X´u$‡**º=$Y)P£`#n&NªÝ¢…wËkæÒÅnơޒÃåÉâ¨Ë.È‚áaÊsÉ\âPˢǨޑÉ~¿óÐ¥D¸ú–fH³¸2KíЫãAͨœž€;™¢æ‰x0 ™@_å%)–IíÏŽ-6e„n âŠn žûp»<ªìzŸo¹&€Z².(~#~.ŸR€H,Ÿ’˜?:¬”,›:“ •9C’vœR=µ–õ¡Ä>:™¦ZAþ ±ÅG]®­¾µI׳»ÁâIx´°ÄƒLÛ·ˆÅÑL—µSÇYPõ²]ÆüQ™³«Ç¿RH´‚ÇYQ¾¹VË~R¤ºù̓U$ºñ̶TLºÌÓSkµSÌtV‘®ÕÉy]shøCøŽ8'F¼=QLl ,X“<]´¡×`j ø` ¦À_eúŠ`š& \ùš ÌW›64[†_ LX»öZõôWéx—S^7_OäX­Sÿ½Wtl aQM[ ±Ow  kO] õ [aS—UhV.J ƒoõ6°&±t19À)у­PB2a‹:%ˆƒpÐ<\†qn/9My½RF/Jr)D]+œm=›'n×G¨+CpiVÊ2IsÑ^5+|àiå8Gz;kŠ8.tof^6ªt™^1ax»hQ3‚|pl6>ƒXt< ƒpý9{Ök€6r{Êfœ8$ƒTð2€ŽGª.?~[7ˆ(ît•(g/jS_fÃb”k¥ £IgqÌÍhB&­h”%S j[++#l+0ç#åo]9$k/9D%måBå&k5O)$kl”4Mj){Ž6œk~™=äj©Ÿ#BÈk#¥D'tY©{Dksœ«LEÚs°'JYoÓ¬vMojÝ¢_D8Vjì)Q(sw6¦/}[Þjrt¿6hp5b52+~Ë#…µ&ž#,½™3@'aÂ@aê1ýÇRœ>YÏt¬Ê@€Ïƒ­ý?æË‰»}],Ê*Ȭ›nÉyËU°ÇÔÈý³Ê8¸‘ÌB„—^^ͤmgC¸Ïd:?ÏŒaY1ƒÍµUŸ/ÊU%3DzI2‰ÉìFm1¥Ð0@Ï/ÞÓ­>:/fÄ/.‘(ˆ¥¼#]$ʇßÊ„b‰ @ d™´ g%÷£B#K*ªZ#m'g¯^ …'J¯õ#­(¹9$'Ž¢ "ƒ(>Ä—žRngÇtãxªÆÎ×Ñ©bÅíØm¨5ÅBØ?§”ÄçØÂ§EÃ8Ö³¦¿ßÌ'†ë¸ã¾.Yܱý±”Eǯ©P=%§º“o5l¡Áp§&7˜·U¼Á‘=M†-#ÒðqgëÕQœm cÙ)Þ w"RÞvZh×#Mr£^¥êx—e{!áŒÙ 3ÕŒT8eˆ Ž#6‹ÿ’ü9H‘Лî;Œ–ƒ¤G>šŸg±PE%­ð¼ÿH¯³ŽÁ(H}´ Ã×Jóµ Å×L›¯£ÂÛO½²0ÆEP²nÆáPQ¶ÇîQj»BË‹S=º2ÌTS¸ÇÌ2SÄ·¾ËŽU<±…ÍËY[š²Ÿ!G D7ótFì”»Náç‚RÛ:UQ_–qµ_mA_oIhZà \2>_1ºS_mõ]š%ÊZYÝàZ>ðzV¦EîVXõWW$÷ ÚP‹¢÷TÕG}Yë MÙFýO¶ï ÑYóJÓd™"Srë1+"}x%:(»„QQx1SŒ`C6Å‘Óp6;(‘;mx9у¦R 1+y&D+rÚ?š)ÁsÜ@æ*«tzJx/5uR40¦w¡Yˆ3xÕW3‹u”VK2îoÌMê,,yY¡2iqg­8ô€€`ç6€qdÏ4¤|Gd7uê_9ÚPH2my,:›)ºsÜ-V"-d˜‹”aèÞðb!‚fþ< hØ Qn…àe>½_÷$Ö‘a'¢gª0Œ!¥mÅ2Ý%vk§4ä yhç>#ožS4'¦nêaÿ,?kñ{Ô2-n•Á;siF–D3?ÑÓ6".8µ£#…&u—œC%qð$ƒ™õ4'o¦]! %ò­ Ã%ð¬ÿ('î³Í .'pŸx!å&c¶š¸UYÇ\Û`|¹ÄnÐÊ}HÄÐÓ$ÂÁÎÈvÀÀy˹mû½ÀÈÏdz½ŠÃ¿YP¹j½ìRO²:±ÐC‡©Qž9›Ïu;)<’+G“&‡…,Ú |­•oUÿ fTj7S\ad ¥q!3n2w´BøõuEDÖBod<ÐÓe})H&kV.ÿ{¨qî.0€èzö.„ƒ–…g3w–ö;ܖȦ0>ӢdzAO¯N¼¸Fì°òÁ¥Jà°ÁŸMù«ÝÀGPª¬hÀR ¯ŽÃƒQ÷ÆöQy¹ÐÊÅPî·ÁË„S¶Ê\TL²AÇ‚W¬ ÉUTrˆH¿ ¤7äQ[M-QQX¼TX[ÍX $NY k[ÖZšóŸ[Wîñ]d)^¿úÝ^¥½ ]ßC4WõAµXs¡/U„Æ/Y¸¢ 5U¨î(QЮP¦a°W®™ Q³A IJ]ÕU m b^xÕÂgÒ"‘“ku(Ÿ!z\ dž[''# bP4“æe‰; QbØDŠƒ]HQsÁTüEÅWNWÖ%=j5zôBN‚ašdÒ›Û¹¹‚ý¢²º‰¿›§þx½£kÁ|†Y ÐÒ¦z«‚ ©ÃQ@gÞ^º*w°{£6‹Rî0¹%.û%ÜÂCß,ÀB]P1>É™sŠ5lÎòƒù:RÏâ™j>é̱¨UD̛ҥ¥ºË"ÕG·´ÌÎâÆÔ"Ìsá×¢Í2ãÇÚ6Ì‘áóÚ0ÈÑÝèÏÊÈÂÝÏg̘ڽÌýËçÕ{Æ´ÇýÎ\¾YÅvij°°Æï־ˆÉóÓ7ÈÉÇû¢È‘ûÉp¥è–äÏÙeÝN­Óu7ä/¶ÎW*g/7µ]$¸- —" +ï–™ö"¨¤Œ #t¬­%…°¿ ˆ&ü›À!Ÿ'xªÕ™ÚKôÉîØKr¶Ã›Í•k4Äa͇ktÃÊÄe}Á.ÇZ[¾EÃèU(»E½aP=³$°ÔEþª œ99f¡è‡1Ë ¥u-·¤3t¥.»¢w0š¥¶~ˆ3¦œˆÏ6§¥»Œx7ù¤b6C­™k9Tµ®©Ý?á¸>³8Iä·ß³-Lp²L©¥Fú²U©ÑIˆ±§©Mo¬«¥¯Lâ¤5›§Eù £˜[Aýœ«—µB–·š|=ö¥Í?H¡©®:Dͤ³8GÒŸ=±ùD( µH£¹$Kó®À;M޳*Ä[N\¸É2Sж¶ÈŽR.´oÆGO“¯%ËËVa,É9ÝDÒV¡B¬º@>J‰LȈŠNTpÓLRÐMšJOçÌ©NãÞÑOH:šQw&TúˆQ¶T®uQÑÎáSn±“TPÕ/U)`LT<"ÚR6UØ@_T0ëZÆ÷ ”K5àxNkUÉYB· dGؾm{$K¥v^2t"x…‹K/xŽ^4¦•c67,‹[\,83}Ê?)+Äq“8v(œpÑ4m&q77‘&„pÊ;…%ŠjU>4'ÌoÝB*rD(txQJ£-tw·Gš*ãyJ°,µ„U§4 ƒ“TG/ß…W8>†Qc3¤¦?´*L›0 )Lù …_H—;ÏFÁaÞOx rÍUËÈYX\e”‘ñ]I+ù`.U _)èÃT$Í’R̾ ˆRöÞP) pS„þ»NÚ‹}B Ž33ð1þ9µNÎr ~˜6ž¬RÕ‘†ŽÊòï°ÎƎꚪûÆ0ë}¬ÊÄë!«ê·‡ßj 6”9¾g„E©SÏeÍ]T.#iˆ`ä*»{œZñ1ž©a3¤*h¿Æ<ü)À1X/2LJk"5µÎ[ 88Ï  @¿Ëf´ÓU.ɘȳ‡b˦ØV³ŠÍéâ…ОÍÚå@ÙÍEâr×UÎ[åÜ™ÊiݪћÈ?ÙàÇîÊó߳ϬËôã„Õ.Ê®Þ9ÑZÊjâdÛ7Ê©ä™ÞÏÈ‚Ú_ÌØÊ|ãàÞÛÊ'ßÉÔÊR•j—ÎZ€}eŸÓq`íRÒ…8/88Âk"Ë-§*ˆ'•Y#\“3æ!Þ¢Ðë"ô”0ž$¸¯„™~C¥Ê5Ù’jÃ×̓c4ÂúËE]³Â-Ê]þ¿3ÆY¸»†½ÂSˆ¹'µ¦L+µ¯I·Ã®?B;ҸåG÷ơųM ʪϙQ¹Ì–ÓžW¿Ì&ÑvU]ÍbÑ^T@̕ϳNøÎ8ÐoR^Î ÎzOÈËàÌÑMVÌ Í5RLË%Ï­UEÍÓÕUÑʳÑèU:É™ÎiVËCÑ#]›ËºÐÑYŠÊúÎ#WÉÌ:XWÄâÇQ˜À‚ÃRO®»¨ÂÅUŶG¾’Tƒª´ Já¢k®=K¡¯ŸGפ3³ëH¥¨'¸?Kñ­Ï½pL¾«J¼lO£²ºuL˜œIC!OþÐ ‹+d9v0É4#;&6`8ÿC›E¬·HV(G˜ëfL5ãNÏ‚HÂHæTOx<ÉO=O•TPôcãPá)zQŽJO ‚çS[2ûTæa ^I‡î&H›‰XÑ Æ +]}L=gØ"X¬x4Á#†Nî-“Å^ž4TŒÊX¥4B™9Ä$¬p™/¬!Xn93]!¼r?;K%Up 5o!ÿttÓçGµ«GJB ,4TÌ “U  àV¯ V 7‘T0² LiIHf ' wHÅ 3=Û{¶;]¦5ÓK4ÊMy%pK83lrÂmî.V¨xË¡zRš⠛mº…ÙÁŠI² ϯ‰ñª£Ê0†/ªÍÃʘíÆÒb¦Ž1±FQ u qk7.wS+ìØ\1 Ÿ3>ˆ,áÁF9(³ÆEFÎ-gË;Mo.ÂÎÖkS2”чˆÚ:$Г­-QvÎDÄ–p ÌLËùˆ›Î Û§µoÍûÞÁgÍèà˜Ç›Í å(ÑËÉá7ÎÒ̘ߖ̛ËäÞé̽ËtàS̼ËmÞëнËçâ-×òÌ×ã‘ݧɊÚþÑ!Í‘æeâ¢ÉÉØºYÈ nHiÊà–ZnÉÑ…o`@ÐZvD\MКN2I×Í-þ,Ö¿û%+ð¥9Ô&“&(!÷ޱ—AÇ&ÖÞc0ßÌq]w¿”É)X]¾kÃëW¼w¿†SÛ»¾R«ÀÃÂ.VÄ’ÆëQSƲÊR)ÆøÊ©SŽÇ ÈàPšÆµÊ’U_ÆÛÊMW#ÆçƼQ»È:ÇXNÇCÆ&LçÆØÇTOMÇøÇ9K°Æ:ÇWQ¦Ç…ÇdQÀÈGÊMÜÈ®ÍPÁÈdËR`È!É·PÎÇ—Ë”VmÈËŸQöÇøÉHQtÇ—Ê\P¨È‚ÊQÝȧÍXYÉGÏa¨ÉϲgÊÈÕÍ¢f˜ÆšËa`ÃZÇ&\½VöW캑¿ Y÷1¾ÄW²Ç¼çR°­êºTO¥ˆÑA2x$H $atŸJ#3z¶K£#ÍvÉG_&+oy?æ¼f`3Û_Y!²…Soº@Fð l?Ÿr6Z/Ð0k7¹;úÕ¹?·BChlÝF´€PHù XNMƒSQZÞO†NIKœ7Rº–Vø  T ) GRÎKL(úP|P°[ä<“jQ Ò u±0³!­~¾BÉ*&|Ý?c*¼mé)Ø ÁaÒ!pÊ^š# xg¦*ýg'.Y»n³3À# sÎ8D'[v©:W,w¤ô*;9þÎÈ7Í­ 5ß-Ý% ”r.ß ãzi>\,Ʋ™ÙiiÒ¿çßG‹‘¥WȘj{¨Ònsy›?Ƭd°ô…–;Û_?E'mòd-&B}1oN0W|U`d+xë_.ÉœÉ7t(¿¼d<+oÅÌN¼/}ËDU10ÜÏÀf¾4qÔÄqÑ5<ÔK…î:)ÓÇ¡ÆJ«ÑйtUBÏVÇßx´ÍŽÍd‹lÍÂϹ“MÌÖÔŸCÌ”Ú7¬öÌ©ÙÒ° Í/ØŽ­ÓÍÞè¸êÏKæbÎ=͆äÚÕ¹Î:äûØЪè#ß)ÎÞç‡ábÇýÑøÇªÆŠl„`§Ë `WGÏiR@wÐ’gèHëÓwqJWе>é6’Ï2¹2Êè,.®¿r&9+†u¶¨°ñ•8ÒÅxÓAWåÂÖÉžUÜ¿«Ã_Mú½Ç¾‹LhÀòÁ.NÕÊÇr[ ľË5[ÿÂØÈîRÄ'ÊmV ÆEÌæVýÇHÌaW#ÇÔÌ×V–Ç:Ì£V#È=ËëTGɼÍoU¬Éu˽QMȳÊüNíÉõËxNÉ)ËÁR[ȉÌOTHÉÊÐPšÉ;Í'Q—É Ì¦PÉ˳M“È‹ÊÅM+ɹË"QnɼˌS©È1Ë`R†È4ËzRÃÈ"ËÑWnÇmÌÞ\ÊÇpÍ^GÇVÊÍ[ÌÇF˳Y8ÈpÍ&\”ɆÍ{cÀÅËfÕÆ“Ìh¢ÆwË(]ãÆÆÉòX+ÆPÎ?X[È?РZyÇæÌ½XãÈéÍä[gÈ£Ìá\åÇôʦ_ÅäÇÕ[çÂÓÁÍY³À†º¶Xž¹¥­„VNªé–ÔKç—t‹9 xèPÄ(iZ÷+ß%Ež Q5,P-™8k;Yï–C6'IéxFáù¿HƒºLgJQIJЛMb Ÿ >Lù#ýKª›—QQ <ÿ_GL hšñ¤o!ŠžhYì:_É0KUvÚ ¡ZŠžábU"âüg‰#÷'of,$¼sú4‚&:v7m)÷z%>Û)`~7<€'n|Ž=(&y?:Y')o|%rVÖ¤ ç?äY•0xG1]å,0uu1âN3-D$u3&r!DdDóD°¿OCôYwHa rqL$ çK® Ú ¥ID 1-E8 <8@: D©^»?‘¢|8Œ,].// -c ÆuJ¬9þ3<®' @/JGÍ;ªgküj.Š\(F  G§*í7²,’[.'&d;&Ñç`Â?,Ì|›' ¤³Î.ˆ&‰ÉÅRS/’Ð&b§2ÃÔ8iŽ3ÉØ{qÓ6cØl‚ã;ŸÖ?…ˆ9tÕŦAÉÒ»°ýJyÒ%µºO³Ñg¸åY6ϽsbÎ*¿dfÌ>ÂÙnkÊ÷¹JlÀË"µ.k)ËW½?+ËTÍ›¦ÆËYÓÔº¡ËŠÛjÆ3ÍÝ|Í9ÊSÚÄÊ„ËQ´b¦€ÏhµQÖÍFIó?jÑÝG½;„Ì(89,ÀÌœ<0qÓ¹>ž2ÞÌž4À0}Ö“-Ö,ò±¯-¡-"®êŽÑ2ˆÄlËÅK·½F¼6G¸o´¯?ÀdÁGÇÅxË^”ÅÆÍŒ`IÆ‹ÍÇSDÆÊÏ/W˜Æ÷Ñ]¸ÇÑMZ\ÇóÏëZYÈ™ÐÅV2ÉbÐÜVWÈCθTÚÉ%Ï…TÔÊIÏ T'ÉÌNP3É®Ì7KòÊ’Ì×OžÉÁÌ~RƒÉNËþP³ÊÅÍSO3ÉùÍNP;ÉžÌQôÊG̶QÉÚÌKR›É­Ë×TºÉ1ÎVÙÊÎ6W&ʤÎ+WÇÊuΫZÈPÍyYÊÈåËxVßÇÔÊyT6È'ËhXMÇRË/[‹ÆøÊµ\Æ]ÊÔ^ëÄÒÊô\¼ÃÿÊ{ZâÃ2Ç®VŠÃÇIX@Á°ÅJV×Á…Æ¡\ŒÁ™Çe`.Á$Æ ` À¬Æl_ØÂ_É2_ÎÄGË9bžÆ΢jÆkÐiʈӿeÃÍ­Ò"fÊfÇXam¼¯õTÌ£ ‚¥?´}FM•(¿Véš@ôƒ91¦3³<‘@p =J[ÇN¼íÄMnI”;¦N ÙñCOS©>z7CtâfOò¼€\Ž—ÉX$Ò KXG ^ ÞKMè™Lê – °ShÞ]®7šg²'%q6E$\sÎ7o'8xÎ94'yo9 'Ùw1!‡qš%ò±b'ÃúP º b.¢j@/ ™4!q4Ik0ù@9-±ß(ç+).¢\4?;«M>á@Ë@^Ê'@?Rh4û#Ï4Ч:þ3PM¦0Ðûx-04$&ä ½ AwПÚß+‚ ª(L0ZŒ\ÕÓwLfÏ (xskÅ®4G,|ÈÈ9Â+SË?Ff-iÏËOÝ1<Ï‚P00ÙÍIUO0êÍTX“2Ð]p®6’Î׉aAþÎ¥žþTÑ8£]WÑY°§Y,ѧºìZÂÓÂÛaoÓhÇ=q\ÒÀEnËÐÜ¿n"ÐCΰ›Ï¨Ø(§"ÍLÓO§Ë+ͧ¥ûÌûרµ!ÍÔÀÿ¢ДnûWѸXæGžÌ±<¡50Âu-µ+‘Å=.k+ËÍP2d,Ïq3(.¨ÔC4€/%°ç5./°‰1uÁÀFD¶>ªU8·Á¯¬8pÂUÉ TRÄ Ìl^ƈÍ9UÑÆ«ÍPÇÐéY‡ÆçÑ \_É ÒYÁȾÑKVäÈÑUªÊÐ÷WØÉªÎÊQÁɑϬPáÊÜΣLåÉ„ËANéÉËˈKyʆ˅L´ÉÓËïOÇʶÎ*LPÊ3Î J¯ÉÌ`Q9ËñÍÁS÷ÌÏQS@Ë ÎžRàÊXÏYxɪϒX›ÉºÏQV=ÊÎïTÊÆÎgX•ÉÎ'_iÉ Ì$X&È%ÌFU8ÈÌ‹YÜÇKË$XºÈË[ǾÍJZìÇTÍq[)Æ*Ìv]ØÆ*Ì^²ÆaÍ‚_‚Ç|ÌðbˆÅÄÊécÅTÍ,c†ÂÞÊ6c¨Ã•ÊYf€ÄnËÃfÃàËxeÜÂÉÊk˜ÂúÉ k«ÄÉxi!ÁÚdzežÃÉ4eÌÆrÌze|ÊaÐ?dÏjÎÿctÆÇ¼€Yé² šFJæy\<£ƒV+Ådi,PŽJh‹47Š0¿ 03v`/‚&14Œ™-Z‘28($B $éY`…l(è“!§'+n.–cN,~**CöH•x pb[ê—†*h";ª0˜'–´43*~¿«4Î-#½Æ1Þ,Áºí3š+º20Ù+3½¯-Á-ܼv2 ,‘»T4,Ź+V*ˆ·Õ&_(D¸c'H'¤¶¨/A*]¶/ *ô¶c7F-µ*IÅ6Á´2K'9sº\Mý74»¨Z;,½FeFBlÁ×u"JÂ…ýYÀÄÈR_fÆ<›fýÈy¡éwîÊ«“jMÎHt8T„Ò´e!J»Ì¬;—1ÎÂå+%*ÑÃ2*Í*uÃÏ*®(ÝÆâ-V*UÏH/6,=¯4 ,¾©ƒµ*á½ÝµMš,pJ¹zY'[ r·$0 ,p[+#æi€*Ð 6b«dVz_ kGy °ã?²U?ãkÁuáÁ«ÈÙp"ÄŽÍEn½ÈàÒör¶Å“Çžk/­0štQj‚mU¯3ê[ÒÛCH;nGðªªPá”J®A÷?f7ª=îŠEõ¼.FçMžOS ® ˆQo à tZQÁ™_¦³ÃZÔ![D>V 6¯S> @X_ Ë¥Uà §qOo g ÓKúÏH\–òDê t@¦rK8ó:»7ª7&&°6ì„2õ>4) 7L@$3 ~42s…/*õ-Þ¬+ÚÈž*¬Æž%CÚ ãLJÓîÖ#Ø5»duk i—Ä‘йÓ-#~Èf;)À 2q&ƒ¼ .!%k¹·0%àµ`,' µ»*Ä'W¶›-@&ݳÚ)&lµˆ)€$Œµ×+ $~·œ*Ð&ð¹H+B',»Í.'”¼/x*c¹°,I)'¼z2÷,S¾B7·.*½0ú*/ºQ2%/¨»¥2q.ݹp4†-Oº0¼-—»P.-¥¶µ1V/5¶'2C/}·ª2d,“·ƒ/‡+M»š.y1Y¼*+õ½/!+ǾV0F.æÂû1Ð0àÅQ1ô.Ⱥ< -.ËBF.Ë3qlB°Ì·våOFÆõVb=‹Å8P1'©ÿ%ý+½Ÿ~-¯Ó“,õðvÍ'(9¶´9:ÊDÓ«XƒÆÊÐß\NÉPÓî_AɉÔOiÉ_ÔíeJÉÃ׋cðÉ¿×SjüÊ¬× pCËë×*gmÌÖ_h:ÌåÕê,Bº•;¤)S¿ñ=f*öÅ =~+óÄd<ó+bÂÕ;+Õ¾Ë:f)ܹ6<'F´î32&®/ƒ#K¦Ô."œ&$ƒž ¬lËWön¢™qþll·ào-{yèÅ€“)&ÊÖ«š.Á!ä± 0Å#F¦q |¥ùc¬Œ!šs³Ç- !š¶±.›%Ï·®/ª&¼t.ß(­¹§+"'û¹9,×'s²R'$¹µù($Ó³˜'ì&ü³Æ$¦$F¯3%y%Í®X$P&úµ×+ä'¹³(ê&~‘<ôͨ ü$ϧ &^'e¦" (²¨ #G&«‚%w(ª¤(K'Ñ©~))§­†%b)-¯ï+ƒ*–³¼+õ*ϵc+‡+e¶«+k*Õº¦, .®½+*5°Á2&,÷Ä®3w.TÇN7»1fÍ/@ 2ÍdCû3vÍŒXm1|ÉT¤FtZÈTÅ`ŸÍÍ#Éõ¢Æ ´šyÈ餫pœÅ0¨ûo5x›|¯%un©i¸[Q‡¯¨³K$Á¼è8È€Ñ9S$ÈxÑIYøÈÓÓ`{ÈÓÔeVÈ„ÓüeÉôÕÈ×ÐGkÅÑÍ‚ïÄéÍEíÅ Ðæ”Ynjխ§ÖÆ]Õƒ°2ÄíÑõ£mÆ,×Iµ©ÄäÖ*º¿ÃoÖ3µúÅ•ØL¾;Ä“ÚÿÈÜÆgÞϳȚâ×ÒÿÈ=âˆÎíÇÏãmÌ2ÇzâxÈÈá5ĄȮߞĚË?â}ɼËÐã5Í€Ë|ânÎÛʼßÈËÈ ÝÉÅŒÊ߯pÈÉۇƒÈcܹÈVǶ×{»§ÆÔÑ´±ÄLÐ ¢>Ä·Ñ£çÄDÐa«ÒÄDК¨{ijÔ´¥Ã-Õ¾½3Ñܰ»#ÄËÀ†€í…,¼­Õ&Œß § |’–%Ž"ºšö,Ì&U |1r&×¥:•*¯”µ+&$‚Ÿ ¶µ‘E%$å•ë,Ü'Óž,. (4 ®-|&í£E-a'¤^-„.שø-A¹«W-Â(£©½0_+I«Ë1 *©¬Ã6'ˆ­75p&c²5á'³›6&í²Z9û)µ¹4í(ú²±4}*f´@6Þ(жp63(H¾Ã8,'Àÿ8æ&¹À}4‹%¢Áó5ì'лÞ4I&€»W/Ø#ëº.ê$s½ 2b%×È)4~(ôÔ H%-×_e­1žÒÐs5©Ï8…•2ÏǶŠ28bÀGRä-Lµå/G%–®'™"µå2­&)·ð1U)Nºp2¯+«ºP4d.ºí/+9´i.¤)&±@)L'Ö­%™(Z§$ê%º§=#7%]«x(ª'(±*¸(i®6%b%³£])¥(øªÍ&»2¤ûÏ#Ȫò#¤'ب$´%¸ªZ%·(P­:'¼(@­'‘(õ±['˜({³‡-p+@·-®,¸¾/š+û¹f+i,B¾y*ë*)À¦-*‘À/:,+Ä7 /FÊ÷B1êÌöHT1:Î_Uö5ºÊåÁOrÄhŸ–€¡ÃÕ¨M…ܯ$b/ ÙºqïŽl¼{ŸëbB†,•ºŒ°† 4§»¸YPœÚ•F:g° §/3ÉmλRXÇMÏW¶ÈðÑ^ËÉ«Ñ`†ÉÙÓÖ\¤Ë[ÔTaáËÑÔtb\ÊKÕfÏÉÓó`iÉ6Ò^XÉ/Ò˜^DÈÉÓ4]8ÉqÐÜ^wɿМ]6É–ÏhT*Ê/ÏYThÊSÐÌXÿÉAЈVÕÊWÏ}VŒÊ£Ð¯XîɿЅZÉÂΗaˆÈAÎæi‘È~Ñ–wÇÈÓ”}ÈYÔµ©”ÆœÍòrcÆrÎ5^^ÆOÍÝr4ÆœÍÅuÆ#Î({•ƄөÆêÓø¶qÆÊÒ„£žÆÃÔ¿§wÅ¥×7³˜Ä&Õ=´@Æ'ØAº¶È+ݹÄÎÉ©älÎËågË,ÈàÙÁÖÄÚy³`¾×Òÿ¡ì·dÊn˜±Á؃®²aÀò{¨³É¿ðwË´E¿${¡¸VÅVƒ½ÎÉj‰›½ÿË ‘ݾáÍ=•½ÁZΘÃÐø›5ÅWÖ;ªÜÇ{Ý0¼GÊ)ßËÀôɪàtÅôÈaÞ«ÃnÇQÚ*¶çÈ[ÞBÂ7ÉýàÆ,ÈQß½¬ÅLÙÊ­rÂÕÐŒk»Æ·Ih_’Bm1´‰ )E,‚†?!Ñ( O”!Fdàl‘W H] / { Vc)># ‘K)‚#|–*&‰Ÿ4*>%£ž,>'â¨-¼(W©n3‹'˜¬b4Å)q¬Œ0)Á­.1)C°•3S*®ª6Œ)ò° 8')ݲŽ8¥*L²ó7+&š±{6ø);±Š5™):¯{24)²@3Å(¯c4N&á²]0›$A­•-"¬ð*ì"«y+«#¼©Ó*š"à±1)ž!Õ´y+"˹°0ã$¤ÃÆ9±(ÅʼOt*ÍÕt-0ÉÌYx‡3ÜÌ™‡!;¶ÉÓ®ÓKaÉ´McÆÎ(‰–@š¼¤BË([§K¶¿²/;$ ¹@5O)\¸x1(¶¹Î-û)˹ -†+Rµ‰-h*D³¡/2+бÎ+E) °+*")|²©.2*B´‰3f,w³S&å'«}E.m¯½–v.¯P-v4ª¤'i&!­Ü)ô)}­Q( )º¯ó,*Ȱ£,þ+«´"/Ï,#µ•0«/ö¸Í630·±5Â/v¸71r.·ºä0Ñ,¸¿Ë3;/¿3L-ÏÄx8ÿ/³ËuaÒÇØÍ`RȦÍXÉÍÏW%ÉÍ=V#ÈòÍýRNÉ=χS+ÇÄÎ TcÇÍ@[ïÆ¦ÍtnÇ{ÑzvÉfÏæzJÇñÏD{÷ƨÑ÷“”ÇRÓ?›äÆlÏéƒ,Å…Íøn¯Å[Ïö{ÌÅmÎz‚‡ÅÅÏS„ùùÒn¢ÇQÕÛ ÿÅÑçÄFÎ%saÆ'Î^uÑÀÍË»t"¸Š¾Sd†®t­äU;¨á®ýZ¬‰µbý¯º9m2°:¾æwà°}Ã$‚B®GÆB…¯°ÍNj²Ǯ‰'¶dȯŠº÷ËX.¾~ÎO—c½ôÎÔ›£ÀcПžê¿¿ÐÜ¢¤¾æÑ˨-ÀqÒý©Ä¾˜Ò7§÷½Ñ& ¦»ËÔ” ¸ªÅˆÇ¸{Ãù€í·(Â:x…¶ Á¨zB¶éÄ‘ì¹JÈU…z¼Ëœ¼Í&»åÏœ‘p¼àÑ ”o¾9Ѩ”h¾cÒÝ–vÀÏ×Ü™}ÅfÛ5œÜžÛišž¾˜Ì{•A¥œ,w±’åe§Oó‰ú;Þ7p„S3'q– Š™Œ-‹%÷¥5R*˱¿9)/ĸô?91 »àA´0Ó¸>+0´š9ö-³º8ƒ-­²<9&-ÿ±»@Ÿ.Ö²È>.)°D9\/±þ5Á)¢°ñ7q'm¯e1'aª-Ô%®ª¼.‹%!«j.ð$ ®¨-$¼­ú.›%™µP5$v½Ê0 ,§q‹-¹"ªgÍR•8TŽVˆ'gøšxª@pn­"jSE¯ú(S'°ô1/³ƒ1«-³¼.@,\°B.×+(®x,†)“¶Œ1»-O¹C4.¹ 7 0.»f6j2½Ê6l0é¼5O/ºÂ§<Û2ÒÊÄLM3±ËéY3úÎ nÅ:èɶš¹RÇ„Ów·žÆæ¾¦<¼7žEgæ¹·Ó3²ú¸bÓÏ´è´ÆÏ€«¥¸ËÒû§”|+aT%¼zÁzé2ެ‰m5¶¸±ºŸV6¿0·#<òÊyÌJYÇ+ÌŠYÓÇFÍš\ÄÈgÏ®R—ÊYÑM†ÈÌÎóTýÇ_ÐÝVLÉÔiBÇÁÒjÈdЮ]ÈPÑöf!Ç,ÐÛi‘È_ÏšdÕÉDÏx_mÈ×Ï0f ÈçÏ6fÀÉΓYìÈSÏÃVZÆîγZÆmÏwjÞÆCÒ…lÅkшÑÅÎãÅVÎá‹Ã>Ð'‘ïÿÑ`—ÿÃGΉÇÃñͦ{Ä(Í:sÜÄÊÂjÃÀɘbÒÁÆŽX0ÂòÇŸ_'Á0Æq[—ÃIÆ W½ÀÂÏ[^µµ·UÔ­¯•Y½­´j¯úº€tº°¾Èw1±ÀX{)²Z³~ƒ²¦Åº„4°õÆý…U²ÖÇs‰³šÇ´„÷¶zÊPŒ »{Ì©•C¼ìÎ}–ø½¼Î{œA¾uÏLå½óÏž Æ¿ÄÒc§J¿®Õ.¬ÈÀ~Öé°Ð¾Õ×6±¿åÖø°~À‚ÓÅ­¾kÒä¨V¾³Ò£¿¸Ñš¥;¿™Ó–¨%ÀPÔí¥þÀóÔ ¥Û¿•ÒØ¦,½RÓ¢æ¾.ÒÆ¤i¼,Ïù£G¼±ÏߢY¾ ÐJž¤¾„Ð(¡’¾]Ðì ò¿hÔ…žäÃíÜp¦Æ Û]¡Ž¾ÉÊ-ޮɔµlpŽ5Ao8e‡6#€%‰‘å'”&N™ý+w)ü§4:.ä³ 9Ø/p¼A .ç¼µFé0޼»H¹0JºŠ@ó-ü¶±:ô*À·ï>+Dµr;M+Ú·Ä:(÷ø9•(û·8)°è4}&´b1å%ø´4%%å´¸6n%>»‹6Ê'FÀú=©)íÅ“NÄ-“ÇøVÉ0ˤ]"-¸Ð—s¤0«ËÕ˜:3ÍÃܹ<[–ÅjжÂÚ³rÞ  ¼qA“W¯jyç¡!½iô¦»me1º¼–éJ¿¶H?¤*ÿ›|w¦œ'Ž ê§$K"w¨Ð(‹#ûª¥(¸&‰®ˆ)b* ®'#(m¦Ø-d'r²-r%5V0ŽÔˆôlpUÒ¥µ>€œ­“zÓHS²`)Š% ±‰.[(N´a-ß*²;*,*¯)O(n«´&€'ޱ×)ñ*µ.Ö*†´¬00+ÓºM2¹,…ºš6ð/.¹x711»ð6×15ÄÎG·4áÇ:Ly3÷ÉÉT'0ßÌûüA ÉΞ´F‚È¢Ô§*Ê.׉Áî· ¸lƒÀ´áÔF­C¹Õ·µŽ´ˆÖ¾¬k³¬Ë<¡e—,X ,^,n,º)1A-S-Hrgb-3c-16b.tiffx:èXXuÈ“8°¨Îëˆø&hCØaH~¸œ(¹˜×ôxèppppppppppppppppppÂGraphicsMagick 1.2 unreleased Q16 http://www.GraphicsMagick.org/tiff-4.0.3/test/images/miniswhite-1c-1b.tiff0000644000212300117540000000633111244340171015446 00000000000000MM* ÔýûêÃô8ï訥]Áàùh8z (€·S[ (ÿü0þ€8îþÚðÛä €Ö·TíÞP`€Ýÿÿ¿À  €ÿ÷t?øÿ÷Ú`€€ûÿü?ÿíÝÿàÀ  ÷¿üÿ¾ûklâ>E ð/ÿþÿßëÿöÈ<åCûûÿÿúýû9@<”€àówûÿkoùä}Â÷÷ÿÿýÿ½Xpxàóÿï½¶÷óØx€ïÿžïoïÀø‚@Ëÿü÷ýýü0ô(€ÿÿüÿÝÿwˆùÀ ‡ýè?×÷×ÿðð ”=€¿ÿð?þÿ]þü?ø ¡=}ßô;½û«^ù €:ÿïÿ ïÿߥ¶Öü( Gÿ÷ßÐýgûÿÿÿ?üÈÿïÿáûþýý¿n€?ûÿÝÿàþww[Ö÷€øH  ÿÿcÿÞÝÚ»þ ?àH?ïûÿ{÷ÿÿßgà‡À€ˆ?÷ÿþÿoù©õº¸-@ (ýÿÿþûïÿ_ÿÌ2D`ä_ÿ¯ÿüïÛ]¶í¯ÚÌ?ÿ?ÿ½ýy÷ÿwú¿/¸¨¿þ7ÿüÁ¿¯«¾ëÿV@ÿü¿üõüýöþëÿúÿüwÿøýü_¿\­Õ¿è ÿü¿ÿåW{íðàsÿõ ð?ÿð×ï½õØWÿù€ð¿ÿÌþõ»¯pqÿôð?ÿÀg½¿°aßø ò¿ÿüßýßÖàd¿åàì¦÷ißþ UÿäàÂÁ~ôÝ·ðo¯ùàO‡Rñÿ¾Ðz¿ò€⇀tWç ¯ïøm ÅÀ~¿àú¿ú>À ð_ö¸«,ïúø@À"ðë¡Zü/ðРÿÅ@ À-ÿþ®X'åÀ€€Ä@p~_ÕÜ/ù€@Æ¿À@ À÷ùø/ô”À€€àïûUÐú  ¹§åxþ®ÿp/ý€ŠÀ#„ ¿ûŸð?ö€8†¯Éˆðûjù`oýH6@á¿Á$„°ûßÿ ÿþØ<áßè› î»þùiÀÿâ  ÿÿÖ”@½môýÿÿÿÿ€@ÿÿÉ~ö“?kßÿà ÿÿþþ › ?þÿÀÿÿýÿìõð=e ÿÿ€ÿÿÿüPûëü=Ö‚çÿ0ÿÿÿüÿVxý/çÿßÏÿý@@Ökøú_gÿ›ÿÿü%ÿþPßûÿÿ‡?ÿþÿÞøßwÿÿ8$ÿÿü ý³x½ïÿÿ(¦ÿÿü ï÷jþ¿òÿ8 ÿÿøý¾Èá‡à p“ÿÿøÿþÖÈOx·ÿÿüÿþî! ø/ÿÿø ÿü„ì`€xÿÿÿøÿðÝ€ÈàßÿÿðDÿ¾à¯ÿÿðýú›€é8_ÿÿø {œ üø¿ÿÿðLå˜úÝ1ø¿ÿÿð?@Oü6 €ügÖøÿÿÿø~ð1¿ˆû_߸ÿÿÿðyú€? ÿÿÿðÿÿÿð|€ðÿÿÿøÿÿÿè@ðð þÿÿÿ¸ÿÿÿðö 8t=Ðÿÿÿøÿÿÿøò¤vÿÿÿðÿÿÿðôpí@ÿÿÿØÿÿÿððØú ÿÿûøÿÿÿà€ÀI(†øÿÿÿðÿÿÿàÁ¢¸?"€ÿÿßðÿÿÿðàB Ôÿÿþ ÿÿÿààh ÿÿÿÀÿÿÿðÆD T@ÿÿ÷@ÿÿÿЩ@H ÿÿ{ÿÿÿà¤"ÖÿÿÿÿÿÿÀ™EPDÿÿíÿÿÿàÕ ¢ÿÿþÿÿÿà/¨Š„Ú€ÿÿôÿÿÿÐR¨  *ÿý¿ÿÿÿÀ?¤C@õ€ÿÿüÿÿÿ?ÕjZÿÿlÿÿÿÄ?Pb€õ„ÿûÜÿÿÿÀOîÑŒÀj"ÿÿ¸8ÿÿÿ€äõL!ÿÿôhÿÿÿ »êVHŠZ°ÿÿØ8ÿÿÿ€É$µÀIzE€ÿÿxxÿÿ¯@÷ûª"§˜ “ÿÿêxÿÿÿ€ï®_‘Ee@ ÿÿüøÿÿŸ ?ù÷ÔHj¶‰ÿÿóøÿÿÿ?ûýÕŠ…ÚÔÿÿÚøÿÿ_ú—¦à¥%Ñcÿÿÿøÿÿÿ@¿õÅÛZ¥šCÿÿúxÿÿÿÿ{¥¢å*eÿÿßøÿÿÿ`ÿ³Ûl7ª© ÿÿÿøÿÿÿ@ÿM¤ÒBåZ„Cÿÿÿøÿÿþ_ÿ¶ë™ü£ ÿÿëøÿÿþ@?ÿÛtôG›h$ÿÿÿøÿÿÿ¿ÿíÕÊÆõÙÿÿÿøÿÿÿ€ÿ¶x}«*†ƒÿÿÿøÿÿþ@?ÿÞö¬Ev¶  ÿÿÿøÿÿþ?ÿ×mV—Ú‘Bÿÿÿøÿÿþ?ÿzz~ë$ƒÿÿÿøÿÿü@ÿÿÞ½›gx–bÿÿÿøÿÿþ@ÿÿµVžÖ’ýÿÿøÿÿý ÿÿîn·gÝH¨ÿÿÿø¿ÿþ@ÿÿïûVWª‰'ÿÿÿøßøÿÿü~¾¯õhPGÿÿÿø‰§ø„ÿÿùîSV®†/ÿÿÿø]øÿÿÿu®¯óªÿÿÿø6øÿÿý~¾7û˜ÿÿÿø‹ù ÿÿþÙS¯ÿ£@ÿÿÿøòÿÿÿ~ª_ÿè?ÿÿÿøø ÿÿý[U§þÖÈ¿ÿÿÿøñÿÿÿüR¯ÿÕ2zÿÿÿøæ ÿÿÿ__ÿø€§ÿÿøòÿÿÿ{&WÿêŠþÿÿøù@ÿÿÿÞ›¯ÿ’1ýÀÿÿøù@ÿÿÿŸå¿ÿê'þ¯ÿøöÿÿÿÿ¾ÿúþMøü€ÿÿÿ?_ÿÿý¿øøþäÿÿÿïþÿÿÿ„Þøÿÿÿÿÿÿÿÿ€}ø?ÿÿÿÿÿÿÿÿ€>ø6ÿÿÿÿÿÿÿÿ“ûø_ÿÿÿÿÿÿÿóý€¸?ÿÿÿÿÿÿÿþPØÿÿÿÿÿÿÿûÿ øÿÿÿÿÿÿÿÿÿÿÿø ?ÿÿÿÿÿÿÿÝþàÿÿÿÿÿÿýÿ÷|àÿÿçÿÿÿÿÿÿöÀÿÿÿÿþ¾ÿÿÄÐÿþÿÿýÿoíø€ÿþÿÈÿçÿð€ÿ[¿øÿϽÀ€?¼ÿÐÿÏÿP—  ‚™ Ì)1A ˜Sminiswhite-1c-1b.tiffGraphicsMagick 1.2 unreleased Q16 http://www.GraphicsMagick.org/tiff-4.0.3/test/images/logluv-3c-16b.tiff0000644000212300117540000000024611244340171014665 00000000000000II*V št‡M€ªS tiff-4.0.3/test/tiffcrop-doubleflip-palette-1c-8b.sh0000755000212300117540000000037211244400052017102 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-8b.tiff" outfile="o-tiffcrop-doubleflip-palette-1c-8b.tiff" f_test_convert "$TIFFCROP -F both" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/short_tag.c0000644000212300117540000001335011011074065012501 00000000000000/* $Id: short_tag.c,v 1.8 2008/04/15 14:20:30 dron Exp $ */ /* * Copyright (c) 2004, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Module to test SHORT tags read/write functions. */ #include "tif_config.h" #include #ifdef HAVE_UNISTD_H # include #endif #include "tiffio.h" #include "tifftest.h" static const char filename[] = "short_test.tiff"; #define SPP 3 /* Samples per pixel */ const uint16 width = 1; const uint16 length = 1; const uint16 bps = 8; const uint16 photometric = PHOTOMETRIC_RGB; const uint16 rows_per_strip = 1; const uint16 planarconfig = PLANARCONFIG_CONTIG; static const struct { const ttag_t tag; const uint16 value; } short_single_tags[] = { { TIFFTAG_COMPRESSION, COMPRESSION_NONE }, { TIFFTAG_FILLORDER, FILLORDER_MSB2LSB }, { TIFFTAG_ORIENTATION, ORIENTATION_BOTRIGHT }, { TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH }, { TIFFTAG_MINSAMPLEVALUE, 23 }, { TIFFTAG_MAXSAMPLEVALUE, 241 }, { TIFFTAG_INKSET, INKSET_MULTIINK }, { TIFFTAG_NUMBEROFINKS, SPP }, { TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT } }; #define NSINGLETAGS (sizeof(short_single_tags) / sizeof(short_single_tags[0])) static const struct { const ttag_t tag; const uint16 values[2]; } short_paired_tags[] = { { TIFFTAG_PAGENUMBER, {1, 1} }, { TIFFTAG_HALFTONEHINTS, {0, 255} }, { TIFFTAG_DOTRANGE, {8, 16} }, { TIFFTAG_YCBCRSUBSAMPLING, {2, 1} } }; #define NPAIREDTAGS (sizeof(short_paired_tags) / sizeof(short_paired_tags[0])) int main() { TIFF *tif; size_t i; unsigned char buf[SPP] = { 0, 127, 255 }; /* Test whether we can write tags. */ tif = TIFFOpen(filename, "w"); if (!tif) { fprintf (stderr, "Can't create test TIFF file %s.\n", filename); return 1; } if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width)) { fprintf (stderr, "Can't set ImageWidth tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, length)) { fprintf (stderr, "Can't set ImageLength tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps)) { fprintf (stderr, "Can't set BitsPerSample tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, SPP)) { fprintf (stderr, "Can't set SamplesPerPixel tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rows_per_strip)) { fprintf (stderr, "Can't set SamplesPerPixel tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, planarconfig)) { fprintf (stderr, "Can't set PlanarConfiguration tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photometric)) { fprintf (stderr, "Can't set PhotometricInterpretation tag.\n"); goto failure; } for (i = 0; i < NSINGLETAGS; i++) { if (!TIFFSetField(tif, short_single_tags[i].tag, short_single_tags[i].value)) { fprintf(stderr, "Can't set tag %lu.\n", (unsigned long)short_single_tags[i].tag); goto failure; } } for (i = 0; i < NPAIREDTAGS; i++) { if (!TIFFSetField(tif, short_paired_tags[i].tag, short_paired_tags[i].values[0], short_paired_tags[i].values[1])) { fprintf(stderr, "Can't set tag %lu.\n", (unsigned long)short_paired_tags[i].tag); goto failure; } } /* Write dummy pixel data. */ if (!TIFFWriteScanline(tif, buf, 0, 0) < 0) { fprintf (stderr, "Can't write image data.\n"); goto failure; } TIFFClose(tif); /* Ok, now test whether we can read written values. */ tif = TIFFOpen(filename, "r"); if (!tif) { fprintf (stderr, "Can't open test TIFF file %s.\n", filename); return 1; } if (CheckLongField(tif, TIFFTAG_IMAGEWIDTH, width) < 0) goto failure; if (CheckLongField(tif, TIFFTAG_IMAGELENGTH, length) < 0) goto failure; if (CheckShortField(tif, TIFFTAG_BITSPERSAMPLE, bps) < 0) goto failure; if (CheckShortField(tif, TIFFTAG_PHOTOMETRIC, photometric) < 0) goto failure; if (CheckShortField(tif, TIFFTAG_SAMPLESPERPIXEL, SPP) < 0) goto failure; if (CheckLongField(tif, TIFFTAG_ROWSPERSTRIP, rows_per_strip) < 0) goto failure; if (CheckShortField(tif, TIFFTAG_PLANARCONFIG, planarconfig) < 0) goto failure; for (i = 0; i < NSINGLETAGS; i++) { if (CheckShortField(tif, short_single_tags[i].tag, short_single_tags[i].value) < 0) goto failure; } for (i = 0; i < NPAIREDTAGS; i++) { if (CheckShortPairedField(tif, short_paired_tags[i].tag, short_paired_tags[i].values) < 0) goto failure; } TIFFClose(tif); /* All tests passed; delete file and exit with success status. */ unlink(filename); return 0; failure: /* * Something goes wrong; close file and return unsuccessful status. * Do not remove the file for further manual investigation. */ TIFFClose(tif); return 1; } /* vim: set ts=8 sts=8 sw=8 noet: */ tiff-4.0.3/test/tiffcp-split.sh0000755000212300117540000000062211244341001013277 00000000000000#!/bin/sh # # Basic sanity check for tiffcp + tiffsplit # # First we use tiffcp to join our test files into a multi-frame TIFF # and then we use tiffsplit to split them out again. # . ${srcdir:-.}/common.sh conjoined=o-tiffcp-split-conjoined.tif splitfile=o-tiffcp-split-split- f_test_convert "${TIFFCP}" "${IMG_UNCOMPRESSED}" "${conjoined}" f_test_convert "${TIFFSPLIT}" "${conjoined}" "${splitfile}"tiff-4.0.3/test/tiffcrop-doubleflip-palette-1c-1b.sh0000755000212300117540000000037211244400052017073 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-1b.tiff" outfile="o-tiffcrop-doubleflip-palette-1c-1b.tiff" f_test_convert "$TIFFCROP -F both" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-R90-minisblack-1c-16b.sh0000755000212300117540000000037011244400052016062 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-1c-16b.tiff" outfile="o-tiffcrop-R90-minisblack-1c-16b.tiff" f_test_convert "$TIFFCROP -R90" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/strip_rw.c0000644000212300117540000001154110773046357012401 00000000000000/* $Id: strip_rw.c,v 1.6 2008/03/28 01:42:07 bfriesen Exp $ */ /* * Copyright (c) 2004, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Test libtiff input/output routines. */ #include "tif_config.h" #include #ifdef HAVE_UNISTD_H # include #endif #include "tiffio.h" #include "test_arrays.h" extern int create_image_striped(const char *, uint32, uint32, uint32, uint16, uint16, uint16, uint16, uint16, uint16, const tdata_t, const tsize_t); extern int read_image_striped(const char *, uint32, uint32, uint32, uint16, uint16, uint16, uint16, uint16, uint16, const tdata_t, const tsize_t); const char *filename = "strip_test.tiff"; int main(int argc, char **argv) { uint32 rowsperstrip; uint16 compression; uint16 spp, bps, photometric, sampleformat, planarconfig; (void) argc; (void) argv; /* * Test two special cases: image consisting from single line and image * consisting from single column. */ rowsperstrip = 1; compression = COMPRESSION_NONE; spp = 1; bps = 8; photometric = PHOTOMETRIC_MINISBLACK; sampleformat = SAMPLEFORMAT_UINT; planarconfig = PLANARCONFIG_CONTIG; if (create_image_striped(filename, XSIZE * YSIZE, 1, rowsperstrip, compression, spp, bps, photometric, sampleformat, planarconfig, (const tdata_t) byte_array1, byte_array1_size) < 0) { fprintf (stderr, "Can't create TIFF file %s.\n", filename); goto failure; } if (read_image_striped(filename, XSIZE * YSIZE, 1, rowsperstrip, compression, spp, bps, photometric, sampleformat, planarconfig, (const tdata_t) byte_array1, byte_array1_size) < 0) { fprintf (stderr, "Can't read TIFF file %s.\n", filename); goto failure; } unlink(filename); if (create_image_striped(filename, 1, XSIZE * YSIZE, rowsperstrip, compression, spp, bps, photometric, sampleformat, planarconfig, (const tdata_t) byte_array1, byte_array1_size) < 0) { fprintf (stderr, "Can't create TIFF file %s.\n", filename); goto failure; } if (read_image_striped(filename, 1, XSIZE * YSIZE, rowsperstrip, compression, spp, bps, photometric, sampleformat, planarconfig, (const tdata_t) byte_array1, byte_array1_size) < 0) { fprintf (stderr, "Can't read TIFF file %s.\n", filename); goto failure; } unlink(filename); /* * Test one-channel image with different parameters. */ rowsperstrip = 1; spp = 1; bps = 8; photometric = PHOTOMETRIC_MINISBLACK; sampleformat = SAMPLEFORMAT_UINT; planarconfig = PLANARCONFIG_CONTIG; if (create_image_striped(filename, XSIZE, YSIZE, rowsperstrip, compression, spp, bps, photometric, sampleformat, planarconfig, (const tdata_t) byte_array1, byte_array1_size) < 0) { fprintf (stderr, "Can't create TIFF file %s.\n", filename); goto failure; } if (read_image_striped(filename, XSIZE, YSIZE, rowsperstrip, compression, spp, bps, photometric, sampleformat, planarconfig, (const tdata_t) byte_array1, byte_array1_size) < 0) { fprintf (stderr, "Can't read TIFF file %s.\n", filename); goto failure; } unlink(filename); rowsperstrip = YSIZE; if (create_image_striped(filename, XSIZE, YSIZE, rowsperstrip, compression, spp, bps, photometric, sampleformat, planarconfig, (const tdata_t) byte_array1, byte_array1_size) < 0) { fprintf (stderr, "Can't create TIFF file %s.\n", filename); goto failure; } if (read_image_striped(filename, XSIZE, YSIZE, rowsperstrip, compression, spp, bps, photometric, sampleformat, planarconfig, (const tdata_t) byte_array1, byte_array1_size) < 0) { fprintf (stderr, "Can't read TIFF file %s.\n", filename); goto failure; } unlink(filename); return 0; failure: unlink(filename); return 1; } /* vim: set ts=8 sts=8 sw=8 noet: */ tiff-4.0.3/test/tiffcrop-extract-miniswhite-1c-1b.sh0000755000212300117540000000041611273622560017155 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/miniswhite-1c-1b.tiff" outfile="o-tiffcrop-extract-miniswhite-1c-1b.tiff" f_test_convert "$TIFFCROP -U px -E top -X 60 -Y 60" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-doubleflip-minisblack-1c-16b.sh0000755000212300117540000000040211244400052017631 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-1c-16b.tiff" outfile="o-tiffcrop-doubleflip-minisblack-1c-16b.tiff" f_test_convert "$TIFFCROP -F both" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcp-g3-1d-fill.sh0000755000212300117540000000035711244341001013710 00000000000000#!/bin/sh # # Basic sanity check for tiffcp with G3 compression, 1 dimensional # encoding, and zero-filled boundaries. # . ${srcdir:-.}/common.sh f_test_convert "${TIFFCP} -c g3:1d:fill" "${IMG_MINISWHITE_1C_1B}" "o-tiffcp-g3-1d-fill.tiff"tiff-4.0.3/test/tiffcrop-extractz14-palette-1c-8b.sh0000755000212300117540000000040411244400052016762 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-8b.tiff" outfile="o-tiffcrop-extractz14-palette-1c-8b.tiff" f_test_convert "$TIFFCROP -E left -Z1:4,2:4" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-R90-logluv-3c-16b.sh0000755000212300117540000000036011244400052015257 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/logluv-3c-16b.tiff" outfile="o-tiffcrop-R90-logluv-3c-16b.tiff" f_test_convert "$TIFFCROP -R90" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extractz14-palette-1c-1b.sh0000755000212300117540000000040411244400052016753 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-1b.tiff" outfile="o-tiffcrop-extractz14-palette-1c-1b.tiff" f_test_convert "$TIFFCROP -E left -Z1:4,2:4" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiff2rgba-palette-1c-1b.sh0000755000212300117540000000035111244400051014776 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-1b.tiff" outfile="o-tiff2rgba-palette-1c-1b.tiff" f_test_convert "$TIFF2RGBA" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiff2rgba-palette-1c-8b.sh0000755000212300117540000000035111244400051015005 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-8b.tiff" outfile="o-tiff2rgba-palette-1c-8b.tiff" f_test_convert "$TIFF2RGBA" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/ascii_tag.c0000644000212300117540000001213411011074065012431 00000000000000/* $Id: ascii_tag.c,v 1.7 2008/04/15 13:32:12 dron Exp $ */ /* * Copyright (c) 2004, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Module to test ASCII tags read/write functions. */ #include "tif_config.h" #include #include #ifdef HAVE_UNISTD_H # include #endif #include "tiffio.h" static const char filename[] = "ascii_test.tiff"; static const struct { ttag_t tag; const char *value; } ascii_tags[] = { { TIFFTAG_DOCUMENTNAME, "Test TIFF image" }, { TIFFTAG_IMAGEDESCRIPTION, "Temporary test image" }, { TIFFTAG_MAKE, "This is not scanned image" }, { TIFFTAG_MODEL, "No scanner" }, { TIFFTAG_PAGENAME, "Test page" }, { TIFFTAG_SOFTWARE, "Libtiff library" }, { TIFFTAG_DATETIME, "2004:09:10 16:09:00" }, { TIFFTAG_ARTIST, "Andrey V. Kiselev" }, { TIFFTAG_HOSTCOMPUTER, "Debian GNU/Linux (Sarge)" }, { TIFFTAG_TARGETPRINTER, "No printer" }, { TIFFTAG_COPYRIGHT, "Copyright (c) 2004, Andrey Kiselev" }, { TIFFTAG_FAXSUBADDRESS, "Fax subaddress" }, /* DGN tags */ { TIFFTAG_UNIQUECAMERAMODEL, "No camera" }, { TIFFTAG_CAMERASERIALNUMBER, "1234567890" } }; #define NTAGS (sizeof (ascii_tags) / sizeof (ascii_tags[0])) static const char ink_names[] = "Red\0Green\0Blue"; const int ink_names_size = 15; int main() { TIFF *tif; size_t i; unsigned char buf[] = { 0, 127, 255 }; char *value; /* Test whether we can write tags. */ tif = TIFFOpen(filename, "w"); if (!tif) { fprintf (stderr, "Can't create test TIFF file %s.\n", filename); return 1; } if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, 1)) { fprintf (stderr, "Can't set ImageWidth tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, 1)) { fprintf (stderr, "Can't set ImageLength tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8)) { fprintf (stderr, "Can't set BitsPerSample tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, sizeof(buf))) { fprintf (stderr, "Can't set SamplesPerPixel tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG)) { fprintf (stderr, "Can't set PlanarConfiguration tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB)) { fprintf (stderr, "Can't set PhotometricInterpretation tag.\n"); goto failure; } for (i = 0; i < NTAGS; i++) { if (!TIFFSetField(tif, ascii_tags[i].tag, ascii_tags[i].value)) { fprintf(stderr, "Can't set tag %lu.\n", (unsigned long)ascii_tags[i].tag); goto failure; } } /* InkNames tag has special form, so we handle it separately. */ if (!TIFFSetField(tif, TIFFTAG_NUMBEROFINKS, 3)) { fprintf (stderr, "Can't set tag %d (NUMBEROFINKS).\n", TIFFTAG_NUMBEROFINKS); goto failure; } if (!TIFFSetField(tif, TIFFTAG_INKNAMES, ink_names_size, ink_names)) { fprintf (stderr, "Can't set tag %d (INKNAMES).\n", TIFFTAG_INKNAMES); goto failure; } /* Write dummy pixel data. */ if (!TIFFWriteScanline(tif, buf, 0, 0) < 0) { fprintf (stderr, "Can't write image data.\n"); goto failure; } TIFFClose(tif); /* Ok, now test whether we can read written values. */ tif = TIFFOpen(filename, "r"); if (!tif) { fprintf (stderr, "Can't open test TIFF file %s.\n", filename); return 1; } for (i = 0; i < NTAGS; i++) { if (!TIFFGetField(tif, ascii_tags[i].tag, &value) || strcmp(value, ascii_tags[i].value)) { fprintf(stderr, "Can't get tag %lu.\n", (unsigned long)ascii_tags[i].tag); goto failure; } } if (!TIFFGetField(tif, TIFFTAG_INKNAMES, &value) || memcmp(value, ink_names, ink_names_size)) { fprintf (stderr, "Can't get tag %d (INKNAMES).\n", TIFFTAG_INKNAMES); goto failure; } TIFFClose(tif); /* All tests passed; delete file and exit with success status. */ unlink(filename); return 0; failure: /* * Something goes wrong; close file and return unsuccessful status. * Do not remove the file for further manual investigation. */ TIFFClose(tif); return 1; } /* vim: set ts=8 sts=8 sw=8 noet: */ tiff-4.0.3/test/tiffcrop-R90-miniswhite-1c-1b.sh0000755000212300117540000000036611244400052016045 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/miniswhite-1c-1b.tiff" outfile="o-tiffcrop-R90-miniswhite-1c-1b.tiff" f_test_convert "$TIFFCROP -R90" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extract-rgb-3c-8b.sh0000755000212300117540000000040011273622560015551 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/rgb-3c-8b.tiff" outfile="o-tiffcrop-extract-rgb-3c-8b.tiff" f_test_convert "$TIFFCROP -U px -E top -X 60 -Y 60" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffdump.sh0000755000212300117540000000017611244332726012533 00000000000000#!/bin/sh # # Basic sanity check for tiffdump # . ${srcdir:-.}/common.sh f_test_reader "${TIFFDUMP}" "${IMG_MINISWHITE_1C_1B}"tiff-4.0.3/test/tiff2rgba-minisblack-1c-16b.sh0000755000212300117540000000036111244400051015543 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-1c-16b.tiff" outfile="o-tiff2rgba-minisblack-1c-16b.tiff" f_test_convert "$TIFF2RGBA" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/common.sh0000644000212300117540000000617111246310262012174 00000000000000# Common code fragment for tests # srcdir=${srcdir:-.} BUILDDIR=`pwd` SRCDIR=`dirname $0` SRCDIR=`cd $SRCDIR && pwd` TOPSRCDIR=`cd $srcdir/.. && pwd` TOOLS=`cd ../tools && pwd` IMAGES="${SRCDIR}/images" # Aliases for built tools BMP2TIFF=${TOOLS}/bmp2tiff FAX2PS=${TOOLS}/fax2ps FAX2TIFF=${TOOLS}/fax2tiff GIF2TIFF=${TOOLS}/gif2tiff PAL2RGB=${TOOLS}/pal2rgb PPM2TIFF=${TOOLS}/ppm2tiff RAS2TIFF=${TOOLS}/ras2tiff RAW2TIFF=${TOOLS}/raw2tiff RGB2YCBCR=${TOOLS}/rgb2ycbcr THUMBNAIL=${TOOLS}/thumbnail TIFF2BW=${TOOLS}/tiff2bw TIFF2PDF=${TOOLS}/tiff2pdf TIFF2PS=${TOOLS}/tiff2ps TIFF2RGBA=${TOOLS}/tiff2rgba TIFFCMP=${TOOLS}/tiffcmp TIFFCP=${TOOLS}/tiffcp TIFFCROP=${TOOLS}/tiffcrop TIFFDITHER=${TOOLS}/tiffdither TIFFDUMP=${TOOLS}/tiffdump TIFFINFO=${TOOLS}/tiffinfo TIFFMEDIAN=${TOOLS}/tiffmedian TIFFSET=${TOOLS}/tiffset TIFFSPLIT=${TOOLS}/tiffsplit # Aliases for input test files IMG_MINISBLACK_1C_16B=${IMAGES}/minisblack-1c-16b.tiff IMG_MINISBLACK_1C_8B=${IMAGES}/minisblack-1c-8b.tiff IMG_MINISWHITE_1C_1B=${IMAGES}/miniswhite-1c-1b.tiff IMG_PALETTE_1C_1B=${IMAGES}/palette-1c-1b.tiff IMG_PALETTE_1C_4B=${IMAGES}/palette-1c-4b.tiff IMG_PALETTE_1C_8B=${IMAGES}/palette-1c-8b.tiff IMG_RGB_3C_16B=${IMAGES}/rgb-3c-16b.tiff IMG_RGB_3C_8B=${IMAGES}/rgb-3c-8b.tiff IMG_MINISBLACK_2C_8B_ALPHA=${IMAGES}/minisblack-2c-8b-alpha.tiff IMG_PALETTE_1C_8B_BMP=${IMAGES}/palette-1c-8b.bmp IMG_RGB_3C_8B_BMP=${IMAGES}/rgb-3c-8b.bmp IMG_PALETTE_1C_8B_GIF=${IMAGES}/palette-1c-8b.gif IMG_MINISWHITE_1C_1B_PBM=${IMAGES}/miniswhite-1c-1b.pbm IMG_MINISBLACK_1C_8B_PGM=${IMAGES}/minisblack-1c-8b.pgm IMG_RGB_3C_8B_PPM=${IMAGES}/rgb-3c-8b.ppm # All uncompressed image files IMG_UNCOMPRESSED="${IMG_MINISBLACK_1C_16B} ${IMG_MINISBLACK_1C_8B} ${IMG_MINISWHITE_1C_1B} ${IMG_PALETTE_1C_1B} ${IMG_PALETTE_1C_4B} ${IMG_PALETTE_1C_4B} ${IMG_PALETTE_1C_8B} ${IMG_RGB_3C_8B}" # # Test a simple convert-like command. # # f_test_convert command infile outfile f_test_convert () { command=$1 infile=$2 outfile=$3 rm -f $outfile echo "$MEMCHECK $command $infile $outfile" eval $MEMCHECK $command $infile $outfile status=$? if [ $status != 0 ] ; then echo "Returned failed status $status!" echo "Output (if any) is in \"${outfile}\"." exit $status fi } # # Test a simple command which sends output to stdout # # f_test_stdout command infile outfile f_test_stdout () { command=$1 infile=$2 outfile=$3 rm -f $outfile echo "$MEMCHECK $command $infile > $outfile" eval $MEMCHECK $command $infile > $outfile status=$? if [ $status != 0 ] ; then echo "Returned failed status $status!" echo "Output (if any) is in \"${outfile}\"." exit $status fi } # # Execute a simple command (e.g. tiffinfo) with one input file # # f_test_exec command infile f_test_reader () { command=$1 infile=$2 echo "$MEMCHECK $command $infile" eval $MEMCHECK $command $infile status=$? if [ $status != 0 ] ; then echo "Returned failed status $status!" exit $status fi } # # Execute tiffinfo on a specified file to validate it # # f_tiffinfo_validate infile f_tiffinfo_validate () { f_test_reader "$TIFFINFO -D" $1 } if test "$VERBOSE" = TRUE then set -x fi tiff-4.0.3/test/ppm2tiff_ppm.sh0000755000212300117540000000031611246310252013304 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$IMG_RGB_3C_8B_PPM" outfile="o-ppm2tiff_ppm.tiff" f_test_convert "$PPM2TIFF" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/test_arrays.h0000644000212300117540000000377510411004552013063 00000000000000/* $Id: test_arrays.h,v 1.3 2006/03/23 14:54:02 dron Exp $ */ /* * Copyright (c) 2004, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Few declarations for the test numerical arrays. */ #ifndef _TEST_ARRAYS_ #define _TEST_ARRAYS_ #include #define XSIZE 37 #define YSIZE 23 extern const unsigned char byte_array1[]; extern const size_t byte_array1_size; extern const unsigned char byte_array2[]; extern const size_t byte_array2_size; extern const unsigned char byte_array3[]; extern const size_t byte_array3_size; extern const float array_float1[]; extern const size_t array_float1_size; extern const float array_float2[]; extern const size_t array_float2_size; extern const double array_double1[]; extern const size_t array_double1_size; extern const double array_double2[]; extern const size_t array_double2_size; #endif /* _TEST_ARRAYS_ */ /* vim: set ts=8 sts=8 sw=8 noet: */ tiff-4.0.3/test/tiffcrop-R90-palette-1c-8b.sh0000755000212300117540000000036011244400052015324 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-8b.tiff" outfile="o-tiffcrop-R90-palette-1c-8b.tiff" f_test_convert "$TIFFCROP -R90" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extractz14-minisblack-1c-16b.sh0000755000212300117540000000041411244400052017520 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-1c-16b.tiff" outfile="o-tiffcrop-extractz14-minisblack-1c-16b.tiff" f_test_convert "$TIFFCROP -E left -Z1:4,2:4" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extractz14-miniswhite-1c-1b.sh0000755000212300117540000000041211244400052017474 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/miniswhite-1c-1b.tiff" outfile="o-tiffcrop-extractz14-miniswhite-1c-1b.tiff" f_test_convert "$TIFFCROP -E left -Z1:4,2:4" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-R90-palette-1c-1b.sh0000755000212300117540000000036011244400052015315 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-1b.tiff" outfile="o-tiffcrop-R90-palette-1c-1b.tiff" f_test_convert "$TIFFCROP -R90" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiff2rgba-rgb-3c-8b.sh0000755000212300117540000000034111244400051014122 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/rgb-3c-8b.tiff" outfile="o-tiff2rgba-rgb-3c-8b.tiff" f_test_convert "$TIFF2RGBA" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-doubleflip-miniswhite-1c-1b.sh0000755000212300117540000000040011244400052017605 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/miniswhite-1c-1b.tiff" outfile="o-tiffcrop-doubleflip-miniswhite-1c-1b.tiff" f_test_convert "$TIFFCROP -F both" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extractz14-logluv-3c-16b.sh0000755000212300117540000000040411244400052016715 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/logluv-3c-16b.tiff" outfile="o-tiffcrop-extractz14-logluv-3c-16b.tiff" f_test_convert "$TIFFCROP -E left -Z1:4,2:4" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiff2rgba-logluv-3c-16b.sh0000755000212300117540000000035111244400051014740 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/logluv-3c-16b.tiff" outfile="o-tiff2rgba-logluv-3c-16b.tiff" f_test_convert "$TIFF2RGBA" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/gif2tiff.sh0000755000212300117540000000031611246310522012401 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$IMG_PALETTE_1C_8B_GIF" outfile="o-gif2tiff.tiff" f_test_convert "$GIF2TIFF" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/ppm2tiff_pbm.sh0000755000212300117540000000032511246307770013301 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$IMG_MINISWHITE_1C_1B_PBM" outfile="o-ppm2tiff_pbm.tiff" f_test_convert "$PPM2TIFF" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcp-g3-1d.sh0000755000212300117540000000031211244341001012753 00000000000000#!/bin/sh # # Basic sanity check for tiffcp with G3 compression and 1 dimensional encoding. # . ${srcdir:-.}/common.sh f_test_convert "${TIFFCP} -c g3:1d" "${IMG_MINISWHITE_1C_1B}" "o-tiffcp-g3-1d.tiff"tiff-4.0.3/test/custom_dir.c0000644000212300117540000001623111763565015012676 00000000000000/* $Id: custom_dir.c,v 1.2 2012-06-06 05:26:37 fwarmerdam Exp $ */ /* * Copyright (c) 2012, Frank Warmerdam * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Module to handling of custom directories like EXIF. */ #include "tif_config.h" #include #include #ifdef HAVE_UNISTD_H # include #endif #include "tiffio.h" #include "tif_dir.h" #include "tifftest.h" static const char filename[] = "custom_dir.tif"; #define SPP 3 /* Samples per pixel */ const uint16 width = 1; const uint16 length = 1; const uint16 bps = 8; const uint16 photometric = PHOTOMETRIC_RGB; const uint16 rows_per_strip = 1; const uint16 planarconfig = PLANARCONFIG_CONTIG; static TIFFField customFields[] = { { TIFFTAG_IMAGEWIDTH, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Custom1", NULL }, { TIFFTAG_DOTRANGE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Custom2", NULL }, }; static TIFFFieldArray customFieldArray = { tfiatOther, 0, 2, customFields }; int main() { TIFF *tif; unsigned char buf[SPP] = { 0, 127, 255 }; uint64 dir_offset = 0, dir_offset2 = 0; uint64 read_dir_offset = 0, read_dir_offset2 = 0; uint64 *dir_offset2_ptr = NULL; char *ascii_value; uint16 count16 = 0; /* We write the main directory as a simple image. */ tif = TIFFOpen(filename, "w+"); if (!tif) { fprintf (stderr, "Can't create test TIFF file %s.\n", filename); return 1; } if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width)) { fprintf (stderr, "Can't set ImageWidth tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, length)) { fprintf (stderr, "Can't set ImageLength tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps)) { fprintf (stderr, "Can't set BitsPerSample tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, SPP)) { fprintf (stderr, "Can't set SamplesPerPixel tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rows_per_strip)) { fprintf (stderr, "Can't set SamplesPerPixel tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, planarconfig)) { fprintf (stderr, "Can't set PlanarConfiguration tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photometric)) { fprintf (stderr, "Can't set PhotometricInterpretation tag.\n"); goto failure; } /* Write dummy pixel data. */ if (!TIFFWriteScanline(tif, buf, 0, 0) < 0) { fprintf (stderr, "Can't write image data.\n"); goto failure; } if (!TIFFWriteDirectory( tif )) { fprintf (stderr, "TIFFWriteDirectory() failed.\n"); goto failure; } /* * Now create an EXIF directory. */ if (TIFFCreateEXIFDirectory(tif) != 0) { fprintf (stderr, "TIFFCreateEXIFDirectory() failed.\n" ); goto failure; } if (!TIFFSetField( tif, EXIFTAG_SPECTRALSENSITIVITY, "EXIF Spectral Sensitivity")) { fprintf (stderr, "Can't write SPECTRALSENSITIVITY\n" ); goto failure; } if (!TIFFWriteCustomDirectory( tif, &dir_offset )) { fprintf (stderr, "TIFFWriteCustomDirectory() with EXIF failed.\n"); goto failure; } /* * Now create a custom directory with tags that conflict with mainline * TIFF tags. */ TIFFFreeDirectory( tif ); if (TIFFCreateCustomDirectory(tif, &customFieldArray) != 0) { fprintf (stderr, "TIFFCreateEXIFDirectory() failed.\n" ); goto failure; } if (!TIFFSetField( tif, TIFFTAG_IMAGEWIDTH, "*Custom1")) { /* not really IMAGEWIDTH */ fprintf (stderr, "Can't write pseudo-IMAGEWIDTH.\n" ); goto failure; } if (!TIFFSetField( tif, TIFFTAG_DOTRANGE, "*Custom2")) { /* not really DOTWIDTH */ fprintf (stderr, "Can't write pseudo-DOTWIDTH.\n" ); goto failure; } if (!TIFFWriteCustomDirectory( tif, &dir_offset2 )) { fprintf (stderr, "TIFFWriteCustomDirectory() with EXIF failed.\n"); goto failure; } /* * Go back to the first directory, and add the EXIFIFD pointer. */ TIFFSetDirectory(tif, 0); TIFFSetField(tif, TIFFTAG_EXIFIFD, dir_offset ); TIFFSetField(tif, TIFFTAG_SUBIFD, 1, &dir_offset2 ); TIFFClose(tif); /* Ok, now test whether we can read written values in the EXIF directory. */ tif = TIFFOpen(filename, "r"); TIFFGetField(tif, TIFFTAG_EXIFIFD, &read_dir_offset ); if( read_dir_offset != dir_offset ) { fprintf (stderr, "Did not get expected EXIFIFD.\n" ); goto failure; } TIFFGetField(tif, TIFFTAG_SUBIFD, &count16, &dir_offset2_ptr ); read_dir_offset2 = dir_offset2_ptr[0]; if( read_dir_offset2 != dir_offset2 || count16 != 1) { fprintf (stderr, "Did not get expected SUBIFD.\n" ); goto failure; } if( !TIFFReadEXIFDirectory(tif, read_dir_offset) ) { fprintf (stderr, "TIFFReadEXIFDirectory() failed.\n" ); goto failure; } if (!TIFFGetField( tif, EXIFTAG_SPECTRALSENSITIVITY, &ascii_value) ) { fprintf (stderr, "reading SPECTRALSENSITIVITY failed.\n" ); goto failure; } if( strcmp(ascii_value,"EXIF Spectral Sensitivity") != 0) { fprintf (stderr, "got wrong SPECTRALSENSITIVITY value.\n" ); goto failure; } /* Try reading the Custom directory */ if( !TIFFReadCustomDirectory(tif, read_dir_offset2, &customFieldArray) ) { fprintf (stderr, "TIFFReadCustomDirectory() failed.\n" ); goto failure; } if (!TIFFGetField( tif, TIFFTAG_IMAGEWIDTH, &ascii_value) ) { fprintf (stderr, "reading pseudo-IMAGEWIDTH failed.\n" ); goto failure; } if( strcmp(ascii_value,"*Custom1") != 0) { fprintf (stderr, "got wrong pseudo-IMAGEWIDTH value.\n" ); goto failure; } if (!TIFFGetField( tif, TIFFTAG_DOTRANGE, &ascii_value) ) { fprintf (stderr, "reading pseudo-DOTRANGE failed.\n" ); goto failure; } if( strcmp(ascii_value,"*Custom2") != 0) { fprintf (stderr, "got wrong pseudo-DOTRANGE value.\n" ); goto failure; } TIFFClose(tif); /* All tests passed; delete file and exit with success status. */ unlink(filename); return 0; failure: /* * Something goes wrong; close file and return unsuccessful status. * Do not remove the file for further manual investigation. */ TIFFClose(tif); return 1; } /* vim: set ts=8 sts=8 sw=8 noet: */ tiff-4.0.3/test/Makefile.am0000644000212300117540000002240012026614224012377 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. AUTOMAKE_OPTIONS = 1.12 color-tests parallel-tests foreign LIBTIFF = $(top_builddir)/libtiff/libtiff.la # Environment parameters to be used during tests TESTS_ENVIRONMENT = \ MAKE="$(MAKE)" \ MAKEFLAGS="$(MAKEFLAGS)" \ MEMCHECK="$(MEMCHECK)" EXTRA_DIST = \ $(TESTSCRIPTS) \ $(IMAGES_EXTRA_DIST) \ common.sh # All of the tests to execute via 'make check' TESTS = $(check_PROGRAMS) $(TESTSCRIPTS) # Tests which are expected to fail XFAIL_TESTS = # Extra files which should be cleaned by 'make clean' CLEANFILES = test_packbits.tif o-* # Executable programs which need to be built in order to support tests check_PROGRAMS = ascii_tag long_tag short_tag strip_rw rewrite raw_decode custom_dir # Test scripts to execute TESTSCRIPTS = \ bmp2tiff_palette.sh \ bmp2tiff_rgb.sh \ gif2tiff.sh \ ppm2tiff_pbm.sh \ ppm2tiff_pgm.sh \ ppm2tiff_ppm.sh \ tiffcp-g3.sh \ tiffcp-g3-1d.sh \ tiffcp-g3-1d-fill.sh \ tiffcp-g3-2d.sh \ tiffcp-g3-2d-fill.sh \ tiffcp-g4.sh \ tiffcp-logluv.sh \ tiffcp-thumbnail.sh \ tiffdump.sh \ tiffinfo.sh \ tiffcp-split.sh \ tiffcp-split-join.sh \ tiff2ps-PS1.sh \ tiff2ps-PS2.sh \ tiff2ps-PS3.sh \ tiff2ps-EPS1.sh \ tiff2pdf.sh \ tiffcrop-doubleflip-logluv-3c-16b.sh \ tiffcrop-doubleflip-minisblack-1c-16b.sh \ tiffcrop-doubleflip-minisblack-1c-8b.sh \ tiffcrop-doubleflip-minisblack-2c-8b-alpha.sh \ tiffcrop-doubleflip-miniswhite-1c-1b.sh \ tiffcrop-doubleflip-palette-1c-1b.sh \ tiffcrop-doubleflip-palette-1c-4b.sh \ tiffcrop-doubleflip-palette-1c-8b.sh \ tiffcrop-doubleflip-rgb-3c-16b.sh \ tiffcrop-doubleflip-rgb-3c-8b.sh \ tiffcrop-extract-logluv-3c-16b.sh \ tiffcrop-extract-minisblack-1c-16b.sh \ tiffcrop-extract-minisblack-1c-8b.sh \ tiffcrop-extract-minisblack-2c-8b-alpha.sh \ tiffcrop-extract-miniswhite-1c-1b.sh \ tiffcrop-extract-palette-1c-1b.sh \ tiffcrop-extract-palette-1c-4b.sh \ tiffcrop-extract-palette-1c-8b.sh \ tiffcrop-extract-rgb-3c-16b.sh \ tiffcrop-extract-rgb-3c-8b.sh \ tiffcrop-extractz14-logluv-3c-16b.sh \ tiffcrop-extractz14-minisblack-1c-16b.sh \ tiffcrop-extractz14-minisblack-1c-8b.sh \ tiffcrop-extractz14-minisblack-2c-8b-alpha.sh \ tiffcrop-extractz14-miniswhite-1c-1b.sh \ tiffcrop-extractz14-palette-1c-1b.sh \ tiffcrop-extractz14-palette-1c-4b.sh \ tiffcrop-extractz14-palette-1c-8b.sh \ tiffcrop-extractz14-rgb-3c-16b.sh \ tiffcrop-extractz14-rgb-3c-8b.sh \ tiffcrop-R90-logluv-3c-16b.sh \ tiffcrop-R90-minisblack-1c-16b.sh \ tiffcrop-R90-minisblack-1c-8b.sh \ tiffcrop-R90-minisblack-2c-8b-alpha.sh \ tiffcrop-R90-miniswhite-1c-1b.sh \ tiffcrop-R90-palette-1c-1b.sh \ tiffcrop-R90-palette-1c-4b.sh \ tiffcrop-R90-palette-1c-8b.sh \ tiffcrop-R90-rgb-3c-16b.sh \ tiffcrop-R90-rgb-3c-8b.sh \ tiff2rgba-logluv-3c-16b.sh \ tiff2rgba-minisblack-1c-16b.sh \ tiff2rgba-minisblack-1c-8b.sh \ tiff2rgba-minisblack-2c-8b-alpha.sh \ tiff2rgba-miniswhite-1c-1b.sh \ tiff2rgba-palette-1c-1b.sh \ tiff2rgba-palette-1c-4b.sh \ tiff2rgba-palette-1c-8b.sh \ tiff2rgba-rgb-3c-16b.sh \ tiff2rgba-rgb-3c-8b.sh \ tiff2rgba-quad-tile.jpg.sh # This list should contain all of the TIFF files in the 'images' # subdirectory which are intended to be used as input images for # tests. All of these files should use the extension ".tiff". TIFFIMAGES = \ images/logluv-3c-16b.tiff \ images/minisblack-1c-16b.tiff \ images/minisblack-1c-8b.tiff \ images/minisblack-2c-8b-alpha.tiff \ images/miniswhite-1c-1b.tiff \ images/palette-1c-1b.tiff \ images/palette-1c-4b.tiff \ images/palette-1c-8b.tiff \ images/rgb-3c-16b.tiff \ images/rgb-3c-8b.tiff \ images/quad-tile.jpg.tiff BMPIMAGES = \ images/palette-1c-8b.bmp \ images/rgb-3c-8b.bmp GIFIMAGES = \ images/palette-1c-8b.gif PNMIMAGES = \ images/minisblack-1c-8b.pgm \ images/miniswhite-1c-1b.pbm \ images/rgb-3c-8b.ppm # This list should include all of the files in the 'images' # subdirectory which are intended to be distributed. This may include # files which are not currently used by the tests. IMAGES_EXTRA_DIST = \ images/README.txt \ $(BMPIMAGES) \ $(GIFIMAGES) \ $(PNMIMAGES) \ $(TIFFIMAGES) noinst_HEADERS = tifftest.h ascii_tag_SOURCES = ascii_tag.c ascii_tag_LDADD = $(LIBTIFF) long_tag_SOURCES = long_tag.c check_tag.c long_tag_LDADD = $(LIBTIFF) short_tag_SOURCES = short_tag.c check_tag.c short_tag_LDADD = $(LIBTIFF) strip_rw_SOURCES = strip_rw.c strip.c test_arrays.c test_arrays.h strip_rw_LDADD = $(LIBTIFF) rewrite_SOURCES = rewrite_tag.c rewrite_LDADD = $(LIBTIFF) raw_decode_SOURCES = raw_decode.c raw_decode_LDADD = $(LIBTIFF) custom_dir_SOURCES = custom_dir.c custom_dir_LDADD = $(LIBTIFF) AM_CPPFLAGS = -I$(top_srcdir)/libtiff # memcheck: valgrind's memory access checker memcheck: $(MAKE) MEMCHECK='valgrind --tool=memcheck --leak-check=full --read-var-info=yes --track-origins=yes --num-callers=12 --quiet $(VALGRIND_EXTRA_OPTS)' check # ptrcheck: valgrind's experimental pointer checking tool. ptrcheck: $(MAKE) MEMCHECK='valgrind --tool=exp-ptrcheck --quiet $(VALGRIND_EXTRA_OPTS)' check generate-tiff2rgba-tests: for file in $(TIFFIMAGES) ; \ do \ base=`basename $$file .tiff` ; \ testscript=$(srcdir)/tiff2rgba-$$base.sh ; \ ( \ echo "#!/bin/sh" ; \ echo "# Generated file, master is Makefile.am" ; \ echo ". \$${srcdir:-.}/common.sh" ; \ echo "infile=\"\$$srcdir/$$file\"" ; \ echo "outfile=\"o-tiff2rgba-$$base.tiff\"" ; \ echo "f_test_convert \"\$$TIFF2RGBA\" \$$infile \$$outfile" ; \ echo "f_tiffinfo_validate \$$outfile" ; \ ) > $$testscript ; \ chmod +x $$testscript ; \ done # Test rotations generate-tiffcrop-R90-tests: for file in $(TIFFIMAGES) ; \ do \ base=`basename $$file .tiff` ; \ testscript=$(srcdir)/tiffcrop-R90-$$base.sh ; \ ( \ echo "#!/bin/sh" ; \ echo "# Generated file, master is Makefile.am" ; \ echo ". \$${srcdir:-.}/common.sh" ; \ echo "infile=\"\$$srcdir/$$file\"" ; \ echo "outfile=\"o-tiffcrop-R90-$$base.tiff\"" ; \ echo "f_test_convert \"\$$TIFFCROP -R90\" \$$infile \$$outfile" ; \ echo "f_tiffinfo_validate \$$outfile" ; \ ) > $$testscript ; \ chmod +x $$testscript ; \ done # Test flip (mirror) generate-tiffcrop-doubleflip-tests: for file in $(TIFFIMAGES) ; \ do \ base=`basename $$file .tiff` ; \ testscript=$(srcdir)/tiffcrop-doubleflip-$$base.sh ; \ ( \ echo "#!/bin/sh" ; \ echo "# Generated file, master is Makefile.am" ; \ echo ". \$${srcdir:-.}/common.sh" ; \ echo "infile=\"\$$srcdir/$$file\"" ; \ echo "outfile=\"o-tiffcrop-doubleflip-$$base.tiff\"" ; \ echo "f_test_convert \"\$$TIFFCROP -F both\" \$$infile \$$outfile" ; \ echo "f_tiffinfo_validate \$$outfile" ; \ ) > $$testscript ; \ chmod +x $$testscript ; \ done # Test extracting a section 100 pixels wide and 100 pixels high generate-tiffcrop-extract-tests: for file in $(TIFFIMAGES) ; \ do \ base=`basename $$file .tiff` ; \ testscript=$(srcdir)/tiffcrop-extract-$$base.sh ; \ ( \ echo "#!/bin/sh" ; \ echo "# Generated file, master is Makefile.am" ; \ echo ". \$${srcdir:-.}/common.sh" ; \ echo "infile=\"\$$srcdir/$$file\"" ; \ echo "outfile=\"o-tiffcrop-extract-$$base.tiff\"" ; \ echo "f_test_convert \"\$$TIFFCROP -U px -E top -X 60 -Y 60\" \$$infile \$$outfile" ; \ echo "f_tiffinfo_validate \$$outfile" ; \ ) > $$testscript ; \ chmod +x $$testscript ; \ done # Test extracting the first and fourth quarters from the left side. generate-tiffcrop-extractz14-tests: for file in $(TIFFIMAGES) ; \ do \ base=`basename $$file .tiff` ; \ testscript=$(srcdir)/tiffcrop-extractz14-$$base.sh ; \ ( \ echo "#!/bin/sh" ; \ echo "# Generated file, master is Makefile.am" ; \ echo ". \$${srcdir:-.}/common.sh" ; \ echo "infile=\"\$$srcdir/$$file\"" ; \ echo "outfile=\"o-tiffcrop-extractz14-$$base.tiff\"" ; \ echo "f_test_convert \"\$$TIFFCROP -E left -Z1:4,2:4\" \$$infile \$$outfile" ; \ echo "f_tiffinfo_validate \$$outfile" ; \ ) > $$testscript ; \ chmod +x $$testscript ; \ done generate-tiffcrop-tests: \ generate-tiffcrop-R90-tests \ generate-tiffcrop-doubleflip-tests \ generate-tiffcrop-extract-tests \ generate-tiffcrop-extractz14-tests generate-tests: \ generate-tiff2rgba-tests \ generate-tiffcrop-tests tiff-4.0.3/test/strip.c0000644000212300117540000001770210773046356011675 00000000000000/* $Id: strip.c,v 1.4 2008/03/28 01:42:06 bfriesen Exp $ */ /* * Copyright (c) 2004, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Functions to test strip interface of libtiff. */ #include #include #include "tiffio.h" int write_strips(TIFF *tif, const tdata_t array, const tsize_t size) { tstrip_t strip, nstrips; tsize_t stripsize, offset; stripsize = TIFFStripSize(tif); if (!stripsize) { fprintf (stderr, "Wrong size of strip.\n"); return -1; } nstrips = TIFFNumberOfStrips(tif); for (offset = 0, strip = 0; offset < size && strip < nstrips; offset+=stripsize, strip++) { /* * Properly write last strip. */ tsize_t bufsize = size - offset; if (bufsize > stripsize) bufsize = stripsize; if (TIFFWriteEncodedStrip(tif, strip, (char *)array + offset, bufsize) != bufsize) { fprintf (stderr, "Can't write strip %lu.\n", (unsigned long)strip); return -1; } } return 0; } int read_strips(TIFF *tif, const tdata_t array, const tsize_t size) { tstrip_t strip, nstrips; tsize_t stripsize, offset; tdata_t buf = NULL; stripsize = TIFFStripSize(tif); if (!stripsize) { fprintf (stderr, "Wrong size of strip.\n"); return -1; } buf = _TIFFmalloc(stripsize); if (!buf) { fprintf (stderr, "Can't allocate space for strip buffer.\n"); return -1; } nstrips = TIFFNumberOfStrips(tif); for (offset = 0, strip = 0; offset < size && strip < nstrips; offset+=stripsize, strip++) { /* * Properly read last strip. */ tsize_t bufsize = size - offset; if (bufsize > stripsize) bufsize = stripsize; if (TIFFReadEncodedStrip(tif, strip, buf, -1) != bufsize) { fprintf (stderr, "Can't read strip %lu.\n", (unsigned long)strip); return -1; } if (memcmp(buf, (char *)array + offset, bufsize) != 0) { fprintf (stderr, "Wrong data read for strip %lu.\n", (unsigned long)strip); _TIFFfree(buf); return -1; } } _TIFFfree(buf); return 0; } int create_image_striped(const char *name, uint32 width, uint32 length, uint32 rowsperstrip, uint16 compression, uint16 spp, uint16 bps, uint16 photometric, uint16 sampleformat, uint16 planarconfig, const tdata_t array, const tsize_t size) { TIFF *tif; /* Test whether we can write tags. */ tif = TIFFOpen(name, "w"); if (!tif) goto openfailure; if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width)) { fprintf (stderr, "Can't set ImageWidth tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, length)) { fprintf (stderr, "Can't set ImageLength tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps)) { fprintf (stderr, "Can't set BitsPerSample tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, spp)) { fprintf (stderr, "Can't set SamplesPerPixel tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip)) { fprintf (stderr, "Can't set RowsPerStrip tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, planarconfig)) { fprintf (stderr, "Can't set PlanarConfiguration tag.\n"); goto failure; } if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photometric)) { fprintf (stderr, "Can't set PhotometricInterpretation tag.\n"); goto failure; } if (write_strips(tif, array, size) < 0) { fprintf (stderr, "Can't write image data.\n"); goto failure; } TIFFClose(tif); return 0; failure: TIFFClose(tif); openfailure: fprintf (stderr, "Can't create test TIFF file %s:\n" " ImageWidth=%ld, ImageLength=%ld, RowsPerStrip=%ld, Compression=%d,\n" " BitsPerSample=%d, SamplesPerPixel=%d, SampleFormat=%d,\n" " PlanarConfiguration=%d, PhotometricInterpretation=%d.\n", name, (long) width, (long) length, (long) rowsperstrip, compression, bps, spp, sampleformat, planarconfig, photometric); return -1; } int read_image_striped(const char *name, uint32 width, uint32 length, uint32 rowsperstrip, uint16 compression, uint16 spp, uint16 bps, uint16 photometric, uint16 sampleformat, uint16 planarconfig, const tdata_t array, const tsize_t size) { TIFF *tif; uint16 value_u16; uint32 value_u32; /* Test whether we can read written values. */ tif = TIFFOpen(name, "r"); if (!tif) goto openfailure; if (TIFFIsTiled(tif)) { fprintf (stderr, "Can't read image %s, it is tiled.\n", name); goto failure; } if (!TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &value_u32) || value_u32 != width) { fprintf (stderr, "Can't get tag %d.\n", TIFFTAG_IMAGEWIDTH); goto failure; } if (!TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &value_u32) || value_u32 != length) { fprintf (stderr, "Can't get tag %d.\n", TIFFTAG_IMAGELENGTH); goto failure; } if (!TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &value_u16) || value_u16 != bps) { fprintf (stderr, "Can't get tag %d.\n", TIFFTAG_BITSPERSAMPLE); goto failure; } if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &value_u16) || value_u16 != photometric) { fprintf (stderr, "Can't get tag %d.\n", TIFFTAG_PHOTOMETRIC); goto failure; } if (!TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &value_u16) || value_u16 != spp) { fprintf (stderr, "Can't get tag %d.\n", TIFFTAG_SAMPLESPERPIXEL); goto failure; } if (!TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &value_u32) || value_u32 != rowsperstrip) { fprintf (stderr, "Can't get tag %d.\n", TIFFTAG_ROWSPERSTRIP); goto failure; } if (!TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &value_u16) || value_u16 != planarconfig) { fprintf (stderr, "Can't get tag %d.\n", TIFFTAG_PLANARCONFIG); goto failure; } if (read_strips(tif, array, size) < 0) { fprintf (stderr, "Can't read image data.\n"); goto failure; } TIFFClose(tif); return 0; failure: TIFFClose(tif); openfailure: fprintf (stderr, "Can't read test TIFF file %s:\n" " ImageWidth=%ld, ImageLength=%ld, RowsPerStrip=%ld, Compression=%d,\n" " BitsPerSample=%d, SamplesPerPixel=%d, SampleFormat=%d,\n" " PlanarConfiguration=%d, PhotometricInterpretation=%d.\n", name, (long) width, (long) length, (long) rowsperstrip, compression, bps, spp, sampleformat, planarconfig, photometric); return -1; } int write_scanlines(TIFF *tif, const tdata_t array, const tsize_t size) { uint32 length, row; tsize_t scanlinesize, offset; (void) size; if (!TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &length)) { fprintf (stderr, "Can't get tag %d.\n", TIFFTAG_IMAGELENGTH); return -1; } scanlinesize = TIFFScanlineSize(tif); if (!scanlinesize) { fprintf (stderr, "Wrong size of scanline.\n"); return -1; } for (offset = 0, row = 0; row < length; offset+=scanlinesize, row++) { if (TIFFWriteScanline(tif, (char *)array + offset, row, 0) < 0) { fprintf (stderr, "Can't write image data at row %lu.\n", (long) row); return -1; } } return 0; } /* vim: set ts=8 sts=8 sw=8 noet: */ tiff-4.0.3/test/tiffcrop-extract-logluv-3c-16b.sh0000755000212300117540000000041011273622560016367 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/logluv-3c-16b.tiff" outfile="o-tiffcrop-extract-logluv-3c-16b.tiff" f_test_convert "$TIFFCROP -U px -E top -X 60 -Y 60" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tifftest.h0000644000212300117540000000305611001134474012346 00000000000000/* $Id: tifftest.h,v 1.1 2008/04/15 14:18:36 dron Exp $ */ /* * Copyright (c) 2008, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFFTEST_ #define _TIFFTEST_ /* * TIFF Library * * Header file for helper testing routines. */ #include "tiffio.h" int CheckShortField(TIFF *, const ttag_t, const uint16); int CheckShortPairedField(TIFF *, const ttag_t, const uint16*); int CheckLongField(TIFF *, const ttag_t, const uint32); #endif /* _TIFFTEST_ */ tiff-4.0.3/test/tiffcrop-extract-minisblack-2c-8b-alpha.sh0000755000212300117540000000043211273622560020202 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-2c-8b-alpha.tiff" outfile="o-tiffcrop-extract-minisblack-2c-8b-alpha.tiff" f_test_convert "$TIFFCROP -U px -E top -X 60 -Y 60" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiff2rgba-minisblack-2c-8b-alpha.sh0000755000212300117540000000037311244400051016553 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-2c-8b-alpha.tiff" outfile="o-tiff2rgba-minisblack-2c-8b-alpha.tiff" f_test_convert "$TIFF2RGBA" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extract-rgb-3c-16b.sh0000755000212300117540000000040211273622560015632 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/rgb-3c-16b.tiff" outfile="o-tiffcrop-extract-rgb-3c-16b.tiff" f_test_convert "$TIFFCROP -U px -E top -X 60 -Y 60" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-doubleflip-palette-1c-4b.sh0000755000212300117540000000037211244400052017076 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-4b.tiff" outfile="o-tiffcrop-doubleflip-palette-1c-4b.tiff" f_test_convert "$TIFFCROP -F both" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcp-g3-2d.sh0000755000212300117540000000031211244341001012754 00000000000000#!/bin/sh # # Basic sanity check for tiffcp with G3 compression and 2 dimensional encoding. # . ${srcdir:-.}/common.sh f_test_convert "${TIFFCP} -c g3:2d" "${IMG_MINISWHITE_1C_1B}" "o-tiffcp-g3-2d.tiff"tiff-4.0.3/test/tiff2rgba-quad-tile.jpg.sh0000755000212300117540000000035111766743411015226 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/quad-tile.jpg.tiff" outfile="o-tiff2rgba-quad-tile.jpg.tiff" f_test_convert "$TIFF2RGBA" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extractz14-minisblack-1c-8b.sh0000755000212300117540000000041211244400052017437 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-1c-8b.tiff" outfile="o-tiffcrop-extractz14-minisblack-1c-8b.tiff" f_test_convert "$TIFFCROP -E left -Z1:4,2:4" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcp-logluv.sh0000755000212300117540000000044011244341001013452 00000000000000#!/bin/sh # # Basic sanity check for tiffcp with logluv compression # . ${srcdir:-.}/common.sh f_test_convert "${TIFFCP} -c none" "${srcdir}/images/logluv-3c-16b.tiff" "o-tiffcp-logluv-raw.tiff" f_test_convert "${TIFFCP} -c sgilog" "o-tiffcp-logluv-raw.tiff" "o-tiffcp-logluv-sgilog.tiff"tiff-4.0.3/test/tiffcrop-doubleflip-minisblack-1c-8b.sh0000755000212300117540000000040011244400052017550 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-1c-8b.tiff" outfile="o-tiffcrop-doubleflip-minisblack-1c-8b.tiff" f_test_convert "$TIFFCROP -F both" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extract-palette-1c-8b.sh0000755000212300117540000000041011273622560016434 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-8b.tiff" outfile="o-tiffcrop-extract-palette-1c-8b.tiff" f_test_convert "$TIFFCROP -U px -E top -X 60 -Y 60" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcp-thumbnail.sh0000755000212300117540000000042711244341001014132 00000000000000#!/bin/sh # # Basic sanity check for thumbnail # . ${srcdir:-.}/common.sh outfile1=o-tiffcp-thumbnail-in.tif outfile2=o-tiffcp-thumbnail-out.tif f_test_convert "${TIFFCP} -c g3:1d" "${IMG_MINISWHITE_1C_1B}" "${outfile1}" f_test_convert "${THUMBNAIL}" "${outfile1}" "${outfile2}"tiff-4.0.3/test/tiff2pdf.sh0000755000212300117540000000021711244527705012420 00000000000000#!/bin/sh # # Basic sanity check for tiff2pdf # . ${srcdir:-.}/common.sh f_test_stdout "${TIFF2PDF}" "${IMG_MINISWHITE_1C_1B}" "o-tiff2pdf.pdf"tiff-4.0.3/test/tiffcrop-extract-palette-1c-1b.sh0000755000212300117540000000041011273622560016425 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-1b.tiff" outfile="o-tiffcrop-extract-palette-1c-1b.tiff" f_test_convert "$TIFFCROP -U px -E top -X 60 -Y 60" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-R90-minisblack-1c-8b.sh0000755000212300117540000000036611244400052016010 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-1c-8b.tiff" outfile="o-tiffcrop-R90-minisblack-1c-8b.tiff" f_test_convert "$TIFFCROP -R90" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-doubleflip-rgb-3c-8b.sh0000755000212300117540000000036211244400052016217 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/rgb-3c-8b.tiff" outfile="o-tiffcrop-doubleflip-rgb-3c-8b.tiff" f_test_convert "$TIFFCROP -F both" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcp-g3.sh0000755000212300117540000000025011244341001012452 00000000000000#!/bin/sh # # Basic sanity check for tiffcp with G3 compression # . ${srcdir:-.}/common.sh f_test_convert "${TIFFCP} -c g3" "${IMG_MINISWHITE_1C_1B}" "o-tiffcp-g3.tiff"tiff-4.0.3/test/tiffcrop-extractz14-minisblack-2c-8b-alpha.sh0000755000212300117540000000042611244400052020530 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-2c-8b-alpha.tiff" outfile="o-tiffcrop-extractz14-minisblack-2c-8b-alpha.tiff" f_test_convert "$TIFFCROP -E left -Z1:4,2:4" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcp-g3-2d-fill.sh0000755000212300117540000000036011244341001013703 00000000000000#!/bin/sh # # Basic sanity check for tiffcp with G3 compression, 2 dimensional # encoding, and zero-filled boundaries. # . ${srcdir:-.}/common.sh f_test_convert "${TIFFCP} -c g3:2d:fill" "${IMG_MINISWHITE_1C_1B}" "o-tiffcp-g3-2d-fill.tiff" tiff-4.0.3/test/bmp2tiff_palette.sh0000755000212300117540000000032611246307335014141 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$IMG_PALETTE_1C_8B_BMP" outfile="o-bmp2tiff_palette.tiff" f_test_convert "$BMP2TIFF" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiff2ps-PS1.sh0000755000212300117540000000026611550106765012675 00000000000000#!/bin/sh # # Basic sanity check for tiffps with PostScript Level 1 output # . ${srcdir:-.}/common.sh f_test_stdout "${TIFF2PS} -a -p -1" "${IMG_MINISWHITE_1C_1B}" "o-tiff2ps-PS1.ps"tiff-4.0.3/test/tiffcrop-extract-minisblack-1c-8b.sh0000755000212300117540000000041611273622560017120 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-1c-8b.tiff" outfile="o-tiffcrop-extract-minisblack-1c-8b.tiff" f_test_convert "$TIFFCROP -U px -E top -X 60 -Y 60" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extract-minisblack-1c-16b.sh0000755000212300117540000000042011273622560017172 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-1c-16b.tiff" outfile="o-tiffcrop-extract-minisblack-1c-16b.tiff" f_test_convert "$TIFFCROP -U px -E top -X 60 -Y 60" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-R90-minisblack-2c-8b-alpha.sh0000755000212300117540000000040211244400052017063 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-2c-8b-alpha.tiff" outfile="o-tiffcrop-R90-minisblack-2c-8b-alpha.tiff" f_test_convert "$TIFFCROP -R90" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/ppm2tiff_pgm.sh0000755000212300117540000000032511246310142013271 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$IMG_MINISBLACK_1C_8B_PGM" outfile="o-ppm2tiff_pgm.tiff" f_test_convert "$PPM2TIFF" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/raw_decode.c0000644000212300117540000001652711775615314012633 00000000000000/* $Id: raw_decode.c,v 1.4 2012-07-06 17:05:16 bfriesen Exp $ */ /* * Copyright (c) 2012, Frank Warmerdam * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * The objective of this test suite is to test the JPEGRawDecode() * interface via TIFReadEncodedTile(). This function with YCbCr subsampling * is a frequent source of bugs. */ #include "tif_config.h" #include #include #include #ifdef HAVE_UNISTD_H # include #endif #include "tiffio.h" #include "jpeglib.h" /* Needed for JPEG_LIB_VERSION */ static unsigned char cluster_0[] = { 0, 0, 2, 0, 138, 139 }; static unsigned char cluster_64[] = { 0, 0, 9, 6, 134, 119 }; static unsigned char cluster_128[] = { 44, 40, 63, 59, 230, 95 }; static int check_cluster( int cluster, unsigned char *buffer, unsigned char *expected_cluster ) { unsigned char *target = buffer + cluster*6; if (memcmp(target, expected_cluster, 6) == 0) { return 0; } fprintf( stderr, "Cluster %d did not match expected results.\n", cluster ); fprintf( stderr, "Expect: %3d %3d %3d %3d\n" " %3d %3d\n", expected_cluster[0], expected_cluster[1], expected_cluster[4], expected_cluster[5], expected_cluster[2], expected_cluster[3] ); fprintf( stderr, " Got: %3d %3d %3d %3d\n" " %3d %3d\n", target[0], target[1], target[4], target[5], target[2], target[3] ); return 1; } static int check_rgb_pixel( int pixel, int red, int green, int blue, unsigned char *buffer ) { unsigned char *rgb = buffer + 3 * pixel; if( rgb[0] == red && rgb[1] == green && rgb[2] == blue ) { return 0; } fprintf( stderr, "Pixel %d did not match expected results.\n", pixel ); fprintf( stderr, "Expect: %3d %3d %3d\n", red, green, blue ); fprintf( stderr, " Got: %3d %3d %3d\n", rgb[0], rgb[1], rgb[2] ); return 1; } static int check_rgba_pixel( int pixel, int red, int green, int blue, int alpha, uint32 *buffer ) { /* RGBA images are upside down - adjust for normal ordering */ int adjusted_pixel = pixel % 128 + (127 - (pixel/128)) * 128; uint32 rgba = buffer[adjusted_pixel]; if( TIFFGetR(rgba) == (uint32) red && TIFFGetG(rgba) == (uint32) green && TIFFGetB(rgba) == (uint32) blue && TIFFGetA(rgba) == (uint32) alpha ) { return 0; } fprintf( stderr, "Pixel %d did not match expected results.\n", pixel ); fprintf( stderr, "Expect: %3d %3d %3d %3d\n", red, green, blue, alpha ); fprintf( stderr, " Got: %3d %3d %3d %3d\n", TIFFGetR(rgba), TIFFGetG(rgba), TIFFGetB(rgba), TIFFGetA(rgba) ); return 1; } int main(int argc, char **argv) { TIFF *tif; static const char *srcfilerel = "images/quad-tile.jpg.tiff"; char *srcdir = NULL; char srcfile[1024]; unsigned short h, v; int status; unsigned char *buffer; uint32 *rgba_buffer; tsize_t sz, szout; unsigned int pixel_status = 0; (void) argc; (void) argv; if ((srcdir = getenv("srcdir")) == NULL) { srcdir = "."; } if ((strlen(srcdir) + 1 + strlen(srcfilerel)) >= sizeof(srcfile)) { fprintf( stderr, "srcdir too long %s\n", srcdir); exit( 1 ); } strcpy(srcfile,srcdir); strcat(srcfile,"/"); strcat(srcfile,srcfilerel); tif = TIFFOpen(srcfile,"r"); if ( tif == NULL ) { fprintf( stderr, "Could not open %s\n", srcfile); exit( 1 ); } status = TIFFGetField(tif,TIFFTAG_YCBCRSUBSAMPLING, &h, &v); if ( status == 0 || h != 2 || v != 2) { fprintf( stderr, "Could not retrieve subsampling tag.\n" ); exit(1); } /* * What is the appropriate size of a YCbCr encoded tile? */ sz = TIFFTileSize(tif); if( sz != 24576) { fprintf(stderr, "tiles are %d bytes\n", (int)sz); exit(1); } buffer = (unsigned char *) malloc(sz); /* * Read a tile in decompressed form, but still YCbCr subsampled. */ szout = TIFFReadEncodedTile(tif,9,buffer,sz); if (szout != sz) { fprintf( stderr, "Did not get expected result code from TIFFReadEncodedTile()(%d instead of %d)\n", (int) szout, (int) sz ); return 1; } if( check_cluster( 0, buffer, cluster_0 ) || check_cluster( 64, buffer, cluster_64 ) || check_cluster( 128, buffer, cluster_128 ) ) { exit(1); } free(buffer); /* * Read a tile using the built-in conversion to RGB format provided by the JPEG library. */ TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); sz = TIFFTileSize(tif); if( sz != 128*128*3) { fprintf(stderr, "tiles are %d bytes\n", (int)sz); exit(1); } buffer = (unsigned char *) malloc(sz); szout = TIFFReadEncodedTile(tif,9,buffer,sz); if (szout != sz) { fprintf( stderr, "Did not get expected result code from TIFFReadEncodedTile()(%d instead of %d)\n", (int) szout, (int) sz ); return 1; } #if JPEG_LIB_VERSION >= 70 pixel_status |= check_rgb_pixel( 0, 18, 0, 41, buffer ); pixel_status |= check_rgb_pixel( 64, 0, 0, 0, buffer ); pixel_status |= check_rgb_pixel( 512, 5, 34, 196, buffer ); #else pixel_status |= check_rgb_pixel( 0, 15, 0, 18, buffer ); pixel_status |= check_rgb_pixel( 64, 0, 0, 2, buffer ); pixel_status |= check_rgb_pixel( 512, 6, 36, 182, buffer ); #endif free( buffer ); TIFFClose(tif); /* * Reopen and test reading using the RGBA interface. */ tif = TIFFOpen(srcfile,"r"); sz = 128 * 128 * sizeof(uint32); rgba_buffer = (uint32 *) malloc(sz); if (!TIFFReadRGBATile( tif, 1*128, 2*128, rgba_buffer )) { fprintf( stderr, "TIFFReadRGBATile() returned failure code.\n" ); return 1; } /* * Currently TIFFReadRGBATile() just uses JPEGCOLORMODE_RGB so this * trivally matches the last results. Eventually we should actually * accomplish it from the YCbCr subsampled buffer ourselves in which * case the results may be subtly different but similar. */ #if JPEG_LIB_VERSION >= 70 pixel_status |= check_rgba_pixel( 0, 18, 0, 41, 255, rgba_buffer ); pixel_status |= check_rgba_pixel( 64, 0, 0, 0, 255, rgba_buffer ); pixel_status |= check_rgba_pixel( 512, 5, 34, 196, 255, rgba_buffer ); #else pixel_status |= check_rgba_pixel( 0, 15, 0, 18, 255, rgba_buffer ); pixel_status |= check_rgba_pixel( 64, 0, 0, 2, 255, rgba_buffer ); pixel_status |= check_rgba_pixel( 512, 6, 36, 182, 255, rgba_buffer ); #endif free( rgba_buffer ); TIFFClose(tif); if (pixel_status) { exit(1); } exit( 0 ); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/test/test_arrays.c0000644000212300117540000013774210411004552013060 00000000000000/* $Id: test_arrays.c,v 1.3 2006/03/23 14:54:02 dron Exp $ */ /* * Copyright (c) 2004, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Numerical arrays used to test libtiff's read/write functions. */ #include #include "test_arrays.h" const unsigned char byte_array1[XSIZE * YSIZE]= { 86, 84, 86, 90, 89, 85, 90, 78, 77, 79, 75, 77, 79, 86, 87, 83, 82, 87, 89, 88, 86, 87, 88, 87, 81, 84, 85, 85, 84, 86, 88, 91, 96, 95, 97, 95, 89, 85, 82, 81, 88, 89, 85, 89, 83, 74, 79, 76, 77, 80, 87, 87, 84, 84, 88, 90, 89, 87, 85, 87, 88, 83, 80, 82, 84, 85, 87, 90, 95, 96, 95, 95, 92, 90, 85, 81, 79, 84, 90, 87, 88, 88, 73, 79, 75, 76, 79, 88, 88, 87, 85, 90, 92, 89, 88, 88, 87, 86, 84, 82, 82, 83, 87, 89, 93, 94, 93, 93, 92, 92, 96, 85, 82, 76, 80, 88, 89, 88, 89, 73, 80, 75, 75, 77, 89, 92, 93, 91, 89, 94, 92, 90, 89, 88, 84, 84, 82, 82, 85, 88, 91, 94, 93, 93, 89, 90, 96, 96, 87, 83, 75, 77, 83, 89, 90, 90, 74, 78, 76, 76, 76, 84, 94, 100, 89, 92, 94, 92, 90, 89, 90, 85, 84, 83, 83, 87, 91, 92, 88, 92, 91, 88, 90, 97, 95, 89, 83, 74, 77, 82, 84, 90, 92, 78, 72, 76, 75, 75, 81, 95, 101, 95, 92, 95, 93, 90, 89, 90, 87, 86, 84, 86, 88, 90, 90, 87, 90, 89, 90, 89, 98, 98, 92, 84, 75, 76, 81, 81, 86, 91, 81, 72, 74, 74, 75, 81, 104, 108, 93, 92, 95, 94, 88, 87, 89, 87, 85, 85, 88, 89, 93, 91, 88, 88, 91, 88, 91, 106, 108, 93, 89, 78, 75, 77, 80, 85, 86, 85, 73, 72, 73, 74, 79, 102, 101, 88, 92, 93, 91, 87, 87, 86, 87, 85, 86, 88, 89, 94, 94, 90, 88, 85, 86, 98, 109, 113, 92, 93, 83, 76, 74, 79, 84, 85, 81, 75, 72, 73, 74, 79, 105, 86, 86, 92, 96, 98, 104, 86, 85, 85, 85, 88, 90, 90, 93, 92, 88, 87, 86, 89, 97, 110, 109, 92, 93, 89, 78, 79, 78, 89, 84, 75, 76, 73, 72, 73, 78, 105, 83, 82, 88, 83, 107, 95, 84, 85, 84, 86, 87, 90, 91, 92, 90, 88, 87, 89, 90, 91, 99, 107, 96, 94, 91, 82, 84, 86, 91, 87, 75, 74, 73, 73, 73, 77, 101, 86, 83, 89, 92, 99, 98, 86, 86, 87, 83, 84, 89, 89, 92, 92, 92, 96, 96, 87, 91, 90, 98, 96, 97, 94, 87, 88, 89, 92, 90, 79, 72, 73, 73, 74, 77, 100, 92, 84, 86, 98, 100, 92, 87, 88, 88, 84, 83, 87, 89, 91, 94, 94, 96, 93, 87, 87, 84, 109, 93, 92, 95, 92, 94, 93, 92, 91, 82, 72, 73, 74, 74, 76, 95, 89, 85, 84, 102, 89, 85, 88, 94, 86, 82, 83, 82, 91, 94, 97, 90, 92, 85, 90, 85, 79, 125, 89, 96, 94, 90, 94, 95, 91, 91, 85, 76, 72, 73, 74, 75, 88, 100, 83, 84, 84, 83, 85, 88, 90, 85, 84, 83, 84, 88, 92, 93, 90, 89, 84, 90, 94, 79, 139, 93, 97, 97, 93, 92, 95, 91, 90, 87, 81, 74, 73, 73, 74, 85, 97, 95, 95, 89, 86, 86, 92, 87, 85, 84, 90, 86, 85, 91, 87, 87, 86, 93, 124, 140, 106, 143, 101, 95, 97, 97, 96, 95, 84, 88, 87, 82, 78, 73, 73, 74, 82, 92, 104, 95, 88, 89, 87, 89, 86, 85, 86, 87, 87, 81, 81, 83, 91, 106, 131, 153, 151, 123, 133, 99, 101, 102, 99, 96, 90, 83, 82, 85, 84, 79, 76, 74, 74, 78, 81, 89, 96, 90, 93, 88, 88, 86, 88, 89, 95, 89, 82, 81, 85, 104, 118, 141, 160, 129, 137, 147, 103, 104, 98, 99, 90, 88, 81, 76, 81, 83, 79, 77, 75, 75, 75, 76, 80, 90, 94, 87, 86, 87, 92, 85, 85, 85, 87, 87, 89, 91, 112, 115, 145, 154, 145, 141, 147, 106, 103, 100, 99, 92, 82, 78, 75, 78, 81, 79, 77, 77, 78, 78, 76, 77, 81, 89, 87, 84, 84, 90, 86, 85, 84, 80, 85, 97, 104, 119, 119, 149, 147, 144, 146, 152, 107, 105, 103, 100, 93, 83, 78, 74, 74, 79, 78, 77, 76, 78, 80, 79, 76, 78, 83, 84, 81, 81, 84, 83, 82, 78, 78, 85, 86, 97, 105, 114, 145, 146, 148, 147, 150, 107, 105, 103, 97, 92, 84, 72, 72, 75, 77, 76, 75, 76, 79, 80, 80, 77, 76, 82, 81, 80, 81, 80, 80, 80, 77, 74, 74, 73, 77, 91, 110, 132, 141, 152, 152, 145, 107, 105, 103, 96, 92, 86, 73, 71, 73, 75, 75, 76, 76, 78, 80, 80, 80, 98, 80, 80, 82, 82, 80, 78, 76, 73, 71, 72, 71, 74, 80, 108, 119, 136, 158, 142, 137, 107, 104, 101, 97, 85, 87, 75, 70, 70, 74, 74, 75, 77, 78, 80, 82, 110, 117, 110, 78, 81, 83, 81, 78, 76, 73, 71, 69, 68, 71, 74, 95, 120, 138, 148, 143, 139 }; const size_t byte_array1_size = sizeof(byte_array1); const unsigned char byte_array2[YSIZE * XSIZE] = { 77, 73, 76, 80, 79, 75, 82, 65, 62, 64, 59, 59, 61, 72, 70, 67, 65, 70, 71, 70, 68, 66, 65, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 65, 63, 63, 62, 75, 71, 71, 79, 81, 75, 81, 73, 59, 65, 60, 60, 64, 73, 73, 68, 66, 70, 72, 71, 68, 66, 66, 67, 66, 66, 66, 67, 67, 67, 66, 67, 66, 64, 63, 63, 63, 76, 71, 66, 73, 81, 78, 80, 79, 59, 66, 60, 59, 62, 74, 74, 71, 67, 70, 73, 71, 68, 66, 65, 65, 66, 66, 67, 67, 67, 67, 67, 67, 66, 64, 64, 64, 64, 76, 72, 64, 68, 79, 81, 80, 80, 59, 68, 60, 59, 60, 75, 75, 73, 67, 68, 73, 72, 68, 66, 65, 63, 67, 67, 67, 67, 68, 67, 67, 66, 65, 64, 65, 65, 65, 79, 72, 63, 66, 73, 80, 83, 82, 60, 65, 61, 61, 60, 66, 75, 75, 65, 70, 73, 72, 68, 66, 65, 64, 68, 67, 68, 68, 68, 67, 67, 66, 65, 65, 65, 66, 65, 81, 73, 62, 65, 72, 74, 82, 85, 66, 59, 62, 60, 60, 63, 75, 76, 68, 69, 72, 72, 68, 66, 66, 65, 67, 68, 68, 68, 68, 68, 66, 66, 64, 66, 65, 66, 66, 84, 74, 64, 64, 70, 71, 78, 84, 70, 58, 60, 59, 59, 63, 75, 80, 73, 67, 72, 72, 68, 66, 66, 65, 66, 68, 68, 68, 68, 68, 66, 65, 65, 65, 66, 67, 68, 87, 81, 66, 63, 65, 68, 76, 76, 75, 59, 58, 59, 59, 60, 71, 92, 65, 64, 74, 72, 69, 67, 65, 65, 65, 68, 69, 68, 69, 67, 65, 65, 65, 65, 67, 68, 69, 86, 86, 73, 64, 62, 67, 75, 76, 70, 61, 58, 58, 59, 60, 81, 68, 59, 63, 74, 90, 99, 67, 65, 65, 64, 67, 68, 68, 68, 67, 65, 65, 66, 65, 66, 68, 68, 85, 85, 80, 66, 67, 67, 81, 74, 62, 63, 59, 58, 58, 60, 93, 61, 59, 59, 68, 115, 76, 67, 66, 64, 64, 66, 68, 68, 68, 66, 65, 65, 66, 65, 64, 65, 69, 90, 87, 83, 71, 74, 77, 83, 79, 63, 60, 59, 59, 58, 58, 90, 61, 59, 59, 67, 80, 71, 68, 66, 64, 63, 63, 68, 68, 68, 66, 65, 66, 67, 65, 64, 62, 87, 91, 92, 86, 76, 78, 81, 85, 82, 67, 59, 59, 59, 59, 60, 88, 72, 59, 60, 74, 80, 70, 67, 66, 64, 62, 60, 65, 68, 67, 66, 65, 67, 66, 64, 62, 59, 111, 84, 84, 87, 85, 87, 85, 84, 84, 72, 59, 59, 59, 59, 59, 73, 71, 62, 59, 100, 70, 70, 67, 66, 64, 60, 58, 58, 67, 68, 66, 65, 66, 64, 63, 59, 56, 131, 80, 90, 87, 83, 88, 89, 84, 83, 76, 64, 59, 59, 59, 58, 59, 97, 64, 62, 71, 68, 70, 73, 66, 63, 61, 58, 58, 62, 67, 66, 64, 65, 63, 63, 61, 57, 149, 86, 91, 92, 87, 85, 88, 83, 81, 78, 69, 61, 59, 59, 59, 59, 61, 83, 72, 67, 67, 69, 69, 66, 64, 61, 72, 56, 57, 64, 64, 64, 64, 65, 115, 150, 93, 151, 97, 89, 91, 92, 89, 88, 74, 80, 78, 71, 65, 59, 58, 59, 58, 59, 71, 72, 67, 70, 70, 69, 67, 64, 63, 66, 56, 54, 57, 59, 64, 87, 139, 162, 160, 128, 141, 94, 96, 97, 94, 89, 82, 71, 70, 76, 73, 67, 61, 59, 59, 58, 59, 61, 71, 67, 75, 70, 68, 70, 65, 63, 63, 59, 56, 54, 55, 90, 121, 149, 168, 138, 144, 157, 99, 100, 93, 93, 82, 80, 70, 62, 70, 72, 67, 63, 60, 60, 58, 58, 60, 68, 70, 70, 69, 68, 79, 68, 64, 62, 60, 59, 57, 57, 88, 120, 151, 162, 154, 149, 155, 103, 99, 95, 94, 84, 73, 67, 62, 65, 69, 67, 64, 63, 64, 63, 59, 60, 65, 71, 69, 69, 67, 78, 65, 63, 61, 59, 61, 60, 68, 100, 128, 155, 155, 152, 155, 164, 104, 102, 99, 95, 86, 74, 67, 61, 61, 66, 65, 63, 63, 64, 65, 63, 60, 63, 70, 69, 67, 67, 67, 65, 62, 60, 58, 57, 62, 58, 71, 117, 150, 154, 157, 155, 163, 104, 101, 99, 91, 84, 74, 59, 59, 62, 64, 63, 61, 62, 64, 64, 64, 61, 60, 69, 68, 67, 69, 67, 65, 62, 59, 58, 57, 57, 56, 59, 104, 137, 147, 159, 161, 158, 104, 101, 99, 90, 85, 77, 60, 57, 60, 62, 62, 62, 63, 64, 65, 65, 66, 100, 67, 67, 69, 69, 67, 65, 63, 60, 58, 56, 54, 55, 56, 77, 122, 142, 166, 157, 150, 104, 101, 97, 92, 77, 79, 64, 57, 57, 62, 62, 62, 64, 65, 66, 65, 115, 138, 129, 64, 68, 70, 68, 66, 64, 60, 58, 56, 53, 53, 56, 62, 115, 143, 157, 156, 159 }; const size_t byte_array2_size = sizeof(byte_array2); const unsigned char byte_array3[YSIZE * XSIZE] = { 211, 221, 216, 201, 205, 216, 195, 236, 244, 237, 250, 250, 248, 218, 223, 232, 236, 224, 221, 221, 227, 231, 232, 227, 229, 227, 227, 225, 227, 225, 226, 226, 226, 228, 234, 234, 234, 216, 226, 228, 205, 200, 214, 198, 215, 250, 233, 247, 250, 242, 219, 220, 229, 235, 225, 217, 220, 227, 232, 230, 228, 229, 228, 227, 224, 225, 223, 226, 225, 226, 230, 233, 233, 234, 213, 227, 237, 220, 200, 204, 202, 201, 248, 231, 246, 250, 245, 214, 215, 223, 232, 225, 218, 218, 225, 230, 232, 231, 229, 227, 225, 224, 223, 226, 224, 225, 228, 229, 230, 232, 231, 215, 223, 242, 233, 206, 200, 201, 197, 250, 227, 250, 249, 248, 211, 212, 216, 233, 229, 216, 218, 225, 230, 232, 237, 226, 224, 224, 223, 225, 225, 224, 225, 228, 229, 231, 229, 231, 208, 220, 247, 238, 221, 202, 194, 194, 245, 237, 247, 247, 249, 234, 210, 212, 237, 222, 219, 217, 226, 229, 232, 235, 222, 222, 223, 223, 223, 224, 224, 227, 226, 229, 229, 228, 231, 200, 221, 247, 239, 224, 217, 196, 189, 229, 248, 245, 248, 250, 241, 210, 210, 230, 225, 218, 218, 224, 230, 230, 229, 224, 222, 222, 222, 222, 223, 225, 226, 231, 226, 228, 229, 230, 191, 216, 246, 245, 226, 228, 207, 191, 221, 251, 248, 249, 251, 245, 214, 214, 233, 229, 217, 217, 224, 229, 230, 229, 225, 220, 223, 221, 222, 224, 224, 227, 230, 227, 226, 229, 230, 187, 199, 238, 248, 242, 231, 213, 211, 209, 246, 248, 251, 251, 250, 226, 215, 236, 237, 217, 215, 222, 226, 229, 229, 227, 222, 222, 223, 222, 225, 227, 228, 226, 227, 228, 228, 230, 188, 189, 221, 243, 247, 237, 215, 209, 223, 241, 248, 248, 250, 248, 228, 234, 251, 239, 219, 210, 205, 224, 229, 228, 230, 221, 223, 223, 222, 226, 229, 228, 224, 227, 229, 230, 232, 190, 190, 201, 235, 236, 238, 198, 214, 243, 238, 248, 248, 250, 249, 215, 244, 250, 250, 240, 168, 220, 224, 228, 230, 231, 226, 221, 224, 223, 226, 230, 227, 226, 226, 230, 233, 234, 179, 185, 195, 224, 215, 210, 195, 204, 239, 245, 250, 250, 252, 254, 216, 243, 249, 249, 233, 210, 215, 223, 227, 230, 234, 234, 224, 223, 223, 227, 230, 226, 226, 228, 231, 235, 212, 178, 174, 190, 211, 207, 199, 189, 194, 230, 250, 250, 250, 253, 253, 222, 225, 250, 248, 218, 216, 217, 225, 226, 232, 239, 242, 229, 223, 224, 229, 230, 225, 228, 230, 236, 241, 183, 194, 194, 185, 190, 185, 190, 191, 191, 219, 250, 251, 250, 253, 254, 241, 225, 246, 249, 198, 217, 220, 224, 225, 234, 241, 242, 246, 224, 223, 227, 229, 227, 228, 234, 237, 245, 149, 203, 178, 182, 193, 185, 179, 191, 194, 211, 236, 252, 252, 254, 254, 253, 192, 240, 244, 235, 224, 220, 229, 224, 236, 239, 243, 244, 236, 224, 229, 230, 229, 231, 230, 233, 244, 128, 188, 177, 171, 184, 191, 182, 196, 197, 208, 224, 247, 253, 255, 252, 250, 248, 226, 216, 228, 230, 220, 220, 227, 234, 237, 231, 247, 244, 231, 231, 229, 228, 229, 182, 128, 196, 118, 160, 182, 174, 172, 179, 183, 216, 203, 206, 220, 236, 253, 254, 253, 253, 249, 225, 219, 232, 230, 220, 224, 227, 233, 237, 234, 244, 250, 245, 240, 224, 212, 174, 123, 124, 176, 127, 171, 163, 161, 167, 177, 198, 221, 228, 212, 215, 233, 245, 252, 255, 253, 252, 251, 223, 231, 216, 222, 227, 231, 231, 234, 227, 238, 245, 249, 244, 210, 177, 124, 129, 134, 124, 113, 156, 155, 172, 168, 197, 201, 224, 247, 224, 219, 233, 242, 249, 250, 252, 254, 252, 230, 230, 224, 224, 225, 225, 227, 232, 232, 235, 239, 239, 241, 213, 178, 131, 128, 128, 120, 114, 149, 157, 165, 168, 191, 218, 231, 246, 237, 226, 234, 241, 243, 239, 244, 252, 249, 237, 225, 226, 224, 227, 220, 229, 235, 235, 239, 238, 236, 230, 204, 177, 125, 131, 127, 117, 111, 146, 151, 158, 166, 187, 215, 230, 246, 246, 231, 238, 243, 246, 243, 241, 244, 253, 245, 226, 226, 229, 229, 229, 231, 236, 238, 241, 240, 241, 235, 224, 188, 134, 123, 127, 116, 116, 144, 151, 158, 173, 190, 214, 251, 250, 243, 236, 242, 249, 246, 241, 241, 244, 251, 251, 228, 230, 230, 226, 232, 231, 236, 241, 243, 244, 243, 243, 235, 200, 150, 128, 122, 119, 117, 144, 151, 156, 176, 190, 207, 246, 253, 244, 239, 244, 246, 244, 242, 240, 243, 249, 198, 239, 234, 226, 226, 228, 234, 238, 241, 244, 245, 247, 250, 244, 219, 182, 138, 118, 118, 116, 143, 150, 162, 173, 208, 205, 238, 253, 251, 241, 244, 244, 242, 243, 238, 246, 193, 146, 173, 246, 231, 223, 230, 232, 236, 240, 245, 247, 252, 252, 245, 233, 195, 138, 114, 118, 108 }; const size_t byte_array3_size = sizeof(byte_array3); const float array_float1[YSIZE * XSIZE] = { 234.866, 229.404, 234.866, 245.790, 243.059, 232.135, 245.790, 213.018, 210.287, 215.749, 204.825, 210.287, 215.749, 234.866, 237.597, 226.673, 223.942, 237.597, 243.059, 240.328, 234.866, 237.597, 240.328, 237.597, 221.211, 229.404, 232.135, 232.135, 229.404, 234.866, 240.328, 248.521, 262.176, 259.445, 264.907, 259.445, 243.059, 232.135, 223.942, 221.211, 240.328, 243.059, 232.135, 243.059, 226.673, 202.094, 215.749, 207.556, 210.287, 218.480, 237.597, 237.597, 229.404, 229.404, 240.328, 245.790, 243.059, 237.597, 232.135, 237.597, 240.328, 226.673, 218.480, 223.942, 229.404, 232.135, 237.597, 245.790, 259.445, 262.176, 259.445, 259.445, 251.252, 245.790, 232.135, 221.211, 215.749, 229.404, 245.790, 237.597, 240.328, 240.328, 199.363, 215.749, 204.825, 207.556, 215.749, 240.328, 240.328, 237.597, 232.135, 245.790, 251.252, 243.059, 240.328, 240.328, 237.597, 234.866, 229.404, 223.942, 223.942, 226.673, 237.597, 243.059, 253.983, 256.714, 253.983, 253.983, 251.252, 251.252, 262.176, 232.135, 223.942, 207.556, 218.480, 240.328, 243.059, 240.328, 243.059, 199.363, 218.480, 204.825, 204.825, 210.287, 243.059, 251.252, 253.983, 248.521, 243.059, 256.714, 251.252, 245.790, 243.059, 240.328, 229.404, 229.404, 223.942, 223.942, 232.135, 240.328, 248.521, 256.714, 253.983, 253.983, 243.059, 245.790, 262.176, 262.176, 237.597, 226.673, 204.825, 210.287, 226.673, 243.059, 245.790, 245.790, 202.094, 213.018, 207.556, 207.556, 207.556, 229.404, 256.714, 273.100, 243.059, 251.252, 256.714, 251.252, 245.790, 243.059, 245.790, 232.135, 229.404, 226.673, 226.673, 237.597, 248.521, 251.252, 240.328, 251.252, 248.521, 240.328, 245.790, 264.907, 259.445, 243.059, 226.673, 202.094, 210.287, 223.942, 229.404, 245.790, 251.252, 213.018, 196.632, 207.556, 204.825, 204.825, 221.211, 259.445, 275.831, 259.445, 251.252, 259.445, 253.983, 245.790, 243.059, 245.790, 237.597, 234.866, 229.404, 234.866, 240.328, 245.790, 245.790, 237.597, 245.790, 243.059, 245.790, 243.059, 267.638, 267.638, 251.252, 229.404, 204.825, 207.556, 221.211, 221.211, 234.866, 248.521, 221.211, 196.632, 202.094, 202.094, 204.825, 221.211, 284.024, 294.948, 253.983, 251.252, 259.445, 256.714, 240.328, 237.597, 243.059, 237.597, 232.135, 232.135, 240.328, 243.059, 253.983, 248.521, 240.328, 240.328, 248.521, 240.328, 248.521, 289.486, 294.948, 253.983, 243.059, 213.018, 204.825, 210.287, 218.480, 232.135, 234.866, 232.135, 199.363, 196.632, 199.363, 202.094, 215.749, 278.562, 275.831, 240.328, 251.252, 253.983, 248.521, 237.597, 237.597, 234.866, 237.597, 232.135, 234.866, 240.328, 243.059, 256.714, 256.714, 245.790, 240.328, 232.135, 234.866, 267.638, 297.679, 308.603, 251.252, 253.983, 226.673, 207.556, 202.094, 215.749, 229.404, 232.135, 221.211, 204.825, 196.632, 199.363, 202.094, 215.749, 286.755, 234.866, 234.866, 251.252, 262.176, 267.638, 284.024, 234.866, 232.135, 232.135, 232.135, 240.328, 245.790, 245.790, 253.983, 251.252, 240.328, 237.597, 234.866, 243.059, 264.907, 300.410, 297.679, 251.252, 253.983, 243.059, 213.018, 215.749, 213.018, 243.059, 229.404, 204.825, 207.556, 199.363, 196.632, 199.363, 213.018, 286.755, 226.673, 223.942, 240.328, 226.673, 292.217, 259.445, 229.404, 232.135, 229.404, 234.866, 237.597, 245.790, 248.521, 251.252, 245.790, 240.328, 237.597, 243.059, 245.790, 248.521, 270.369, 292.217, 262.176, 256.714, 248.521, 223.942, 229.404, 234.866, 248.521, 237.597, 204.825, 202.094, 199.363, 199.363, 199.363, 210.287, 275.831, 234.866, 226.673, 243.059, 251.252, 270.369, 267.638, 234.866, 234.866, 237.597, 226.673, 229.404, 243.059, 243.059, 251.252, 251.252, 251.252, 262.176, 262.176, 237.597, 248.521, 245.790, 267.638, 262.176, 264.907, 256.714, 237.597, 240.328, 243.059, 251.252, 245.790, 215.749, 196.632, 199.363, 199.363, 202.094, 210.287, 273.100, 251.252, 229.404, 234.866, 267.638, 273.100, 251.252, 237.597, 240.328, 240.328, 229.404, 226.673, 237.597, 243.059, 248.521, 256.714, 256.714, 262.176, 253.983, 237.597, 237.597, 229.404, 297.679, 253.983, 251.252, 259.445, 251.252, 256.714, 253.983, 251.252, 248.521, 223.942, 196.632, 199.363, 202.094, 202.094, 207.556, 259.445, 243.059, 232.135, 229.404, 278.562, 243.059, 232.135, 240.328, 256.714, 234.866, 223.942, 226.673, 223.942, 248.521, 256.714, 264.907, 245.790, 251.252, 232.135, 245.790, 232.135, 215.749, 341.375, 243.059, 262.176, 256.714, 245.790, 256.714, 259.445, 248.521, 248.521, 232.135, 207.556, 196.632, 199.363, 202.094, 204.825, 240.328, 273.100, 226.673, 229.404, 229.404, 226.673, 232.135, 240.328, 245.790, 232.135, 229.404, 226.673, 229.404, 240.328, 251.252, 253.983, 245.790, 243.059, 229.404, 245.790, 256.714, 215.749, 379.609, 253.983, 264.907, 264.907, 253.983, 251.252, 259.445, 248.521, 245.790, 237.597, 221.211, 202.094, 199.363, 199.363, 202.094, 232.135, 264.907, 259.445, 259.445, 243.059, 234.866, 234.866, 251.252, 237.597, 232.135, 229.404, 245.790, 234.866, 232.135, 248.521, 237.597, 237.597, 234.866, 253.983, 338.644, 382.340, 289.486, 390.533, 275.831, 259.445, 264.907, 264.907, 262.176, 259.445, 229.404, 240.328, 237.597, 223.942, 213.018, 199.363, 199.363, 202.094, 223.942, 251.252, 284.024, 259.445, 240.328, 243.059, 237.597, 243.059, 234.866, 232.135, 234.866, 237.597, 237.597, 221.211, 221.211, 226.673, 248.521, 289.486, 357.761, 417.843, 412.381, 335.913, 363.223, 270.369, 275.831, 278.562, 270.369, 262.176, 245.790, 226.673, 223.942, 232.135, 229.404, 215.749, 207.556, 202.094, 202.094, 213.018, 221.211, 243.059, 262.176, 245.790, 253.983, 240.328, 240.328, 234.866, 240.328, 243.059, 259.445, 243.059, 223.942, 221.211, 232.135, 284.024, 322.258, 385.071, 436.960, 352.299, 374.147, 401.457, 281.293, 284.024, 267.638, 270.369, 245.790, 240.328, 221.211, 207.556, 221.211, 226.673, 215.749, 210.287, 204.825, 204.825, 204.825, 207.556, 218.480, 245.790, 256.714, 237.597, 234.866, 237.597, 251.252, 232.135, 232.135, 232.135, 237.597, 237.597, 243.059, 248.521, 305.872, 314.065, 395.995, 420.574, 395.995, 385.071, 401.457, 289.486, 281.293, 273.100, 270.369, 251.252, 223.942, 213.018, 204.825, 213.018, 221.211, 215.749, 210.287, 210.287, 213.018, 213.018, 207.556, 210.287, 221.211, 243.059, 237.597, 229.404, 229.404, 245.790, 234.866, 232.135, 229.404, 218.480, 232.135, 264.907, 284.024, 324.989, 324.989, 406.919, 401.457, 393.264, 398.726, 415.112, 292.217, 286.755, 281.293, 273.100, 253.983, 226.673, 213.018, 202.094, 202.094, 215.749, 213.018, 210.287, 207.556, 213.018, 218.480, 215.749, 207.556, 213.018, 226.673, 229.404, 221.211, 221.211, 229.404, 226.673, 223.942, 213.018, 213.018, 232.135, 234.866, 264.907, 286.755, 311.334, 395.995, 398.726, 404.188, 401.457, 409.650, 292.217, 286.755, 281.293, 264.907, 251.252, 229.404, 196.632, 196.632, 204.825, 210.287, 207.556, 204.825, 207.556, 215.749, 218.480, 218.480, 210.287, 207.556, 223.942, 221.211, 218.480, 221.211, 218.480, 218.480, 218.480, 210.287, 202.094, 202.094, 199.363, 210.287, 248.521, 300.410, 360.492, 385.071, 415.112, 415.112, 395.995, 292.217, 286.755, 281.293, 262.176, 251.252, 234.866, 199.363, 193.901, 199.363, 204.825, 204.825, 207.556, 207.556, 213.018, 218.480, 218.480, 218.480, 267.638, 218.480, 218.480, 223.942, 223.942, 218.480, 213.018, 207.556, 199.363, 193.901, 196.632, 193.901, 202.094, 218.480, 294.948, 324.989, 371.416, 431.498, 387.802, 374.147, 292.217, 284.024, 275.831, 264.907, 232.135, 237.597, 204.825, 191.170, 191.170, 202.094, 202.094, 204.825, 210.287, 213.018, 218.480, 223.942, 300.410, 319.527, 300.410, 213.018, 221.211, 226.673, 221.211, 213.018, 207.556, 199.363, 193.901, 188.439, 185.708, 193.901, 202.094, 259.445, 327.720, 376.878, 404.188, 390.533, 379.609 }; const size_t array_float1_size = sizeof(array_float1); const float array_float2[YSIZE * XSIZE] = { 210.287, 199.363, 207.556, 218.480, 215.749, 204.825, 223.942, 177.515, 169.322, 174.784, 161.129, 161.129, 166.591, 196.632, 191.170, 182.977, 177.515, 191.170, 193.901, 191.170, 185.708, 180.246, 177.515, 182.977, 180.246, 180.246, 180.246, 180.246, 180.246, 180.246, 180.246, 180.246, 180.246, 177.515, 172.053, 172.053, 169.322, 204.825, 193.901, 193.901, 215.749, 221.211, 204.825, 221.211, 199.363, 161.129, 177.515, 163.860, 163.860, 174.784, 199.363, 199.363, 185.708, 180.246, 191.170, 196.632, 193.901, 185.708, 180.246, 180.246, 182.977, 180.246, 180.246, 180.246, 182.977, 182.977, 182.977, 180.246, 182.977, 180.246, 174.784, 172.053, 172.053, 172.053, 207.556, 193.901, 180.246, 199.363, 221.211, 213.018, 218.480, 215.749, 161.129, 180.246, 163.860, 161.129, 169.322, 202.094, 202.094, 193.901, 182.977, 191.170, 199.363, 193.901, 185.708, 180.246, 177.515, 177.515, 180.246, 180.246, 182.977, 182.977, 182.977, 182.977, 182.977, 182.977, 180.246, 174.784, 174.784, 174.784, 174.784, 207.556, 196.632, 174.784, 185.708, 215.749, 221.211, 218.480, 218.480, 161.129, 185.708, 163.860, 161.129, 163.860, 204.825, 204.825, 199.363, 182.977, 185.708, 199.363, 196.632, 185.708, 180.246, 177.515, 172.053, 182.977, 182.977, 182.977, 182.977, 185.708, 182.977, 182.977, 180.246, 177.515, 174.784, 177.515, 177.515, 177.515, 215.749, 196.632, 172.053, 180.246, 199.363, 218.480, 226.673, 223.942, 163.860, 177.515, 166.591, 166.591, 163.860, 180.246, 204.825, 204.825, 177.515, 191.170, 199.363, 196.632, 185.708, 180.246, 177.515, 174.784, 185.708, 182.977, 185.708, 185.708, 185.708, 182.977, 182.977, 180.246, 177.515, 177.515, 177.515, 180.246, 177.515, 221.211, 199.363, 169.322, 177.515, 196.632, 202.094, 223.942, 232.135, 180.246, 161.129, 169.322, 163.860, 163.860, 172.053, 204.825, 207.556, 185.708, 188.439, 196.632, 196.632, 185.708, 180.246, 180.246, 177.515, 182.977, 185.708, 185.708, 185.708, 185.708, 185.708, 180.246, 180.246, 174.784, 180.246, 177.515, 180.246, 180.246, 229.404, 202.094, 174.784, 174.784, 191.170, 193.901, 213.018, 229.404, 191.170, 158.398, 163.860, 161.129, 161.129, 172.053, 204.825, 218.480, 199.363, 182.977, 196.632, 196.632, 185.708, 180.246, 180.246, 177.515, 180.246, 185.708, 185.708, 185.708, 185.708, 185.708, 180.246, 177.515, 177.515, 177.515, 180.246, 182.977, 185.708, 237.597, 221.211, 180.246, 172.053, 177.515, 185.708, 207.556, 207.556, 204.825, 161.129, 158.398, 161.129, 161.129, 163.860, 193.901, 251.252, 177.515, 174.784, 202.094, 196.632, 188.439, 182.977, 177.515, 177.515, 177.515, 185.708, 188.439, 185.708, 188.439, 182.977, 177.515, 177.515, 177.515, 177.515, 182.977, 185.708, 188.439, 234.866, 234.866, 199.363, 174.784, 169.322, 182.977, 204.825, 207.556, 191.170, 166.591, 158.398, 158.398, 161.129, 163.860, 221.211, 185.708, 161.129, 172.053, 202.094, 245.790, 270.369, 182.977, 177.515, 177.515, 174.784, 182.977, 185.708, 185.708, 185.708, 182.977, 177.515, 177.515, 180.246, 177.515, 180.246, 185.708, 185.708, 232.135, 232.135, 218.480, 180.246, 182.977, 182.977, 221.211, 202.094, 169.322, 172.053, 161.129, 158.398, 158.398, 163.860, 253.983, 166.591, 161.129, 161.129, 185.708, 314.065, 207.556, 182.977, 180.246, 174.784, 174.784, 180.246, 185.708, 185.708, 185.708, 180.246, 177.515, 177.515, 180.246, 177.515, 174.784, 177.515, 188.439, 245.790, 237.597, 226.673, 193.901, 202.094, 210.287, 226.673, 215.749, 172.053, 163.860, 161.129, 161.129, 158.398, 158.398, 245.790, 166.591, 161.129, 161.129, 182.977, 218.480, 193.901, 185.708, 180.246, 174.784, 172.053, 172.053, 185.708, 185.708, 185.708, 180.246, 177.515, 180.246, 182.977, 177.515, 174.784, 169.322, 237.597, 248.521, 251.252, 234.866, 207.556, 213.018, 221.211, 232.135, 223.942, 182.977, 161.129, 161.129, 161.129, 161.129, 163.860, 240.328, 196.632, 161.129, 163.860, 202.094, 218.480, 191.170, 182.977, 180.246, 174.784, 169.322, 163.860, 177.515, 185.708, 182.977, 180.246, 177.515, 182.977, 180.246, 174.784, 169.322, 161.129, 303.141, 229.404, 229.404, 237.597, 232.135, 237.597, 232.135, 229.404, 229.404, 196.632, 161.129, 161.129, 161.129, 161.129, 161.129, 199.363, 193.901, 169.322, 161.129, 273.100, 191.170, 191.170, 182.977, 180.246, 174.784, 163.860, 158.398, 158.398, 182.977, 185.708, 180.246, 177.515, 180.246, 174.784, 172.053, 161.129, 152.936, 357.761, 218.480, 245.790, 237.597, 226.673, 240.328, 243.059, 229.404, 226.673, 207.556, 174.784, 161.129, 161.129, 161.129, 158.398, 161.129, 264.907, 174.784, 169.322, 193.901, 185.708, 191.170, 199.363, 180.246, 172.053, 166.591, 158.398, 158.398, 169.322, 182.977, 180.246, 174.784, 177.515, 172.053, 172.053, 166.591, 155.667, 406.919, 234.866, 248.521, 251.252, 237.597, 232.135, 240.328, 226.673, 221.211, 213.018, 188.439, 166.591, 161.129, 161.129, 161.129, 161.129, 166.591, 226.673, 196.632, 182.977, 182.977, 188.439, 188.439, 180.246, 174.784, 166.591, 196.632, 152.936, 155.667, 174.784, 174.784, 174.784, 174.784, 177.515, 314.065, 409.650, 253.983, 412.381, 264.907, 243.059, 248.521, 251.252, 243.059, 240.328, 202.094, 218.480, 213.018, 193.901, 177.515, 161.129, 158.398, 161.129, 158.398, 161.129, 193.901, 196.632, 182.977, 191.170, 191.170, 188.439, 182.977, 174.784, 172.053, 180.246, 152.936, 147.474, 155.667, 161.129, 174.784, 237.597, 379.609, 442.422, 436.960, 349.568, 385.071, 256.714, 262.176, 264.907, 256.714, 243.059, 223.942, 193.901, 191.170, 207.556, 199.363, 182.977, 166.591, 161.129, 161.129, 158.398, 161.129, 166.591, 193.901, 182.977, 204.825, 191.170, 185.708, 191.170, 177.515, 172.053, 172.053, 161.129, 152.936, 147.474, 150.205, 245.790, 330.451, 406.919, 458.808, 376.878, 393.264, 428.767, 270.369, 273.100, 253.983, 253.983, 223.942, 218.480, 191.170, 169.322, 191.170, 196.632, 182.977, 172.053, 163.860, 163.860, 158.398, 158.398, 163.860, 185.708, 191.170, 191.170, 188.439, 185.708, 215.749, 185.708, 174.784, 169.322, 163.860, 161.129, 155.667, 155.667, 240.328, 327.720, 412.381, 442.422, 420.574, 406.919, 423.305, 281.293, 270.369, 259.445, 256.714, 229.404, 199.363, 182.977, 169.322, 177.515, 188.439, 182.977, 174.784, 172.053, 174.784, 172.053, 161.129, 163.860, 177.515, 193.901, 188.439, 188.439, 182.977, 213.018, 177.515, 172.053, 166.591, 161.129, 166.591, 163.860, 185.708, 273.100, 349.568, 423.305, 423.305, 415.112, 423.305, 447.884, 284.024, 278.562, 270.369, 259.445, 234.866, 202.094, 182.977, 166.591, 166.591, 180.246, 177.515, 172.053, 172.053, 174.784, 177.515, 172.053, 163.860, 172.053, 191.170, 188.439, 182.977, 182.977, 182.977, 177.515, 169.322, 163.860, 158.398, 155.667, 169.322, 158.398, 193.901, 319.527, 409.650, 420.574, 428.767, 423.305, 445.153, 284.024, 275.831, 270.369, 248.521, 229.404, 202.094, 161.129, 161.129, 169.322, 174.784, 172.053, 166.591, 169.322, 174.784, 174.784, 174.784, 166.591, 163.860, 188.439, 185.708, 182.977, 188.439, 182.977, 177.515, 169.322, 161.129, 158.398, 155.667, 155.667, 152.936, 161.129, 284.024, 374.147, 401.457, 434.229, 439.691, 431.498, 284.024, 275.831, 270.369, 245.790, 232.135, 210.287, 163.860, 155.667, 163.860, 169.322, 169.322, 169.322, 172.053, 174.784, 177.515, 177.515, 180.246, 273.100, 182.977, 182.977, 188.439, 188.439, 182.977, 177.515, 172.053, 163.860, 158.398, 152.936, 147.474, 150.205, 152.936, 210.287, 333.182, 387.802, 453.346, 428.767, 409.650, 284.024, 275.831, 264.907, 251.252, 210.287, 215.749, 174.784, 155.667, 155.667, 169.322, 169.322, 169.322, 174.784, 177.515, 180.246, 177.515, 314.065, 376.878, 352.299, 174.784, 185.708, 191.170, 185.708, 180.246, 174.784, 163.860, 158.398, 152.936, 144.743, 144.743, 152.936, 169.322, 314.065, 390.533, 428.767, 426.036, 434.229 }; const size_t array_float2_size = sizeof(array_float2); const double array_double1[YSIZE * XSIZE] = { 148.914762, 145.451628, 148.914762, 155.841030, 154.109463, 147.183195, 155.841030, 135.062226, 133.330659, 136.793793, 129.867525, 133.330659, 136.793793, 148.914762, 150.646329, 143.720061, 141.988494, 150.646329, 154.109463, 152.377896, 148.914762, 150.646329, 152.377896, 150.646329, 140.256927, 145.451628, 147.183195, 147.183195, 145.451628, 148.914762, 152.377896, 157.572597, 166.230432, 164.498865, 167.961999, 164.498865, 154.109463, 147.183195, 141.988494, 140.256927, 152.377896, 154.109463, 147.183195, 154.109463, 143.720061, 128.135958, 136.793793, 131.599092, 133.330659, 138.525360, 150.646329, 150.646329, 145.451628, 145.451628, 152.377896, 155.841030, 154.109463, 150.646329, 147.183195, 150.646329, 152.377896, 143.720061, 138.525360, 141.988494, 145.451628, 147.183195, 150.646329, 155.841030, 164.498865, 166.230432, 164.498865, 164.498865, 159.304164, 155.841030, 147.183195, 140.256927, 136.793793, 145.451628, 155.841030, 150.646329, 152.377896, 152.377896, 126.404391, 136.793793, 129.867525, 131.599092, 136.793793, 152.377896, 152.377896, 150.646329, 147.183195, 155.841030, 159.304164, 154.109463, 152.377896, 152.377896, 150.646329, 148.914762, 145.451628, 141.988494, 141.988494, 143.720061, 150.646329, 154.109463, 161.035731, 162.767298, 161.035731, 161.035731, 159.304164, 159.304164, 166.230432, 147.183195, 141.988494, 131.599092, 138.525360, 152.377896, 154.109463, 152.377896, 154.109463, 126.404391, 138.525360, 129.867525, 129.867525, 133.330659, 154.109463, 159.304164, 161.035731, 157.572597, 154.109463, 162.767298, 159.304164, 155.841030, 154.109463, 152.377896, 145.451628, 145.451628, 141.988494, 141.988494, 147.183195, 152.377896, 157.572597, 162.767298, 161.035731, 161.035731, 154.109463, 155.841030, 166.230432, 166.230432, 150.646329, 143.720061, 129.867525, 133.330659, 143.720061, 154.109463, 155.841030, 155.841030, 128.135958, 135.062226, 131.599092, 131.599092, 131.599092, 145.451628, 162.767298, 173.156700, 154.109463, 159.304164, 162.767298, 159.304164, 155.841030, 154.109463, 155.841030, 147.183195, 145.451628, 143.720061, 143.720061, 150.646329, 157.572597, 159.304164, 152.377896, 159.304164, 157.572597, 152.377896, 155.841030, 167.961999, 164.498865, 154.109463, 143.720061, 128.135958, 133.330659, 141.988494, 145.451628, 155.841030, 159.304164, 135.062226, 124.672824, 131.599092, 129.867525, 129.867525, 140.256927, 164.498865, 174.888267, 164.498865, 159.304164, 164.498865, 161.035731, 155.841030, 154.109463, 155.841030, 150.646329, 148.914762, 145.451628, 148.914762, 152.377896, 155.841030, 155.841030, 150.646329, 155.841030, 154.109463, 155.841030, 154.109463, 169.693566, 169.693566, 159.304164, 145.451628, 129.867525, 131.599092, 140.256927, 140.256927, 148.914762, 157.572597, 140.256927, 124.672824, 128.135958, 128.135958, 129.867525, 140.256927, 180.082968, 187.009236, 161.035731, 159.304164, 164.498865, 162.767298, 152.377896, 150.646329, 154.109463, 150.646329, 147.183195, 147.183195, 152.377896, 154.109463, 161.035731, 157.572597, 152.377896, 152.377896, 157.572597, 152.377896, 157.572597, 183.546102, 187.009236, 161.035731, 154.109463, 135.062226, 129.867525, 133.330659, 138.525360, 147.183195, 148.914762, 147.183195, 126.404391, 124.672824, 126.404391, 128.135958, 136.793793, 176.619834, 174.888267, 152.377896, 159.304164, 161.035731, 157.572597, 150.646329, 150.646329, 148.914762, 150.646329, 147.183195, 148.914762, 152.377896, 154.109463, 162.767298, 162.767298, 155.841030, 152.377896, 147.183195, 148.914762, 169.693566, 188.740803, 195.667071, 159.304164, 161.035731, 143.720061, 131.599092, 128.135958, 136.793793, 145.451628, 147.183195, 140.256927, 129.867525, 124.672824, 126.404391, 128.135958, 136.793793, 181.814535, 148.914762, 148.914762, 159.304164, 166.230432, 169.693566, 180.082968, 148.914762, 147.183195, 147.183195, 147.183195, 152.377896, 155.841030, 155.841030, 161.035731, 159.304164, 152.377896, 150.646329, 148.914762, 154.109463, 167.961999, 190.472370, 188.740803, 159.304164, 161.035731, 154.109463, 135.062226, 136.793793, 135.062226, 154.109463, 145.451628, 129.867525, 131.599092, 126.404391, 124.672824, 126.404391, 135.062226, 181.814535, 143.720061, 141.988494, 152.377896, 143.720061, 185.277669, 164.498865, 145.451628, 147.183195, 145.451628, 148.914762, 150.646329, 155.841030, 157.572597, 159.304164, 155.841030, 152.377896, 150.646329, 154.109463, 155.841030, 157.572597, 171.425133, 185.277669, 166.230432, 162.767298, 157.572597, 141.988494, 145.451628, 148.914762, 157.572597, 150.646329, 129.867525, 128.135958, 126.404391, 126.404391, 126.404391, 133.330659, 174.888267, 148.914762, 143.720061, 154.109463, 159.304164, 171.425133, 169.693566, 148.914762, 148.914762, 150.646329, 143.720061, 145.451628, 154.109463, 154.109463, 159.304164, 159.304164, 159.304164, 166.230432, 166.230432, 150.646329, 157.572597, 155.841030, 169.693566, 166.230432, 167.961999, 162.767298, 150.646329, 152.377896, 154.109463, 159.304164, 155.841030, 136.793793, 124.672824, 126.404391, 126.404391, 128.135958, 133.330659, 173.156700, 159.304164, 145.451628, 148.914762, 169.693566, 173.156700, 159.304164, 150.646329, 152.377896, 152.377896, 145.451628, 143.720061, 150.646329, 154.109463, 157.572597, 162.767298, 162.767298, 166.230432, 161.035731, 150.646329, 150.646329, 145.451628, 188.740803, 161.035731, 159.304164, 164.498865, 159.304164, 162.767298, 161.035731, 159.304164, 157.572597, 141.988494, 124.672824, 126.404391, 128.135958, 128.135958, 131.599092, 164.498865, 154.109463, 147.183195, 145.451628, 176.619834, 154.109463, 147.183195, 152.377896, 162.767298, 148.914762, 141.988494, 143.720061, 141.988494, 157.572597, 162.767298, 167.961999, 155.841030, 159.304164, 147.183195, 155.841030, 147.183195, 136.793793, 216.445875, 154.109463, 166.230432, 162.767298, 155.841030, 162.767298, 164.498865, 157.572597, 157.572597, 147.183195, 131.599092, 124.672824, 126.404391, 128.135958, 129.867525, 152.377896, 173.156700, 143.720061, 145.451628, 145.451628, 143.720061, 147.183195, 152.377896, 155.841030, 147.183195, 145.451628, 143.720061, 145.451628, 152.377896, 159.304164, 161.035731, 155.841030, 154.109463, 145.451628, 155.841030, 162.767298, 136.793793, 240.687813, 161.035731, 167.961999, 167.961999, 161.035731, 159.304164, 164.498865, 157.572597, 155.841030, 150.646329, 140.256927, 128.135958, 126.404391, 126.404391, 128.135958, 147.183195, 167.961999, 164.498865, 164.498865, 154.109463, 148.914762, 148.914762, 159.304164, 150.646329, 147.183195, 145.451628, 155.841030, 148.914762, 147.183195, 157.572597, 150.646329, 150.646329, 148.914762, 161.035731, 214.714308, 242.419380, 183.546102, 247.614081, 174.888267, 164.498865, 167.961999, 167.961999, 166.230432, 164.498865, 145.451628, 152.377896, 150.646329, 141.988494, 135.062226, 126.404391, 126.404391, 128.135958, 141.988494, 159.304164, 180.082968, 164.498865, 152.377896, 154.109463, 150.646329, 154.109463, 148.914762, 147.183195, 148.914762, 150.646329, 150.646329, 140.256927, 140.256927, 143.720061, 157.572597, 183.546102, 226.835277, 264.929751, 261.466617, 212.982741, 230.298411, 171.425133, 174.888267, 176.619834, 171.425133, 166.230432, 155.841030, 143.720061, 141.988494, 147.183195, 145.451628, 136.793793, 131.599092, 128.135958, 128.135958, 135.062226, 140.256927, 154.109463, 166.230432, 155.841030, 161.035731, 152.377896, 152.377896, 148.914762, 152.377896, 154.109463, 164.498865, 154.109463, 141.988494, 140.256927, 147.183195, 180.082968, 204.324906, 244.150947, 277.050720, 223.372143, 237.224679, 254.540349, 178.351401, 180.082968, 169.693566, 171.425133, 155.841030, 152.377896, 140.256927, 131.599092, 140.256927, 143.720061, 136.793793, 133.330659, 129.867525, 129.867525, 129.867525, 131.599092, 138.525360, 155.841030, 162.767298, 150.646329, 148.914762, 150.646329, 159.304164, 147.183195, 147.183195, 147.183195, 150.646329, 150.646329, 154.109463, 157.572597, 193.935504, 199.130205, 251.077215, 266.661318, 251.077215, 244.150947, 254.540349, 183.546102, 178.351401, 173.156700, 171.425133, 159.304164, 141.988494, 135.062226, 129.867525, 135.062226, 140.256927, 136.793793, 133.330659, 133.330659, 135.062226, 135.062226, 131.599092, 133.330659, 140.256927, 154.109463, 150.646329, 145.451628, 145.451628, 155.841030, 148.914762, 147.183195, 145.451628, 138.525360, 147.183195, 167.961999, 180.082968, 206.056473, 206.056473, 258.003483, 254.540349, 249.345648, 252.808782, 263.198184, 185.277669, 181.814535, 178.351401, 173.156700, 161.035731, 143.720061, 135.062226, 128.135958, 128.135958, 136.793793, 135.062226, 133.330659, 131.599092, 135.062226, 138.525360, 136.793793, 131.599092, 135.062226, 143.720061, 145.451628, 140.256927, 140.256927, 145.451628, 143.720061, 141.988494, 135.062226, 135.062226, 147.183195, 148.914762, 167.961999, 181.814535, 197.398638, 251.077215, 252.808782, 256.271916, 254.540349, 259.735050, 185.277669, 181.814535, 178.351401, 167.961999, 159.304164, 145.451628, 124.672824, 124.672824, 129.867525, 133.330659, 131.599092, 129.867525, 131.599092, 136.793793, 138.525360, 138.525360, 133.330659, 131.599092, 141.988494, 140.256927, 138.525360, 140.256927, 138.525360, 138.525360, 138.525360, 133.330659, 128.135958, 128.135958, 126.404391, 133.330659, 157.572597, 190.472370, 228.566844, 244.150947, 263.198184, 263.198184, 251.077215, 185.277669, 181.814535, 178.351401, 166.230432, 159.304164, 148.914762, 126.404391, 122.941257, 126.404391, 129.867525, 129.867525, 131.599092, 131.599092, 135.062226, 138.525360, 138.525360, 138.525360, 169.693566, 138.525360, 138.525360, 141.988494, 141.988494, 138.525360, 135.062226, 131.599092, 126.404391, 122.941257, 124.672824, 122.941257, 128.135958, 138.525360, 187.009236, 206.056473, 235.493112, 273.587586, 245.882514, 237.224679, 185.277669, 180.082968, 174.888267, 167.961999, 147.183195, 150.646329, 129.867525, 121.209690, 121.209690, 128.135958, 128.135958, 129.867525, 133.330659, 135.062226, 138.525360, 141.988494, 190.472370, 202.593339, 190.472370, 135.062226, 140.256927, 143.720061, 140.256927, 135.062226, 131.599092, 126.404391, 122.941257, 119.478123, 117.746556, 122.941257, 128.135958, 164.498865, 207.788040, 238.956246, 256.271916, 247.614081, 240.687813 }; const size_t array_double1_size = sizeof(array_double1); const double array_double2[YSIZE * XSIZE] = { 133.330659, 126.404391, 131.599092, 138.525360, 136.793793, 129.867525, 141.988494, 112.551855, 107.357154, 110.820288, 102.162453, 102.162453, 105.625587, 124.672824, 121.209690, 116.014989, 112.551855, 121.209690, 122.941257, 121.209690, 117.746556, 114.283422, 112.551855, 116.014989, 114.283422, 114.283422, 114.283422, 114.283422, 114.283422, 114.283422, 114.283422, 114.283422, 114.283422, 112.551855, 109.088721, 109.088721, 107.357154, 129.867525, 122.941257, 122.941257, 136.793793, 140.256927, 129.867525, 140.256927, 126.404391, 102.162453, 112.551855, 103.894020, 103.894020, 110.820288, 126.404391, 126.404391, 117.746556, 114.283422, 121.209690, 124.672824, 122.941257, 117.746556, 114.283422, 114.283422, 116.014989, 114.283422, 114.283422, 114.283422, 116.014989, 116.014989, 116.014989, 114.283422, 116.014989, 114.283422, 110.820288, 109.088721, 109.088721, 109.088721, 131.599092, 122.941257, 114.283422, 126.404391, 140.256927, 135.062226, 138.525360, 136.793793, 102.162453, 114.283422, 103.894020, 102.162453, 107.357154, 128.135958, 128.135958, 122.941257, 116.014989, 121.209690, 126.404391, 122.941257, 117.746556, 114.283422, 112.551855, 112.551855, 114.283422, 114.283422, 116.014989, 116.014989, 116.014989, 116.014989, 116.014989, 116.014989, 114.283422, 110.820288, 110.820288, 110.820288, 110.820288, 131.599092, 124.672824, 110.820288, 117.746556, 136.793793, 140.256927, 138.525360, 138.525360, 102.162453, 117.746556, 103.894020, 102.162453, 103.894020, 129.867525, 129.867525, 126.404391, 116.014989, 117.746556, 126.404391, 124.672824, 117.746556, 114.283422, 112.551855, 109.088721, 116.014989, 116.014989, 116.014989, 116.014989, 117.746556, 116.014989, 116.014989, 114.283422, 112.551855, 110.820288, 112.551855, 112.551855, 112.551855, 136.793793, 124.672824, 109.088721, 114.283422, 126.404391, 138.525360, 143.720061, 141.988494, 103.894020, 112.551855, 105.625587, 105.625587, 103.894020, 114.283422, 129.867525, 129.867525, 112.551855, 121.209690, 126.404391, 124.672824, 117.746556, 114.283422, 112.551855, 110.820288, 117.746556, 116.014989, 117.746556, 117.746556, 117.746556, 116.014989, 116.014989, 114.283422, 112.551855, 112.551855, 112.551855, 114.283422, 112.551855, 140.256927, 126.404391, 107.357154, 112.551855, 124.672824, 128.135958, 141.988494, 147.183195, 114.283422, 102.162453, 107.357154, 103.894020, 103.894020, 109.088721, 129.867525, 131.599092, 117.746556, 119.478123, 124.672824, 124.672824, 117.746556, 114.283422, 114.283422, 112.551855, 116.014989, 117.746556, 117.746556, 117.746556, 117.746556, 117.746556, 114.283422, 114.283422, 110.820288, 114.283422, 112.551855, 114.283422, 114.283422, 145.451628, 128.135958, 110.820288, 110.820288, 121.209690, 122.941257, 135.062226, 145.451628, 121.209690, 100.430886, 103.894020, 102.162453, 102.162453, 109.088721, 129.867525, 138.525360, 126.404391, 116.014989, 124.672824, 124.672824, 117.746556, 114.283422, 114.283422, 112.551855, 114.283422, 117.746556, 117.746556, 117.746556, 117.746556, 117.746556, 114.283422, 112.551855, 112.551855, 112.551855, 114.283422, 116.014989, 117.746556, 150.646329, 140.256927, 114.283422, 109.088721, 112.551855, 117.746556, 131.599092, 131.599092, 129.867525, 102.162453, 100.430886, 102.162453, 102.162453, 103.894020, 122.941257, 159.304164, 112.551855, 110.820288, 128.135958, 124.672824, 119.478123, 116.014989, 112.551855, 112.551855, 112.551855, 117.746556, 119.478123, 117.746556, 119.478123, 116.014989, 112.551855, 112.551855, 112.551855, 112.551855, 116.014989, 117.746556, 119.478123, 148.914762, 148.914762, 126.404391, 110.820288, 107.357154, 116.014989, 129.867525, 131.599092, 121.209690, 105.625587, 100.430886, 100.430886, 102.162453, 103.894020, 140.256927, 117.746556, 102.162453, 109.088721, 128.135958, 155.841030, 171.425133, 116.014989, 112.551855, 112.551855, 110.820288, 116.014989, 117.746556, 117.746556, 117.746556, 116.014989, 112.551855, 112.551855, 114.283422, 112.551855, 114.283422, 117.746556, 117.746556, 147.183195, 147.183195, 138.525360, 114.283422, 116.014989, 116.014989, 140.256927, 128.135958, 107.357154, 109.088721, 102.162453, 100.430886, 100.430886, 103.894020, 161.035731, 105.625587, 102.162453, 102.162453, 117.746556, 199.130205, 131.599092, 116.014989, 114.283422, 110.820288, 110.820288, 114.283422, 117.746556, 117.746556, 117.746556, 114.283422, 112.551855, 112.551855, 114.283422, 112.551855, 110.820288, 112.551855, 119.478123, 155.841030, 150.646329, 143.720061, 122.941257, 128.135958, 133.330659, 143.720061, 136.793793, 109.088721, 103.894020, 102.162453, 102.162453, 100.430886, 100.430886, 155.841030, 105.625587, 102.162453, 102.162453, 116.014989, 138.525360, 122.941257, 117.746556, 114.283422, 110.820288, 109.088721, 109.088721, 117.746556, 117.746556, 117.746556, 114.283422, 112.551855, 114.283422, 116.014989, 112.551855, 110.820288, 107.357154, 150.646329, 157.572597, 159.304164, 148.914762, 131.599092, 135.062226, 140.256927, 147.183195, 141.988494, 116.014989, 102.162453, 102.162453, 102.162453, 102.162453, 103.894020, 152.377896, 124.672824, 102.162453, 103.894020, 128.135958, 138.525360, 121.209690, 116.014989, 114.283422, 110.820288, 107.357154, 103.894020, 112.551855, 117.746556, 116.014989, 114.283422, 112.551855, 116.014989, 114.283422, 110.820288, 107.357154, 102.162453, 192.203937, 145.451628, 145.451628, 150.646329, 147.183195, 150.646329, 147.183195, 145.451628, 145.451628, 124.672824, 102.162453, 102.162453, 102.162453, 102.162453, 102.162453, 126.404391, 122.941257, 107.357154, 102.162453, 173.156700, 121.209690, 121.209690, 116.014989, 114.283422, 110.820288, 103.894020, 100.430886, 100.430886, 116.014989, 117.746556, 114.283422, 112.551855, 114.283422, 110.820288, 109.088721, 102.162453, 96.967752, 226.835277, 138.525360, 155.841030, 150.646329, 143.720061, 152.377896, 154.109463, 145.451628, 143.720061, 131.599092, 110.820288, 102.162453, 102.162453, 102.162453, 100.430886, 102.162453, 167.961999, 110.820288, 107.357154, 122.941257, 117.746556, 121.209690, 126.404391, 114.283422, 109.088721, 105.625587, 100.430886, 100.430886, 107.357154, 116.014989, 114.283422, 110.820288, 112.551855, 109.088721, 109.088721, 105.625587, 98.699319, 258.003483, 148.914762, 157.572597, 159.304164, 150.646329, 147.183195, 152.377896, 143.720061, 140.256927, 135.062226, 119.478123, 105.625587, 102.162453, 102.162453, 102.162453, 102.162453, 105.625587, 143.720061, 124.672824, 116.014989, 116.014989, 119.478123, 119.478123, 114.283422, 110.820288, 105.625587, 124.672824, 96.967752, 98.699319, 110.820288, 110.820288, 110.820288, 110.820288, 112.551855, 199.130205, 259.735050, 161.035731, 261.466617, 167.961999, 154.109463, 157.572597, 159.304164, 154.109463, 152.377896, 128.135958, 138.525360, 135.062226, 122.941257, 112.551855, 102.162453, 100.430886, 102.162453, 100.430886, 102.162453, 122.941257, 124.672824, 116.014989, 121.209690, 121.209690, 119.478123, 116.014989, 110.820288, 109.088721, 114.283422, 96.967752, 93.504618, 98.699319, 102.162453, 110.820288, 150.646329, 240.687813, 280.513854, 277.050720, 221.640576, 244.150947, 162.767298, 166.230432, 167.961999, 162.767298, 154.109463, 141.988494, 122.941257, 121.209690, 131.599092, 126.404391, 116.014989, 105.625587, 102.162453, 102.162453, 100.430886, 102.162453, 105.625587, 122.941257, 116.014989, 129.867525, 121.209690, 117.746556, 121.209690, 112.551855, 109.088721, 109.088721, 102.162453, 96.967752, 93.504618, 95.236185, 155.841030, 209.519607, 258.003483, 290.903256, 238.956246, 249.345648, 271.856019, 171.425133, 173.156700, 161.035731, 161.035731, 141.988494, 138.525360, 121.209690, 107.357154, 121.209690, 124.672824, 116.014989, 109.088721, 103.894020, 103.894020, 100.430886, 100.430886, 103.894020, 117.746556, 121.209690, 121.209690, 119.478123, 117.746556, 136.793793, 117.746556, 110.820288, 107.357154, 103.894020, 102.162453, 98.699319, 98.699319, 152.377896, 207.788040, 261.466617, 280.513854, 266.661318, 258.003483, 268.392885, 178.351401, 171.425133, 164.498865, 162.767298, 145.451628, 126.404391, 116.014989, 107.357154, 112.551855, 119.478123, 116.014989, 110.820288, 109.088721, 110.820288, 109.088721, 102.162453, 103.894020, 112.551855, 122.941257, 119.478123, 119.478123, 116.014989, 135.062226, 112.551855, 109.088721, 105.625587, 102.162453, 105.625587, 103.894020, 117.746556, 173.156700, 221.640576, 268.392885, 268.392885, 263.198184, 268.392885, 283.976988, 180.082968, 176.619834, 171.425133, 164.498865, 148.914762, 128.135958, 116.014989, 105.625587, 105.625587, 114.283422, 112.551855, 109.088721, 109.088721, 110.820288, 112.551855, 109.088721, 103.894020, 109.088721, 121.209690, 119.478123, 116.014989, 116.014989, 116.014989, 112.551855, 107.357154, 103.894020, 100.430886, 98.699319, 107.357154, 100.430886, 122.941257, 202.593339, 259.735050, 266.661318, 271.856019, 268.392885, 282.245421, 180.082968, 174.888267, 171.425133, 157.572597, 145.451628, 128.135958, 102.162453, 102.162453, 107.357154, 110.820288, 109.088721, 105.625587, 107.357154, 110.820288, 110.820288, 110.820288, 105.625587, 103.894020, 119.478123, 117.746556, 116.014989, 119.478123, 116.014989, 112.551855, 107.357154, 102.162453, 100.430886, 98.699319, 98.699319, 96.967752, 102.162453, 180.082968, 237.224679, 254.540349, 275.319153, 278.782287, 273.587586, 180.082968, 174.888267, 171.425133, 155.841030, 147.183195, 133.330659, 103.894020, 98.699319, 103.894020, 107.357154, 107.357154, 107.357154, 109.088721, 110.820288, 112.551855, 112.551855, 114.283422, 173.156700, 116.014989, 116.014989, 119.478123, 119.478123, 116.014989, 112.551855, 109.088721, 103.894020, 100.430886, 96.967752, 93.504618, 95.236185, 96.967752, 133.330659, 211.251174, 245.882514, 287.440122, 271.856019, 259.735050, 180.082968, 174.888267, 167.961999, 159.304164, 133.330659, 136.793793, 110.820288, 98.699319, 98.699319, 107.357154, 107.357154, 107.357154, 110.820288, 112.551855, 114.283422, 112.551855, 199.130205, 238.956246, 223.372143, 110.820288, 117.746556, 121.209690, 117.746556, 114.283422, 110.820288, 103.894020, 100.430886, 96.967752, 91.773051, 91.773051, 96.967752, 107.357154, 199.130205, 247.614081, 271.856019, 270.124452, 275.319153 }; const size_t array_double2_size = sizeof(array_double2); /* vim: set ts=8 sts=8 sw=8 noet: */ tiff-4.0.3/test/tiff2ps-EPS1.sh0000755000212300117540000000030111550107141012755 00000000000000#!/bin/sh # # Basic sanity check for tiffps with PostScript Level 1 encapsulated output # . ${srcdir:-.}/common.sh f_test_stdout "${TIFF2PS} -e -1" "${IMG_MINISWHITE_1C_1B}" "o-tiff2ps-EPS1.ps"tiff-4.0.3/test/Makefile.in0000644000212300117540000021311412027361163012416 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ XFAIL_TESTS = check_PROGRAMS = ascii_tag$(EXEEXT) long_tag$(EXEEXT) \ short_tag$(EXEEXT) strip_rw$(EXEEXT) rewrite$(EXEEXT) \ raw_decode$(EXEEXT) custom_dir$(EXEEXT) subdir = test DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/mkinstalldirs \ $(top_srcdir)/config/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am_ascii_tag_OBJECTS = ascii_tag.$(OBJEXT) ascii_tag_OBJECTS = $(am_ascii_tag_OBJECTS) ascii_tag_DEPENDENCIES = $(LIBTIFF) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_custom_dir_OBJECTS = custom_dir.$(OBJEXT) custom_dir_OBJECTS = $(am_custom_dir_OBJECTS) custom_dir_DEPENDENCIES = $(LIBTIFF) am_long_tag_OBJECTS = long_tag.$(OBJEXT) check_tag.$(OBJEXT) long_tag_OBJECTS = $(am_long_tag_OBJECTS) long_tag_DEPENDENCIES = $(LIBTIFF) am_raw_decode_OBJECTS = raw_decode.$(OBJEXT) raw_decode_OBJECTS = $(am_raw_decode_OBJECTS) raw_decode_DEPENDENCIES = $(LIBTIFF) am_rewrite_OBJECTS = rewrite_tag.$(OBJEXT) rewrite_OBJECTS = $(am_rewrite_OBJECTS) rewrite_DEPENDENCIES = $(LIBTIFF) am_short_tag_OBJECTS = short_tag.$(OBJEXT) check_tag.$(OBJEXT) short_tag_OBJECTS = $(am_short_tag_OBJECTS) short_tag_DEPENDENCIES = $(LIBTIFF) am_strip_rw_OBJECTS = strip_rw.$(OBJEXT) strip.$(OBJEXT) \ test_arrays.$(OBJEXT) strip_rw_OBJECTS = $(am_strip_rw_OBJECTS) strip_rw_DEPENDENCIES = $(LIBTIFF) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/libtiff depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(ascii_tag_SOURCES) $(custom_dir_SOURCES) \ $(long_tag_SOURCES) $(raw_decode_SOURCES) $(rewrite_SOURCES) \ $(short_tag_SOURCES) $(strip_rw_SOURCES) DIST_SOURCES = $(ascii_tag_SOURCES) $(custom_dir_SOURCES) \ $(long_tag_SOURCES) $(raw_decode_SOURCES) $(rewrite_SOURCES) \ $(short_tag_SOURCES) $(strip_rw_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/config/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/config/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = 1.12 color-tests parallel-tests foreign LIBTIFF = $(top_builddir)/libtiff/libtiff.la # Environment parameters to be used during tests TESTS_ENVIRONMENT = \ MAKE="$(MAKE)" \ MAKEFLAGS="$(MAKEFLAGS)" \ MEMCHECK="$(MEMCHECK)" EXTRA_DIST = \ $(TESTSCRIPTS) \ $(IMAGES_EXTRA_DIST) \ common.sh # All of the tests to execute via 'make check' TESTS = $(check_PROGRAMS) $(TESTSCRIPTS) # Extra files which should be cleaned by 'make clean' CLEANFILES = test_packbits.tif o-* # Test scripts to execute TESTSCRIPTS = \ bmp2tiff_palette.sh \ bmp2tiff_rgb.sh \ gif2tiff.sh \ ppm2tiff_pbm.sh \ ppm2tiff_pgm.sh \ ppm2tiff_ppm.sh \ tiffcp-g3.sh \ tiffcp-g3-1d.sh \ tiffcp-g3-1d-fill.sh \ tiffcp-g3-2d.sh \ tiffcp-g3-2d-fill.sh \ tiffcp-g4.sh \ tiffcp-logluv.sh \ tiffcp-thumbnail.sh \ tiffdump.sh \ tiffinfo.sh \ tiffcp-split.sh \ tiffcp-split-join.sh \ tiff2ps-PS1.sh \ tiff2ps-PS2.sh \ tiff2ps-PS3.sh \ tiff2ps-EPS1.sh \ tiff2pdf.sh \ tiffcrop-doubleflip-logluv-3c-16b.sh \ tiffcrop-doubleflip-minisblack-1c-16b.sh \ tiffcrop-doubleflip-minisblack-1c-8b.sh \ tiffcrop-doubleflip-minisblack-2c-8b-alpha.sh \ tiffcrop-doubleflip-miniswhite-1c-1b.sh \ tiffcrop-doubleflip-palette-1c-1b.sh \ tiffcrop-doubleflip-palette-1c-4b.sh \ tiffcrop-doubleflip-palette-1c-8b.sh \ tiffcrop-doubleflip-rgb-3c-16b.sh \ tiffcrop-doubleflip-rgb-3c-8b.sh \ tiffcrop-extract-logluv-3c-16b.sh \ tiffcrop-extract-minisblack-1c-16b.sh \ tiffcrop-extract-minisblack-1c-8b.sh \ tiffcrop-extract-minisblack-2c-8b-alpha.sh \ tiffcrop-extract-miniswhite-1c-1b.sh \ tiffcrop-extract-palette-1c-1b.sh \ tiffcrop-extract-palette-1c-4b.sh \ tiffcrop-extract-palette-1c-8b.sh \ tiffcrop-extract-rgb-3c-16b.sh \ tiffcrop-extract-rgb-3c-8b.sh \ tiffcrop-extractz14-logluv-3c-16b.sh \ tiffcrop-extractz14-minisblack-1c-16b.sh \ tiffcrop-extractz14-minisblack-1c-8b.sh \ tiffcrop-extractz14-minisblack-2c-8b-alpha.sh \ tiffcrop-extractz14-miniswhite-1c-1b.sh \ tiffcrop-extractz14-palette-1c-1b.sh \ tiffcrop-extractz14-palette-1c-4b.sh \ tiffcrop-extractz14-palette-1c-8b.sh \ tiffcrop-extractz14-rgb-3c-16b.sh \ tiffcrop-extractz14-rgb-3c-8b.sh \ tiffcrop-R90-logluv-3c-16b.sh \ tiffcrop-R90-minisblack-1c-16b.sh \ tiffcrop-R90-minisblack-1c-8b.sh \ tiffcrop-R90-minisblack-2c-8b-alpha.sh \ tiffcrop-R90-miniswhite-1c-1b.sh \ tiffcrop-R90-palette-1c-1b.sh \ tiffcrop-R90-palette-1c-4b.sh \ tiffcrop-R90-palette-1c-8b.sh \ tiffcrop-R90-rgb-3c-16b.sh \ tiffcrop-R90-rgb-3c-8b.sh \ tiff2rgba-logluv-3c-16b.sh \ tiff2rgba-minisblack-1c-16b.sh \ tiff2rgba-minisblack-1c-8b.sh \ tiff2rgba-minisblack-2c-8b-alpha.sh \ tiff2rgba-miniswhite-1c-1b.sh \ tiff2rgba-palette-1c-1b.sh \ tiff2rgba-palette-1c-4b.sh \ tiff2rgba-palette-1c-8b.sh \ tiff2rgba-rgb-3c-16b.sh \ tiff2rgba-rgb-3c-8b.sh \ tiff2rgba-quad-tile.jpg.sh # This list should contain all of the TIFF files in the 'images' # subdirectory which are intended to be used as input images for # tests. All of these files should use the extension ".tiff". TIFFIMAGES = \ images/logluv-3c-16b.tiff \ images/minisblack-1c-16b.tiff \ images/minisblack-1c-8b.tiff \ images/minisblack-2c-8b-alpha.tiff \ images/miniswhite-1c-1b.tiff \ images/palette-1c-1b.tiff \ images/palette-1c-4b.tiff \ images/palette-1c-8b.tiff \ images/rgb-3c-16b.tiff \ images/rgb-3c-8b.tiff \ images/quad-tile.jpg.tiff BMPIMAGES = \ images/palette-1c-8b.bmp \ images/rgb-3c-8b.bmp GIFIMAGES = \ images/palette-1c-8b.gif PNMIMAGES = \ images/minisblack-1c-8b.pgm \ images/miniswhite-1c-1b.pbm \ images/rgb-3c-8b.ppm # This list should include all of the files in the 'images' # subdirectory which are intended to be distributed. This may include # files which are not currently used by the tests. IMAGES_EXTRA_DIST = \ images/README.txt \ $(BMPIMAGES) \ $(GIFIMAGES) \ $(PNMIMAGES) \ $(TIFFIMAGES) noinst_HEADERS = tifftest.h ascii_tag_SOURCES = ascii_tag.c ascii_tag_LDADD = $(LIBTIFF) long_tag_SOURCES = long_tag.c check_tag.c long_tag_LDADD = $(LIBTIFF) short_tag_SOURCES = short_tag.c check_tag.c short_tag_LDADD = $(LIBTIFF) strip_rw_SOURCES = strip_rw.c strip.c test_arrays.c test_arrays.h strip_rw_LDADD = $(LIBTIFF) rewrite_SOURCES = rewrite_tag.c rewrite_LDADD = $(LIBTIFF) raw_decode_SOURCES = raw_decode.c raw_decode_LDADD = $(LIBTIFF) custom_dir_SOURCES = custom_dir.c custom_dir_LDADD = $(LIBTIFF) AM_CPPFLAGS = -I$(top_srcdir)/libtiff all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign test/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list ascii_tag$(EXEEXT): $(ascii_tag_OBJECTS) $(ascii_tag_DEPENDENCIES) $(EXTRA_ascii_tag_DEPENDENCIES) @rm -f ascii_tag$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ascii_tag_OBJECTS) $(ascii_tag_LDADD) $(LIBS) custom_dir$(EXEEXT): $(custom_dir_OBJECTS) $(custom_dir_DEPENDENCIES) $(EXTRA_custom_dir_DEPENDENCIES) @rm -f custom_dir$(EXEEXT) $(AM_V_CCLD)$(LINK) $(custom_dir_OBJECTS) $(custom_dir_LDADD) $(LIBS) long_tag$(EXEEXT): $(long_tag_OBJECTS) $(long_tag_DEPENDENCIES) $(EXTRA_long_tag_DEPENDENCIES) @rm -f long_tag$(EXEEXT) $(AM_V_CCLD)$(LINK) $(long_tag_OBJECTS) $(long_tag_LDADD) $(LIBS) raw_decode$(EXEEXT): $(raw_decode_OBJECTS) $(raw_decode_DEPENDENCIES) $(EXTRA_raw_decode_DEPENDENCIES) @rm -f raw_decode$(EXEEXT) $(AM_V_CCLD)$(LINK) $(raw_decode_OBJECTS) $(raw_decode_LDADD) $(LIBS) rewrite$(EXEEXT): $(rewrite_OBJECTS) $(rewrite_DEPENDENCIES) $(EXTRA_rewrite_DEPENDENCIES) @rm -f rewrite$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rewrite_OBJECTS) $(rewrite_LDADD) $(LIBS) short_tag$(EXEEXT): $(short_tag_OBJECTS) $(short_tag_DEPENDENCIES) $(EXTRA_short_tag_DEPENDENCIES) @rm -f short_tag$(EXEEXT) $(AM_V_CCLD)$(LINK) $(short_tag_OBJECTS) $(short_tag_LDADD) $(LIBS) strip_rw$(EXEEXT): $(strip_rw_OBJECTS) $(strip_rw_DEPENDENCIES) $(EXTRA_strip_rw_DEPENDENCIES) @rm -f strip_rw$(EXEEXT) $(AM_V_CCLD)$(LINK) $(strip_rw_OBJECTS) $(strip_rw_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ascii_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/custom_dir.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/long_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/raw_decode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rewrite_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/short_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strip.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strip_rw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_arrays.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # exand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? ascii_tag.log: ascii_tag$(EXEEXT) @p='ascii_tag$(EXEEXT)'; \ b='ascii_tag'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) long_tag.log: long_tag$(EXEEXT) @p='long_tag$(EXEEXT)'; \ b='long_tag'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) short_tag.log: short_tag$(EXEEXT) @p='short_tag$(EXEEXT)'; \ b='short_tag'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) strip_rw.log: strip_rw$(EXEEXT) @p='strip_rw$(EXEEXT)'; \ b='strip_rw'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) rewrite.log: rewrite$(EXEEXT) @p='rewrite$(EXEEXT)'; \ b='rewrite'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) raw_decode.log: raw_decode$(EXEEXT) @p='raw_decode$(EXEEXT)'; \ b='raw_decode'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) custom_dir.log: custom_dir$(EXEEXT) @p='custom_dir$(EXEEXT)'; \ b='custom_dir'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) bmp2tiff_palette.sh.log: bmp2tiff_palette.sh @p='bmp2tiff_palette.sh'; \ b='bmp2tiff_palette.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) bmp2tiff_rgb.sh.log: bmp2tiff_rgb.sh @p='bmp2tiff_rgb.sh'; \ b='bmp2tiff_rgb.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) gif2tiff.sh.log: gif2tiff.sh @p='gif2tiff.sh'; \ b='gif2tiff.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ppm2tiff_pbm.sh.log: ppm2tiff_pbm.sh @p='ppm2tiff_pbm.sh'; \ b='ppm2tiff_pbm.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ppm2tiff_pgm.sh.log: ppm2tiff_pgm.sh @p='ppm2tiff_pgm.sh'; \ b='ppm2tiff_pgm.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ppm2tiff_ppm.sh.log: ppm2tiff_ppm.sh @p='ppm2tiff_ppm.sh'; \ b='ppm2tiff_ppm.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcp-g3.sh.log: tiffcp-g3.sh @p='tiffcp-g3.sh'; \ b='tiffcp-g3.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcp-g3-1d.sh.log: tiffcp-g3-1d.sh @p='tiffcp-g3-1d.sh'; \ b='tiffcp-g3-1d.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcp-g3-1d-fill.sh.log: tiffcp-g3-1d-fill.sh @p='tiffcp-g3-1d-fill.sh'; \ b='tiffcp-g3-1d-fill.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcp-g3-2d.sh.log: tiffcp-g3-2d.sh @p='tiffcp-g3-2d.sh'; \ b='tiffcp-g3-2d.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcp-g3-2d-fill.sh.log: tiffcp-g3-2d-fill.sh @p='tiffcp-g3-2d-fill.sh'; \ b='tiffcp-g3-2d-fill.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcp-g4.sh.log: tiffcp-g4.sh @p='tiffcp-g4.sh'; \ b='tiffcp-g4.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcp-logluv.sh.log: tiffcp-logluv.sh @p='tiffcp-logluv.sh'; \ b='tiffcp-logluv.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcp-thumbnail.sh.log: tiffcp-thumbnail.sh @p='tiffcp-thumbnail.sh'; \ b='tiffcp-thumbnail.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffdump.sh.log: tiffdump.sh @p='tiffdump.sh'; \ b='tiffdump.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffinfo.sh.log: tiffinfo.sh @p='tiffinfo.sh'; \ b='tiffinfo.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcp-split.sh.log: tiffcp-split.sh @p='tiffcp-split.sh'; \ b='tiffcp-split.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcp-split-join.sh.log: tiffcp-split-join.sh @p='tiffcp-split-join.sh'; \ b='tiffcp-split-join.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2ps-PS1.sh.log: tiff2ps-PS1.sh @p='tiff2ps-PS1.sh'; \ b='tiff2ps-PS1.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2ps-PS2.sh.log: tiff2ps-PS2.sh @p='tiff2ps-PS2.sh'; \ b='tiff2ps-PS2.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2ps-PS3.sh.log: tiff2ps-PS3.sh @p='tiff2ps-PS3.sh'; \ b='tiff2ps-PS3.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2ps-EPS1.sh.log: tiff2ps-EPS1.sh @p='tiff2ps-EPS1.sh'; \ b='tiff2ps-EPS1.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2pdf.sh.log: tiff2pdf.sh @p='tiff2pdf.sh'; \ b='tiff2pdf.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-doubleflip-logluv-3c-16b.sh.log: tiffcrop-doubleflip-logluv-3c-16b.sh @p='tiffcrop-doubleflip-logluv-3c-16b.sh'; \ b='tiffcrop-doubleflip-logluv-3c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-doubleflip-minisblack-1c-16b.sh.log: tiffcrop-doubleflip-minisblack-1c-16b.sh @p='tiffcrop-doubleflip-minisblack-1c-16b.sh'; \ b='tiffcrop-doubleflip-minisblack-1c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-doubleflip-minisblack-1c-8b.sh.log: tiffcrop-doubleflip-minisblack-1c-8b.sh @p='tiffcrop-doubleflip-minisblack-1c-8b.sh'; \ b='tiffcrop-doubleflip-minisblack-1c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-doubleflip-minisblack-2c-8b-alpha.sh.log: tiffcrop-doubleflip-minisblack-2c-8b-alpha.sh @p='tiffcrop-doubleflip-minisblack-2c-8b-alpha.sh'; \ b='tiffcrop-doubleflip-minisblack-2c-8b-alpha.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-doubleflip-miniswhite-1c-1b.sh.log: tiffcrop-doubleflip-miniswhite-1c-1b.sh @p='tiffcrop-doubleflip-miniswhite-1c-1b.sh'; \ b='tiffcrop-doubleflip-miniswhite-1c-1b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-doubleflip-palette-1c-1b.sh.log: tiffcrop-doubleflip-palette-1c-1b.sh @p='tiffcrop-doubleflip-palette-1c-1b.sh'; \ b='tiffcrop-doubleflip-palette-1c-1b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-doubleflip-palette-1c-4b.sh.log: tiffcrop-doubleflip-palette-1c-4b.sh @p='tiffcrop-doubleflip-palette-1c-4b.sh'; \ b='tiffcrop-doubleflip-palette-1c-4b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-doubleflip-palette-1c-8b.sh.log: tiffcrop-doubleflip-palette-1c-8b.sh @p='tiffcrop-doubleflip-palette-1c-8b.sh'; \ b='tiffcrop-doubleflip-palette-1c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-doubleflip-rgb-3c-16b.sh.log: tiffcrop-doubleflip-rgb-3c-16b.sh @p='tiffcrop-doubleflip-rgb-3c-16b.sh'; \ b='tiffcrop-doubleflip-rgb-3c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-doubleflip-rgb-3c-8b.sh.log: tiffcrop-doubleflip-rgb-3c-8b.sh @p='tiffcrop-doubleflip-rgb-3c-8b.sh'; \ b='tiffcrop-doubleflip-rgb-3c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extract-logluv-3c-16b.sh.log: tiffcrop-extract-logluv-3c-16b.sh @p='tiffcrop-extract-logluv-3c-16b.sh'; \ b='tiffcrop-extract-logluv-3c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extract-minisblack-1c-16b.sh.log: tiffcrop-extract-minisblack-1c-16b.sh @p='tiffcrop-extract-minisblack-1c-16b.sh'; \ b='tiffcrop-extract-minisblack-1c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extract-minisblack-1c-8b.sh.log: tiffcrop-extract-minisblack-1c-8b.sh @p='tiffcrop-extract-minisblack-1c-8b.sh'; \ b='tiffcrop-extract-minisblack-1c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extract-minisblack-2c-8b-alpha.sh.log: tiffcrop-extract-minisblack-2c-8b-alpha.sh @p='tiffcrop-extract-minisblack-2c-8b-alpha.sh'; \ b='tiffcrop-extract-minisblack-2c-8b-alpha.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extract-miniswhite-1c-1b.sh.log: tiffcrop-extract-miniswhite-1c-1b.sh @p='tiffcrop-extract-miniswhite-1c-1b.sh'; \ b='tiffcrop-extract-miniswhite-1c-1b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extract-palette-1c-1b.sh.log: tiffcrop-extract-palette-1c-1b.sh @p='tiffcrop-extract-palette-1c-1b.sh'; \ b='tiffcrop-extract-palette-1c-1b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extract-palette-1c-4b.sh.log: tiffcrop-extract-palette-1c-4b.sh @p='tiffcrop-extract-palette-1c-4b.sh'; \ b='tiffcrop-extract-palette-1c-4b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extract-palette-1c-8b.sh.log: tiffcrop-extract-palette-1c-8b.sh @p='tiffcrop-extract-palette-1c-8b.sh'; \ b='tiffcrop-extract-palette-1c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extract-rgb-3c-16b.sh.log: tiffcrop-extract-rgb-3c-16b.sh @p='tiffcrop-extract-rgb-3c-16b.sh'; \ b='tiffcrop-extract-rgb-3c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extract-rgb-3c-8b.sh.log: tiffcrop-extract-rgb-3c-8b.sh @p='tiffcrop-extract-rgb-3c-8b.sh'; \ b='tiffcrop-extract-rgb-3c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extractz14-logluv-3c-16b.sh.log: tiffcrop-extractz14-logluv-3c-16b.sh @p='tiffcrop-extractz14-logluv-3c-16b.sh'; \ b='tiffcrop-extractz14-logluv-3c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extractz14-minisblack-1c-16b.sh.log: tiffcrop-extractz14-minisblack-1c-16b.sh @p='tiffcrop-extractz14-minisblack-1c-16b.sh'; \ b='tiffcrop-extractz14-minisblack-1c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extractz14-minisblack-1c-8b.sh.log: tiffcrop-extractz14-minisblack-1c-8b.sh @p='tiffcrop-extractz14-minisblack-1c-8b.sh'; \ b='tiffcrop-extractz14-minisblack-1c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extractz14-minisblack-2c-8b-alpha.sh.log: tiffcrop-extractz14-minisblack-2c-8b-alpha.sh @p='tiffcrop-extractz14-minisblack-2c-8b-alpha.sh'; \ b='tiffcrop-extractz14-minisblack-2c-8b-alpha.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extractz14-miniswhite-1c-1b.sh.log: tiffcrop-extractz14-miniswhite-1c-1b.sh @p='tiffcrop-extractz14-miniswhite-1c-1b.sh'; \ b='tiffcrop-extractz14-miniswhite-1c-1b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extractz14-palette-1c-1b.sh.log: tiffcrop-extractz14-palette-1c-1b.sh @p='tiffcrop-extractz14-palette-1c-1b.sh'; \ b='tiffcrop-extractz14-palette-1c-1b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extractz14-palette-1c-4b.sh.log: tiffcrop-extractz14-palette-1c-4b.sh @p='tiffcrop-extractz14-palette-1c-4b.sh'; \ b='tiffcrop-extractz14-palette-1c-4b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extractz14-palette-1c-8b.sh.log: tiffcrop-extractz14-palette-1c-8b.sh @p='tiffcrop-extractz14-palette-1c-8b.sh'; \ b='tiffcrop-extractz14-palette-1c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extractz14-rgb-3c-16b.sh.log: tiffcrop-extractz14-rgb-3c-16b.sh @p='tiffcrop-extractz14-rgb-3c-16b.sh'; \ b='tiffcrop-extractz14-rgb-3c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-extractz14-rgb-3c-8b.sh.log: tiffcrop-extractz14-rgb-3c-8b.sh @p='tiffcrop-extractz14-rgb-3c-8b.sh'; \ b='tiffcrop-extractz14-rgb-3c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-R90-logluv-3c-16b.sh.log: tiffcrop-R90-logluv-3c-16b.sh @p='tiffcrop-R90-logluv-3c-16b.sh'; \ b='tiffcrop-R90-logluv-3c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-R90-minisblack-1c-16b.sh.log: tiffcrop-R90-minisblack-1c-16b.sh @p='tiffcrop-R90-minisblack-1c-16b.sh'; \ b='tiffcrop-R90-minisblack-1c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-R90-minisblack-1c-8b.sh.log: tiffcrop-R90-minisblack-1c-8b.sh @p='tiffcrop-R90-minisblack-1c-8b.sh'; \ b='tiffcrop-R90-minisblack-1c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-R90-minisblack-2c-8b-alpha.sh.log: tiffcrop-R90-minisblack-2c-8b-alpha.sh @p='tiffcrop-R90-minisblack-2c-8b-alpha.sh'; \ b='tiffcrop-R90-minisblack-2c-8b-alpha.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-R90-miniswhite-1c-1b.sh.log: tiffcrop-R90-miniswhite-1c-1b.sh @p='tiffcrop-R90-miniswhite-1c-1b.sh'; \ b='tiffcrop-R90-miniswhite-1c-1b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-R90-palette-1c-1b.sh.log: tiffcrop-R90-palette-1c-1b.sh @p='tiffcrop-R90-palette-1c-1b.sh'; \ b='tiffcrop-R90-palette-1c-1b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-R90-palette-1c-4b.sh.log: tiffcrop-R90-palette-1c-4b.sh @p='tiffcrop-R90-palette-1c-4b.sh'; \ b='tiffcrop-R90-palette-1c-4b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-R90-palette-1c-8b.sh.log: tiffcrop-R90-palette-1c-8b.sh @p='tiffcrop-R90-palette-1c-8b.sh'; \ b='tiffcrop-R90-palette-1c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-R90-rgb-3c-16b.sh.log: tiffcrop-R90-rgb-3c-16b.sh @p='tiffcrop-R90-rgb-3c-16b.sh'; \ b='tiffcrop-R90-rgb-3c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiffcrop-R90-rgb-3c-8b.sh.log: tiffcrop-R90-rgb-3c-8b.sh @p='tiffcrop-R90-rgb-3c-8b.sh'; \ b='tiffcrop-R90-rgb-3c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2rgba-logluv-3c-16b.sh.log: tiff2rgba-logluv-3c-16b.sh @p='tiff2rgba-logluv-3c-16b.sh'; \ b='tiff2rgba-logluv-3c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2rgba-minisblack-1c-16b.sh.log: tiff2rgba-minisblack-1c-16b.sh @p='tiff2rgba-minisblack-1c-16b.sh'; \ b='tiff2rgba-minisblack-1c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2rgba-minisblack-1c-8b.sh.log: tiff2rgba-minisblack-1c-8b.sh @p='tiff2rgba-minisblack-1c-8b.sh'; \ b='tiff2rgba-minisblack-1c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2rgba-minisblack-2c-8b-alpha.sh.log: tiff2rgba-minisblack-2c-8b-alpha.sh @p='tiff2rgba-minisblack-2c-8b-alpha.sh'; \ b='tiff2rgba-minisblack-2c-8b-alpha.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2rgba-miniswhite-1c-1b.sh.log: tiff2rgba-miniswhite-1c-1b.sh @p='tiff2rgba-miniswhite-1c-1b.sh'; \ b='tiff2rgba-miniswhite-1c-1b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2rgba-palette-1c-1b.sh.log: tiff2rgba-palette-1c-1b.sh @p='tiff2rgba-palette-1c-1b.sh'; \ b='tiff2rgba-palette-1c-1b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2rgba-palette-1c-4b.sh.log: tiff2rgba-palette-1c-4b.sh @p='tiff2rgba-palette-1c-4b.sh'; \ b='tiff2rgba-palette-1c-4b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2rgba-palette-1c-8b.sh.log: tiff2rgba-palette-1c-8b.sh @p='tiff2rgba-palette-1c-8b.sh'; \ b='tiff2rgba-palette-1c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2rgba-rgb-3c-16b.sh.log: tiff2rgba-rgb-3c-16b.sh @p='tiff2rgba-rgb-3c-16b.sh'; \ b='tiff2rgba-rgb-3c-16b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2rgba-rgb-3c-8b.sh.log: tiff2rgba-rgb-3c-8b.sh @p='tiff2rgba-rgb-3c-8b.sh'; \ b='tiff2rgba-rgb-3c-8b.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) tiff2rgba-quad-tile.jpg.sh.log: tiff2rgba-quad-tile.jpg.sh @p='tiff2rgba-quad-tile.jpg.sh'; \ b='tiff2rgba-quad-tile.jpg.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool cscopelist \ ctags distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags uninstall uninstall-am # memcheck: valgrind's memory access checker memcheck: $(MAKE) MEMCHECK='valgrind --tool=memcheck --leak-check=full --read-var-info=yes --track-origins=yes --num-callers=12 --quiet $(VALGRIND_EXTRA_OPTS)' check # ptrcheck: valgrind's experimental pointer checking tool. ptrcheck: $(MAKE) MEMCHECK='valgrind --tool=exp-ptrcheck --quiet $(VALGRIND_EXTRA_OPTS)' check generate-tiff2rgba-tests: for file in $(TIFFIMAGES) ; \ do \ base=`basename $$file .tiff` ; \ testscript=$(srcdir)/tiff2rgba-$$base.sh ; \ ( \ echo "#!/bin/sh" ; \ echo "# Generated file, master is Makefile.am" ; \ echo ". \$${srcdir:-.}/common.sh" ; \ echo "infile=\"\$$srcdir/$$file\"" ; \ echo "outfile=\"o-tiff2rgba-$$base.tiff\"" ; \ echo "f_test_convert \"\$$TIFF2RGBA\" \$$infile \$$outfile" ; \ echo "f_tiffinfo_validate \$$outfile" ; \ ) > $$testscript ; \ chmod +x $$testscript ; \ done # Test rotations generate-tiffcrop-R90-tests: for file in $(TIFFIMAGES) ; \ do \ base=`basename $$file .tiff` ; \ testscript=$(srcdir)/tiffcrop-R90-$$base.sh ; \ ( \ echo "#!/bin/sh" ; \ echo "# Generated file, master is Makefile.am" ; \ echo ". \$${srcdir:-.}/common.sh" ; \ echo "infile=\"\$$srcdir/$$file\"" ; \ echo "outfile=\"o-tiffcrop-R90-$$base.tiff\"" ; \ echo "f_test_convert \"\$$TIFFCROP -R90\" \$$infile \$$outfile" ; \ echo "f_tiffinfo_validate \$$outfile" ; \ ) > $$testscript ; \ chmod +x $$testscript ; \ done # Test flip (mirror) generate-tiffcrop-doubleflip-tests: for file in $(TIFFIMAGES) ; \ do \ base=`basename $$file .tiff` ; \ testscript=$(srcdir)/tiffcrop-doubleflip-$$base.sh ; \ ( \ echo "#!/bin/sh" ; \ echo "# Generated file, master is Makefile.am" ; \ echo ". \$${srcdir:-.}/common.sh" ; \ echo "infile=\"\$$srcdir/$$file\"" ; \ echo "outfile=\"o-tiffcrop-doubleflip-$$base.tiff\"" ; \ echo "f_test_convert \"\$$TIFFCROP -F both\" \$$infile \$$outfile" ; \ echo "f_tiffinfo_validate \$$outfile" ; \ ) > $$testscript ; \ chmod +x $$testscript ; \ done # Test extracting a section 100 pixels wide and 100 pixels high generate-tiffcrop-extract-tests: for file in $(TIFFIMAGES) ; \ do \ base=`basename $$file .tiff` ; \ testscript=$(srcdir)/tiffcrop-extract-$$base.sh ; \ ( \ echo "#!/bin/sh" ; \ echo "# Generated file, master is Makefile.am" ; \ echo ". \$${srcdir:-.}/common.sh" ; \ echo "infile=\"\$$srcdir/$$file\"" ; \ echo "outfile=\"o-tiffcrop-extract-$$base.tiff\"" ; \ echo "f_test_convert \"\$$TIFFCROP -U px -E top -X 60 -Y 60\" \$$infile \$$outfile" ; \ echo "f_tiffinfo_validate \$$outfile" ; \ ) > $$testscript ; \ chmod +x $$testscript ; \ done # Test extracting the first and fourth quarters from the left side. generate-tiffcrop-extractz14-tests: for file in $(TIFFIMAGES) ; \ do \ base=`basename $$file .tiff` ; \ testscript=$(srcdir)/tiffcrop-extractz14-$$base.sh ; \ ( \ echo "#!/bin/sh" ; \ echo "# Generated file, master is Makefile.am" ; \ echo ". \$${srcdir:-.}/common.sh" ; \ echo "infile=\"\$$srcdir/$$file\"" ; \ echo "outfile=\"o-tiffcrop-extractz14-$$base.tiff\"" ; \ echo "f_test_convert \"\$$TIFFCROP -E left -Z1:4,2:4\" \$$infile \$$outfile" ; \ echo "f_tiffinfo_validate \$$outfile" ; \ ) > $$testscript ; \ chmod +x $$testscript ; \ done generate-tiffcrop-tests: \ generate-tiffcrop-R90-tests \ generate-tiffcrop-doubleflip-tests \ generate-tiffcrop-extract-tests \ generate-tiffcrop-extractz14-tests generate-tests: \ generate-tiff2rgba-tests \ generate-tiffcrop-tests # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/test/tiffcrop-R90-rgb-3c-16b.sh0000755000212300117540000000035211244400052014522 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/rgb-3c-16b.tiff" outfile="o-tiffcrop-R90-rgb-3c-16b.tiff" f_test_convert "$TIFFCROP -R90" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-R90-palette-1c-4b.sh0000755000212300117540000000036011244400052015320 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-4b.tiff" outfile="o-tiffcrop-R90-palette-1c-4b.tiff" f_test_convert "$TIFFCROP -R90" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcp-g4.sh0000755000212300117540000000025011244341001012453 00000000000000#!/bin/sh # # Basic sanity check for tiffcp with G4 compression # . ${srcdir:-.}/common.sh f_test_convert "${TIFFCP} -c g4" "${IMG_MINISWHITE_1C_1B}" "o-tiffcp-g4.tiff"tiff-4.0.3/test/tiff2ps-PS2.sh0000755000212300117540000000026611550106773012675 00000000000000#!/bin/sh # # Basic sanity check for tiffps with PostScript Level 2 output # . ${srcdir:-.}/common.sh f_test_stdout "${TIFF2PS} -a -p -2" "${IMG_MINISWHITE_1C_1B}" "o-tiff2ps-PS2.ps"tiff-4.0.3/test/tiffcrop-doubleflip-minisblack-2c-8b-alpha.sh0000755000212300117540000000041411244400052020641 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/minisblack-2c-8b-alpha.tiff" outfile="o-tiffcrop-doubleflip-minisblack-2c-8b-alpha.tiff" f_test_convert "$TIFFCROP -F both" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcp-split-join.sh0000755000212300117540000000107111244341001014233 00000000000000#!/bin/sh # # Basic sanity check for tiffcp + tiffsplit + tiffcp # # First we use tiffcp to join our test files into a multi-frame TIFF # then we use tiffsplit to split them out again, and then we use # tiffcp to recombine again. . ${srcdir:-.}/common.sh conjoined=o-tiffcp-split-join-conjoined.tif reconjoined=o-tiffcp-split-join-reconjoined.tif splitfile=o-tiffcp-split-join-split- f_test_convert "${TIFFCP}" "${IMG_UNCOMPRESSED}" "${conjoined}" f_test_convert "${TIFFSPLIT}" "${conjoined}" "${splitfile}" f_test_convert "${TIFFCP}" "${splitfile}*" "${reconjoined}"tiff-4.0.3/test/tiffinfo.sh0000755000212300117540000000022111244330656012510 00000000000000#!/bin/sh # # Basic sanity check for tiffinfo. # . ${srcdir:-.}/common.sh f_test_reader "${TIFFINFO} -c -D -d -j -s " "${IMG_MINISBLACK_1C_16B}" tiff-4.0.3/test/tiff2rgba-palette-1c-4b.sh0000755000212300117540000000035111244400051015001 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-4b.tiff" outfile="o-tiff2rgba-palette-1c-4b.tiff" f_test_convert "$TIFF2RGBA" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extractz14-rgb-3c-8b.sh0000755000212300117540000000037411244400052016106 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/rgb-3c-8b.tiff" outfile="o-tiffcrop-extractz14-rgb-3c-8b.tiff" f_test_convert "$TIFFCROP -E left -Z1:4,2:4" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiffcrop-extractz14-palette-1c-4b.sh0000755000212300117540000000040411244400052016756 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/palette-1c-4b.tiff" outfile="o-tiffcrop-extractz14-palette-1c-4b.tiff" f_test_convert "$TIFFCROP -E left -Z1:4,2:4" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/check_tag.c0000644000212300117540000000467311011074065012427 00000000000000/* $Id: check_tag.c,v 1.3 2008/04/15 14:19:37 dron Exp $ */ /* * Copyright (c) 2004, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Helper testing routines. */ #include "tiffio.h" int CheckShortField(TIFF *tif, const ttag_t field, const uint16 value) { uint16 tmp = 123; if (!TIFFGetField(tif, field, &tmp)) { fprintf (stderr, "Problem fetching tag %lu.\n", (unsigned long) field); return -1; } if (tmp != value) { fprintf (stderr, "Wrong SHORT value fetched for tag %lu.\n", (unsigned long) field); return -1; } return 0; } int CheckShortPairedField(TIFF *tif, const ttag_t field, const uint16 *values) { uint16 tmp[2] = { 123, 456 }; if (!TIFFGetField(tif, field, tmp, tmp + 1)) { fprintf (stderr, "Problem fetching tag %lu.\n", (unsigned long) field); return -1; } if (tmp[0] != values[0] || tmp[1] != values[1]) { fprintf (stderr, "Wrong SHORT PAIR fetched for tag %lu.\n", (unsigned long) field); return -1; } return 0; } int CheckLongField(TIFF *tif, const ttag_t field, const uint32 value) { uint32 tmp = 123; if (!TIFFGetField(tif, field, &tmp)) { fprintf (stderr, "Problem fetching tag %lu.\n", (unsigned long) field); return -1; } if (tmp != value) { fprintf (stderr, "Wrong LONG value fetched for tag %lu.\n", (unsigned long) field); return -1; } return 0; } tiff-4.0.3/test/tiff2rgba-miniswhite-1c-1b.sh0000755000212300117540000000035711244400051015526 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/miniswhite-1c-1b.tiff" outfile="o-tiff2rgba-miniswhite-1c-1b.tiff" f_test_convert "$TIFF2RGBA" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiff2rgba-rgb-3c-16b.sh0000755000212300117540000000034311244400051014203 00000000000000#!/bin/sh # Generated file, master is Makefile.am . ${srcdir:-.}/common.sh infile="$srcdir/images/rgb-3c-16b.tiff" outfile="o-tiff2rgba-rgb-3c-16b.tiff" f_test_convert "$TIFF2RGBA" $infile $outfile f_tiffinfo_validate $outfile tiff-4.0.3/test/tiff2ps-PS3.sh0000755000212300117540000000026611550107001012657 00000000000000#!/bin/sh # # Basic sanity check for tiffps with PostScript Level 3 output # . ${srcdir:-.}/common.sh f_test_stdout "${TIFF2PS} -a -p -3" "${IMG_MINISWHITE_1C_1B}" "o-tiff2ps-PS3.ps"tiff-4.0.3/VERSION0000644000212300117540000000000612027361253010434 000000000000004.0.3 tiff-4.0.3/port/0000755000212300117540000000000012027361330010430 500000000000000tiff-4.0.3/port/libport.h0000644000212300117540000000334411273570075012212 00000000000000/* $Id: libport.h,v 1.2 2009-11-02 14:44:13 bfriesen Exp $ */ /* * Copyright (c) 2009 Frank Warmerdam * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _LIBPORT_ #define _LIBPORT_ int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int opterr; extern int optind; extern int optopt; int strcasecmp(const char *s1, const char *s2); #ifndef HAVE_GETOPT # define HAVE_GETOPT 1 #endif #if 0 unsigned long strtoul(const char *nptr, char **endptr, int base); #endif #if 0 void * lfind(const void *key, const void *base, size_t *nmemb, size_t size, int(*compar)(const void *, const void *)); #endif #endif /* ndef _LIBPORT_ */ tiff-4.0.3/port/Makefile.vc0000644000212300117540000000272210411004551012414 00000000000000# $Id: Makefile.vc,v 1.4 2006/03/23 14:54:02 dron Exp $ # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # # Makefile for MS Visual C and Watcom C compilers. # # To build: # C:\libtiff\port> nmake /f makefile.vc !INCLUDE ..\nmake.opt OBJ = \ strcasecmp.obj \ getopt.obj all: libport.lib libport.lib: $(OBJ) $(AR) /out:libport.lib $(OBJ) clean: -del *.obj -del *.lib tiff-4.0.3/port/Makefile.in0000644000212300117540000004511212027361163012424 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = port DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/mkinstalldirs getopt.c lfind.c \ strcasecmp.c strtoul.c strtoull.c ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libport_la_DEPENDENCIES = @LTLIBOBJS@ am_libport_la_OBJECTS = dummy.lo libport_la_OBJECTS = $(am_libport_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/libtiff depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libport_la_SOURCES) DIST_SOURCES = $(libport_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = Makefile.vc libport.h noinst_LTLIBRARIES = libport.la libport_la_SOURCES = dummy.c libport.h libport_la_LIBADD = @LTLIBOBJS@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign port/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign port/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libport.la: $(libport_la_OBJECTS) $(libport_la_DEPENDENCIES) $(EXTRA_libport_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libport_la_OBJECTS) $(libport_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lfind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strcasecmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtoul.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtoull.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf $(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf $(DEPDIR) ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/port/strtoull.c0000644000212300117540000000651310640232255012413 00000000000000/*- * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include #include /* * Convert a string to an unsigned long long integer. * * Assumes that the upper and lower case * alphabets and digits are each contiguous. */ unsigned long long strtoull(const char *nptr, char **endptr, int base) { const char *s; unsigned long long acc; char c; unsigned long long cutoff; int neg, any, cutlim; /* * See strtoq for comments as to the logic used. */ s = nptr; do { c = *s++; } while (isspace((unsigned char)c)); if (c == '-') { neg = 1; c = *s++; } else { neg = 0; if (c == '+') c = *s++; } if ((base == 0 || base == 16) && c == '0' && (*s == 'x' || *s == 'X') && ((s[1] >= '0' && s[1] <= '9') || (s[1] >= 'A' && s[1] <= 'F') || (s[1] >= 'a' && s[1] <= 'f'))) { c = s[1]; s += 2; base = 16; } if (base == 0) base = c == '0' ? 8 : 10; acc = any = 0; if (base < 2 || base > 36) goto noconv; cutoff = ULLONG_MAX / base; cutlim = ULLONG_MAX % base; for ( ; ; c = *s++) { if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'Z') c -= 'A' - 10; else if (c >= 'a' && c <= 'z') c -= 'a' - 10; else break; if (c >= base) break; if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) any = -1; else { any = 1; acc *= base; acc += c; } } if (any < 0) { acc = ULLONG_MAX; errno = ERANGE; } else if (!any) { noconv: errno = EINVAL; } else if (neg) acc = -acc; if (endptr != NULL) *endptr = (char *)(any ? s - 1 : nptr); return (acc); } tiff-4.0.3/port/lfind.c0000644000212300117540000000444210552750412011620 00000000000000/* $Id: lfind.c,v 1.4 2007/01/15 18:40:39 mloskot Exp $ */ /* * Copyright (c) 1989, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Roger L. Snyder. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if 0 static char sccsid[] = "@(#)lsearch.c 8.1 (Berkeley) 6/4/93"; __RCSID("$NetBSD: lsearch.c,v 1.2 2005/07/06 15:47:15 drochner Exp $"); #endif #ifdef _WIN32_WCE # include #else # include #endif #ifndef NULL # define NULL 0 #endif void * lfind(const void *key, const void *base, size_t *nmemb, size_t size, int(*compar)(const void *, const void *)) { char *element, *end; end = (char *)base + *nmemb * size; for (element = (char *)base; element < end; element += size) if (!compar(element, key)) /* key found */ return element; return NULL; } tiff-4.0.3/port/Makefile.am0000644000212300117540000000257111273567700012424 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. EXTRA_DIST = Makefile.vc libport.h noinst_LTLIBRARIES = libport.la libport_la_SOURCES = dummy.c libport.h libport_la_LIBADD = @LTLIBOBJS@ tiff-4.0.3/port/dummy.c0000644000212300117540000000030210634007171011644 00000000000000/* $Id: dummy.c,v 1.3 2007/03/21 14:54:16 dron Exp $ */ /* * Dummy function, just to be ensure that the library always will be created. */ void libport_dummy_function() { return; } tiff-4.0.3/port/strtoul.c0000644000212300117540000000622210276422321012234 00000000000000/* $Id: strtoul.c,v 1.2 2005/07/07 16:34:06 dron Exp $ */ /* * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if 0 static char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93"; __RCSID("$NetBSD: strtoul.c,v 1.16 2003/08/07 16:43:45 agc Exp $"); #endif #include #include #include #include /* * Convert a string to an unsigned long integer. * * Ignores `locale' stuff. Assumes that the upper and lower case * alphabets and digits are each contiguous. */ unsigned long strtoul(const char *nptr, char **endptr, int base) { const char *s; unsigned long acc, cutoff; int c; int neg, any, cutlim; /* * See strtol for comments as to the logic used. */ s = nptr; do { c = (unsigned char) *s++; } while (isspace(c)); if (c == '-') { neg = 1; c = *s++; } else { neg = 0; if (c == '+') c = *s++; } if ((base == 0 || base == 16) && c == '0' && (*s == 'x' || *s == 'X')) { c = s[1]; s += 2; base = 16; } if (base == 0) base = c == '0' ? 8 : 10; cutoff = ULONG_MAX / (unsigned long)base; cutlim = (int)(ULONG_MAX % (unsigned long)base); for (acc = 0, any = 0;; c = (unsigned char) *s++) { if (isdigit(c)) c -= '0'; else if (isalpha(c)) c -= isupper(c) ? 'A' - 10 : 'a' - 10; else break; if (c >= base) break; if (any < 0) continue; if (acc > cutoff || (acc == cutoff && c > cutlim)) { any = -1; acc = ULONG_MAX; errno = ERANGE; } else { any = 1; acc *= (unsigned long)base; acc += c; } } if (neg && any > 0) acc = -acc; if (endptr != 0) /* LINTED interface specification */ *endptr = (char *)(any ? s - 1 : nptr); return (acc); } tiff-4.0.3/port/strcasecmp.c0000644000212300117540000000413411140423202012652 00000000000000/* $Id: strcasecmp.c,v 1.3 2009-01-22 20:53:07 fwarmerdam Exp $ */ /* * Copyright (c) 1987, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if 0 static char sccsid[] = "@(#)strcasecmp.c 8.1 (Berkeley) 6/4/93"; __RCSID("$NetBSD: strcasecmp.c,v 1.16 2003/08/07 16:43:49 agc Exp $"); #endif #include #include #include "libport.h" int strcasecmp(const char *s1, const char *s2) { const unsigned char *us1 = (const unsigned char *)s1, *us2 = (const unsigned char *)s2; while (tolower(*us1) == tolower(*us2++)) if (*us1++ == '\0') return (0); return (tolower(*us1) - tolower(*--us2)); } tiff-4.0.3/port/getopt.c0000644000212300117540000000767711140423202012027 00000000000000/* $Id: getopt.c,v 1.3 2009-01-22 20:53:07 fwarmerdam Exp $ */ /* * Copyright (c) 1987, 1993, 1994 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if 0 static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; __RCSID("$NetBSD: getopt.c,v 1.26 2003/08/07 16:43:40 agc Exp $"); #endif #include #include #include "libport.h" int opterr = 1, /* if error message should be printed */ optind = 1, /* index into parent argv vector */ optopt, /* character checked for validity */ optreset; /* reset getopt */ char *optarg; /* argument associated with option */ #define BADCH (int)'?' #define BADARG (int)':' #define EMSG "" /* * getopt -- * Parse argc/argv argument vector. */ int getopt(int argc, char * const argv[], const char *optstring) { static char *place = EMSG; /* option letter processing */ char *oli; /* option letter list index */ if (optreset || *place == 0) { /* update scanning pointer */ optreset = 0; place = argv[optind]; if (optind >= argc || *place++ != '-') { /* Argument is absent or is not an option */ place = EMSG; return (-1); } optopt = *place++; if (optopt == '-' && *place == 0) { /* "--" => end of options */ ++optind; place = EMSG; return (-1); } if (optopt == 0) { /* Solitary '-', treat as a '-' option if the program (eg su) is looking for it. */ place = EMSG; if (strchr(optstring, '-') == NULL) return -1; optopt = '-'; } } else optopt = *place++; /* See if option letter is one the caller wanted... */ if (optopt == ':' || (oli = strchr(optstring, optopt)) == NULL) { if (*place == 0) ++optind; if (opterr && *optstring != ':') (void)fprintf(stderr, "unknown option -- %c\n", optopt); return (BADCH); } /* Does this option need an argument? */ if (oli[1] != ':') { /* don't need argument */ optarg = NULL; if (*place == 0) ++optind; } else { /* Option-argument is either the rest of this argument or the entire next argument. */ if (*place) optarg = place; else if (argc > ++optind) optarg = argv[optind]; else { /* option-argument absent */ place = EMSG; if (*optstring == ':') return (BADARG); if (opterr) (void)fprintf(stderr, "option requires an argument -- %c\n", optopt); return (BADCH); } place = EMSG; ++optind; } return (optopt); /* return option letter */ } tiff-4.0.3/Makefile.vc0000644000212300117540000000330110773042324011435 00000000000000# $Id: Makefile.vc,v 1.7 2008/01/01 15:53:10 fwarmerdam Exp $ # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # # Makefile for MS Visual C and Watcom C compilers. # Edit nmake.opt file if you want to ajust building options. # # To build: # C:\libtiff> nmake /f makefile.vc !INCLUDE nmake.opt all: port lib tools port:: cd port $(MAKE) /f Makefile.vc cd.. lib: port cd libtiff $(MAKE) /f Makefile.vc cd.. tools: lib cd tools $(MAKE) /f Makefile.vc cd .. clean: cd port $(MAKE) /f Makefile.vc clean cd.. cd libtiff $(MAKE) /f Makefile.vc clean cd.. cd tools $(MAKE) /f Makefile.vc clean cd .. tiff-4.0.3/build/0000755000212300117540000000000012027361330010543 500000000000000tiff-4.0.3/build/README0000644000212300117540000000016610570051725011353 00000000000000This directory contains scripts and tools needed to build libtiff library and its utilities in various environments. tiff-4.0.3/build/Makefile.am0000644000212300117540000000242011016026224012512 00000000000000# # Tag Image File Format (TIFF) Software # # Copyright (C) 2007, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. EXTRA_DIST = README SUBDIRS = tiff-4.0.3/build/Makefile.in0000644000212300117540000004711612027361162012544 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Tag Image File Format (TIFF) Software # # Copyright (C) 2007, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = build DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README SUBDIRS = all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign build/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign build/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ cscopelist cscopelist-recursive ctags ctags-recursive \ distclean distclean-generic distclean-libtool distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/configure.com0000644000212300117540000010735012005263021012045 00000000000000$! $Id: configure.com,v 1.3 2012-07-29 15:45:29 tgl Exp $ $! $! OpenVMS configure procedure for libtiff $! (c) Alexey Chupahin 22-NOV-2007 $! elvis_75@mail.ru $! $! Permission to use, copy, modify, distribute, and sell this software and $! its documentation for any purpose is hereby granted without fee, provided $! that (i) the above copyright notices and this permission notice appear in $! all copies of the software and related documentation, and (ii) the names of $! Sam Leffler and Silicon Graphics may not be used in any advertising or $! publicity relating to the software without the specific, prior written $! permission of Sam Leffler and Silicon Graphics. $! $! THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, $! EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY $! WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. $! $! IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR $! ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, $! OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, $! WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF $! LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE $! OF THIS SOFTWARE. $! $! $ SET NOON $WRITE SYS$OUTPUT " " $WRITE SYS$OUTPUT "Configuring libTIFF library" $WRITE SYS$OUTPUT " " $! Checking architecture $DECC = F$SEARCH("SYS$SYSTEM:DECC$COMPILER.EXE") .NES. "" $IF (.NOT. DECC) THEN $WRITE SYS$OUTPUT "BAD compiler" GOTO EXIT $ IF F$GETSYI("ARCH_TYPE").EQ.1 THEN CPU = "VAX" $ IF F$GETSYI("ARCH_TYPE").EQ.2 THEN CPU = "Alpha" $ IF F$GETSYI("ARCH_TYPE").EQ.3 THEN CPU = "I64" $ OS = F$GETSYI("VERSION") $WRITE SYS$OUTPUT "Checking architecture ... ", CPU $WRITE SYS$OUTPUT "Checking OS ... OpenVMS ",OS $SHARED=0 $IF ( (CPU.EQS."Alpha").OR.(CPU.EQS."I64") ) $ THEN $ SHARED=64 $ ELSE $ SHARED=32 $ENDIF $MMS = F$SEARCH("SYS$SYSTEM:MMS.EXE") .NES. "" $MMK = F$TYPE(MMK) $IF (MMS .OR. MMK.NES."") THEN GOTO TEST_LIBRARIES $! I cant find any make tool $GOTO EXIT $! $! $TEST_LIBRARIES: $! Setting as MAKE utility one of MMS or MMK. I prefer MMS. $IF (MMK.NES."") THEN MAKE="MMK" $IF (MMS) THEN MAKE="MMS" $WRITE SYS$OUTPUT "Checking build utility ... ''MAKE'" $WRITE SYS$OUTPUT " " $! $! $IF (P1.EQS."STATIC").OR.(P1.EQS."static") THEN SHARED=0 $! $! $!"Checking for strcasecmp " $ DEFINE SYS$ERROR _NLA0: $ DEFINE SYS$OUTPUT _NLA0: $ CC/OBJECT=TEST.OBJ/INCLUDE=(ZLIB) SYS$INPUT #include #include int main() { if (strcasecmp("bla", "Bla")==0) exit(0); else exit(2); } $! $TMP = $STATUS $DEASS SYS$ERROR $DEAS SYS$OUTPUT $IF (TMP .NE. %X10B90001) $ THEN $ HAVE_STRCASECMP=0 $ GOTO NEXT1 $ENDIF $DEFINE SYS$ERROR _NLA0: $DEFINE SYS$OUTPUT _NLA0: $LINK/EXE=TEST TEST $TMP = $STATUS $DEAS SYS$ERROR $DEAS SYS$OUTPUT $!WRITE SYS$OUTPUT TMP $IF (TMP .NE. %X10000001) $ THEN $ HAVE_STRCASECMP=0 $ GOTO NEXT1 $ENDIF $! $DEFINE SYS$ERROR _NLA0: $DEFINE SYS$OUTPUT _NLA0: $RUN TEST $IF ($STATUS .NE. %X00000001) $ THEN $ HAVE_STRCASECMP=0 $ ELSE $ HAVE_STRCASECMP=1 $ENDIF $DEAS SYS$ERROR $DEAS SYS$OUTPUT $NEXT1: $IF (HAVE_STRCASECMP.EQ.1) $ THEN $ WRITE SYS$OUTPUT "Checking for strcasecmp ... Yes" $ ELSE $ WRITE SYS$OUTPUT "Checking for strcasecmp ... No" $ENDIF $! $! $!"Checking for lfind " $ DEFINE SYS$ERROR _NLA0: $ DEFINE SYS$OUTPUT _NLA0: $ CC/OBJECT=TEST.OBJ/INCLUDE=(ZLIB) SYS$INPUT #include int main() { lfind((const void *)key, (const void *)NULL, (size_t *)NULL, (size_t) 0, NULL); } $! $TMP = $STATUS $DEASS SYS$ERROR $DEAS SYS$OUTPUT $IF (TMP .NE. %X10B90001) $ THEN $ HAVE_LFIND=0 $ GOTO NEXT2 $ENDIF $DEFINE SYS$ERROR _NLA0: $DEFINE SYS$OUTPUT _NLA0: $LINK/EXE=TEST TEST $TMP = $STATUS $DEAS SYS$ERROR $DEAS SYS$OUTPUT $!WRITE SYS$OUTPUT TMP $IF (TMP .NE. %X10000001) $ THEN $ HAVE_LFIND=0 $ GOTO NEXT2 $ ELSE $ HAVE_LFIND=1 $ENDIF $! $NEXT2: $IF (HAVE_LFIND.EQ.1) $ THEN $ WRITE SYS$OUTPUT "Checking for lfind ... Yes" $ ELSE $ WRITE SYS$OUTPUT "Checking for lfind ... No" $ENDIF $! $! $!"Checking for correct zlib library " $ DEFINE SYS$ERROR _NLA0: $ DEFINE SYS$OUTPUT _NLA0: $ CC/OBJECT=TEST.OBJ/INCLUDE=(ZLIB) SYS$INPUT #include #include #include int main() { printf("checking version zlib: %s\n",zlibVersion()); } $TMP = $STATUS $DEASS SYS$ERROR $DEAS SYS$OUTPUT $!WRITE SYS$OUTPUT TMP $IF (TMP .NE. %X10B90001) $ THEN $ HAVE_ZLIB=0 $ GOTO EXIT $ENDIF $DEFINE SYS$ERROR _NLA0: $DEFINE SYS$OUTPUT _NLA0: $LINK/EXE=TEST TEST,ZLIB:LIBZ/LIB $TMP = $STATUS $DEAS SYS$ERROR $DEAS SYS$OUTPUT $!WRITE SYS$OUTPUT TMP $IF (TMP .NE. %X10000001) $ THEN $ HAVE_ZLIB=0 $ GOTO EXIT $ ELSE $ HAVE_ZLIB=1 $ENDIF $IF (HAVE_ZLIB.EQ.1) $ THEN $ WRITE SYS$OUTPUT "Checking for correct zlib library ... Yes" $ ELSE $ WRITE SYS$OUTPUT "Checking for correct zlib library ... No" $ WRITE SYS$OUTPUT "This is fatal. Please download and install good library from fafner.dyndns.org/~alexey/libsdl/public.html" $ENDIF $RUN TEST $! $DEL TEST.OBJ;* $! Checking for JPEG ... $ DEFINE SYS$ERROR _NLA0: $ DEFINE SYS$OUTPUT _NLA0: $ CC/OBJECT=TEST.OBJ/INCLUDE=(JPEG) SYS$INPUT #include #include #include #include int main() { printf("checking version jpeg: %s\n",JVERSION); jpeg_quality_scaling(0); return 0; } $TMP = $STATUS $DEASS SYS$ERROR $DEAS SYS$OUTPUT $!WRITE SYS$OUTPUT TMP $IF (TMP .NE. %X10B90001) $ THEN $ WRITE SYS$OUTPUT "Checking for static jpeg library ... No" $ HAVE_JPEG=0 $ENDIF $DEFINE SYS$ERROR _NLA0: $DEFINE SYS$OUTPUT _NLA0: $LINK/EXE=TEST TEST,JPEG:LIBJPEG/LIB $TMP = $STATUS $DEAS SYS$ERROR $DEAS SYS$OUTPUT $!WRITE SYS$OUTPUT TMP $IF (TMP .NE. %X10000001) $ THEN $ HAVE_JPEG=0 $ ELSE $ HAVE_JPEG=1 $ENDIF $IF (HAVE_JPEG.EQ.1) $ THEN $ WRITE SYS$OUTPUT "Checking for static jpeg library ... Yes" $ JPEG_LIBRARY_PATH="JPEG:LIBJPEG/LIB" $ RUN TEST $ ELSE $ WRITE SYS$OUTPUT "Checking for static jpeg library ... No" $ENDIF $! $!"Checking for SHARED JPEG library " $OPEN/WRITE OUT TEST.OPT $WRITE OUT "SYS$SHARE:LIBJPEG$SHR/SHARE" $WRITE OUT "ZLIB:LIBZ/LIB" $CLOSE OUT $DEFINE SYS$ERROR _NLA0: $DEFINE SYS$OUTPUT _NLA0: $LINK/EXE=TEST TEST,TEST/OPT $TMP = $STATUS $DEAS SYS$ERROR $DEAS SYS$OUTPUT $!WRITE SYS$OUTPUT TMP $IF (TMP .NE. %X10000001) $ THEN $ HAVE_JPEG_SHARED=0 $ ELSE $ HAVE_JPEG_SHARED=1 $ENDIF $IF (HAVE_JPEG_SHARED.EQ.1) $ THEN $ WRITE SYS$OUTPUT "Checking for shared jpeg library ... Yes" $ JPEG_LIBRARY_PATH="SYS$SHARE:LIBJPEG$SHR/SHARE" $ ELSE $ WRITE SYS$OUTPUT "Checking for shared jpeg library ... No" $ENDIF $! $ IF ( (HAVE_JPEG_SHARED.EQ.0).AND.(HAVE_JPEG.EQ.0) ) $ THEN $ WRITE SYS$OUTPUT "No JPEG library installed. This is fatal. Please download and install good library from fafner.dyndns.org/~alexey/libsdl/public.html" $ GOTO EXIT $ ENDIF $! $! $! $! Checking for X11 ... $IF F$TRNLNM("DECW$INCLUDE") .NES. "" $ THEN $ WRITE SYS$OUTPUT "Checking for X11 ... Yes" $ ELSE $ WRITE SYS$OUTPUT "Checking for X11 ... No" $ WRITE SYS$OUTPUT "This is fatal. Please install X11 software" $ GOTO EXIT $ENDIF $! $!WRITING BUILD FILES $OPEN/WRITE OUT BUILD.COM $ WRITE OUT "$set def [.port]" $ WRITE OUT "$",MAKE $ WRITE OUT "$set def [-.libtiff]" $ WRITE OUT "$",MAKE $ WRITE OUT "$set def [-.tools]" $ WRITE OUT "$",MAKE $ WRITE OUT "$set def [-]" $ WRITE OUT "$cop [.PORT]LIBPORT.OLB [.LIBTIFF]LIBPORT.OLB" $ WRITE OUT "$ CURRENT = F$ENVIRONMENT (""DEFAULT"") " $ WRITE OUT "$TIFF=CURRENT" $ WRITE OUT "$OPEN/WRITE OUTT LIBTIFF$STARTUP.COM" $ WRITE OUT "$TIFF[F$LOCATE(""]"",TIFF),9]:="".LIBTIFF]""" $ WRITE OUT "$WRITE OUTT ""DEFINE TIFF ","'","'","TIFF'"" " $ WRITE OUT "$TIFF=CURRENT" $ WRITE OUT "$TIFF[F$LOCATE(""]"",TIFF),7]:="".TOOLS]""" $ WRITE OUT "$WRITE OUTT ""BMP2TIFF:==$", "'","'","TIFF'BMP2TIFF""" $ WRITE OUT "$WRITE OUTT ""FAX2PS:==$", "'","'","TIFF'FAX2PS""" $ WRITE OUT "$WRITE OUTT ""FAX2TIFF:==$", "'","'","TIFF'FAX2TIFF""" $ WRITE OUT "$WRITE OUTT ""GIF2TIFF:==$", "'","'","TIFF'GIF2TIFF""" $ WRITE OUT "$WRITE OUTT ""PAL2RGB:==$", "'","'","TIFF'PAL2RGB""" $ WRITE OUT "$WRITE OUTT ""PPM2TIFF:==$", "'","'","TIFF'PPM2TIFF""" $ WRITE OUT "$WRITE OUTT ""RAS2TIFF:==$", "'","'","TIFF'RAS2TIFF""" $ WRITE OUT "$WRITE OUTT ""RAW2TIFF:==$", "'","'","TIFF'RAW2TIFF""" $ WRITE OUT "$WRITE OUTT ""RGB2YCBCR:==$", "'","'","TIFF'RGB2YCBCR""" $ WRITE OUT "$WRITE OUTT ""THUMBNAIL:==$", "'","'","TIFF'THUMBNAIL""" $ WRITE OUT "$WRITE OUTT ""TIFF2BW:==$", "'","'","TIFF'TIFF2BW""" $ WRITE OUT "$WRITE OUTT ""TIFF2PDF:==$", "'","'","TIFF'TIFF2PDF""" $ WRITE OUT "$WRITE OUTT ""TIFF2PS:==$", "'","'","TIFF'TIFF2PS""" $ WRITE OUT "$WRITE OUTT ""TIFF2RGBA:==$", "'","'","TIFF'TIFF2RGBA""" $ WRITE OUT "$WRITE OUTT ""TIFFCMP:==$", "'","'","TIFF'TIFFCMP""" $ WRITE OUT "$WRITE OUTT ""TIFFCP:==$", "'","'","TIFF'TIFFCP""" $ WRITE OUT "$WRITE OUTT ""TIFFDITHER:==$", "'","'","TIFF'TIFFDITHER""" $ WRITE OUT "$WRITE OUTT ""TIFFDUMP:==$", "'","'","TIFF'TIFFDUMP""" $ WRITE OUT "$WRITE OUTT ""TIFFINFO:==$", "'","'","TIFF'TIFFINFO""" $ WRITE OUT "$WRITE OUTT ""TIFFMEDIAN:==$", "'","'","TIFF'TIFFMEDIAN""" $ WRITE OUT "$WRITE OUTT ""TIFFCROP:==$", "'","'","TIFF'TIFFCROP""" $ WRITE OUT "$WRITE OUTT ""TIFFSET:==$", "'","'","TIFF'TIFFSET""" $ WRITE OUT "$CLOSE OUTT" $ WRITE OUT "$OPEN/WRITE OUTT [.LIBTIFF]LIBTIFF.OPT" $ WRITE OUT "$WRITE OUTT ""TIFF:TIFF/LIB"" $ WRITE OUT "$WRITE OUTT ""TIFF:LIBPORT/LIB"" $ WRITE OUT "$WRITE OUTT ""JPEG:LIBJPEG/LIB"" $ WRITE OUT "$WRITE OUTT ""ZLIB:LIBZ/LIB"" $ WRITE OUT "$CLOSE OUTT" $! $ WRITE OUT "$WRITE SYS$OUTPUT "" "" " $ WRITE OUT "$WRITE SYS$OUTPUT ""***************************************************************************** "" " $ WRITE OUT "$WRITE SYS$OUTPUT ""LIBTIFF$STARTUP.COM has been created. "" " $ WRITE OUT "$WRITE SYS$OUTPUT ""This file setups all logicals needed. It should be execute before using LibTIFF "" " $ WRITE OUT "$WRITE SYS$OUTPUT ""Nice place to call it - LOGIN.COM "" " $ WRITE OUT "$WRITE SYS$OUTPUT """" " $ WRITE OUT "$WRITE SYS$OUTPUT ""Using the library:"" " $ WRITE OUT "$WRITE SYS$OUTPUT ""CC/INC=TIFF ASCII_TAG.C"" " $ WRITE OUT "$WRITE SYS$OUTPUT ""LINK ASCII_TAG,TIFF:LIBTIFF/OPT"" " $ WRITE OUT "$WRITE SYS$OUTPUT ""***************************************************************************** "" " $CLOSE OUT $! $! DESCRIP.MMS in [.PORT] $OBJ="dummy.obj" $IF HAVE_STRCASECMP.NE.1 $ THEN $ OBJ=OBJ+",strcasecmp.obj" $ENDIF $IF HAVE_LFIND.NE.1 $ THEN $ OBJ=OBJ+",lfind.obj" $ENDIF $OPEN/WRITE OUT [.PORT]DESCRIP.MMS $WRITE OUT "OBJ=",OBJ $WRITE OUT "" $WRITE OUT "LIBPORT.OLB : $(OBJ)" $WRITE OUT " LIB/CREA LIBPORT $(OBJ)" $WRITE OUT "" $WRITE OUT "" $WRITE OUT "dummy.obj : dummy.c" $WRITE OUT " $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET)" $WRITE OUT "" $WRITE OUT "" $WRITE OUT "strcasecmp.obj : strcasecmp.c" $WRITE OUT " $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET)" $WRITE OUT "" $WRITE OUT "" $WRITE OUT "lfind.obj : lfind.c" $WRITE OUT " $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET)" $WRITE OUT "" $WRITE OUT "" $CLOSE OUT $! $! $WRITE SYS$OUTPUT "Creating LIBTIFF$DEF.OPT" $IF (SHARED.EQ.64) $ THEN $ COPY SYS$INPUT TIFF$DEF.OPT SYMBOL_VECTOR= (- TIFFOpen=PROCEDURE,- TIFFGetVersion=PROCEDURE,- TIFFCleanup=PROCEDURE,- TIFFClose=PROCEDURE,- TIFFFlush=PROCEDURE,- TIFFFlushData=PROCEDURE,- TIFFGetField=PROCEDURE,- TIFFVGetField=PROCEDURE,- TIFFGetFieldDefaulted=PROCEDURE,- TIFFVGetFieldDefaulted=PROCEDURE,- TIFFGetTagListEntry=PROCEDURE,- TIFFGetTagListCount=PROCEDURE,- TIFFReadDirectory=PROCEDURE,- TIFFScanlineSize=PROCEDURE,- TIFFStripSize=PROCEDURE,- TIFFVStripSize=PROCEDURE,- TIFFRawStripSize=PROCEDURE,- TIFFTileRowSize=PROCEDURE,- TIFFTileSize=PROCEDURE,- TIFFVTileSize=PROCEDURE,- TIFFFileno=PROCEDURE,- TIFFSetFileno=PROCEDURE,- TIFFGetMode=PROCEDURE,- TIFFIsTiled=PROCEDURE,- TIFFIsByteSwapped=PROCEDURE,- TIFFIsBigEndian=PROCEDURE,- TIFFIsMSB2LSB=PROCEDURE,- TIFFIsUpSampled=PROCEDURE,- TIFFCIELabToRGBInit=PROCEDURE,- TIFFCIELabToXYZ=PROCEDURE,- TIFFXYZToRGB=PROCEDURE,- TIFFYCbCrToRGBInit=PROCEDURE,- TIFFYCbCrtoRGB=PROCEDURE,- TIFFCurrentRow=PROCEDURE,- TIFFCurrentDirectory=PROCEDURE,- TIFFCurrentStrip=PROCEDURE,- TIFFCurrentTile=PROCEDURE,- TIFFDataWidth=PROCEDURE,- TIFFReadBufferSetup=PROCEDURE,- TIFFWriteBufferSetup=PROCEDURE,- TIFFSetupStrips=PROCEDURE,- TIFFLastDirectory=PROCEDURE,- TIFFSetDirectory=PROCEDURE,- TIFFSetSubDirectory=PROCEDURE,- TIFFUnlinkDirectory=PROCEDURE,- TIFFSetField=PROCEDURE,- TIFFVSetField=PROCEDURE,- TIFFCheckpointDirectory=PROCEDURE,- TIFFWriteDirectory=PROCEDURE,- TIFFRewriteDirectory=PROCEDURE,- TIFFPrintDirectory=PROCEDURE,- TIFFReadScanline=PROCEDURE,- TIFFWriteScanline=PROCEDURE,- TIFFReadRGBAImage=PROCEDURE,- TIFFReadRGBAImageOriented=PROCEDURE,- TIFFFdOpen=PROCEDURE,- TIFFClientOpen=PROCEDURE,- TIFFFileName=PROCEDURE,- TIFFError=PROCEDURE,- TIFFErrorExt=PROCEDURE,- TIFFWarning=PROCEDURE,- TIFFWarningExt=PROCEDURE,- TIFFSetErrorHandler=PROCEDURE,- TIFFSetErrorHandlerExt=PROCEDURE,- TIFFSetWarningHandler=PROCEDURE,- TIFFSetWarningHandlerExt=PROCEDURE,- TIFFComputeTile=PROCEDURE,- TIFFCheckTile=PROCEDURE,- TIFFNumberOfTiles=PROCEDURE,- TIFFReadTile=PROCEDURE,- TIFFWriteTile=PROCEDURE,- TIFFComputeStrip=PROCEDURE,- TIFFNumberOfStrips=PROCEDURE,- TIFFRGBAImageBegin=PROCEDURE,- TIFFRGBAImageGet=PROCEDURE,- TIFFRGBAImageEnd=PROCEDURE,- TIFFReadEncodedStrip=PROCEDURE,- TIFFReadRawStrip=PROCEDURE,- TIFFReadEncodedTile=PROCEDURE,- TIFFReadRawTile=PROCEDURE,- TIFFReadRGBATile=PROCEDURE,- TIFFReadRGBAStrip=PROCEDURE,- TIFFWriteEncodedStrip=PROCEDURE,- TIFFWriteRawStrip=PROCEDURE,- TIFFWriteEncodedTile=PROCEDURE,- TIFFWriteRawTile=PROCEDURE,- TIFFSetWriteOffset=PROCEDURE,- TIFFSwabDouble=PROCEDURE,- TIFFSwabShort=PROCEDURE,- TIFFSwabLong=PROCEDURE,- TIFFSwabArrayOfShort=PROCEDURE,- TIFFSwabArrayOfLong=PROCEDURE,- TIFFSwabArrayOfDouble=PROCEDURE,- TIFFSwabArrayOfTriples=PROCEDURE,- TIFFReverseBits=PROCEDURE,- TIFFGetBitRevTable=PROCEDURE,- TIFFDefaultStripSize=PROCEDURE,- TIFFDefaultTileSize=PROCEDURE,- TIFFRasterScanlineSize=PROCEDURE,- _TIFFmalloc=PROCEDURE,- _TIFFrealloc=PROCEDURE,- _TIFFfree=PROCEDURE,- _TIFFmemset=PROCEDURE,- _TIFFmemcpy=PROCEDURE,- _TIFFmemcmp=PROCEDURE,- TIFFCreateDirectory=PROCEDURE,- TIFFSetTagExtender=PROCEDURE,- TIFFMergeFieldInfo=PROCEDURE,- TIFFFindFieldInfo=PROCEDURE,- TIFFFindFieldInfoByName=PROCEDURE,- TIFFFieldWithName=PROCEDURE,- TIFFFieldWithTag=PROCEDURE,- TIFFFieldTag=PROCEDURE,- TIFFFieldName=PROCEDURE,- TIFFFieldDataType=PROCEDURE,- TIFFFieldPassCount=PROCEDURE,- TIFFFieldReadCount=PROCEDURE,- TIFFFieldWriteCount=PROCEDURE,- TIFFCurrentDirOffset=PROCEDURE,- TIFFWriteCheck=PROCEDURE,- TIFFRGBAImageOK=PROCEDURE,- TIFFNumberOfDirectories=PROCEDURE,- TIFFSetFileName=PROCEDURE,- TIFFSetClientdata=PROCEDURE,- TIFFSetMode=PROCEDURE,- TIFFClientdata=PROCEDURE,- TIFFGetReadProc=PROCEDURE,- TIFFGetWriteProc=PROCEDURE,- TIFFGetSeekProc=PROCEDURE,- TIFFGetCloseProc=PROCEDURE,- TIFFGetSizeProc=PROCEDURE,- TIFFGetMapFileProc=PROCEDURE,- TIFFGetUnmapFileProc=PROCEDURE,- TIFFIsCODECConfigured=PROCEDURE,- TIFFGetConfiguredCODECs=PROCEDURE,- TIFFFindCODEC=PROCEDURE,- TIFFRegisterCODEC=PROCEDURE,- TIFFUnRegisterCODEC=PROCEDURE,- TIFFFreeDirectory=PROCEDURE,- TIFFReadCustomDirectory=PROCEDURE,- TIFFReadEXIFDirectory=PROCEDURE,- TIFFAccessTagMethods=PROCEDURE,- TIFFGetClientInfo=PROCEDURE,- TIFFSetClientInfo=PROCEDURE,- TIFFReassignTagToIgnore=PROCEDURE- ) $ENDIF $IF (SHARED.EQ.32) $ THEN $ COPY SYS$INPUT TIFF$DEF.OPT UNIVERSAL=TIFFOpen UNIVERSAL=TIFFGetVersion UNIVERSAL=TIFFCleanup UNIVERSAL=TIFFClose UNIVERSAL=TIFFFlush UNIVERSAL=TIFFFlushData UNIVERSAL=TIFFGetField UNIVERSAL=TIFFVGetField UNIVERSAL=TIFFGetFieldDefaulted UNIVERSAL=TIFFVGetFieldDefaulted UNIVERSAL=TIFFGetTagListEntry UNIVERSAL=TIFFGetTagListCount UNIVERSAL=TIFFReadDirectory UNIVERSAL=TIFFScanlineSize UNIVERSAL=TIFFStripSize UNIVERSAL=TIFFVStripSize UNIVERSAL=TIFFRawStripSize UNIVERSAL=TIFFTileRowSize UNIVERSAL=TIFFTileSize UNIVERSAL=TIFFVTileSize UNIVERSAL=TIFFFileno UNIVERSAL=TIFFSetFileno UNIVERSAL=TIFFGetMode UNIVERSAL=TIFFIsTiled UNIVERSAL=TIFFIsByteSwapped UNIVERSAL=TIFFIsBigEndian UNIVERSAL=TIFFIsMSB2LSB UNIVERSAL=TIFFIsUpSampled UNIVERSAL=TIFFCIELabToRGBInit UNIVERSAL=TIFFCIELabToXYZ UNIVERSAL=TIFFXYZToRGB UNIVERSAL=TIFFYCbCrToRGBInit UNIVERSAL=TIFFYCbCrtoRGB UNIVERSAL=TIFFCurrentRow UNIVERSAL=TIFFCurrentDirectory UNIVERSAL=TIFFCurrentStrip UNIVERSAL=TIFFCurrentTile UNIVERSAL=TIFFDataWidth UNIVERSAL=TIFFReadBufferSetup UNIVERSAL=TIFFWriteBufferSetup UNIVERSAL=TIFFSetupStrips UNIVERSAL=TIFFLastDirectory UNIVERSAL=TIFFSetDirectory UNIVERSAL=TIFFSetSubDirectory UNIVERSAL=TIFFUnlinkDirectory UNIVERSAL=TIFFSetField UNIVERSAL=TIFFVSetField UNIVERSAL=TIFFCheckpointDirectory UNIVERSAL=TIFFWriteDirectory UNIVERSAL=TIFFRewriteDirectory UNIVERSAL=TIFFPrintDirectory UNIVERSAL=TIFFReadScanline UNIVERSAL=TIFFWriteScanline UNIVERSAL=TIFFReadRGBAImage UNIVERSAL=TIFFReadRGBAImageOriented UNIVERSAL=TIFFFdOpen UNIVERSAL=TIFFClientOpen UNIVERSAL=TIFFFileName UNIVERSAL=TIFFError UNIVERSAL=TIFFErrorExt UNIVERSAL=TIFFWarning UNIVERSAL=TIFFWarningExt UNIVERSAL=TIFFSetErrorHandler UNIVERSAL=TIFFSetErrorHandlerExt UNIVERSAL=TIFFSetWarningHandler UNIVERSAL=TIFFSetWarningHandlerExt UNIVERSAL=TIFFComputeTile UNIVERSAL=TIFFCheckTile UNIVERSAL=TIFFNumberOfTiles UNIVERSAL=TIFFReadTile UNIVERSAL=TIFFWriteTile UNIVERSAL=TIFFComputeStrip UNIVERSAL=TIFFNumberOfStrips UNIVERSAL=TIFFRGBAImageBegin UNIVERSAL=TIFFRGBAImageGet UNIVERSAL=TIFFRGBAImageEnd UNIVERSAL=TIFFReadEncodedStrip UNIVERSAL=TIFFReadRawStrip UNIVERSAL=TIFFReadEncodedTile UNIVERSAL=TIFFReadRawTile UNIVERSAL=TIFFReadRGBATile UNIVERSAL=TIFFReadRGBAStrip UNIVERSAL=TIFFWriteEncodedStrip UNIVERSAL=TIFFWriteRawStrip UNIVERSAL=TIFFWriteEncodedTile UNIVERSAL=TIFFWriteRawTile UNIVERSAL=TIFFSetWriteOffset UNIVERSAL=TIFFSwabDouble UNIVERSAL=TIFFSwabShort UNIVERSAL=TIFFSwabLong UNIVERSAL=TIFFSwabArrayOfShort UNIVERSAL=TIFFSwabArrayOfLong UNIVERSAL=TIFFSwabArrayOfDouble UNIVERSAL=TIFFSwabArrayOfTriples UNIVERSAL=TIFFReverseBits UNIVERSAL=TIFFGetBitRevTable UNIVERSAL=TIFFDefaultStripSize UNIVERSAL=TIFFDefaultTileSize UNIVERSAL=TIFFRasterScanlineSize UNIVERSAL=_TIFFmalloc UNIVERSAL=_TIFFrealloc UNIVERSAL=_TIFFfree UNIVERSAL=_TIFFmemset UNIVERSAL=_TIFFmemcpy UNIVERSAL=_TIFFmemcmp UNIVERSAL=TIFFCreateDirectory UNIVERSAL=TIFFSetTagExtender UNIVERSAL=TIFFMergeFieldInfo UNIVERSAL=TIFFFindFieldInfo UNIVERSAL=TIFFFindFieldInfoByName UNIVERSAL=TIFFFieldWithName UNIVERSAL=TIFFFieldWithTag UNIVERSAL=TIFFFieldTag UNIVERSAL=TIFFFieldName UNIVERSAL=TIFFFieldDataType UNIVERSAL=TIFFFieldPassCount UNIVERSAL=TIFFFieldReadCount UNIVERSAL=TIFFFieldWriteCount UNIVERSAL=TIFFCurrentDirOffset UNIVERSAL=TIFFWriteCheck UNIVERSAL=TIFFRGBAImageOK UNIVERSAL=TIFFNumberOfDirectories UNIVERSAL=TIFFSetFileName UNIVERSAL=TIFFSetClientdata UNIVERSAL=TIFFSetMode UNIVERSAL=TIFFClientdata UNIVERSAL=TIFFGetReadProc UNIVERSAL=TIFFGetWriteProc UNIVERSAL=TIFFGetSeekProc UNIVERSAL=TIFFGetCloseProc UNIVERSAL=TIFFGetSizeProc UNIVERSAL=TIFFGetMapFileProc UNIVERSAL=TIFFGetUnmapFileProc UNIVERSAL=TIFFIsCODECConfigured UNIVERSAL=TIFFGetConfiguredCODECs UNIVERSAL=TIFFFindCODEC UNIVERSAL=TIFFRegisterCODEC UNIVERSAL=TIFFUnRegisterCODEC UNIVERSAL=TIFFFreeDirectory UNIVERSAL=TIFFReadCustomDirectory UNIVERSAL=TIFFReadEXIFDirectory UNIVERSAL=TIFFAccessTagMethods UNIVERSAL=TIFFGetClientInfo UNIVERSAL=TIFFSetClientInfo UNIVERSAL=TIFFReassignTagToIgnore $ENDIF $! $! $! Writing TIFF$SHR.OPT file to build TOOLS $ IF (SHARED.GT.0) $ THEN $ OPEN/WRITE OUT TIFF$SHR.OPT $ WRITE OUT "[]TIFF/LIB" $ WRITE OUT "[-.PORT]LIBPORT/LIB" $ WRITE OUT JPEG_LIBRARY_PATH $ WRITE OUT "ZLIB:LIBZ/LIB" $ CLOSE OUT $ ENDIF $! $! $! Writing OPT.OPT file to build TOOLS $OPEN/WRITE OUT OPT.OPT $ IF (SHARED.GT.0) $ THEN $ WRITE OUT "[-.LIBTIFF]TIFF$SHR/SHARE" $ WRITE OUT JPEG_LIBRARY_PATH $ ELSE $ WRITE OUT "[-.LIBTIFF]TIFF/LIB" $ WRITE OUT "[-.PORT]LIBPORT/LIB" $ WRITE OUT JPEG_LIBRARY_PATH $ ENDIF $ WRITE OUT "ZLIB:LIBZ/LIB" $CLOSE OUT $! $! $COPY SYS$INPUT [.LIBTIFF]DESCRIP.MMS # (c) Alexey Chupahin 22-NOV-2007 # OpenVMS 7.3-1, DEC 2000 mod.300 # OpenVMS 8.3, HP rx1620 # Makefile for DEC C compilers. # INCL = /INCLUDE=(JPEG,ZLIB,[]) CFLAGS = $(INCL) OBJ_SYSDEP_MODULE = tif_vms.obj OBJ = \ tif_aux.obj,\ tif_close.obj,\ tif_codec.obj,\ tif_color.obj,\ tif_compress.obj,\ tif_dir.obj,\ tif_dirinfo.obj,\ tif_dirread.obj,\ tif_dirwrite.obj,\ tif_dumpmode.obj,\ tif_error.obj,\ tif_extension.obj,\ tif_fax3.obj,\ tif_fax3sm.obj,\ tif_flush.obj,\ tif_getimage.obj,\ tif_jbig.obj,\ tif_jpeg.obj,\ tif_luv.obj,\ tif_lzw.obj,\ tif_next.obj,\ tif_ojpeg.obj,\ tif_open.obj,\ tif_packbits.obj,\ tif_pixarlog.obj,\ tif_predict.obj,\ tif_print.obj,\ tif_read.obj,\ tif_strip.obj,\ tif_swab.obj,\ tif_thunder.obj,\ tif_tile.obj,\ tif_version.obj,\ tif_warning.obj,\ tif_write.obj,\ tif_zip.obj, $(OBJ_SYSDEP_MODULE) $IF (SHARED.GT.0) $ THEN $ APP SYS$INPUT [.LIBTIFF]DESCRIP.MMS ALL : tiff.olb, tiff$shr.exe $WRITE SYS$OUTPUT "Done" tiff$shr.exe : tiff.olb LINK/SHARE=TIFF$SHR.EXE TIF_AUX,[-]TIFF$DEF/OPT, [-]TIFF$SHR/OPT COPY TIFF$SHR.EXE SYS$SHARE PURGE SYS$SHARE:TIFF$SHR.EXE $ ELSE $ APP SYS$INPUT [.LIBTIFF]DESCRIP.MMS ALL : tiff.olb $WRITE SYS$OUTPUT "Done" $ENDIF $! $! $ APP SYS$INPUT [.LIBTIFF]DESCRIP.MMS tiff.olb : $(OBJ) lib/crea tiff.olb $(OBJ) #tif_config.h : tif_config.h-vms # copy tif_config.h-vms tif_config.h # #tiffconf.h : tiffconf.h-vms # copy tiffconf.h-vms tiffconf.h tif_aux.obj : tif_aux.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_close.obj : tif_close.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_codec.obj : tif_codec.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_color.obj : tif_color.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_compress.obj : tif_compress.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_dir.obj : tif_dir.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_dirinfo.obj : tif_dirinfo.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_dirread.obj : tif_dirread.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_dirwrite.obj : tif_dirwrite.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_dumpmode.obj : tif_dumpmode.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_error.obj : tif_error.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_extension.obj : tif_extension.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_fax3.obj : tif_fax3.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_fax3sm.obj : tif_fax3sm.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_flush.obj : tif_flush.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_getimage.obj : tif_getimage.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_jbig.obj : tif_jbig.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_jpeg.obj : tif_jpeg.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_luv.obj : tif_luv.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_lzw.obj : tif_lzw.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_next.obj : tif_next.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_ojpeg.obj : tif_ojpeg.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_open.obj : tif_open.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_packbits.obj : tif_packbits.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_pixarlog.obj : tif_pixarlog.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_predict.obj : tif_predict.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_print.obj : tif_print.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_read.obj : tif_read.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_strip.obj : tif_strip.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_swab.obj : tif_swab.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_thunder.obj : tif_thunder.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_tile.obj : tif_tile.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_unix.obj : tif_unix.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_version.obj : tif_version.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_warning.obj : tif_warning.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_write.obj : tif_write.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tif_zip.obj : tif_zip.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) clean : del *.obj;* del *.olb;* $! $! $! $COPY SYS$INPUT [.TOOLS]DESCRIP.MMS # (c) Alexey Chupahin 22-NOV-2007 # OpenVMS 7.3-1, DEC 2000 mod.300 # OpenVMS 8.3, HP rx1620 INCL = /INCL=([],[-.LIBTIFF]) CFLAGS = $(INCL) LIBS = [-]OPT/OPT OBJ=\ bmp2tiff.exe,\ fax2ps.exe,\ fax2tiff.exe,\ gif2tiff.exe,\ pal2rgb.exe,\ ppm2tiff.exe,\ ras2tiff.exe,\ raw2tiff.exe,\ rgb2ycbcr.exe,\ thumbnail.exe,\ tiff2bw.exe,\ tiff2pdf.exe,\ tiff2ps.exe,\ tiff2rgba.exe,\ tiffcmp.exe,\ tiffcp.exe,\ tiffcrop.exe,\ tiffdither.exe,\ tiffdump.exe,\ tiffinfo.exe,\ tiffmedian.exe,\ tiffset.exe,\ tiffsplit.exe,\ ycbcr.exe all : $(OBJ) $! bmp2tiff.obj : bmp2tiff.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) bmp2tiff.exe : bmp2tiff.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) fax2ps.obj : fax2ps.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) fax2ps.exe : fax2ps.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) fax2tiff.obj : fax2tiff.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) fax2tiff.exe : fax2tiff.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) gif2tiff.obj : gif2tiff.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) gif2tiff.exe : gif2tiff.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) pal2rgb.obj : pal2rgb.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) pal2rgb.exe : pal2rgb.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) ppm2tiff.obj : ppm2tiff.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) ppm2tiff.exe : ppm2tiff.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) ras2tiff.obj : ras2tiff.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) ras2tiff.exe : ras2tiff.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) raw2tiff.obj : raw2tiff.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) raw2tiff.exe : raw2tiff.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) rgb2ycbcr.obj : rgb2ycbcr.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) rgb2ycbcr.exe : rgb2ycbcr.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) sgi2tiff.obj : sgi2tiff.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) sgi2tiff.exe : sgi2tiff.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) sgisv.obj : sgisv.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) sgisv.exe : sgisv.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) thumbnail.obj : thumbnail.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) thumbnail.exe : thumbnail.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiff2bw.obj : tiff2bw.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiff2bw.exe : tiff2bw.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiff2pdf.obj : tiff2pdf.c $(CC) $(CFLAGS) /NOWARN $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiff2pdf.exe : tiff2pdf.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiff2ps.obj : tiff2ps.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiff2ps.exe : tiff2ps.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiff2rgba.obj : tiff2rgba.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiff2rgba.exe : tiff2rgba.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiffcmp.obj : tiffcmp.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiffcmp.exe : tiffcmp.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiffcp.obj : tiffcp.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiffcp.exe : tiffcp.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiffcrop.obj : tiffcrop.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiffcrop.exe : tiffcrop.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiffdither.obj : tiffdither.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiffdither.exe : tiffdither.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiffdump.obj : tiffdump.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiffdump.exe : tiffdump.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiffgt.obj : tiffgt.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiffgt.exe : tiffgt.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiffinfo.obj : tiffinfo.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiffinfo.exe : tiffinfo.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiffmedian.obj : tiffmedian.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiffmedian.exe : tiffmedian.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiffset.obj : tiffset.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiffset.exe : tiffset.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) tiffsplit.obj : tiffsplit.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) tiffsplit.exe : tiffsplit.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) ycbcr.obj : ycbcr.c $(CC) $(CFLAGS) $(MMS$SOURCE) /OBJ=$(MMS$TARGET) ycbcr.exe : ycbcr.obj LINK/EXE=$(MMS$TARGET) $(MMS$SOURCE), $(LIBS) CLEAN : DEL ALL.;* DEL *.OBJ;* DEL *.EXE;* $! $! $! $!copiing and patching TIFF_CONF.H, TIF_CONFIG.H $! $CURRENT = F$ENVIRONMENT (""DEFAULT"") $CURRENT[F$LOCATE("]",CURRENT),9]:=".LIBTIFF]" $WRITE SYS$OUTPUT "Creating TIFFCONF.H and TIF_CONFIG.H" $COPY SYS$INPUT 'CURRENT'TIFFCONF.H /* Configuration defines for installed libtiff. This file maintained for backward compatibility. Do not use definitions from this file in your programs. */ #ifndef _TIFFCONF_ #define _TIFFCONF_ /* Define to 1 if the system has the type `int16'. */ //#define HAVE_INT16 /* Define to 1 if the system has the type `int32'. */ //#define HAVE_INT32 /* Define to 1 if the system has the type `int8'. */ //#define HAVE_INT8 /* The size of a `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* The size of a `long', as computed by sizeof. */ #define SIZEOF_LONG 4 /* Compatibility stuff. */ /* Define as 0 or 1 according to the floating point format suported by the machine */ #ifdef __IEEE_FLOAT #define HAVE_IEEEFP 1 #endif #define HAVE_GETOPT 1 /* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ #define HOST_FILLORDER FILLORDER_LSB2MSB /* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian (Intel) */ #define HOST_BIGENDIAN 0 /* Support CCITT Group 3 & 4 algorithms */ #define CCITT_SUPPORT 1 /* Support LogLuv high dynamic range encoding */ #define LOGLUV_SUPPORT 1 /* Support LZW algorithm */ #define LZW_SUPPORT 1 /* Support NeXT 2-bit RLE algorithm */ #define NEXT_SUPPORT 1 /* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation fails with unpatched IJG JPEG library) */ /* Support Macintosh PackBits algorithm */ #define PACKBITS_SUPPORT 1 /* Support Pixar log-format algorithm (requires Zlib) */ #define PIXARLOG_SUPPORT 1 /* Support ThunderScan 4-bit RLE algorithm */ #define THUNDER_SUPPORT 1 /* Support Deflate compression */ /* #undef ZIP_SUPPORT */ /* Support strip chopping (whether or not to convert single-strip uncompressed images to mutiple strips of ~8Kb to reduce memory usage) */ #define STRIPCHOP_DEFAULT TIFF_STRIPCHOP /* Enable SubIFD tag (330) support */ #define SUBIFD_SUPPORT 1 /* Treat extra sample as alpha (default enabled). The RGBA interface will treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA files but don't mark the alpha properly. */ #define DEFAULT_EXTRASAMPLE_AS_ALPHA 1 /* Pick up YCbCr subsampling info from the JPEG data stream to support files lacking the tag (default enabled). */ #define CHECK_JPEG_YCBCR_SUBSAMPLING 1 /* * Feature support definitions. * XXX: These macros are obsoleted. Don't use them in your apps! * Macros stays here for backward compatibility and should be always defined. */ #define COLORIMETRY_SUPPORT #define YCBCR_SUPPORT #define CMYK_SUPPORT #define ICC_SUPPORT #define PHOTOSHOP_SUPPORT #define IPTC_SUPPORT #endif /* _TIFFCONF_ */ $COPY SYS$INPUT 'CURRENT'TIF_CONFIG.H /* Define to 1 if you have the header file. */ #ifndef HAVE_GETOPT # define HAVE_GETOPT 1 #endif #define HAVE_ASSERT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define as 0 or 1 according to the floating point format suported by the machine */ #ifdef __IEEE_FLOAT #define HAVE_IEEEFP 1 #endif #define HAVE_UNISTD_H 1 #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ //#define HAVE_IO_H 1 /* Define to 1 if you have the header file. */ //#define HAVE_SEARCH_H 1 /* The size of a `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* The size of a `long', as computed by sizeof. */ #define SIZEOF_LONG 4 /* Set the native cpu bit order */ #define HOST_FILLORDER FILLORDER_LSB2MSB /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ /* #undef WORDS_BIGENDIAN */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ /* #ifndef __cplusplus # ifndef inline # define inline __inline # endif #endif */ /* Support CCITT Group 3 & 4 algorithms */ #define CCITT_SUPPORT 1 /* Pick up YCbCr subsampling info from the JPEG data stream to support files lacking the tag (default enabled). */ #define CHECK_JPEG_YCBCR_SUBSAMPLING 1 /* Support C++ stream API (requires C++ compiler) */ #define CXX_SUPPORT 1 /* Treat extra sample as alpha (default enabled). The RGBA interface will treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA files but don't mark the alpha properly. */ #define DEFAULT_EXTRASAMPLE_AS_ALPHA 1 /* little Endian */ #define HOST_BIGENDIAN 0 #define JPEG_SUPPORT 1 #define LOGLUV_SUPPORT 1 /* Support LZW algorithm */ #define LZW_SUPPORT 1 /* Support Microsoft Document Imaging format */ #define MDI_SUPPORT 1 /* Support NeXT 2-bit RLE algorithm */ #define NEXT_SUPPORT 1 #define OJPEG_SUPPORT 1 /* Name of package */ #define PACKAGE "tiff" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "tiff@lists.maptools.org" /* Define to the full name of this package. */ #define PACKAGE_NAME "LibTIFF Software" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "LibTIFF Software 3.9.0beta for VMS" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "tiff" $PURGE 'CURRENT'TIFFCONF.H $PURGE 'CURRENT'TIF_CONFIG.H $OPEN/APPEND OUT 'CURRENT'TIF_CONFIG.H $IF HAVE_LFIND.EQ.1 $ THEN $ WRITE OUT "#define HAVE_SEARCH_H 1" $ ELSE $ WRITE OUT "#undef HAVE_SEARCH_H" $ENDIF $CLOSE OUT $! $! $WRITE SYS$OUTPUT " " $WRITE SYS$OUTPUT " " $WRITE SYS$OUTPUT "Now you can type @BUILD " $! $EXIT: $DEFINE SYS$ERROR _NLA0: $DEFINE SYS$OUTPUT _NLA0: $DEL TEST.OBJ;* $DEL TEST.C;* $DEL TEST.EXE;* $DEAS SYS$ERROR $DEAS SYS$OUTPUT tiff-4.0.3/Makefile.am0000644000212300117540000000411412026614247011427 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. docdir = $(LIBTIFF_DOCDIR) AUTOMAKE_OPTIONS = 1.12 dist-zip foreign ACLOCAL_AMFLAGS = -I m4 docfiles = \ COPYRIGHT \ ChangeLog \ README \ README.vms \ RELEASE-DATE \ TODO \ VERSION EXTRA_DIST = \ HOWTO-RELEASE \ Makefile.vc \ SConstruct \ autogen.sh \ configure.com \ nmake.opt \ libtiff-4.pc.in dist_doc_DATA = $(docfiles) SUBDIRS = port libtiff tools build contrib test man html release: (rm -f $(top_srcdir)/RELEASE-DATE && echo $(LIBTIFF_RELEASE_DATE) > $(top_srcdir)/RELEASE-DATE) (rm -f $(top_srcdir)/VERSION && echo $(LIBTIFF_VERSION) > $(top_srcdir)/VERSION) (rm -f $(top_srcdir)/libtiff/tiffvers.h && sed 's,LIBTIFF_VERSION,$(LIBTIFF_VERSION),;s,LIBTIFF_RELEASE_DATE,$(LIBTIFF_RELEASE_DATE),' $(top_srcdir)/libtiff/tiffvers.h.in > $(top_srcdir)/libtiff/tiffvers.h) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libtiff-4.pc tiff-4.0.3/aclocal.m40000644000212300117540000011550612027361160011235 00000000000000# generated automatically by aclocal 1.12.4 -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.12' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.12.4], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.12.4])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated. For more info, see: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl dnl Support for Objective C++ was only introduced in Autoconf 2.65, dnl but we still cater to Autoconf 2.62. m4_ifdef([AC_PROG_OBJCXX], [AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The 'parallel-tests' driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Copyright (C) 1999-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_CC_C_O # -------------- # Like AC_PROG_CC_C_O, but changed for automake. AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi dnl Make sure AC_PROG_CC is never called again, or it will override our dnl setting of CC. m4_define([AC_PROG_CC], [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of '-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/acinclude.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) tiff-4.0.3/contrib/0000755000212300117540000000000012027361331011105 500000000000000tiff-4.0.3/contrib/dbs/0000755000212300117540000000000012027361330011654 500000000000000tiff-4.0.3/contrib/dbs/Makefile.am0000644000212300117540000000325412026613730013637 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. SUBDIRS = xtiff LIBTIFF = $(top_builddir)/libtiff/libtiff.la EXTRA_DIST = README noinst_PROGRAMS = tiff-bi tiff-grayscale tiff-palette tiff-rgb tiff_bi_SOURCES = tiff-bi.c tiff_bi_LDADD = $(LIBTIFF) tiff_grayscale_SOURCES = tiff-grayscale.c tiff_grayscale_LDADD = $(LIBTIFF) tiff_palette_SOURCES = tiff-palette.c tiff_palette_LDADD = $(LIBTIFF) tiff_rgb_SOURCES = tiff-rgb.c tiff_rgb_LDADD = $(LIBTIFF) AM_CPPFLAGS = -I$(top_srcdir)/libtiff tiff-4.0.3/contrib/dbs/tiff-bi.c0000644000212300117540000000543611403511023013261 00000000000000/* $Id: tiff-bi.c,v 1.3 2010-06-08 18:55:15 bfriesen Exp $ */ /* * tiff-bi.c -- create a Class B (bilevel) TIFF file * * Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts. * * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #include #include #include "tiffio.h" #define WIDTH 512 #define HEIGHT WIDTH int main(int argc, char **argv) { int i; unsigned char * scan_line; TIFF * tif; if (argc != 2) { fprintf(stderr, "Usage: %s tiff-image\n", argv[0]); return 0; } if ((tif = TIFFOpen(argv[1], "w")) == NULL) { fprintf(stderr, "can't open %s as a TIFF file\n", argv[1]); return 0; } TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, WIDTH); TIFFSetField(tif, TIFFTAG_IMAGELENGTH, HEIGHT); TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 1); TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE); scan_line = (unsigned char *) malloc(WIDTH / 8); for (i = 0; i < (WIDTH / 8) / 2; i++) scan_line[i] = 0; for (i = (WIDTH / 8) / 2; i < (WIDTH / 8); i++) scan_line[i] = 255; for (i = 0; i < HEIGHT / 2; i++) TIFFWriteScanline(tif, scan_line, i, 0); for (i = 0; i < (WIDTH / 8) / 2; i++) scan_line[i] = 255; for (i = (WIDTH / 8) / 2; i < (WIDTH / 8); i++) scan_line[i] = 0; for (i = HEIGHT / 2; i < HEIGHT; i++) TIFFWriteScanline(tif, scan_line, i, 0); free(scan_line); TIFFClose(tif); return 0; } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/dbs/README0000644000212300117540000000024006747424642012472 00000000000000Wed May 9 09:11:35 PDT 1990 This directory contains programs from Dan Sears (dbs@decwrl.dec.com). Contact him directly if you have questions/problems. Sam tiff-4.0.3/contrib/dbs/tiff-rgb.c0000644000212300117540000001455311403511023013441 00000000000000/* $Id: tiff-rgb.c,v 1.4 2010-06-08 18:55:15 bfriesen Exp $ */ /* * tiff-rgb.c -- create a 24-bit Class R (rgb) TIFF file * * Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts. * * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #include #include #include #include #include "tiffio.h" #define ROUND(x) (uint16) ((x) + 0.5) #define CMSIZE 256 #define WIDTH 525 #define HEIGHT 512 #define TIFF_GAMMA 2.2 void Usage(); char * programName; int main(int argc, char **argv) { char * input_file = NULL; double image_gamma = TIFF_GAMMA; int i, j; TIFF * tif; unsigned char * scan_line; uint16 red[CMSIZE], green[CMSIZE], blue[CMSIZE]; float refblackwhite[2*3]; programName = argv[0]; switch (argc) { case 2: image_gamma = TIFF_GAMMA; input_file = argv[1]; break; case 4: if (!strcmp(argv[1], "-gamma")) { image_gamma = atof(argv[2]); input_file = argv[3]; } else Usage(); break; default: Usage(); } for (i = 0; i < CMSIZE; i++) { if (i == 0) red[i] = green[i] = blue[i] = 0; else { red[i] = ROUND((pow(i / 255.0, 1.0 / image_gamma) * 65535.0)); green[i] = ROUND((pow(i / 255.0, 1.0 / image_gamma) * 65535.0)); blue[i] = ROUND((pow(i / 255.0, 1.0 / image_gamma) * 65535.0)); } } refblackwhite[0] = 0.0; refblackwhite[1] = 255.0; refblackwhite[2] = 0.0; refblackwhite[3] = 255.0; refblackwhite[4] = 0.0; refblackwhite[5] = 255.0; if ((tif = TIFFOpen(input_file, "w")) == NULL) { fprintf(stderr, "can't open %s as a TIFF file\n", input_file); exit(0); } TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, WIDTH); TIFFSetField(tif, TIFFTAG_IMAGELENGTH, HEIGHT); TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3); TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE); #ifdef notdef TIFFSetField(tif, TIFFTAG_WHITEPOINT, whitex, whitey); TIFFSetField(tif, TIFFTAG_PRIMARYCHROMATICITIES, primaries); #endif TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE, refblackwhite); TIFFSetField(tif, TIFFTAG_TRANSFERFUNCTION, red, green, blue); scan_line = (unsigned char *) malloc(WIDTH * 3); for (i = 0; i < 255; i++) { for (j = 0; j < 75; j++) { scan_line[j * 3] = 255; scan_line[(j * 3) + 1] = 255 - i; scan_line[(j * 3) + 2] = 255 - i; } for (j = 75; j < 150; j++) { scan_line[j * 3] = 255 - i; scan_line[(j * 3) + 1] = 255; scan_line[(j * 3) + 2] = 255 - i; } for (j = 150; j < 225; j++) { scan_line[j * 3] = 255 - i; scan_line[(j * 3) + 1] = 255 - i; scan_line[(j * 3) + 2] = 255; } for (j = 225; j < 300; j++) { scan_line[j * 3] = (i - 1) / 2; scan_line[(j * 3) + 1] = (i - 1) / 2; scan_line[(j * 3) + 2] = (i - 1) / 2; } for (j = 300; j < 375; j++) { scan_line[j * 3] = 255 - i; scan_line[(j * 3) + 1] = 255; scan_line[(j * 3) + 2] = 255; } for (j = 375; j < 450; j++) { scan_line[j * 3] = 255; scan_line[(j * 3) + 1] = 255 - i; scan_line[(j * 3) + 2] = 255; } for (j = 450; j < 525; j++) { scan_line[j * 3] = 255; scan_line[(j * 3) + 1] = 255; scan_line[(j * 3) + 2] = 255 - i; } TIFFWriteScanline(tif, scan_line, i, 0); } for (i = 255; i < 512; i++) { for (j = 0; j < 75; j++) { scan_line[j * 3] = i; scan_line[(j * 3) + 1] = 0; scan_line[(j * 3) + 2] = 0; } for (j = 75; j < 150; j++) { scan_line[j * 3] = 0; scan_line[(j * 3) + 1] = i; scan_line[(j * 3) + 2] = 0; } for (j = 150; j < 225; j++) { scan_line[j * 3] = 0; scan_line[(j * 3) + 1] = 0; scan_line[(j * 3) + 2] = i; } for (j = 225; j < 300; j++) { scan_line[j * 3] = (i - 1) / 2; scan_line[(j * 3) + 1] = (i - 1) / 2; scan_line[(j * 3) + 2] = (i - 1) / 2; } for (j = 300; j < 375; j++) { scan_line[j * 3] = 0; scan_line[(j * 3) + 1] = i; scan_line[(j * 3) + 2] = i; } for (j = 375; j < 450; j++) { scan_line[j * 3] = i; scan_line[(j * 3) + 1] = 0; scan_line[(j * 3) + 2] = i; } for (j = 450; j < 525; j++) { scan_line[j * 3] = i; scan_line[(j * 3) + 1] = i; scan_line[(j * 3) + 2] = 0; } TIFFWriteScanline(tif, scan_line, i, 0); } free(scan_line); TIFFClose(tif); exit(0); } void Usage() { fprintf(stderr, "Usage: %s -gamma gamma tiff-image\n", programName); exit(0); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/dbs/Makefile.in0000644000212300117540000006123412027361162013652 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = tiff-bi$(EXEEXT) tiff-grayscale$(EXEEXT) \ tiff-palette$(EXEEXT) tiff-rgb$(EXEEXT) subdir = contrib/dbs DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_tiff_bi_OBJECTS = tiff-bi.$(OBJEXT) tiff_bi_OBJECTS = $(am_tiff_bi_OBJECTS) tiff_bi_DEPENDENCIES = $(LIBTIFF) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_tiff_grayscale_OBJECTS = tiff-grayscale.$(OBJEXT) tiff_grayscale_OBJECTS = $(am_tiff_grayscale_OBJECTS) tiff_grayscale_DEPENDENCIES = $(LIBTIFF) am_tiff_palette_OBJECTS = tiff-palette.$(OBJEXT) tiff_palette_OBJECTS = $(am_tiff_palette_OBJECTS) tiff_palette_DEPENDENCIES = $(LIBTIFF) am_tiff_rgb_OBJECTS = tiff-rgb.$(OBJEXT) tiff_rgb_OBJECTS = $(am_tiff_rgb_OBJECTS) tiff_rgb_DEPENDENCIES = $(LIBTIFF) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/libtiff depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(tiff_bi_SOURCES) $(tiff_grayscale_SOURCES) \ $(tiff_palette_SOURCES) $(tiff_rgb_SOURCES) DIST_SOURCES = $(tiff_bi_SOURCES) $(tiff_grayscale_SOURCES) \ $(tiff_palette_SOURCES) $(tiff_rgb_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = xtiff LIBTIFF = $(top_builddir)/libtiff/libtiff.la EXTRA_DIST = README tiff_bi_SOURCES = tiff-bi.c tiff_bi_LDADD = $(LIBTIFF) tiff_grayscale_SOURCES = tiff-grayscale.c tiff_grayscale_LDADD = $(LIBTIFF) tiff_palette_SOURCES = tiff-palette.c tiff_palette_LDADD = $(LIBTIFF) tiff_rgb_SOURCES = tiff-rgb.c tiff_rgb_LDADD = $(LIBTIFF) AM_CPPFLAGS = -I$(top_srcdir)/libtiff all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/dbs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/dbs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list tiff-bi$(EXEEXT): $(tiff_bi_OBJECTS) $(tiff_bi_DEPENDENCIES) $(EXTRA_tiff_bi_DEPENDENCIES) @rm -f tiff-bi$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiff_bi_OBJECTS) $(tiff_bi_LDADD) $(LIBS) tiff-grayscale$(EXEEXT): $(tiff_grayscale_OBJECTS) $(tiff_grayscale_DEPENDENCIES) $(EXTRA_tiff_grayscale_DEPENDENCIES) @rm -f tiff-grayscale$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiff_grayscale_OBJECTS) $(tiff_grayscale_LDADD) $(LIBS) tiff-palette$(EXEEXT): $(tiff_palette_OBJECTS) $(tiff_palette_DEPENDENCIES) $(EXTRA_tiff_palette_DEPENDENCIES) @rm -f tiff-palette$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiff_palette_OBJECTS) $(tiff_palette_LDADD) $(LIBS) tiff-rgb$(EXEEXT): $(tiff_rgb_OBJECTS) $(tiff_rgb_DEPENDENCIES) $(EXTRA_tiff_rgb_DEPENDENCIES) @rm -f tiff-rgb$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiff_rgb_OBJECTS) $(tiff_rgb_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiff-bi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiff-grayscale.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiff-palette.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiff-rgb.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ clean-noinstPROGRAMS cscopelist cscopelist-recursive ctags \ ctags-recursive distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/contrib/dbs/tiff-palette.c0000644000212300117540000001715711403511023014330 00000000000000/* $Id: tiff-palette.c,v 1.5 2010-06-08 18:55:15 bfriesen Exp $ */ /* * tiff-palette.c -- create a Class P (palette) TIFF file * * Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts. * * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #include #include #include #include "tiffio.h" #define WIDTH 512 #define HEIGHT WIDTH #define SCALE(x) ((x) * 257L) char * programName; void Usage(); int main(int argc, char **argv) { int bits_per_pixel = 8, cmsize, i, j, k, cmap_index, chunk_size = 32, nchunks = 16; unsigned char * scan_line; uint16 *red, *green, *blue; TIFF * tif; programName = argv[0]; if (argc != 4) Usage(); if (!strcmp(argv[1], "-depth")) bits_per_pixel = atoi(argv[2]); else Usage(); switch (bits_per_pixel) { case 8: nchunks = 16; chunk_size = 32; break; case 4: nchunks = 4; chunk_size = 128; break; case 2: nchunks = 2; chunk_size = 256; break; case 1: nchunks = 2; chunk_size = 256; break; default: Usage(); } if (bits_per_pixel != 1) { cmsize = nchunks * nchunks; } else { cmsize = 2; } red = (uint16 *) malloc(cmsize * sizeof(uint16)); green = (uint16 *) malloc(cmsize * sizeof(uint16)); blue = (uint16 *) malloc(cmsize * sizeof(uint16)); switch (bits_per_pixel) { case 8: for (i = 0; i < cmsize; i++) { if (i < 32) red[i] = 0; else if (i < 64) red[i] = SCALE(36); else if (i < 96) red[i] = SCALE(73); else if (i < 128) red[i] = SCALE(109); else if (i < 160) red[i] = SCALE(146); else if (i < 192) red[i] = SCALE(182); else if (i < 224) red[i] = SCALE(219); else if (i < 256) red[i] = SCALE(255); if ((i % 32) < 4) green[i] = 0; else if (i < 8) green[i] = SCALE(36); else if ((i % 32) < 12) green[i] = SCALE(73); else if ((i % 32) < 16) green[i] = SCALE(109); else if ((i % 32) < 20) green[i] = SCALE(146); else if ((i % 32) < 24) green[i] = SCALE(182); else if ((i % 32) < 28) green[i] = SCALE(219); else if ((i % 32) < 32) green[i] = SCALE(255); if ((i % 4) == 0) blue[i] = SCALE(0); else if ((i % 4) == 1) blue[i] = SCALE(85); else if ((i % 4) == 2) blue[i] = SCALE(170); else if ((i % 4) == 3) blue[i] = SCALE(255); } break; case 4: red[0] = SCALE(255); green[0] = 0; blue[0] = 0; red[1] = 0; green[1] = SCALE(255); blue[1] = 0; red[2] = 0; green[2] = 0; blue[2] = SCALE(255); red[3] = SCALE(255); green[3] = SCALE(255); blue[3] = SCALE(255); red[4] = 0; green[4] = SCALE(255); blue[4] = SCALE(255); red[5] = SCALE(255); green[5] = 0; blue[5] = SCALE(255); red[6] = SCALE(255); green[6] = SCALE(255); blue[6] = 0; red[7] = 0; green[7] = 0; blue[7] = 0; red[8] = SCALE(176); green[8] = SCALE(224); blue[8] = SCALE(230); red[9] = SCALE(100); green[9] = SCALE(149); blue[9] = SCALE(237); red[10] = SCALE(46); green[10] = SCALE(139); blue[10] = SCALE(87); red[11] = SCALE(160); green[11] = SCALE(82); blue[11] = SCALE(45); red[12] = SCALE(238); green[12] = SCALE(130); blue[12] = SCALE(238); red[13] = SCALE(176); green[13] = SCALE(48); blue[13] = SCALE(96); red[14] = SCALE(50); green[14] = SCALE(205); blue[14] = SCALE(50); red[15] = SCALE(240); green[15] = SCALE(152); blue[15] = SCALE(35); break; case 2: red[0] = SCALE(255); green[0] = 0; blue[0] = 0; red[1] = 0; green[1] = SCALE(255); blue[1] = 0; red[2] = 0; green[2] = 0; blue[2] = SCALE(255); red[3] = SCALE(255); green[3] = SCALE(255); blue[3] = SCALE(255); break; case 1: red[0] = 0; green[0] = 0; blue[0] = 0; red[1] = SCALE(255); green[1] = SCALE(255); blue[1] = SCALE(255); break; } if ((tif = TIFFOpen(argv[3], "w")) == NULL) { fprintf(stderr, "can't open %s as a TIFF file\n", argv[3]); free(red);free(green);free(blue); return 0; } TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, WIDTH); TIFFSetField(tif, TIFFTAG_IMAGELENGTH, HEIGHT); TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bits_per_pixel); TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE); TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE); TIFFSetField(tif, TIFFTAG_COLORMAP, red, green, blue); scan_line = (unsigned char *) malloc(WIDTH / (8 / bits_per_pixel)); for (i = 0; i < HEIGHT; i++) { for (j = 0, k = 0; j < WIDTH;) { cmap_index = (j / chunk_size) + ((i / chunk_size) * nchunks); switch (bits_per_pixel) { case 8: scan_line[k++] = cmap_index; j++; break; case 4: scan_line[k++] = (cmap_index << 4) + cmap_index; j += 2; break; case 2: scan_line[k++] = (cmap_index << 6) + (cmap_index << 4) + (cmap_index << 2) + cmap_index; j += 4; break; case 1: scan_line[k++] = ((j / chunk_size) == (i / chunk_size)) ? 0x00 : 0xff; j += 8; break; } } TIFFWriteScanline(tif, scan_line, i, 0); } free(scan_line); TIFFClose(tif); return 0; } void Usage() { fprintf(stderr, "Usage: %s -depth (8 | 4 | 2 | 1) tiff-image\n", programName); exit(0); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/dbs/xtiff/0000755000212300117540000000000012027361331012775 500000000000000tiff-4.0.3/contrib/dbs/xtiff/README0000644000212300117540000000047106747424643013621 00000000000000xtiff 2.0 xtiff is a tool for viewing a TIFF file in an X window. It was written to handle as many different kinds of TIFF files as possible while remaining simple, portable and efficient. xtiff requires X11 R4, the Athena Widgets and Sam Leffler's libtiff package (which can be found on ucbvax.berkeley.edu). tiff-4.0.3/contrib/dbs/xtiff/Makefile.am0000644000212300117540000000312411016026225014746 00000000000000# # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. #LIBTIFF = $(top_builddir)/libtiff/libtiff.la EXTRA_DIST = README patchlevel.h xtiff.c xtifficon.h #noinst_PROGRAMS = #if HAVE_XAW #noinst_PROGRAMS += xtiff #endif #xtiff_SOURCES = patchlevel.h xtiff.c xtifficon.h #xtiff_CFLAGS = $(CFLAGS) $(XAW_CFLAGS) $(AM_CFLAGS) #xtiff_LDADD = $(LIBTIFF) $(X_LIBS) $(XAW_LIBS) #INCLUDES = -I$(top_srcdir)/libtiff tiff-4.0.3/contrib/dbs/xtiff/xtifficon.h0000644000212300117540000000172011403510577015064 00000000000000#define xtifficon_width 32 #define xtifficon_height 32 static char xtifficon_bits[] = { 0xff, 0x00, 0x00, 0xc0, 0xfe, 0x01, 0x7e, 0xc0, 0xfc, 0x03, 0x7e, 0x60, 0xf8, 0x07, 0x06, 0x30, 0xf8, 0x07, 0x1e, 0x18, 0xf0, 0x0f, 0x1e, 0x0c, 0xe0, 0x1f, 0x06, 0x06, 0xc0, 0x3f, 0x06, 0x06, 0xc0, 0x3f, 0x06, 0x03, 0x80, 0x7f, 0x80, 0x01, 0x00, 0xff, 0xc0, 0x00, 0x00, 0xfe, 0x61, 0x00, 0x00, 0xfe, 0x31, 0x7e, 0x7e, 0xfc, 0x33, 0x7e, 0x7e, 0xf8, 0x1b, 0x06, 0x18, 0xf0, 0x0d, 0x1e, 0x18, 0xf0, 0x0e, 0x1e, 0x18, 0x60, 0x1f, 0x06, 0x18, 0xb0, 0x3f, 0x06, 0x18, 0x98, 0x7f, 0x06, 0x18, 0x98, 0x7f, 0x00, 0x00, 0x0c, 0xff, 0x00, 0x00, 0x06, 0xfe, 0x01, 0x00, 0x63, 0xfc, 0x03, 0x80, 0x61, 0xfc, 0x03, 0xc0, 0x60, 0xf8, 0x07, 0xc0, 0x60, 0xf0, 0x0f, 0x60, 0x60, 0xe0, 0x1f, 0x30, 0x60, 0xe0, 0x1f, 0x18, 0x60, 0xc0, 0x3f, 0x0c, 0x60, 0x80, 0x7f, 0x06, 0x00, 0x00, 0xff}; /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/dbs/xtiff/patchlevel.h0000644000212300117540000000015311403510577015221 00000000000000#define PATCHLEVEL 0 /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/dbs/xtiff/Makefile.in0000644000212300117540000003203512027361162014767 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. #LIBTIFF = $(top_builddir)/libtiff/libtiff.la VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = contrib/dbs/xtiff DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README patchlevel.h xtiff.c xtifficon.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/dbs/xtiff/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/dbs/xtiff/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am #noinst_PROGRAMS = #if HAVE_XAW #noinst_PROGRAMS += xtiff #endif #xtiff_SOURCES = patchlevel.h xtiff.c xtifficon.h #xtiff_CFLAGS = $(CFLAGS) $(XAW_CFLAGS) $(AM_CFLAGS) #xtiff_LDADD = $(LIBTIFF) $(X_LIBS) $(XAW_LIBS) #INCLUDES = -I$(top_srcdir)/libtiff # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/contrib/dbs/xtiff/xtiff.c0000644000212300117540000012171511403511023014200 00000000000000/* * $Id: xtiff.c,v 1.3 2010-06-08 18:55:15 bfriesen Exp $ * * xtiff - view a TIFF file in an X window * * Dan Sears * Chris Sears * * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. * * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * * Revision 1.0 90/05/07 * Initial release. * Revision 2.0 90/12/20 * Converted to use the Athena Widgets and the Xt Intrinsics. * * Notes: * * According to the TIFF 5.0 Specification, it is possible to have * both a TIFFTAG_COLORMAP and a TIFFTAG_COLORRESPONSECURVE. This * doesn't make sense since a TIFFTAG_COLORMAP is 16 bits wide and * a TIFFTAG_COLORRESPONSECURVE is tfBitsPerSample bits wide for each * channel. This is probably a bug in the specification. * In this case, TIFFTAG_COLORRESPONSECURVE is ignored. * This might make sense if TIFFTAG_COLORMAP was 8 bits wide. * * TIFFTAG_COLORMAP is often incorrectly written as ranging from * 0 to 255 rather than from 0 to 65535. CheckAndCorrectColormap() * takes care of this. * * Only ORIENTATION_TOPLEFT is supported correctly. This is the * default TIFF and X orientation. Other orientations will be * displayed incorrectly. * * There is no support for or use of 3/3/2 DirectColor visuals. * TIFFTAG_MINSAMPLEVALUE and TIFFTAG_MAXSAMPLEVALUE are not supported. * * Only TIFFTAG_BITSPERSAMPLE values that are 1, 2, 4 or 8 are supported. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #define XK_MISCELLANY #include #include "xtifficon.h" #define TIFF_GAMMA "2.2" /* default gamma from the TIFF 5.0 spec */ #define ROUND(x) (uint16) ((x) + 0.5) #define SCALE(x, s) (((x) * 65535L) / (s)) #define MCHECK(m) if (!m) { fprintf(stderr, "malloc failed\n"); exit(0); } #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #define VIEWPORT_WIDTH 700 #define VIEWPORT_HEIGHT 500 #define KEY_TRANSLATE 20 #ifdef __STDC__ #define PP(args) args #else #define PP(args) () #endif int main PP((int argc, char **argv)); void OpenTIFFFile PP((void)); void GetTIFFHeader PP((void)); void SetNameLabel PP((void)); void CheckAndCorrectColormap PP((void)); void SimpleGammaCorrection PP((void)); void GetVisual PP((void)); Boolean SearchVisualList PP((int image_depth, int visual_class, Visual **visual)); void GetTIFFImage PP((void)); void CreateXImage PP((void)); XtCallbackProc SelectProc PP((Widget w, caddr_t unused_1, caddr_t unused_2)); void QuitProc PP((void)); void NextProc PP((void)); void PreviousProc PP((void)); void PageProc PP((int direction)); void EventProc PP((Widget widget, caddr_t unused, XEvent *event)); void ResizeProc PP((void)); int XTiffErrorHandler PP((Display *display, XErrorEvent *error_event)); void Usage PP((void)); int xtVersion = XtSpecificationRelease; /* xtiff depends on R4 or higher */ /* * Xt data structures */ Widget shellWidget, formWidget, listWidget, labelWidget, imageWidget; enum { ButtonQuit = 0, ButtonPreviousPage = 1, ButtonNextPage = 2 }; String buttonStrings[] = { "Quit", "Previous", "Next" }; static XrmOptionDescRec shellOptions[] = { { "-help", "*help", XrmoptionNoArg, (caddr_t) "True" }, { "-gamma", "*gamma", XrmoptionSepArg, NULL }, { "-usePixmap", "*usePixmap", XrmoptionSepArg, NULL }, { "-viewportWidth", "*viewportWidth", XrmoptionSepArg, NULL }, { "-viewportHeight", "*viewportHeight", XrmoptionSepArg, NULL }, { "-translate", "*translate", XrmoptionSepArg, NULL }, { "-verbose", "*verbose", XrmoptionSepArg, NULL } }; typedef struct { Boolean help; float gamma; Boolean usePixmap; uint32 viewportWidth; uint32 viewportHeight; int translate; Boolean verbose; } AppData, *AppDataPtr; AppData appData; XtResource clientResources[] = { { "help", XtCBoolean, XtRBoolean, sizeof(Boolean), XtOffset(AppDataPtr, help), XtRImmediate, (XtPointer) False }, { "gamma", "Gamma", XtRFloat, sizeof(float), XtOffset(AppDataPtr, gamma), XtRString, (XtPointer) TIFF_GAMMA }, { "usePixmap", "UsePixmap", XtRBoolean, sizeof(Boolean), XtOffset(AppDataPtr, usePixmap), XtRImmediate, (XtPointer) True }, { "viewportWidth", "ViewportWidth", XtRInt, sizeof(int), XtOffset(AppDataPtr, viewportWidth), XtRImmediate, (XtPointer) VIEWPORT_WIDTH }, { "viewportHeight", "ViewportHeight", XtRInt, sizeof(int), XtOffset(AppDataPtr, viewportHeight), XtRImmediate, (XtPointer) VIEWPORT_HEIGHT }, { "translate", "Translate", XtRInt, sizeof(int), XtOffset(AppDataPtr, translate), XtRImmediate, (XtPointer) KEY_TRANSLATE }, { "verbose", "Verbose", XtRBoolean, sizeof(Boolean), XtOffset(AppDataPtr, verbose), XtRImmediate, (XtPointer) True } }; Arg formArgs[] = { { XtNresizable, True } }; Arg listArgs[] = { { XtNresizable, False }, { XtNborderWidth, 0 }, { XtNdefaultColumns, 3 }, { XtNforceColumns, True }, { XtNlist, (int) buttonStrings }, { XtNnumberStrings, XtNumber(buttonStrings) }, { XtNtop, XtChainTop }, { XtNleft, XtChainLeft }, { XtNbottom, XtChainTop }, { XtNright, XtChainLeft } }; Arg labelArgs[] = { { XtNresizable, False }, { XtNwidth, 200 }, { XtNborderWidth, 0 }, { XtNjustify, XtJustifyLeft }, { XtNtop, XtChainTop }, { XtNleft, XtChainLeft }, { XtNbottom, XtChainTop }, { XtNright, XtChainLeft } }; Arg imageArgs[] = { { XtNresizable, True }, { XtNborderWidth, 0 }, { XtNtop, XtChainTop }, { XtNleft, XtChainLeft }, { XtNbottom, XtChainTop }, { XtNright, XtChainLeft } }; XtActionsRec actionsTable[] = { { "quit", QuitProc }, { "next", NextProc }, { "previous", PreviousProc }, { "notifyresize", ResizeProc } }; char translationsTable[] = "q: quit() \n \ Q: quit() \n \ WM_PROTOCOLS: quit()\n \ p: previous() \n \ P: previous() \n \ n: next() \n \ N: next() \n \ : notifyresize()"; /* * X data structures */ Colormap xColormap; Display * xDisplay; Pixmap xImagePixmap; Visual * xVisual; XImage * xImage; GC xWinGc; int xImageDepth, xScreen, xRedMask, xGreenMask, xBlueMask, xOffset = 0, yOffset = 0, grabX = -1, grabY = -1; unsigned char basePixel = 0; /* * TIFF data structures */ TIFF * tfFile = NULL; uint32 tfImageWidth, tfImageHeight; uint16 tfBitsPerSample, tfSamplesPerPixel, tfPlanarConfiguration, tfPhotometricInterpretation, tfGrayResponseUnit, tfImageDepth, tfBytesPerRow; int tfDirectory = 0, tfMultiPage = False; double tfUnitMap, tfGrayResponseUnitMap[] = { -1, -10, -100, -1000, -10000, -100000 }; /* * display data structures */ double *dRed, *dGreen, *dBlue; /* * shared data structures */ uint16 * redMap = NULL, *greenMap = NULL, *blueMap = NULL, *grayMap = NULL, colormapSize; char * imageMemory; char * fileName; int main(int argc, char **argv) { XSetWindowAttributes window_attributes; Widget widget_list[3]; Arg args[5]; setbuf(stdout, NULL); setbuf(stderr, NULL); shellWidget = XtInitialize(argv[0], "XTiff", shellOptions, XtNumber(shellOptions), &argc, argv); XSetErrorHandler(XTiffErrorHandler); XtGetApplicationResources(shellWidget, &appData, (XtResourceList) clientResources, (Cardinal) XtNumber(clientResources), (ArgList) NULL, (Cardinal) 0); if ((argc <= 1) || (argc > 2) || appData.help) Usage(); if (appData.verbose == False) { TIFFSetErrorHandler(0); TIFFSetWarningHandler(0); } fileName = argv[1]; xDisplay = XtDisplay(shellWidget); xScreen = DefaultScreen(xDisplay); OpenTIFFFile(); GetTIFFHeader(); SimpleGammaCorrection(); GetVisual(); GetTIFFImage(); /* * Send visual, colormap, depth and iconPixmap to shellWidget. * Sending the visual to the shell is only possible with the advent of R4. */ XtSetArg(args[0], XtNvisual, xVisual); XtSetArg(args[1], XtNcolormap, xColormap); XtSetArg(args[2], XtNdepth, xImageDepth == 1 ? DefaultDepth(xDisplay, xScreen) : xImageDepth); XtSetArg(args[3], XtNiconPixmap, XCreateBitmapFromData(xDisplay, RootWindow(xDisplay, xScreen), xtifficon_bits, xtifficon_width, xtifficon_height)); XtSetArg(args[4], XtNallowShellResize, True); XtSetValues(shellWidget, args, 5); /* * widget instance hierarchy */ formWidget = XtCreateManagedWidget("form", formWidgetClass, shellWidget, formArgs, XtNumber(formArgs)); widget_list[0] = listWidget = XtCreateWidget("list", listWidgetClass, formWidget, listArgs, XtNumber(listArgs)); widget_list[1] = labelWidget = XtCreateWidget("label", labelWidgetClass, formWidget, labelArgs, XtNumber(labelArgs)); widget_list[2] = imageWidget = XtCreateWidget("image", widgetClass, formWidget, imageArgs, XtNumber(imageArgs)); XtManageChildren(widget_list, XtNumber(widget_list)); /* * initial widget sizes - for small images let xtiff size itself */ if (tfImageWidth >= appData.viewportWidth) { XtSetArg(args[0], XtNwidth, appData.viewportWidth); XtSetValues(shellWidget, args, 1); } if (tfImageHeight >= appData.viewportHeight) { XtSetArg(args[0], XtNheight, appData.viewportHeight); XtSetValues(shellWidget, args, 1); } XtSetArg(args[0], XtNwidth, tfImageWidth); XtSetArg(args[1], XtNheight, tfImageHeight); XtSetValues(imageWidget, args, 2); /* * formWidget uses these constraints but they are stored in the children. */ XtSetArg(args[0], XtNfromVert, listWidget); XtSetValues(imageWidget, args, 1); XtSetArg(args[0], XtNfromHoriz, listWidget); XtSetValues(labelWidget, args, 1); SetNameLabel(); XtAddCallback(listWidget, XtNcallback, (XtCallbackProc) SelectProc, (XtPointer) NULL); XtAddActions(actionsTable, XtNumber(actionsTable)); XtSetArg(args[0], XtNtranslations, XtParseTranslationTable(translationsTable)); XtSetValues(formWidget, &args[0], 1); XtSetValues(imageWidget, &args[0], 1); /* * This is intended to be a little faster than going through * the translation manager. */ XtAddEventHandler(imageWidget, ExposureMask | ButtonPressMask | ButtonReleaseMask | Button1MotionMask | KeyPressMask, False, EventProc, NULL); XtRealizeWidget(shellWidget); window_attributes.cursor = XCreateFontCursor(xDisplay, XC_fleur); XChangeWindowAttributes(xDisplay, XtWindow(imageWidget), CWCursor, &window_attributes); CreateXImage(); XtMainLoop(); return 0; } void OpenTIFFFile() { if (tfFile != NULL) TIFFClose(tfFile); if ((tfFile = TIFFOpen(fileName, "r")) == NULL) { fprintf(appData.verbose ? stderr : stdout, "xtiff: can't open %s as a TIFF file\n", fileName); exit(0); } tfMultiPage = (TIFFLastDirectory(tfFile) ? False : True); } void GetTIFFHeader() { register int i; if (!TIFFSetDirectory(tfFile, tfDirectory)) { fprintf(stderr, "xtiff: can't seek to directory %d in %s\n", tfDirectory, fileName); exit(0); } TIFFGetField(tfFile, TIFFTAG_IMAGEWIDTH, &tfImageWidth); TIFFGetField(tfFile, TIFFTAG_IMAGELENGTH, &tfImageHeight); /* * If the following tags aren't present then use the TIFF defaults. */ TIFFGetFieldDefaulted(tfFile, TIFFTAG_BITSPERSAMPLE, &tfBitsPerSample); TIFFGetFieldDefaulted(tfFile, TIFFTAG_SAMPLESPERPIXEL, &tfSamplesPerPixel); TIFFGetFieldDefaulted(tfFile, TIFFTAG_PLANARCONFIG, &tfPlanarConfiguration); TIFFGetFieldDefaulted(tfFile, TIFFTAG_GRAYRESPONSEUNIT, &tfGrayResponseUnit); tfUnitMap = tfGrayResponseUnitMap[tfGrayResponseUnit]; colormapSize = 1 << tfBitsPerSample; tfImageDepth = tfBitsPerSample * tfSamplesPerPixel; dRed = (double *) malloc(colormapSize * sizeof(double)); dGreen = (double *) malloc(colormapSize * sizeof(double)); dBlue = (double *) malloc(colormapSize * sizeof(double)); MCHECK(dRed); MCHECK(dGreen); MCHECK(dBlue); /* * If TIFFTAG_PHOTOMETRIC is not present then assign a reasonable default. * The TIFF 5.0 specification doesn't give a default. */ if (!TIFFGetField(tfFile, TIFFTAG_PHOTOMETRIC, &tfPhotometricInterpretation)) { if (tfSamplesPerPixel != 1) tfPhotometricInterpretation = PHOTOMETRIC_RGB; else if (tfBitsPerSample == 1) tfPhotometricInterpretation = PHOTOMETRIC_MINISBLACK; else if (TIFFGetField(tfFile, TIFFTAG_COLORMAP, &redMap, &greenMap, &blueMap)) { tfPhotometricInterpretation = PHOTOMETRIC_PALETTE; redMap = greenMap = blueMap = NULL; } else tfPhotometricInterpretation = PHOTOMETRIC_MINISBLACK; } /* * Given TIFFTAG_PHOTOMETRIC extract or create the response curves. */ switch (tfPhotometricInterpretation) { case PHOTOMETRIC_RGB: redMap = (uint16 *) malloc(colormapSize * sizeof(uint16)); greenMap = (uint16 *) malloc(colormapSize * sizeof(uint16)); blueMap = (uint16 *) malloc(colormapSize * sizeof(uint16)); MCHECK(redMap); MCHECK(greenMap); MCHECK(blueMap); for (i = 0; i < colormapSize; i++) dRed[i] = dGreen[i] = dBlue[i] = (double) SCALE(i, colormapSize - 1); break; case PHOTOMETRIC_PALETTE: if (!TIFFGetField(tfFile, TIFFTAG_COLORMAP, &redMap, &greenMap, &blueMap)) { redMap = (uint16 *) malloc(colormapSize * sizeof(uint16)); greenMap = (uint16 *) malloc(colormapSize * sizeof(uint16)); blueMap = (uint16 *) malloc(colormapSize * sizeof(uint16)); MCHECK(redMap); MCHECK(greenMap); MCHECK(blueMap); for (i = 0; i < colormapSize; i++) dRed[i] = dGreen[i] = dBlue[i] = (double) SCALE(i, colormapSize - 1); } else { CheckAndCorrectColormap(); for (i = 0; i < colormapSize; i++) { dRed[i] = (double) redMap[i]; dGreen[i] = (double) greenMap[i]; dBlue[i] = (double) blueMap[i]; } } break; case PHOTOMETRIC_MINISWHITE: redMap = (uint16 *) malloc(colormapSize * sizeof(uint16)); greenMap = (uint16 *) malloc(colormapSize * sizeof(uint16)); blueMap = (uint16 *) malloc(colormapSize * sizeof(uint16)); MCHECK(redMap); MCHECK(greenMap); MCHECK(blueMap); for (i = 0; i < colormapSize; i++) dRed[i] = dGreen[i] = dBlue[i] = (double) SCALE(colormapSize-1-i, colormapSize-1); break; case PHOTOMETRIC_MINISBLACK: redMap = (uint16 *) malloc(colormapSize * sizeof(uint16)); greenMap = (uint16 *) malloc(colormapSize * sizeof(uint16)); blueMap = (uint16 *) malloc(colormapSize * sizeof(uint16)); MCHECK(redMap); MCHECK(greenMap); MCHECK(blueMap); for (i = 0; i < colormapSize; i++) dRed[i] = dGreen[i] = dBlue[i] = (double) SCALE(i, colormapSize-1); break; default: fprintf(stderr, "xtiff: can't display photometric interpretation type %d\n", tfPhotometricInterpretation); exit(0); } } void SetNameLabel() { char buffer[BUFSIZ]; Arg args[1]; if (tfMultiPage) sprintf(buffer, "%s - page %d", fileName, tfDirectory); else strcpy(buffer, fileName); XtSetArg(args[0], XtNlabel, buffer); XtSetValues(labelWidget, args, 1); } /* * Many programs get TIFF colormaps wrong. They use 8-bit colormaps instead of * 16-bit colormaps. This function is a heuristic to detect and correct this. */ void CheckAndCorrectColormap() { register int i; for (i = 0; i < colormapSize; i++) if ((redMap[i] > 255) || (greenMap[i] > 255) || (blueMap[i] > 255)) return; for (i = 0; i < colormapSize; i++) { redMap[i] = SCALE(redMap[i], 255); greenMap[i] = SCALE(greenMap[i], 255); blueMap[i] = SCALE(blueMap[i], 255); } TIFFWarning(fileName, "Assuming 8-bit colormap"); } void SimpleGammaCorrection() { register int i; register double i_gamma = 1.0 / appData.gamma; for (i = 0; i < colormapSize; i++) { if (((tfPhotometricInterpretation == PHOTOMETRIC_MINISWHITE) && (i == colormapSize - 1)) || ((tfPhotometricInterpretation == PHOTOMETRIC_MINISBLACK) && (i == 0))) redMap[i] = greenMap[i] = blueMap[i] = 0; else { redMap[i] = ROUND((pow(dRed[i] / 65535.0, i_gamma) * 65535.0)); greenMap[i] = ROUND((pow(dGreen[i] / 65535.0, i_gamma) * 65535.0)); blueMap[i] = ROUND((pow(dBlue[i] / 65535.0, i_gamma) * 65535.0)); } } free(dRed); free(dGreen); free(dBlue); } static char* classNames[] = { "StaticGray", "GrayScale", "StaticColor", "PseudoColor", "TrueColor", "DirectColor" }; /* * Current limitation: the visual is set initially by the first file. * It cannot be changed. */ void GetVisual() { XColor *colors = NULL; unsigned long *pixels = NULL; unsigned long i; switch (tfImageDepth) { /* * X really wants a 32-bit image with the fourth channel unused, * but the visual structure thinks it's 24-bit. bitmap_unit is 32. */ case 32: case 24: if (SearchVisualList(24, DirectColor, &xVisual) == False) { fprintf(stderr, "xtiff: 24-bit DirectColor visual not available\n"); exit(0); } colors = (XColor *) malloc(3 * colormapSize * sizeof(XColor)); MCHECK(colors); for (i = 0; i < colormapSize; i++) { colors[i].pixel = (i << 16) + (i << 8) + i; colors[i].red = redMap[i]; colors[i].green = greenMap[i]; colors[i].blue = blueMap[i]; colors[i].flags = DoRed | DoGreen | DoBlue; } xColormap = XCreateColormap(xDisplay, RootWindow(xDisplay, xScreen), xVisual, AllocAll); XStoreColors(xDisplay, xColormap, colors, colormapSize); break; case 8: case 4: case 2: /* * We assume that systems with 24-bit visuals also have 8-bit visuals. * We don't promote from 8-bit PseudoColor to 24/32 bit DirectColor. */ switch (tfPhotometricInterpretation) { case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: if (SearchVisualList((int) tfImageDepth, GrayScale, &xVisual) == True) break; case PHOTOMETRIC_PALETTE: if (SearchVisualList((int) tfImageDepth, PseudoColor, &xVisual) == True) break; default: fprintf(stderr, "xtiff: Unsupported TIFF/X configuration\n"); exit(0); } colors = (XColor *) malloc(colormapSize * sizeof(XColor)); MCHECK(colors); for (i = 0; i < colormapSize; i++) { colors[i].pixel = i; colors[i].red = redMap[i]; colors[i].green = greenMap[i]; colors[i].blue = blueMap[i]; colors[i].flags = DoRed | DoGreen | DoBlue; } /* * xtiff's colormap allocation is private. It does not attempt * to detect whether any existing colormap entries are suitable * for its use. This will cause colormap flashing. Furthermore, * background and foreground are taken from the environment. * For example, the foreground color may be red when the visual * is GrayScale. If the colormap is completely populated, * Xt will not be able to allocate fg and bg. */ if (tfImageDepth == 8) xColormap = XCreateColormap(xDisplay, RootWindow(xDisplay, xScreen), xVisual, AllocAll); else { xColormap = XCreateColormap(xDisplay, RootWindow(xDisplay, xScreen), xVisual, AllocNone); pixels = (unsigned long *) malloc(colormapSize * sizeof(unsigned long)); MCHECK(pixels); (void) XAllocColorCells(xDisplay, xColormap, True, NULL, 0, pixels, colormapSize); basePixel = (unsigned char) pixels[0]; free(pixels); } XStoreColors(xDisplay, xColormap, colors, colormapSize); break; case 1: xImageDepth = 1; xVisual = DefaultVisual(xDisplay, xScreen); xColormap = DefaultColormap(xDisplay, xScreen); break; default: fprintf(stderr, "xtiff: unsupported image depth %d\n", tfImageDepth); exit(0); } if (appData.verbose == True) fprintf(stderr, "%s: Using %d-bit %s visual.\n", fileName, xImageDepth, classNames[xVisual->class]); if (colors != NULL) free(colors); if (grayMap != NULL) free(grayMap); if (redMap != NULL) free(redMap); if (greenMap != NULL) free(greenMap); if (blueMap != NULL) free(blueMap); colors = NULL; grayMap = redMap = greenMap = blueMap = NULL; } /* * Search for an appropriate visual. Promote where necessary. * Check to make sure that ENOUGH colormap entries are writeable. * basePixel was determined when XAllocColorCells() contiguously * allocated enough entries. basePixel is used below in GetTIFFImage. */ Boolean SearchVisualList(image_depth, visual_class, visual) int image_depth, visual_class; Visual **visual; { XVisualInfo template_visual, *visual_list, *vl; int i, n_visuals; template_visual.screen = xScreen; vl = visual_list = XGetVisualInfo(xDisplay, VisualScreenMask, &template_visual, &n_visuals); if (n_visuals == 0) { fprintf(stderr, "xtiff: visual list not available\n"); exit(0); } for (i = 0; i < n_visuals; vl++, i++) { if ((vl->class == visual_class) && (vl->depth >= image_depth) && (vl->visual->map_entries >= (1 << vl->depth))) { *visual = vl->visual; xImageDepth = vl->depth; xRedMask = vl->red_mask; xGreenMask = vl->green_mask; xBlueMask = vl->blue_mask; XFree((char *) visual_list); return True; } } XFree((char *) visual_list); return False; } void GetTIFFImage() { int pixel_map[3], red_shift, green_shift, blue_shift; char *scan_line, *output_p, *input_p; uint32 i, j; uint16 s; scan_line = (char *) malloc(tfBytesPerRow = TIFFScanlineSize(tfFile)); MCHECK(scan_line); if ((tfImageDepth == 32) || (tfImageDepth == 24)) { output_p = imageMemory = (char *) malloc(tfImageWidth * tfImageHeight * 4); MCHECK(imageMemory); /* * Handle different color masks for different frame buffers. */ if (ImageByteOrder(xDisplay) == LSBFirst) { /* DECstation 5000 */ red_shift = pixel_map[0] = xRedMask == 0xFF000000 ? 3 : (xRedMask == 0xFF0000 ? 2 : (xRedMask == 0xFF00 ? 1 : 0)); green_shift = pixel_map[1] = xGreenMask == 0xFF000000 ? 3 : (xGreenMask == 0xFF0000 ? 2 : (xGreenMask == 0xFF00 ? 1 : 0)); blue_shift = pixel_map[2] = xBlueMask == 0xFF000000 ? 3 : (xBlueMask == 0xFF0000 ? 2 : (xBlueMask == 0xFF00 ? 1 : 0)); } else { /* Ardent */ red_shift = pixel_map[0] = xRedMask == 0xFF000000 ? 0 : (xRedMask == 0xFF0000 ? 1 : (xRedMask == 0xFF00 ? 2 : 3)); green_shift = pixel_map[0] = xGreenMask == 0xFF000000 ? 0 : (xGreenMask == 0xFF0000 ? 1 : (xGreenMask == 0xFF00 ? 2 : 3)); blue_shift = pixel_map[0] = xBlueMask == 0xFF000000 ? 0 : (xBlueMask == 0xFF0000 ? 1 : (xBlueMask == 0xFF00 ? 2 : 3)); } if (tfPlanarConfiguration == PLANARCONFIG_CONTIG) { for (i = 0; i < tfImageHeight; i++) { if (TIFFReadScanline(tfFile, scan_line, i, 0) < 0) break; for (input_p = scan_line, j = 0; j < tfImageWidth; j++) { *(output_p + red_shift) = *input_p++; *(output_p + green_shift) = *input_p++; *(output_p + blue_shift) = *input_p++; output_p += 4; if (tfSamplesPerPixel == 4) /* skip the fourth channel */ input_p++; } } } else { for (s = 0; s < tfSamplesPerPixel; s++) { if (s == 3) /* skip the fourth channel */ continue; for (i = 0; i < tfImageHeight; i++) { if (TIFFReadScanline(tfFile, scan_line, i, s) < 0) break; input_p = scan_line; output_p = imageMemory + (i*tfImageWidth*4) + pixel_map[s]; for (j = 0; j < tfImageWidth; j++, output_p += 4) *output_p = *input_p++; } } } } else { if (xImageDepth == tfImageDepth) { output_p = imageMemory = (char *) malloc(tfBytesPerRow * tfImageHeight); MCHECK(imageMemory); for (i = 0; i < tfImageHeight; i++, output_p += tfBytesPerRow) if (TIFFReadScanline(tfFile, output_p, i, 0) < 0) break; } else if ((xImageDepth == 8) && (tfImageDepth == 4)) { output_p = imageMemory = (char *) malloc(tfBytesPerRow * 2 * tfImageHeight + 2); MCHECK(imageMemory); /* * If a scanline is of odd size the inner loop below will overshoot. * This is handled very simply by recalculating the start point at * each scanline and padding imageMemory a little at the end. */ for (i = 0; i < tfImageHeight; i++) { if (TIFFReadScanline(tfFile, scan_line, i, 0) < 0) break; output_p = &imageMemory[i * tfImageWidth]; input_p = scan_line; for (j = 0; j < tfImageWidth; j += 2, input_p++) { *output_p++ = (*input_p >> 4) + basePixel; *output_p++ = (*input_p & 0xf) + basePixel; } } } else if ((xImageDepth == 8) && (tfImageDepth == 2)) { output_p = imageMemory = (char *) malloc(tfBytesPerRow * 4 * tfImageHeight + 4); MCHECK(imageMemory); for (i = 0; i < tfImageHeight; i++) { if (TIFFReadScanline(tfFile, scan_line, i, 0) < 0) break; output_p = &imageMemory[i * tfImageWidth]; input_p = scan_line; for (j = 0; j < tfImageWidth; j += 4, input_p++) { *output_p++ = (*input_p >> 6) + basePixel; *output_p++ = ((*input_p >> 4) & 3) + basePixel; *output_p++ = ((*input_p >> 2) & 3) + basePixel; *output_p++ = (*input_p & 3) + basePixel; } } } else if ((xImageDepth == 4) && (tfImageDepth == 2)) { output_p = imageMemory = (char *) malloc(tfBytesPerRow * 2 * tfImageHeight + 2); MCHECK(imageMemory); for (i = 0; i < tfImageHeight; i++) { if (TIFFReadScanline(tfFile, scan_line, i, 0) < 0) break; output_p = &imageMemory[i * tfBytesPerRow * 2]; input_p = scan_line; for (j = 0; j < tfImageWidth; j += 4, input_p++) { *output_p++ = (((*input_p>>6) << 4) | ((*input_p >> 4) & 3)) + basePixel; *output_p++ = ((((*input_p>>2) & 3) << 4) | (*input_p & 3)) + basePixel; } } } else { fprintf(stderr, "xtiff: can't handle %d-bit TIFF file on an %d-bit display\n", tfImageDepth, xImageDepth); exit(0); } } free(scan_line); } void CreateXImage() { XGCValues gc_values; GC bitmap_gc; xOffset = yOffset = 0; grabX = grabY = -1; xImage = XCreateImage(xDisplay, xVisual, xImageDepth, xImageDepth == 1 ? XYBitmap : ZPixmap, /* offset */ 0, (char *) imageMemory, tfImageWidth, tfImageHeight, /* bitmap_pad */ 8, /* bytes_per_line */ 0); /* * libtiff converts LSB data into MSB but doesn't change the FillOrder tag. */ if (xImageDepth == 1) xImage->bitmap_bit_order = MSBFirst; if (xImageDepth <= 8) xImage->byte_order = MSBFirst; /* * create an appropriate GC */ gc_values.function = GXcopy; gc_values.plane_mask = AllPlanes; if (tfPhotometricInterpretation == PHOTOMETRIC_MINISBLACK) { gc_values.foreground = XWhitePixel(xDisplay, xScreen); gc_values.background = XBlackPixel(xDisplay, xScreen); } else { gc_values.foreground = XBlackPixel(xDisplay, xScreen); gc_values.background = XWhitePixel(xDisplay, xScreen); } xWinGc = XCreateGC(xDisplay, XtWindow(shellWidget), GCFunction | GCPlaneMask | GCForeground | GCBackground, &gc_values); /* * create the pixmap and load the image */ if (appData.usePixmap == True) { xImagePixmap = XCreatePixmap(xDisplay, RootWindow(xDisplay, xScreen), xImage->width, xImage->height, xImageDepth); /* * According to the O'Reilly X Protocol Reference Manual, page 53, * "A pixmap depth of one is always supported and listed, but windows * of depth one might not be supported." Therefore we create a pixmap * of depth one and use XCopyPlane(). This is idiomatic. */ if (xImageDepth == 1) { /* just pass the bits through */ gc_values.foreground = 1; /* foreground describes set bits */ gc_values.background = 0; /* background describes clear bits */ bitmap_gc = XCreateGC(xDisplay, xImagePixmap, GCForeground | GCBackground, &gc_values); XPutImage(xDisplay, xImagePixmap, bitmap_gc, xImage, 0, 0, 0, 0, xImage->width, xImage->height); } else XPutImage(xDisplay, xImagePixmap, xWinGc, xImage, 0, 0, 0, 0, xImage->width, xImage->height); XDestroyImage(xImage); free(imageMemory); } } XtCallbackProc SelectProc(w, unused_1, unused_2) Widget w; caddr_t unused_1; caddr_t unused_2; { XawListReturnStruct *list_return; list_return = XawListShowCurrent(w); switch (list_return->list_index) { case ButtonQuit: QuitProc(); break; case ButtonPreviousPage: PreviousProc(); break; case ButtonNextPage: NextProc(); break; default: fprintf(stderr, "error in SelectProc\n"); exit(0); } XawListUnhighlight(w); } void QuitProc(void) { exit(0); } void NextProc() { PageProc(ButtonNextPage); } void PreviousProc() { PageProc(ButtonPreviousPage); } void PageProc(direction) int direction; { XEvent fake_event; Arg args[4]; switch (direction) { case ButtonPreviousPage: if (tfDirectory > 0) TIFFSetDirectory(tfFile, --tfDirectory); else return; break; case ButtonNextPage: if (TIFFReadDirectory(tfFile) == True) tfDirectory++; else return; break; default: fprintf(stderr, "error in PageProc\n"); exit(0); } xOffset = yOffset = 0; grabX = grabY = -1; GetTIFFHeader(); SetNameLabel(); GetTIFFImage(); if (appData.usePixmap == True) XFreePixmap(xDisplay, xImagePixmap); else XDestroyImage(xImage); CreateXImage(); /* * Using XtSetValues() to set the widget size causes a resize. * This resize gets propagated up to the parent shell. * In order to disable this visually disconcerting effect, * shell resizing is temporarily disabled. */ XtSetArg(args[0], XtNallowShellResize, False); XtSetValues(shellWidget, args, 1); XtSetArg(args[0], XtNwidth, tfImageWidth); XtSetArg(args[1], XtNheight, tfImageHeight); XtSetValues(imageWidget, args, 2); XtSetArg(args[0], XtNallowShellResize, True); XtSetValues(shellWidget, args, 1); XClearWindow(xDisplay, XtWindow(imageWidget)); fake_event.type = Expose; fake_event.xexpose.x = fake_event.xexpose.y = 0; fake_event.xexpose.width = tfImageWidth; /* the window will clip */ fake_event.xexpose.height = tfImageHeight; EventProc(imageWidget, NULL, &fake_event); } void EventProc(widget, unused, event) Widget widget; caddr_t unused; XEvent *event; { int ih, iw, ww, wh, sx, sy, w, h, dx, dy; Dimension w_width, w_height; XEvent next_event; Arg args[2]; if (event->type == MappingNotify) { XRefreshKeyboardMapping((XMappingEvent *) event); return; } if (!XtIsRealized(widget)) return; if ((event->type == ButtonPress) || (event->type == ButtonRelease)) if (event->xbutton.button != Button1) return; iw = tfImageWidth; /* avoid sign problems */ ih = tfImageHeight; /* * The grabX and grabY variables record where the user grabbed the image. * They also record whether the mouse button is down or not. */ if (event->type == ButtonPress) { grabX = event->xbutton.x; grabY = event->xbutton.y; return; } /* * imageWidget is a Core widget and doesn't get resized. * So we calculate the size of its viewport here. */ XtSetArg(args[0], XtNwidth, &w_width); XtSetArg(args[1], XtNheight, &w_height); XtGetValues(shellWidget, args, 2); ww = w_width; wh = w_height; XtGetValues(listWidget, args, 2); wh -= w_height; switch (event->type) { case Expose: dx = event->xexpose.x; dy = event->xexpose.y; sx = dx + xOffset; sy = dy + yOffset; w = MIN(event->xexpose.width, iw); h = MIN(event->xexpose.height, ih); break; case KeyPress: if ((grabX >= 0) || (grabY >= 0)) /* Mouse button is still down */ return; switch (XLookupKeysym((XKeyEvent *) event, /* KeySyms index */ 0)) { case XK_Up: if (ih < wh) /* Don't scroll if the window fits the image. */ return; sy = yOffset + appData.translate; sy = MIN(ih - wh, sy); if (sy == yOffset) /* Filter redundant stationary refreshes. */ return; yOffset = sy; sx = xOffset; dx = dy = 0; w = ww; h = wh; break; case XK_Down: if (ih < wh) return; sy = yOffset - appData.translate; sy = MAX(sy, 0); if (sy == yOffset) return; yOffset = sy; sx = xOffset; dx = dy = 0; w = ww; h = wh; break; case XK_Left: if (iw < ww) return; sx = xOffset + appData.translate; sx = MIN(iw - ww, sx); if (sx == xOffset) return; xOffset = sx; sy = yOffset; dx = dy = 0; w = ww; h = wh; break; case XK_Right: if (iw < ww) return; sx = xOffset - appData.translate; sx = MAX(sx, 0); if (sx == xOffset) return; xOffset = sx; sy = yOffset; dx = dy = 0; w = ww; h = wh; break; default: return; } break; case MotionNotify: /* * MotionEvent compression. Ignore multiple motion events. * Ignore motion events if the mouse button is up. */ if (XPending(xDisplay)) /* Xlib doesn't flush the output buffer */ if (XtPeekEvent(&next_event)) if (next_event.type == MotionNotify) return; if ((grabX < 0) || (grabY < 0)) return; sx = xOffset + grabX - (int) event->xmotion.x; if (sx >= (iw - ww)) /* clamp x motion but allow y motion */ sx = iw - ww; sx = MAX(sx, 0); sy = yOffset + grabY - (int) event->xmotion.y; if (sy >= (ih - wh)) /* clamp y motion but allow x motion */ sy = ih - wh; sy = MAX(sy, 0); if ((sx == xOffset) && (sy == yOffset)) return; dx = dy = 0; w = ww; h = wh; break; case ButtonRelease: xOffset = xOffset + grabX - (int) event->xbutton.x; xOffset = MIN(iw - ww, xOffset); xOffset = MAX(xOffset, 0); yOffset = yOffset + grabY - (int) event->xbutton.y; yOffset = MIN(ih - wh, yOffset); yOffset = MAX(yOffset, 0); grabX = grabY = -1; default: return; } if (appData.usePixmap == True) { if (xImageDepth == 1) XCopyPlane(xDisplay, xImagePixmap, XtWindow(widget), xWinGc, sx, sy, w, h, dx, dy, 1); else XCopyArea(xDisplay, xImagePixmap, XtWindow(widget), xWinGc, sx, sy, w, h, dx, dy); } else XPutImage(xDisplay, XtWindow(widget), xWinGc, xImage, sx, sy, dx, dy, w, h); } void ResizeProc() { Dimension w_width, w_height; int xo, yo, ww, wh; XEvent fake_event; Arg args[2]; if ((xOffset == 0) && (yOffset == 0)) return; XtSetArg(args[0], XtNwidth, &w_width); XtSetArg(args[1], XtNheight, &w_height); XtGetValues(shellWidget, args, 2); ww = w_width; wh = w_height; XtGetValues(listWidget, args, 2); wh -= w_height; xo = xOffset; yo = yOffset; if ((xOffset + ww) >= tfImageWidth) xOffset = MAX((int) tfImageWidth - ww, 0); if ((yOffset + wh) >= tfImageHeight) yOffset = MAX((int) tfImageHeight - wh, 0); /* * Send an ExposeEvent if the origin changed. * We have to do this because of the use and semantics of bit gravity. */ if ((xo != xOffset) || (yo != yOffset)) { fake_event.type = Expose; fake_event.xexpose.x = fake_event.xexpose.y = 0; fake_event.xexpose.width = tfImageWidth; fake_event.xexpose.height = tfImageHeight; EventProc(imageWidget, NULL, &fake_event); } } int XTiffErrorHandler(display, error_event) Display *display; XErrorEvent *error_event; { char message[80]; /* * Some X servers limit the size of pixmaps. */ if ((error_event->error_code == BadAlloc) && (error_event->request_code == X_CreatePixmap)) fprintf(stderr, "xtiff: requested pixmap too big for display\n"); else { XGetErrorText(display, error_event->error_code, message, 80); fprintf(stderr, "xtiff: error code %s\n", message); } exit(0); } void Usage() { fprintf(stderr, "Usage xtiff: [options] tiff-file\n"); fprintf(stderr, "\tstandard Xt options\n"); fprintf(stderr, "\t[-help]\n"); fprintf(stderr, "\t[-gamma gamma]\n"); fprintf(stderr, "\t[-usePixmap (True | False)]\n"); fprintf(stderr, "\t[-viewportWidth pixels]\n"); fprintf(stderr, "\t[-viewportHeight pixels]\n"); fprintf(stderr, "\t[-translate pixels]\n"); fprintf(stderr, "\t[-verbose (True | False)]\n"); exit(0); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/dbs/tiff-grayscale.c0000644000212300117540000001045511403511023014636 00000000000000/* $Id: tiff-grayscale.c,v 1.6 2010-06-08 18:55:15 bfriesen Exp $ */ /* * tiff-grayscale.c -- create a Class G (grayscale) TIFF file * with a gray response curve in linear optical density * * Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts. * * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #include #include #include #include #include "tiffio.h" #define WIDTH 512 #define HEIGHT WIDTH char * programName; void Usage(); int main(int argc, char **argv) { int bits_per_pixel = 8, cmsize, i, j, k, gray_index, chunk_size = 32, nchunks = 16; unsigned char * scan_line; uint16 * gray; float refblackwhite[2*1]; TIFF * tif; programName = argv[0]; if (argc != 4) Usage(); if (!strcmp(argv[1], "-depth")) bits_per_pixel = atoi(argv[2]); else Usage(); switch (bits_per_pixel) { case 8: nchunks = 16; chunk_size = 32; break; case 4: nchunks = 4; chunk_size = 128; break; case 2: nchunks = 2; chunk_size = 256; break; default: Usage(); } cmsize = nchunks * nchunks; gray = (uint16 *) malloc(cmsize * sizeof(uint16)); gray[0] = 3000; for (i = 1; i < cmsize; i++) gray[i] = (uint16) (-log10((double) i / (cmsize - 1)) * 1000); refblackwhite[0] = 0.0; refblackwhite[1] = (float)((1L< # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = contrib DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README SUBDIRS = addtiffo dbs iptcutil mfs pds ras stream tags win_dib all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ cscopelist cscopelist-recursive ctags ctags-recursive \ distclean distclean-generic distclean-libtool distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/contrib/iptcutil/0000755000212300117540000000000012027361331012742 500000000000000tiff-4.0.3/contrib/iptcutil/test.txt0000644000212300117540000000407206747424643014427 000000000000002#0="�" 2#120#Caption="Chairman of the US House Judiciary Committee, Henry Hyde,R-IL, makes his opening statement during impeachment hearings 11 December on Capitol Hill in Washington, DC. The committee is debating the articles of impechment and my take a vote on the impeachment of US President BIll Clinton on charges that he obstucted justice, lied and abused the power of his office as early as today. AFP PHOTO Paul J. RICHARDS " 2#122#Caption Writer="kb/lt" 2#100#Country Code="USA" 2#105#Headline="Old fart squeezing two fingers." 2#30#Release Date="19981211" 2#35#Release Time="000000+0000" 2#40#Special Instructions="This is a test. This is only a test. ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890" 2#80#Byline="PAUL J. RICHARDS" 2#85#Byline Title="STF" 2#110#Credit="AFP" 2#65#Originating Program="MacDesk Reporter" 2#115#Source="AFP" 2#5#Image Name="US-HYDE" 2#55#Created Date="19981211" 2#90#City="WASHINGTON" 2#95#Province State="DC" 2#101#Country="UNITED STATES" 2#103#Original Transmission Reference="DCA03" 2#15#Category="POL" 2#20#Supplemental Category="GOVERNMENT" 2#10#Priority="5" 2#25#Keyword="fart" 2#25#Keyword="squeezing" 2#25#Keyword="old" 2#25#Keyword="fingers" 2#75#Object Cycle="a" 2#60#Created Time="000000+0000" 2#70#Program Version="2.0.3" 2#130="3S" 2#135="GB" 2#231="Kaya A. Hoffmann 12/14/98 12:00:44 PM Copy To : Selects - \\KINYANI\Selects������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������" tiff-4.0.3/contrib/iptcutil/test.iptc0000644000212300117540000000212306747424643014542 00000000000000xChairman of the US House Judiciary Committee, Henry Hyde,R-IL, makes his opening statement during impeachment hearings 11 December on Capitol Hill in Washington, DC. The committee is debating the articles of impechment and my take a vote on the impeachment of US President BIll Clinton on charges that he obstucted justice, lied and abused the power of his office as early as today. AFP PHOTO Paul J. RICHARDS zkb/ltdUSAiOld fart squeezing two fingers.19981211# 000000+0000(JThis is a test. This is only a test. ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890PPAUL J. RICHARDSUSTFnAFPAMacDesk ReportersAFPUS-HYDE719981211Z WASHINGTON_DCe UNITED STATESgDCA03POL GOVERNMENT 5fart squeezingoldfingersKa< 000000+0000F2.0.3‚3S‡GBçKaya A. Hoffmann 12/14/98 12:00:44 PM Copy To : Selects - \\KINYANI\Selectstiff-4.0.3/contrib/iptcutil/README0000644000212300117540000000223310130373566013550 00000000000000 Program: IPTCUTIL.C Purpose: Convert between IPTC binary and a "special" IPTC text file format. Usage: iptcutil -t | -b [-i file] [-o file] output Notes: You tell the program the "type" of input file via the -t and -b switches. The -t says that the input is text, while the -b says that the input is binary IPTC. You can use either the -i or the -o switches to tell the program what the input and output files will be, or use simple piping. Author: William T. Radcliffe (billr@corbis.com) Parts of this program were derived from other places. The original binary to text conversion was taken from the PHP distribution and the tokenizer was written many years ago, by someone else as well. This software is provided freely "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall William T. Radcliffe be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with IPTCUTIL tiff-4.0.3/contrib/iptcutil/iptcutil.c0000644000212300117540000005233711571176042014703 00000000000000/* $Id: iptcutil.c,v 1.8 2011-05-08 00:44:18 fwarmerdam Exp $ */ #include "tif_config.h" #include #include #include #include #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_IO_H # include #endif #ifdef HAVE_FCNTL_H # include #endif #ifdef WIN32 #define STRNICMP strnicmp #else #define STRNICMP strncasecmp #endif typedef struct _tag_spec { short id; char *name; } tag_spec; static tag_spec tags[] = { { 5,"Image Name" }, { 7,"Edit Status" }, { 10,"Priority" }, { 15,"Category" }, { 20,"Supplemental Category" }, { 22,"Fixture Identifier" }, { 25,"Keyword" }, { 30,"Release Date" }, { 35,"Release Time" }, { 40,"Special Instructions" }, { 45,"Reference Service" }, { 47,"Reference Date" }, { 50,"Reference Number" }, { 55,"Created Date" }, { 60,"Created Time" }, { 65,"Originating Program" }, { 70,"Program Version" }, { 75,"Object Cycle" }, { 80,"Byline" }, { 85,"Byline Title" }, { 90,"City" }, { 95,"Province State" }, { 100,"Country Code" }, { 101,"Country" }, { 103,"Original Transmission Reference" }, { 105,"Headline" }, { 110,"Credit" }, { 115,"Source" }, { 116,"Copyright String" }, { 120,"Caption" }, { 121,"Local Caption" }, { 122,"Caption Writer" }, { 200,"Custom Field 1" }, { 201,"Custom Field 2" }, { 202,"Custom Field 3" }, { 203,"Custom Field 4" }, { 204,"Custom Field 5" }, { 205,"Custom Field 6" }, { 206,"Custom Field 7" }, { 207,"Custom Field 8" }, { 208,"Custom Field 9" }, { 209,"Custom Field 10" }, { 210,"Custom Field 11" }, { 211,"Custom Field 12" }, { 212,"Custom Field 13" }, { 213,"Custom Field 14" }, { 214,"Custom Field 15" }, { 215,"Custom Field 16" }, { 216,"Custom Field 17" }, { 217,"Custom Field 18" }, { 218,"Custom Field 19" }, { 219,"Custom Field 20" } }; /* * We format the output using HTML conventions * to preserve control characters and such. */ void formatString(FILE *ofile, const char *s, int len) { putc('"', ofile); for (; len > 0; --len, ++s) { int c = *s; switch (c) { case '&': fputs("&", ofile); break; #ifdef HANDLE_GT_LT case '<': fputs("<", ofile); break; case '>': fputs(">", ofile); break; #endif case '"': fputs(""", ofile); break; default: if (iscntrl(c)) fprintf(ofile, "&#%d;", c); else putc(*s, ofile); break; } } fputs("\"\n", ofile); } typedef struct _html_code { short len; const char *code, val; } html_code; static html_code html_codes[] = { #ifdef HANDLE_GT_LT { 4,"<",'<' }, { 4,">",'>' }, #endif { 5,"&",'&' }, { 6,""",'"' } }; /* * This routine converts HTML escape sequence * back to the original ASCII representation. * - returns the number of characters dropped. */ int convertHTMLcodes(char *s, int len) { if (len <=0 || s==(char*)NULL || *s=='\0') return 0; if (s[1] == '#') { int val, o; if (sscanf(s,"&#%d;",&val) == 1) { o = 3; while (s[o] != ';') { o++; if (o > 5) break; } if (o < 5) strcpy(s+1, s+1+o); *s = val; return o; } } else { int i, codes = sizeof(html_codes) / sizeof(html_code); for (i=0; i < codes; i++) { if (html_codes[i].len <= len) if (STRNICMP(s, html_codes[i].code, html_codes[i].len) == 0) { strcpy(s+1, s+html_codes[i].len); *s = html_codes[i].val; return html_codes[i].len-1; } } } return 0; } int formatIPTC(FILE *ifile, FILE *ofile) { unsigned int foundiptc, tagsfound; unsigned char recnum, dataset; char *readable, *str; long tagindx, taglen; int i, tagcount = sizeof(tags) / sizeof(tag_spec); char c; foundiptc = 0; /* found the IPTC-Header */ tagsfound = 0; /* number of tags found */ c = getc(ifile); while (c != EOF) { if (c == 0x1c) foundiptc = 1; else { if (foundiptc) return -1; else continue; } /* we found the 0x1c tag and now grab the dataset and record number tags */ dataset = getc(ifile); if ((char) dataset == EOF) return -1; recnum = getc(ifile); if ((char) recnum == EOF) return -1; /* try to match this record to one of the ones in our named table */ for (i=0; i< tagcount; i++) { if (tags[i].id == recnum) break; } if (i < tagcount) readable = tags[i].name; else readable = ""; /* then we decode the length of the block that follows - long or short fmt */ c = getc(ifile); if (c == EOF) return 0; if (c & (unsigned char) 0x80) { unsigned char buffer[4]; for (i=0; i<4; i++) { c = buffer[i] = getc(ifile); if (c == EOF) return -1; } taglen = (((long) buffer[ 0 ]) << 24) | (((long) buffer[ 1 ]) << 16) | (((long) buffer[ 2 ]) << 8) | (((long) buffer[ 3 ])); } else { unsigned char x = c; taglen = ((long) x) << 8; x = getc(ifile); if ((char)x == EOF) return -1; taglen |= (long) x; } /* make a buffer to hold the tag data and snag it from the input stream */ str = (char *) malloc((unsigned int) (taglen+1)); if (str == (char *) NULL) { printf("Memory allocation failed"); return 0; } for (tagindx=0; tagindx 0) fprintf(ofile, "%d#%d#%s=",(unsigned int)dataset, (unsigned int) recnum, readable); else fprintf(ofile, "%d#%d=",(unsigned int)dataset, (unsigned int) recnum); formatString( ofile, str, taglen ); free(str); tagsfound++; c = getc(ifile); } return tagsfound; } int tokenizer(unsigned inflag,char *token,int tokmax,char *line, char *white,char *brkchar,char *quote,char eschar,char *brkused, int *next,char *quoted); char *super_fgets(char *b, int *blen, FILE *file) { int c, len; char *q; len=*blen; for (q=b; ; q++) { c=fgetc(file); if (c == EOF || c == '\n') break; if (((long)q - (long)b + 1 ) >= (long) len) { long tlen; tlen=(long)q-(long)b; len<<=1; b=(char *) realloc((char *) b,(len+2)); if ((char *) b == (char *) NULL) break; q=b+tlen; } *q=(unsigned char) c; } *blen=0; if ((unsigned char *)b != (unsigned char *) NULL) { int tlen; tlen=(long)q - (long)b; if (tlen == 0) return (char *) NULL; b[tlen] = '\0'; *blen=++tlen; } return b; } #define BUFFER_SZ 4096 int main(int argc, char *argv[]) { unsigned int length; unsigned char *buffer; int i, mode; /* iptc binary, or iptc text */ FILE *ifile = stdin, *ofile = stdout; char c, *usage = "usage: iptcutil -t | -b [-i file] [-o file] output"; if( argc < 2 ) { puts(usage); return 1; } mode = 0; length = -1; buffer = (unsigned char *)NULL; for (i=1; i 0) { char *s = &token[next-1]; len -= convertHTMLcodes(s, strlen(s)); } } fputc(0x1c, ofile); fputc(dataset, ofile); fputc(recnum, ofile); if (len < 0x10000) { fputc((len >> 8) & 255, ofile); fputc(len & 255, ofile); } else { fputc(((len >> 24) & 255) | 0x80, ofile); fputc((len >> 16) & 255, ofile); fputc((len >> 8) & 255, ofile); fputc(len & 255, ofile); } next=0; while (len--) fputc(token[next++], ofile); } state++; } free(token); token = (char *)NULL; free(newstr); newstr = (char *)NULL; } free(line); fclose( ifile ); fclose( ofile ); } return 0; } /* This routine is a generalized, finite state token parser. It allows you extract tokens one at a time from a string of characters. The characters used for white space, for break characters, and for quotes can be specified. Also, characters in the string can be preceded by a specifiable escape character which removes any special meaning the character may have. There are a lot of formal parameters in this subroutine call, but once you get familiar with them, this routine is fairly easy to use. "#define" macros can be used to generate simpler looking calls for commonly used applications of this routine. First, some terminology: token: used here, a single unit of information in the form of a group of characters. white space: space that gets ignored (except within quotes or when escaped), like blanks and tabs. in addition, white space terminates a non-quoted token. break character: a character that separates non-quoted tokens. commas are a common break character. the usage of break characters to signal the end of a token is the same as that of white space, except multiple break characters with nothing or only white space between generate a null token for each two break characters together. for example, if blank is set to be the white space and comma is set to be the break character, the line ... A, B, C , , DEF ... consists of 5 tokens: 1) "A" 2) "B" 3) "C" 4) "" (the null string) 5) "DEF" quote character: a character that, when surrounding a group of other characters, causes the group of characters to be treated as a single token, no matter how many white spaces or break characters exist in the group. also, a token always terminates after the closing quote. for example, if ' is the quote character, blank is white space, and comma is the break character, the following string ... A, ' B, CD'EF GHI ... consists of 4 tokens: 1) "A" 2) " B, CD" (note the blanks & comma) 3) "EF" 4) "GHI" the quote characters themselves do not appear in the resultant tokens. the double quotes are delimiters i use here for documentation purposes only. escape character: a character which itself is ignored but which causes the next character to be used as is. ^ and \ are often used as escape characters. an escape in the last position of the string gets treated as a "normal" (i.e., non-quote, non-white, non-break, and non-escape) character. for example, assume white space, break character, and quote are the same as in the above examples, and further, assume that ^ is the escape character. then, in the string ... ABC, ' DEF ^' GH' I ^ J K^ L ^ ... there are 7 tokens: 1) "ABC" 2) " DEF ' GH" 3) "I" 4) " " (a lone blank) 5) "J" 6) "K L" 7) "^" (passed as is at end of line) OK, now that you have this background, here's how to call "tokenizer": result=tokenizer(flag,token,maxtok,string,white,break,quote,escape, brkused,next,quoted) result: 0 if we haven't reached EOS (end of string), and 1 if we have (this is an "int"). flag: right now, only the low order 3 bits are used. 1 => convert non-quoted tokens to upper case 2 => convert non-quoted tokens to lower case 0 => do not convert non-quoted tokens (this is a "char"). token: a character string containing the returned next token (this is a "char[]"). maxtok: the maximum size of "token". characters beyond "maxtok" are truncated (this is an "int"). string: the string to be parsed (this is a "char[]"). white: a string of the valid white spaces. example: char whitesp[]={" \t"}; blank and tab will be valid white space (this is a "char[]"). break: a string of the valid break characters. example: char breakch[]={";,"}; semicolon and comma will be valid break characters (this is a "char[]"). IMPORTANT: do not use the name "break" as a C variable, as this is a reserved word in C. quote: a string of the valid quote characters. an example would be char whitesp[]={"'\""); (this causes single and double quotes to be valid) note that a token starting with one of these characters needs the same quote character to terminate it. for example, "ABC ' is unterminated, but "DEF" and 'GHI' are properly terminated. note that different quote characters can appear on the same line; only for a given token do the quote characters have to be the same (this is a "char[]"). escape: the escape character (NOT a string ... only one allowed). use zero if none is desired (this is a "char"). brkused: the break character used to terminate the current token. if the token was quoted, this will be the quote used. if the token is the last one on the line, this will be zero (this is a pointer to a "char"). next: this variable points to the first character of the next token. it gets reset by "tokenizer" as it steps through the string. set it to 0 upon initialization, and leave it alone after that. you can change it if you want to jump around in the string or re-parse from the beginning, but be careful (this is a pointer to an "int"). quoted: set to 1 (true) if the token was quoted and 0 (false) if not. you may need this information (for example: in C, a string with quotes around it is a character string, while one without is an identifier). (this is a pointer to a "char"). */ /* states */ #define IN_WHITE 0 #define IN_TOKEN 1 #define IN_QUOTE 2 #define IN_OZONE 3 int _p_state; /* current state */ unsigned _p_flag; /* option flag */ char _p_curquote; /* current quote char */ int _p_tokpos; /* current token pos */ /* routine to find character in string ... used only by "tokenizer" */ int sindex(char ch,char *string) { char *cp; for(cp=string;*cp;++cp) if(ch==*cp) return (int)(cp-string); /* return postion of character */ return -1; /* eol ... no match found */ } /* routine to store a character in a string ... used only by "tokenizer" */ void chstore(char *string,int max,char ch) { char c; if(_p_tokpos>=0&&_p_tokpos=0) /* break */ { switch(_p_state) { case IN_WHITE: /* these are the same here ... */ case IN_TOKEN: /* ... just get out */ case IN_OZONE: /* ditto */ ++(*next); *brkused=brkchar[qp]; goto byebye; case IN_QUOTE: /* just keep going */ chstore(token,tokmax,c); break; } } else if((qp=sindex(c,quote))>=0) /* quote */ { switch(_p_state) { case IN_WHITE: /* these are identical, */ _p_state=IN_QUOTE; /* change states */ _p_curquote=quote[qp]; /* save quote char */ *quoted=1; /* set to true as long as something is in quotes */ break; case IN_QUOTE: if(quote[qp]==_p_curquote) /* same as the beginning quote? */ { _p_state=IN_OZONE; _p_curquote=0; } else chstore(token,tokmax,c); /* treat as regular char */ break; case IN_TOKEN: case IN_OZONE: *brkused=c; /* uses quote as break char */ goto byebye; } } else if((qp=sindex(c,white))>=0) /* white */ { switch(_p_state) { case IN_WHITE: case IN_OZONE: break; /* keep going */ case IN_TOKEN: _p_state=IN_OZONE; break; case IN_QUOTE: chstore(token,tokmax,c); /* it's valid here */ break; } } else if(c==eschar) /* escape */ { nc=line[(*next)+1]; if(nc==0) /* end of line */ { *brkused=0; chstore(token,tokmax,c); ++(*next); goto byebye; } switch(_p_state) { case IN_WHITE: --(*next); _p_state=IN_TOKEN; break; case IN_TOKEN: case IN_QUOTE: ++(*next); chstore(token,tokmax,nc); break; case IN_OZONE: goto byebye; } } else /* anything else is just a real character */ { switch(_p_state) { case IN_WHITE: _p_state=IN_TOKEN; /* switch states */ case IN_TOKEN: /* these 2 are */ case IN_QUOTE: /* identical here */ chstore(token,tokmax,c); break; case IN_OZONE: goto byebye; } } } /* end of main loop */ byebye: token[_p_tokpos]=0; /* make sure token ends with EOS */ return 0; } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/iptcutil/Makefile.in0000644000212300117540000004435212027361162014741 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = iptcutil$(EXEEXT) subdir = contrib/iptcutil DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_iptcutil_OBJECTS = iptcutil.$(OBJEXT) iptcutil_OBJECTS = $(am_iptcutil_OBJECTS) iptcutil_DEPENDENCIES = $(LIBTIFF) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/libtiff depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(iptcutil_SOURCES) DIST_SOURCES = $(iptcutil_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ LIBTIFF = $(top_builddir)/libtiff/libtiff.la EXTRA_DIST = README test.iptc test.txt iptcutil_SOURCES = iptcutil.c iptcutil_LDADD = $(LIBTIFF) AM_CPPFLAGS = -I$(top_srcdir)/libtiff all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/iptcutil/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/iptcutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list iptcutil$(EXEEXT): $(iptcutil_OBJECTS) $(iptcutil_DEPENDENCIES) $(EXTRA_iptcutil_DEPENDENCIES) @rm -f iptcutil$(EXEEXT) $(AM_V_CCLD)$(LINK) $(iptcutil_OBJECTS) $(iptcutil_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iptcutil.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS cscopelist ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/contrib/iptcutil/Makefile.am0000644000212300117540000000270112026613763014726 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. LIBTIFF = $(top_builddir)/libtiff/libtiff.la EXTRA_DIST = README test.iptc test.txt noinst_PROGRAMS = iptcutil iptcutil_SOURCES = iptcutil.c iptcutil_LDADD = $(LIBTIFF) AM_CPPFLAGS = -I$(top_srcdir)/libtiff tiff-4.0.3/contrib/pds/0000755000212300117540000000000012027361331011673 500000000000000tiff-4.0.3/contrib/pds/tif_imageiter.h0000644000212300117540000000417211403510577014605 00000000000000typedef struct _TIFFImageIter TIFFImageIter; /* The callback function is called for each "block" of image pixel data after it has been read from the file and decoded. This image pixel data is in the buffer pp, and this data represents the image pixels from (x,y) to (x+w,y+h). It is stored in pixel format, so each pixel contains img->samplesperpixel consecutive samples each containing img->bitspersample bits of data. The array pp is ordered in h consecutive rows of w+fromskew pixels each. */ typedef void (*ImageIterTileContigRoutine) (TIFFImageIter*, void *, uint32, uint32, uint32, uint32, int32, unsigned char*); #define DECLAREContigCallbackFunc(name) \ static void name(\ TIFFImageIter* img, \ void* user_data, \ uint32 x, uint32 y, \ uint32 w, uint32 h, \ int32 fromskew, \ u_char* pp \ ) typedef void (*ImageIterTileSeparateRoutine) (TIFFImageIter*, void *, uint32, uint32, uint32, uint32, int32, unsigned char*, unsigned char*, unsigned char*, unsigned char*); #define DECLARESepCallbackFunc(name) \ static void name(\ TIFFImageIter* img, \ void* user_data, \ uint32 x, uint32 y, \ uint32 w, uint32 h,\ int32 fromskew, \ u_char* r, u_char* g, u_char* b, u_char* a\ ) struct _TIFFImageIter { TIFF* tif; /* image handle */ int stoponerr; /* stop on read error */ int isContig; /* data is packed/separate */ int alpha; /* type of alpha data present */ uint32 width; /* image width */ uint32 height; /* image height */ uint16 bitspersample; /* image bits/sample */ uint16 samplesperpixel; /* image samples/pixel */ uint16 orientation; /* image orientation */ uint16 photometric; /* image photometric interp */ uint16* redcmap; /* colormap pallete */ uint16* greencmap; uint16* bluecmap; /* get image data routine */ int (*get)(TIFFImageIter*, void *udata, uint32, uint32); union { void (*any)(TIFFImageIter*); ImageIterTileContigRoutine contig; ImageIterTileSeparateRoutine separate; } callback; /* fn to exec for each block */ }; /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/pds/README0000644000212300117540000001101306747424643012511 00000000000000Date: Fri, 01 Aug 1997 20:14:52 MDT To: Sam Leffler From: "Conrad J. Poelman (WSAT)" Subject: Potential TIFF library additions Delivery-Date: Fri, 01 Aug 1997 19:21:06 -0700 Sam, You probably don't remember me, but I sent in a couple of bug fixes regarding the TIFF library about a 16 months ago or so... I just wanted to send you two other additions that I have made to our local version of the TIFF library in hopes that you will want to incorporate them into your next major release of the TIFF library. (These additions are based on TIFF version 3.4beta31, but they sit on top of the library so they shouldn't be much trouble to incorporate them into any more recent version.) They are internally documented to a reasonable extent and we've been successfully using them in our code here for over a year. If you think they would make good additions to the TIFF library, I'd be happy to clean them up more, document them more, and/or integrate them with the latest version of the TIFF library, but I figured I'd see if you were interested in using them before I went to all that trouble. TIFF Image Iterator ------------------- Your ReadRGBA() routine works well for reading many different formats (TILED, STIP, compressed or not, etc.) of the most basic types of data (RGB, 8-bit greyscale, 8-bit colormapped) into an SGI-style data array, and serves as a good template for users with other needs. I used it as an exmaple of how to make an iterator which, rather than fill a data array, calls an arbitrary user-supplied callback function for each "chunk" of data - that "chunk" might be a strip or a tile, and might have one sample-per-pixel or two, and might be 8-bit data or 16-bit or 24-bit. The callback function can do whatever it wants with the data - store it in a big array, convert it to RGBA, or draw it directly to the screen. I was able to use this iterator to read 16-bit greyscale and 32- and 64-bit floating point data, which wasn't possible with ReadRGBA(). I have tested this routine with 8- and 16-bit greyscale data as well as with 32- and 64-bit floating point data. I believe nearly all of our data is organized in strips, so actually I'd appreciate it if you had some tiled images that I could test it with. It should certainly be possible and would be cleanest to reimplement ReadRGBA() in terms of the image iterator, but I haven't done that. Private Sub-Directory Read/Write -------------------------------- TIFF-PL is a Phillips Laboratory extension to the TIFF tags that allows us to store satellite imaging-specific information in a TIFF format, such as the satellite's trajectory, the imaging time, etc. In order to give us the flexibility to modify the tag definitions without getting approval from the TIFF committee every time, we were given only three TIFF tags - a PL signature, a PL version number, and PL directory offset, which lists the position in the file at which to find a private sub-directory of tags-value pairs. So I wrote two routines: TIFFWritePrivateDataSubDirectory(), which takes a list of tags and a "get" function and writes the tag values into the TIFF file, returning the offset within the file at which it wrote the directory; and TIFFReadPrivateDataSubDirectory(), which takes an offset, a list of tags, and a "set" function and reads all the data from the private directory. The functions themselves are pretty simple. (The files are huge because I had to basically copy all of the tif_dirread.c and tif_dirwrite.c files in order to access the various fetching routines which were all declared static and therefore inaccessible in the TIFF library.) I'm including the four source files (tif_imgiter.h, tif_imgiter.c, tif_pdsdirread.c, tif_pdsdirwrite.c) in case you want to take a look at them. I can also send you some sample code that uses them if you like. If you're interested in having them incorporated into the standard TIFF library, I'd be happy to do that integration and clean up and document the routines. (For example, I've already realized that instead of limiting the SEP callback function to three bands (R,G,B) it should take an array to enable the handling of n-banded multi-spectral data...) If not, I'll just leave them as they are, since they work fine for us now. Holler if you have any questions. -- Conrad __________________________________________________________________ Capt Conrad J. Poelman PL/WSAT (Phillips Laboratory) 505-846-4347 3550 Aberdeen Ave SE (FAX) 505-846-4374 Kirtland AFB, NM 87117-5776 tiff-4.0.3/contrib/pds/tif_pdsdirread.c0000644000212300117540000007704411403511023014746 00000000000000/* $Header: /cvs/maptools/cvsroot/libtiff/contrib/pds/tif_pdsdirread.c,v 1.4 2010-06-08 18:55:15 bfriesen Exp $ */ /* * Copyright (c) 1988-1996 Sam Leffler * Copyright (c) 1991-1996 Silicon Graphics, Inc. * Copyright (c( 1996 USAF Phillips Laboratory * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * These routines written by Conrad J. Poelman on a single late-night of * March 20-21, 1996. * * The entire purpose of this file is to provide a single external function, * TIFFReadPrivateDataSubDirectory(). This function is intended for use in reading a * private subdirectory from a TIFF file into a private structure. The * actual writing of data into the structure is handled by the setFieldFn(), * which is passed to TIFFReadPrivateDataSubDirectory() as a parameter. The idea is to * enable any application wishing to store private subdirectories to do so * easily using this function, without modifying the TIFF library. * * The astute observer will notice that only two functions are at all different * from the original tif_dirread.c file: TIFFReadPrivateDataSubDirectory() and * TIFFFetchNormalSubTag(). All the other stuff that makes this file so huge * is only necessary because all of those functions are declared static in * tif_dirread.c, so we have to totally duplicate them in order to use them. * * Oh, also note the bug fix in TIFFFetchFloat(). * */ #include "tiffiop.h" #define IGNORE 0 /* tag placeholder used below */ #if HAVE_IEEEFP #define TIFFCvtIEEEFloatToNative(tif, n, fp) #define TIFFCvtIEEEDoubleToNative(tif, n, dp) #else extern void TIFFCvtIEEEFloatToNative(TIFF*, uint32, float*); extern void TIFFCvtIEEEDoubleToNative(TIFF*, uint32, double*); #endif static void EstimateStripByteCounts(TIFF*, TIFFDirEntry*, uint16); static void MissingRequired(TIFF*, const char*); static int CheckDirCount(TIFF*, TIFFDirEntry*, uint32); static tsize_t TIFFFetchData(TIFF*, TIFFDirEntry*, char*); static tsize_t TIFFFetchString(TIFF*, TIFFDirEntry*, char*); static float TIFFFetchRational(TIFF*, TIFFDirEntry*); static int TIFFFetchNormalSubTag(TIFF*, TIFFDirEntry*, const TIFFFieldInfo*, int (*getFieldFn)(TIFF *tif,ttag_t tag,...)); static int TIFFFetchPerSampleShorts(TIFF*, TIFFDirEntry*, int*); static int TIFFFetchPerSampleAnys(TIFF*, TIFFDirEntry*, double*); static int TIFFFetchShortArray(TIFF*, TIFFDirEntry*, uint16*); static int TIFFFetchStripThing(TIFF*, TIFFDirEntry*, long, uint32**); static int TIFFFetchExtraSamples(TIFF*, TIFFDirEntry*); static int TIFFFetchRefBlackWhite(TIFF*, TIFFDirEntry*); static float TIFFFetchFloat(TIFF*, TIFFDirEntry*); static int TIFFFetchFloatArray(TIFF*, TIFFDirEntry*, float*); static int TIFFFetchDoubleArray(TIFF*, TIFFDirEntry*, double*); static int TIFFFetchAnyArray(TIFF*, TIFFDirEntry*, double*); static int TIFFFetchShortPair(TIFF*, TIFFDirEntry*); #if STRIPCHOP_SUPPORT static void ChopUpSingleUncompressedStrip(TIFF*); #endif static char * CheckMalloc(TIFF* tif, tsize_t n, const char* what) { char *cp = (char*)_TIFFmalloc(n); if (cp == NULL) TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "No space %s", what); return (cp); } /* Just as was done with TIFFWritePrivateDataSubDirectory(), here we implement TIFFReadPrivateDataSubDirectory() which takes an offset into the TIFF file, a TIFFFieldInfo structure specifying the types of the various tags, and a function to use to set individual tags when they are encountered. The data is read from the file, translated using the TIFF library's built-in machine-independent conversion functions, and filled into private subdirectory structure. This code was written by copying the original TIFFReadDirectory() function from tif_dirread.c and paring it down to what is needed for this. It is the caller's responsibility to allocate and initialize the internal structure that setFieldFn() will be writing into. If this function is being called more than once before closing the file, the caller also must be careful to free data in the structure before re-initializing. It is also the caller's responsibility to verify the presence of any required fields after reading the directory in. */ int TIFFReadPrivateDataSubDirectory(TIFF* tif, toff_t pdir_offset, TIFFFieldInfo *field_info, int (*setFieldFn)(TIFF *tif, ttag_t tag, ...)) { register TIFFDirEntry* dp; register int n; register TIFFDirectory* td; TIFFDirEntry* dir; int iv; long v; double dv; const TIFFFieldInfo* fip; int fix; uint16 dircount; uint32 nextdiroff; char* cp; int diroutoforderwarning = 0; /* Skipped part about checking for directories or compression data. */ if (!isMapped(tif)) { if (!SeekOK(tif, pdir_offset)) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Seek error accessing TIFF private subdirectory"); return (0); } if (!ReadOK(tif, &dircount, sizeof (uint16))) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Can not read TIFF private subdirectory count"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); dir = (TIFFDirEntry *)CheckMalloc(tif, dircount * sizeof (TIFFDirEntry), "to read TIFF private subdirectory"); if (dir == NULL) return (0); if (!ReadOK(tif, dir, dircount*sizeof (TIFFDirEntry))) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Can not read TIFF private subdirectory"); goto bad; } /* * Read offset to next directory for sequential scans. */ (void) ReadOK(tif, &nextdiroff, sizeof (uint32)); } else { toff_t off = pdir_offset; if (off + sizeof (short) > tif->tif_size) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Can not read TIFF private subdirectory count"); return (0); } else _TIFFmemcpy(&dircount, tif->tif_base + off, sizeof (uint16)); off += sizeof (uint16); if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); dir = (TIFFDirEntry *)CheckMalloc(tif, dircount * sizeof (TIFFDirEntry), "to read TIFF private subdirectory"); if (dir == NULL) return (0); if (off + dircount*sizeof (TIFFDirEntry) > tif->tif_size) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Can not read TIFF private subdirectory"); goto bad; } else _TIFFmemcpy(dir, tif->tif_base + off, dircount*sizeof (TIFFDirEntry)); off += dircount* sizeof (TIFFDirEntry); if (off + sizeof (uint32) < tif->tif_size) _TIFFmemcpy(&nextdiroff, tif->tif_base+off, sizeof (uint32)); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&nextdiroff); /* * Setup default value and then make a pass over * the fields to check type and tag information, * and to extract info required to size data * structures. A second pass is made afterwards * to read in everthing not taken in the first pass. */ td = &tif->tif_dir; for (fip = field_info, dp = dir, n = dircount; n > 0; n--, dp++) { if (tif->tif_flags & TIFF_SWAB) { TIFFSwabArrayOfShort(&dp->tdir_tag, 2); TIFFSwabArrayOfLong(&dp->tdir_count, 2); } /* * Find the field information entry for this tag. */ /* * Silicon Beach (at least) writes unordered * directory tags (violating the spec). Handle * it here, but be obnoxious (maybe they'll fix it?). */ if (dp->tdir_tag < fip->field_tag) { if (!diroutoforderwarning) { TIFFWarning(tif->tif_name, "invalid TIFF private subdirectory; tags are not sorted in ascending order"); diroutoforderwarning = 1; } fip = field_info; /* O(n^2) */ } while (fip->field_tag && fip->field_tag < dp->tdir_tag) fip++; if (!fip->field_tag || fip->field_tag != dp->tdir_tag) { TIFFWarning(tif->tif_name, "unknown field with tag %d (0x%x) in private subdirectory ignored", dp->tdir_tag, dp->tdir_tag); dp->tdir_tag = IGNORE; fip = field_info;/* restart search */ continue; } /* * Null out old tags that we ignore. */ /* Not implemented yet, since FIELD_IGNORE is specific to the main directories. Could pass this in too... */ if (0 /* && fip->field_bit == FIELD_IGNORE */) { ignore: dp->tdir_tag = IGNORE; continue; } /* * Check data type. */ while (dp->tdir_type != (u_short)fip->field_type) { if (fip->field_type == TIFF_ANY) /* wildcard */ break; fip++; if (!fip->field_tag || fip->field_tag != dp->tdir_tag) { TIFFWarning(tif->tif_name, "wrong data type %d for \"%s\"; tag ignored", dp->tdir_type, fip[-1].field_name); goto ignore; } } /* * Check count if known in advance. */ if (fip->field_readcount != TIFF_VARIABLE) { uint32 expected = (fip->field_readcount == TIFF_SPP) ? (uint32) td->td_samplesperpixel : (uint32) fip->field_readcount; if (!CheckDirCount(tif, dp, expected)) goto ignore; } /* Now read in and process data from field. */ if (!TIFFFetchNormalSubTag(tif, dp, fip, setFieldFn)) goto bad; } if (dir) _TIFFfree(dir); return (1); bad: if (dir) _TIFFfree(dir); return (0); } static void EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount) { register TIFFDirEntry *dp; register TIFFDirectory *td = &tif->tif_dir; uint16 i; if (td->td_stripbytecount) _TIFFfree(td->td_stripbytecount); td->td_stripbytecount = (uint32*) CheckMalloc(tif, td->td_nstrips * sizeof (uint32), "for \"StripByteCounts\" array"); if (td->td_compression != COMPRESSION_NONE) { uint32 space = (uint32)(sizeof (TIFFHeader) + sizeof (uint16) + (dircount * sizeof (TIFFDirEntry)) + sizeof (uint32)); toff_t filesize = TIFFGetFileSize(tif); uint16 n; /* calculate amount of space used by indirect values */ for (dp = dir, n = dircount; n > 0; n--, dp++) { uint32 cc = dp->tdir_count*TIFFDataWidth(dp->tdir_type); if (cc > sizeof (uint32)) space += cc; } space = (filesize - space) / td->td_samplesperpixel; for (i = 0; i < td->td_nstrips; i++) td->td_stripbytecount[i] = space; /* * This gross hack handles the case were the offset to * the last strip is past the place where we think the strip * should begin. Since a strip of data must be contiguous, * it's safe to assume that we've overestimated the amount * of data in the strip and trim this number back accordingly. */ i--; if (td->td_stripoffset[i] + td->td_stripbytecount[i] > filesize) td->td_stripbytecount[i] = filesize - td->td_stripoffset[i]; } else { uint32 rowbytes = TIFFScanlineSize(tif); uint32 rowsperstrip = td->td_imagelength / td->td_nstrips; for (i = 0; i < td->td_nstrips; i++) td->td_stripbytecount[i] = rowbytes*rowsperstrip; } TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS); if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP)) td->td_rowsperstrip = td->td_imagelength; } static void MissingRequired(TIFF* tif, const char* tagname) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "TIFF directory is missing required \"%s\" field", tagname); } /* * Check the count field of a directory * entry against a known value. The caller * is expected to skip/ignore the tag if * there is a mismatch. */ static int CheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count) { if (count != dir->tdir_count) { TIFFWarning(tif->tif_name, "incorrect count for field \"%s\" (%lu, expecting %lu); tag ignored", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name, dir->tdir_count, count); return (0); } return (1); } /* * Fetch a contiguous directory item. */ static tsize_t TIFFFetchData(TIFF* tif, TIFFDirEntry* dir, char* cp) { int w = TIFFDataWidth(dir->tdir_type); tsize_t cc = dir->tdir_count * w; if (!isMapped(tif)) { if (!SeekOK(tif, dir->tdir_offset)) goto bad; if (!ReadOK(tif, cp, cc)) goto bad; } else { if (dir->tdir_offset + cc > tif->tif_size) goto bad; _TIFFmemcpy(cp, tif->tif_base + dir->tdir_offset, cc); } if (tif->tif_flags & TIFF_SWAB) { switch (dir->tdir_type) { case TIFF_SHORT: case TIFF_SSHORT: TIFFSwabArrayOfShort((uint16*) cp, dir->tdir_count); break; case TIFF_LONG: case TIFF_SLONG: case TIFF_FLOAT: TIFFSwabArrayOfLong((uint32*) cp, dir->tdir_count); break; case TIFF_RATIONAL: case TIFF_SRATIONAL: TIFFSwabArrayOfLong((uint32*) cp, 2*dir->tdir_count); break; case TIFF_DOUBLE: TIFFSwabArrayOfDouble((double*) cp, dir->tdir_count); break; } } return (cc); bad: TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error fetching data for field \"%s\"", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); return ((tsize_t) 0); } /* * Fetch an ASCII item from the file. */ static tsize_t TIFFFetchString(TIFF* tif, TIFFDirEntry* dir, char* cp) { if (dir->tdir_count <= 4) { uint32 l = dir->tdir_offset; if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&l); _TIFFmemcpy(cp, &l, dir->tdir_count); return (1); } return (TIFFFetchData(tif, dir, cp)); } /* * Convert numerator+denominator to float. */ static int cvtRational(TIFF* tif, TIFFDirEntry* dir, uint32 num, uint32 denom, float* rv) { if (denom == 0) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%s: Rational with zero denominator (num = %lu)", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name, num); return (0); } else { if (dir->tdir_type == TIFF_RATIONAL) *rv = ((float)num / (float)denom); else *rv = ((float)(int32)num / (float)(int32)denom); return (1); } } /* * Fetch a rational item from the file * at offset off and return the value * as a floating point number. */ static float TIFFFetchRational(TIFF* tif, TIFFDirEntry* dir) { uint32 l[2]; float v; return (!TIFFFetchData(tif, dir, (char *)l) || !cvtRational(tif, dir, l[0], l[1], &v) ? 1.0f : v); } /* * Fetch a single floating point value * from the offset field and return it * as a native float. */ static float TIFFFetchFloat(TIFF* tif, TIFFDirEntry* dir) { /* This appears to be a flagrant bug in the TIFF library, yet I actually don't understand how it could have ever worked the old way. Look at the comments in my new code and you'll understand. */ #if (0) float v = (float) TIFFExtractData(tif, dir->tdir_type, dir->tdir_offset); TIFFCvtIEEEFloatToNative(tif, 1, &v); #else float v; /* This is a little bit tricky - if we just cast the uint32 to a float, C will perform a numerical conversion, which is not what we want. We want to take the actual bit pattern in the uint32 and interpret it as a float. Thus we cast a uint32 * into a float * and then dereference to get v. */ uint32 l = (uint32) TIFFExtractData(tif, dir->tdir_type, dir->tdir_offset); v = * (float *) &l; TIFFCvtIEEEFloatToNative(tif, 1, &v); #endif return (v); } /* * Fetch an array of BYTE or SBYTE values. */ static int TIFFFetchByteArray(TIFF* tif, TIFFDirEntry* dir, uint16* v) { if (dir->tdir_count <= 4) { /* * Extract data from offset field. */ if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) { switch (dir->tdir_count) { case 4: v[3] = dir->tdir_offset & 0xff; case 3: v[2] = (dir->tdir_offset >> 8) & 0xff; case 2: v[1] = (dir->tdir_offset >> 16) & 0xff; case 1: v[0] = dir->tdir_offset >> 24; } } else { switch (dir->tdir_count) { case 4: v[3] = dir->tdir_offset >> 24; case 3: v[2] = (dir->tdir_offset >> 16) & 0xff; case 2: v[1] = (dir->tdir_offset >> 8) & 0xff; case 1: v[0] = dir->tdir_offset & 0xff; } } return (1); } else return (TIFFFetchData(tif, dir, (char*) v) != 0); /* XXX */ } /* * Fetch an array of SHORT or SSHORT values. */ static int TIFFFetchShortArray(TIFF* tif, TIFFDirEntry* dir, uint16* v) { if (dir->tdir_count <= 2) { if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) { switch (dir->tdir_count) { case 2: v[1] = dir->tdir_offset & 0xffff; case 1: v[0] = dir->tdir_offset >> 16; } } else { switch (dir->tdir_count) { case 2: v[1] = dir->tdir_offset >> 16; case 1: v[0] = dir->tdir_offset & 0xffff; } } return (1); } else return (TIFFFetchData(tif, dir, (char *)v) != 0); } /* * Fetch a pair of SHORT or BYTE values. */ static int TIFFFetchShortPair(TIFF* tif, TIFFDirEntry* dir) { uint16 v[2]; int ok = 0; switch (dir->tdir_type) { case TIFF_SHORT: case TIFF_SSHORT: ok = TIFFFetchShortArray(tif, dir, v); break; case TIFF_BYTE: case TIFF_SBYTE: ok = TIFFFetchByteArray(tif, dir, v); break; } if (ok) TIFFSetField(tif, dir->tdir_tag, v[0], v[1]); return (ok); } /* * Fetch an array of LONG or SLONG values. */ static int TIFFFetchLongArray(TIFF* tif, TIFFDirEntry* dir, uint32* v) { if (dir->tdir_count == 1) { v[0] = dir->tdir_offset; return (1); } else return (TIFFFetchData(tif, dir, (char*) v) != 0); } /* * Fetch an array of RATIONAL or SRATIONAL values. */ static int TIFFFetchRationalArray(TIFF* tif, TIFFDirEntry* dir, float* v) { int ok = 0; uint32* l; l = (uint32*)CheckMalloc(tif, dir->tdir_count*TIFFDataWidth(dir->tdir_type), "to fetch array of rationals"); if (l) { if (TIFFFetchData(tif, dir, (char *)l)) { uint32 i; for (i = 0; i < dir->tdir_count; i++) { ok = cvtRational(tif, dir, l[2*i+0], l[2*i+1], &v[i]); if (!ok) break; } } _TIFFfree((char *)l); } return (ok); } /* * Fetch an array of FLOAT values. */ static int TIFFFetchFloatArray(TIFF* tif, TIFFDirEntry* dir, float* v) { if (dir->tdir_count == 1) { v[0] = *(float*) &dir->tdir_offset; TIFFCvtIEEEFloatToNative(tif, dir->tdir_count, v); return (1); } else if (TIFFFetchData(tif, dir, (char*) v)) { TIFFCvtIEEEFloatToNative(tif, dir->tdir_count, v); return (1); } else return (0); } /* * Fetch an array of DOUBLE values. */ static int TIFFFetchDoubleArray(TIFF* tif, TIFFDirEntry* dir, double* v) { if (TIFFFetchData(tif, dir, (char*) v)) { TIFFCvtIEEEDoubleToNative(tif, dir->tdir_count, v); return (1); } else return (0); } /* * Fetch an array of ANY values. The actual values are * returned as doubles which should be able hold all the * types. Yes, there really should be an tany_t to avoid * this potential non-portability ... Note in particular * that we assume that the double return value vector is * large enough to read in any fundamental type. We use * that vector as a buffer to read in the base type vector * and then convert it in place to double (from end * to front of course). */ static int TIFFFetchAnyArray(TIFF* tif, TIFFDirEntry* dir, double* v) { int i; switch (dir->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: if (!TIFFFetchByteArray(tif, dir, (uint16*) v)) return (0); if (dir->tdir_type == TIFF_BYTE) { uint16* vp = (uint16*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } else { int16* vp = (int16*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } break; case TIFF_SHORT: case TIFF_SSHORT: if (!TIFFFetchShortArray(tif, dir, (uint16*) v)) return (0); if (dir->tdir_type == TIFF_SHORT) { uint16* vp = (uint16*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } else { int16* vp = (int16*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } break; case TIFF_LONG: case TIFF_SLONG: if (!TIFFFetchLongArray(tif, dir, (uint32*) v)) return (0); if (dir->tdir_type == TIFF_LONG) { uint32* vp = (uint32*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } else { int32* vp = (int32*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } break; case TIFF_RATIONAL: case TIFF_SRATIONAL: if (!TIFFFetchRationalArray(tif, dir, (float*) v)) return (0); { float* vp = (float*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } break; case TIFF_FLOAT: if (!TIFFFetchFloatArray(tif, dir, (float*) v)) return (0); { float* vp = (float*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } break; case TIFF_DOUBLE: return (TIFFFetchDoubleArray(tif, dir, (double*) v)); default: /* TIFF_NOTYPE */ /* TIFF_ASCII */ /* TIFF_UNDEFINED */ TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Cannot read TIFF_ANY type %d for field \"%s\"", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); return (0); } return (1); } /* * Fetch a tag that is not handled by special case code. */ /* The standard function TIFFFetchNormalTag() could definitely be replaced with a simple call to this function, just adding TIFFSetField() as the last argument. */ static int TIFFFetchNormalSubTag(TIFF* tif, TIFFDirEntry* dp, const TIFFFieldInfo* fip, int (*setFieldFn)(TIFF *tif, ttag_t tag, ...)) { static char mesg[] = "to fetch tag value"; int ok = 0; if (dp->tdir_count > 1) { /* array of values */ char* cp = NULL; switch (dp->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: /* NB: always expand BYTE values to shorts */ cp = CheckMalloc(tif, dp->tdir_count * sizeof (uint16), mesg); ok = cp && TIFFFetchByteArray(tif, dp, (uint16*) cp); break; case TIFF_SHORT: case TIFF_SSHORT: cp = CheckMalloc(tif, dp->tdir_count * sizeof (uint16), mesg); ok = cp && TIFFFetchShortArray(tif, dp, (uint16*) cp); break; case TIFF_LONG: case TIFF_SLONG: cp = CheckMalloc(tif, dp->tdir_count * sizeof (uint32), mesg); ok = cp && TIFFFetchLongArray(tif, dp, (uint32*) cp); break; case TIFF_RATIONAL: case TIFF_SRATIONAL: cp = CheckMalloc(tif, dp->tdir_count * sizeof (float), mesg); ok = cp && TIFFFetchRationalArray(tif, dp, (float*) cp); break; case TIFF_FLOAT: cp = CheckMalloc(tif, dp->tdir_count * sizeof (float), mesg); ok = cp && TIFFFetchFloatArray(tif, dp, (float*) cp); break; case TIFF_DOUBLE: cp = CheckMalloc(tif, dp->tdir_count * sizeof (double), mesg); ok = cp && TIFFFetchDoubleArray(tif, dp, (double*) cp); break; case TIFF_ASCII: case TIFF_UNDEFINED: /* bit of a cheat... */ /* * Some vendors write strings w/o the trailing * NULL byte, so always append one just in case. */ cp = CheckMalloc(tif, dp->tdir_count+1, mesg); if (ok = (cp && TIFFFetchString(tif, dp, cp))) cp[dp->tdir_count] = '\0'; /* XXX */ break; } if (ok) { ok = (fip->field_passcount ? (*setFieldFn)(tif, dp->tdir_tag, dp->tdir_count, cp) : (*setFieldFn)(tif, dp->tdir_tag, cp)); } if (cp != NULL) _TIFFfree(cp); } else if (CheckDirCount(tif, dp, 1)) { /* singleton value */ switch (dp->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: case TIFF_SHORT: case TIFF_SSHORT: /* * If the tag is also acceptable as a LONG or SLONG * then (*setFieldFn) will expect an uint32 parameter * passed to it (through varargs). Thus, for machines * where sizeof (int) != sizeof (uint32) we must do * a careful check here. It's hard to say if this * is worth optimizing. * * NB: We use TIFFFieldWithTag here knowing that * it returns us the first entry in the table * for the tag and that that entry is for the * widest potential data type the tag may have. */ { TIFFDataType type = fip->field_type; if (type != TIFF_LONG && type != TIFF_SLONG) { uint16 v = (uint16) TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset); ok = (fip->field_passcount ? (*setFieldFn)(tif, dp->tdir_tag, 1, &v) : (*setFieldFn)(tif, dp->tdir_tag, v)); break; } } /* fall thru... */ case TIFF_LONG: case TIFF_SLONG: { uint32 v32 = TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset); ok = (fip->field_passcount ? (*setFieldFn)(tif, dp->tdir_tag, 1, &v32) : (*setFieldFn)(tif, dp->tdir_tag, v32)); } break; case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: { float v = (dp->tdir_type == TIFF_FLOAT ? TIFFFetchFloat(tif, dp) : TIFFFetchRational(tif, dp)); ok = (fip->field_passcount ? (*setFieldFn)(tif, dp->tdir_tag, 1, &v) : (*setFieldFn)(tif, dp->tdir_tag, v)); } break; case TIFF_DOUBLE: { double v; ok = (TIFFFetchDoubleArray(tif, dp, &v) && (fip->field_passcount ? (*setFieldFn)(tif, dp->tdir_tag, 1, &v) : (*setFieldFn)(tif, dp->tdir_tag, v)) ); } break; case TIFF_ASCII: case TIFF_UNDEFINED: /* bit of a cheat... */ { char c[2]; if (ok = (TIFFFetchString(tif, dp, c) != 0)) { c[1] = '\0'; /* XXX paranoid */ ok = (*setFieldFn)(tif, dp->tdir_tag, c); } } break; } } return (ok); } /* Everything after this is exactly duplicated from the standard tif_dirread.c file, necessitated by the fact that they are declared static there so we can't call them! */ #define NITEMS(x) (sizeof (x) / sizeof (x[0])) /* * Fetch samples/pixel short values for * the specified tag and verify that * all values are the same. */ static int TIFFFetchPerSampleShorts(TIFF* tif, TIFFDirEntry* dir, int* pl) { int samples = tif->tif_dir.td_samplesperpixel; int status = 0; if (CheckDirCount(tif, dir, (uint32) samples)) { uint16 buf[10]; uint16* v = buf; if (samples > NITEMS(buf)) v = (uint16*) _TIFFmalloc(samples * sizeof (uint16)); if (TIFFFetchShortArray(tif, dir, v)) { int i; for (i = 1; i < samples; i++) if (v[i] != v[0]) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Cannot handle different per-sample values for field \"%s\"", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); goto bad; } *pl = v[0]; status = 1; } bad: if (v != buf) _TIFFfree((char*) v); } return (status); } /* * Fetch samples/pixel ANY values for * the specified tag and verify that * all values are the same. */ static int TIFFFetchPerSampleAnys(TIFF* tif, TIFFDirEntry* dir, double* pl) { int samples = (int) tif->tif_dir.td_samplesperpixel; int status = 0; if (CheckDirCount(tif, dir, (uint32) samples)) { double buf[10]; double* v = buf; if (samples > NITEMS(buf)) v = (double*) _TIFFmalloc(samples * sizeof (double)); if (TIFFFetchAnyArray(tif, dir, v)) { int i; for (i = 1; i < samples; i++) if (v[i] != v[0]) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Cannot handle different per-sample values for field \"%s\"", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); goto bad; } *pl = v[0]; status = 1; } bad: if (v != buf) _TIFFfree(v); } return (status); } #undef NITEMS /* * Fetch a set of offsets or lengths. * While this routine says "strips", * in fact it's also used for tiles. */ static int TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, long nstrips, uint32** lpp) { register uint32* lp; int status; if (!CheckDirCount(tif, dir, (uint32) nstrips)) return (0); /* * Allocate space for strip information. */ if (*lpp == NULL && (*lpp = (uint32 *)CheckMalloc(tif, nstrips * sizeof (uint32), "for strip array")) == NULL) return (0); lp = *lpp; if (dir->tdir_type == (int)TIFF_SHORT) { /* * Handle uint16->uint32 expansion. */ uint16* dp = (uint16*) CheckMalloc(tif, dir->tdir_count* sizeof (uint16), "to fetch strip tag"); if (dp == NULL) return (0); if (status = TIFFFetchShortArray(tif, dir, dp)) { register uint16* wp = dp; while (nstrips-- > 0) *lp++ = *wp++; } _TIFFfree((char*) dp); } else status = TIFFFetchLongArray(tif, dir, lp); return (status); } #define NITEMS(x) (sizeof (x) / sizeof (x[0])) /* * Fetch and set the ExtraSamples tag. */ static int TIFFFetchExtraSamples(TIFF* tif, TIFFDirEntry* dir) { uint16 buf[10]; uint16* v = buf; int status; if (dir->tdir_count > NITEMS(buf)) v = (uint16*) _TIFFmalloc(dir->tdir_count * sizeof (uint16)); if (dir->tdir_type == TIFF_BYTE) status = TIFFFetchByteArray(tif, dir, v); else status = TIFFFetchShortArray(tif, dir, v); if (status) status = TIFFSetField(tif, dir->tdir_tag, dir->tdir_count, v); if (v != buf) _TIFFfree((char*) v); return (status); } #undef NITEMS #ifdef COLORIMETRY_SUPPORT /* * Fetch and set the RefBlackWhite tag. */ static int TIFFFetchRefBlackWhite(TIFF* tif, TIFFDirEntry* dir) { static char mesg[] = "for \"ReferenceBlackWhite\" array"; char* cp; int ok; if (dir->tdir_type == TIFF_RATIONAL) return (1/*TIFFFetchNormalTag(tif, dir) just so linker won't complain - this part of the code is never used anyway */); /* * Handle LONG's for backward compatibility. */ cp = CheckMalloc(tif, dir->tdir_count * sizeof (uint32), mesg); if (ok = (cp && TIFFFetchLongArray(tif, dir, (uint32*) cp))) { float* fp = (float*) CheckMalloc(tif, dir->tdir_count * sizeof (float), mesg); if (ok = (fp != NULL)) { uint32 i; for (i = 0; i < dir->tdir_count; i++) fp[i] = (float)((uint32*) cp)[i]; ok = TIFFSetField(tif, dir->tdir_tag, fp); _TIFFfree((char*) fp); } } if (cp) _TIFFfree(cp); return (ok); } #endif #if STRIPCHOP_SUPPORT /* * Replace a single strip (tile) of uncompressed data by * multiple strips (tiles), each approximately 8Kbytes. * This is useful for dealing with large images or * for dealing with machines with a limited amount * memory. */ static void ChopUpSingleUncompressedStrip(TIFF* tif) { register TIFFDirectory *td = &tif->tif_dir; uint32 bytecount = td->td_stripbytecount[0]; uint32 offset = td->td_stripoffset[0]; tsize_t rowbytes = TIFFVTileSize(tif, 1), stripbytes; tstrip_t strip, nstrips, rowsperstrip; uint32* newcounts; uint32* newoffsets; /* * Make the rows hold at least one * scanline, but fill 8k if possible. */ if (rowbytes > 8192) { stripbytes = rowbytes; rowsperstrip = 1; } else { rowsperstrip = 8192 / rowbytes; stripbytes = rowbytes * rowsperstrip; } /* never increase the number of strips in an image */ if (rowsperstrip >= td->td_rowsperstrip) return; nstrips = (tstrip_t) TIFFhowmany(bytecount, stripbytes); newcounts = (uint32*) CheckMalloc(tif, nstrips * sizeof (uint32), "for chopped \"StripByteCounts\" array"); newoffsets = (uint32*) CheckMalloc(tif, nstrips * sizeof (uint32), "for chopped \"StripOffsets\" array"); if (newcounts == NULL || newoffsets == NULL) { /* * Unable to allocate new strip information, give * up and use the original one strip information. */ if (newcounts != NULL) _TIFFfree(newcounts); if (newoffsets != NULL) _TIFFfree(newoffsets); return; } /* * Fill the strip information arrays with * new bytecounts and offsets that reflect * the broken-up format. */ for (strip = 0; strip < nstrips; strip++) { if (stripbytes > bytecount) stripbytes = bytecount; newcounts[strip] = stripbytes; newoffsets[strip] = offset; offset += stripbytes; bytecount -= stripbytes; } /* * Replace old single strip info with multi-strip info. */ td->td_stripsperimage = td->td_nstrips = nstrips; TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip); _TIFFfree(td->td_stripbytecount); _TIFFfree(td->td_stripoffset); td->td_stripbytecount = newcounts; td->td_stripoffset = newoffsets; } #endif /* STRIPCHOP_SUPPORT */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/pds/Makefile.in0000644000212300117540000003137412027361163013673 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = contrib/pds DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README tif_imageiter.c tif_imageiter.h tif_pdsdirread.c tif_pdsdirwrite.c all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pds/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pds/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/contrib/pds/Makefile.am0000644000212300117540000000250510411004544013644 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. EXTRA_DIST = README tif_imageiter.c tif_imageiter.h tif_pdsdirread.c tif_pdsdirwrite.c tiff-4.0.3/contrib/pds/tif_imageiter.c0000644000212300117540000003710011403511023014560 00000000000000/* $Header: /cvs/maptools/cvsroot/libtiff/contrib/pds/tif_imageiter.c,v 1.4 2010-06-08 18:55:15 bfriesen Exp $ */ /* * Copyright (c) 1991-1996 Sam Leffler * Copyright (c) 1991-1996 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Written by Conrad J. Poelman, PL/WSAT, Kirtland AFB, NM on 26 Mar 96. * * This file contains code to allow a calling program to "iterate" over each * pixels in an image as it is read from the file. The iterator takes care of * reading strips versus (possibly clipped) tiles, decoding the information * according to the decoding method, and so on, so that calling program can * ignore those details. The calling program does, however, need to be * conscious of the type of the pixel data that it is receiving. * * For reasons of efficiency, the callback function actually gets called for * "blocks" of pixels rather than for individual pixels. The format of the * callback arguments is given below. * * This code was taken from TIFFReadRGBAImage() in tif_getimage.c of the original * TIFF distribution, and simplified and generalized to provide this general * iteration capability. Those routines could certainly be re-implemented in terms * of a TIFFImageIter if desired. * */ #include "tiffiop.h" #include "tif_imageiter.h" #include #include static int gtTileContig(TIFFImageIter*, void *udata, uint32, uint32); static int gtTileSeparate(TIFFImageIter*, void *udata, uint32, uint32); static int gtStripContig(TIFFImageIter*, void *udata, uint32, uint32); static int gtStripSeparate(TIFFImageIter*, void *udata, uint32, uint32); static const char photoTag[] = "PhotometricInterpretation"; static int isCCITTCompression(TIFF* tif) { uint16 compress; TIFFGetField(tif, TIFFTAG_COMPRESSION, &compress); return (compress == COMPRESSION_CCITTFAX3 || compress == COMPRESSION_CCITTFAX4 || compress == COMPRESSION_CCITTRLE || compress == COMPRESSION_CCITTRLEW); } int TIFFImageIterBegin(TIFFImageIter* img, TIFF* tif, int stop, char emsg[1024]) { uint16* sampleinfo; uint16 extrasamples; uint16 planarconfig; int colorchannels; img->tif = tif; img->stoponerr = stop; TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &img->bitspersample); img->alpha = 0; TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &img->samplesperpixel); TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, &extrasamples, &sampleinfo); if (extrasamples == 1) switch (sampleinfo[0]) { case EXTRASAMPLE_ASSOCALPHA: /* data is pre-multiplied */ case EXTRASAMPLE_UNASSALPHA: /* data is not pre-multiplied */ img->alpha = sampleinfo[0]; break; } colorchannels = img->samplesperpixel - extrasamples; TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planarconfig); if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric)) { switch (colorchannels) { case 1: if (isCCITTCompression(tif)) img->photometric = PHOTOMETRIC_MINISWHITE; else img->photometric = PHOTOMETRIC_MINISBLACK; break; case 3: img->photometric = PHOTOMETRIC_RGB; break; default: sprintf(emsg, "Missing needed %s tag", photoTag); return (0); } } switch (img->photometric) { case PHOTOMETRIC_PALETTE: if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &img->redcmap, &img->greencmap, &img->bluecmap)) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Missing required \"Colormap\" tag"); return (0); } /* fall thru... */ case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: /* This should work now so skip the check - BSR if (planarconfig == PLANARCONFIG_CONTIG && img->samplesperpixel != 1) { sprintf(emsg, "Sorry, can not handle contiguous data with %s=%d, and %s=%d", photoTag, img->photometric, "Samples/pixel", img->samplesperpixel); return (0); } */ break; case PHOTOMETRIC_YCBCR: if (planarconfig != PLANARCONFIG_CONTIG) { sprintf(emsg, "Sorry, can not handle YCbCr images with %s=%d", "Planarconfiguration", planarconfig); return (0); } /* It would probably be nice to have a reality check here. */ { uint16 compress; TIFFGetField(tif, TIFFTAG_COMPRESSION, &compress); if (compress == COMPRESSION_JPEG && planarconfig == PLANARCONFIG_CONTIG) { /* can rely on libjpeg to convert to RGB */ /* XXX should restore current state on exit */ TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); img->photometric = PHOTOMETRIC_RGB; } } break; case PHOTOMETRIC_RGB: if (colorchannels < 3) { sprintf(emsg, "Sorry, can not handle RGB image with %s=%d", "Color channels", colorchannels); return (0); } break; case PHOTOMETRIC_SEPARATED: { uint16 inkset; TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset); if (inkset != INKSET_CMYK) { sprintf(emsg, "Sorry, can not handle separated image with %s=%d", "InkSet", inkset); return (0); } if (img->samplesperpixel != 4) { sprintf(emsg, "Sorry, can not handle separated image with %s=%d", "Samples/pixel", img->samplesperpixel); return (0); } break; } default: sprintf(emsg, "Sorry, can not handle image with %s=%d", photoTag, img->photometric); return (0); } TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &img->width); TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &img->height); TIFFGetFieldDefaulted(tif, TIFFTAG_ORIENTATION, &img->orientation); switch (img->orientation) { case ORIENTATION_BOTRIGHT: case ORIENTATION_RIGHTBOT: /* XXX */ case ORIENTATION_LEFTBOT: /* XXX */ TIFFWarning(TIFFFileName(tif), "using bottom-left orientation"); img->orientation = ORIENTATION_BOTLEFT; /* fall thru... */ case ORIENTATION_BOTLEFT: break; case ORIENTATION_TOPRIGHT: case ORIENTATION_RIGHTTOP: /* XXX */ case ORIENTATION_LEFTTOP: /* XXX */ default: TIFFWarning(TIFFFileName(tif), "using top-left orientation"); img->orientation = ORIENTATION_TOPLEFT; /* fall thru... */ case ORIENTATION_TOPLEFT: break; } img->isContig = !(planarconfig == PLANARCONFIG_SEPARATE && colorchannels > 1); if (img->isContig) { img->get = TIFFIsTiled(tif) ? gtTileContig : gtStripContig; } else { img->get = TIFFIsTiled(tif) ? gtTileSeparate : gtStripSeparate; } return (1); } int TIFFImageIterGet(TIFFImageIter* img, void *udata, uint32 w, uint32 h) { if (img->get == NULL) { TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No \"get\" routine setup"); return (0); } if (img->callback.any == NULL) { TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No \"put\" routine setupl; probably can not handle image format"); return (0); } return (*img->get)(img, udata, w, h); } TIFFImageIterEnd(TIFFImageIter* img) { /* Nothing to free... ? */ } /* * Read the specified image into an ABGR-format raster. */ int TIFFReadImageIter(TIFF* tif, uint32 rwidth, uint32 rheight, uint8* raster, int stop) { char emsg[1024]; TIFFImageIter img; int ok; if (TIFFImageIterBegin(&img, tif, stop, emsg)) { /* XXX verify rwidth and rheight against width and height */ ok = TIFFImageIterGet(&img, raster, rwidth, img.height); TIFFImageIterEnd(&img); } else { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), emsg); ok = 0; } return (ok); } /* * Get an tile-organized image that has * PlanarConfiguration contiguous if SamplesPerPixel > 1 * or * SamplesPerPixel == 1 */ static int gtTileContig(TIFFImageIter* img, void *udata, uint32 w, uint32 h) { TIFF* tif = img->tif; ImageIterTileContigRoutine callback = img->callback.contig; uint16 orientation; uint32 col, row; uint32 tw, th; u_char* buf; int32 fromskew; uint32 nrow; buf = (u_char*) _TIFFmalloc(TIFFTileSize(tif)); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for tile buffer"); return (0); } TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw); TIFFGetField(tif, TIFFTAG_TILELENGTH, &th); orientation = img->orientation; for (row = 0; row < h; row += th) { nrow = (row + th > h ? h - row : th); for (col = 0; col < w; col += tw) { if (TIFFReadTile(tif, buf, col, row, 0, 0) < 0 && img->stoponerr) break; if (col + tw > w) { /* * Tile is clipped horizontally. Calculate * visible portion and skewing factors. */ uint32 npix = w - col; fromskew = tw - npix; (*callback)(img, udata, col, row, npix, nrow, fromskew, buf); } else { (*callback)(img, udata, col, row, tw, nrow, 0, buf); } } } _TIFFfree(buf); return (1); } /* * Get an tile-organized image that has * SamplesPerPixel > 1 * PlanarConfiguration separated * We assume that all such images are RGB. */ static int gtTileSeparate(TIFFImageIter* img, void *udata, uint32 w, uint32 h) { TIFF* tif = img->tif; ImageIterTileSeparateRoutine callback = img->callback.separate; uint16 orientation; uint32 col, row; uint32 tw, th; u_char* buf; u_char* r; u_char* g; u_char* b; u_char* a; tsize_t tilesize; int32 fromskew; int alpha = img->alpha; uint32 nrow; tilesize = TIFFTileSize(tif); buf = (u_char*) _TIFFmalloc(4*tilesize); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for tile buffer"); return (0); } r = buf; g = r + tilesize; b = g + tilesize; a = b + tilesize; if (!alpha) memset(a, 0xff, tilesize); TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw); TIFFGetField(tif, TIFFTAG_TILELENGTH, &th); orientation = img->orientation; for (row = 0; row < h; row += th) { nrow = (row + th > h ? h - row : th); for (col = 0; col < w; col += tw) { if (TIFFReadTile(tif, r, col, row,0,0) < 0 && img->stoponerr) break; if (TIFFReadTile(tif, g, col, row,0,1) < 0 && img->stoponerr) break; if (TIFFReadTile(tif, b, col, row,0,2) < 0 && img->stoponerr) break; if (alpha && TIFFReadTile(tif,a,col,row,0,3) < 0 && img->stoponerr) break; if (col + tw > w) { /* * Tile is clipped horizontally. Calculate * visible portion and skewing factors. */ uint32 npix = w - col; fromskew = tw - npix; (*callback)(img, udata, col, row, npix, nrow, fromskew, r, g, b, a); } else { (*callback)(img, udata, col, row, tw, nrow, 0, r, g, b, a); } } } _TIFFfree(buf); return (1); } /* * Get a strip-organized image that has * PlanarConfiguration contiguous if SamplesPerPixel > 1 * or * SamplesPerPixel == 1 */ static int gtStripContig(TIFFImageIter* img, void *udata, uint32 w, uint32 h) { TIFF* tif = img->tif; ImageIterTileContigRoutine callback = img->callback.contig; uint16 orientation; uint32 row, nrow; u_char* buf; uint32 rowsperstrip; uint32 imagewidth = img->width; tsize_t scanline; int32 fromskew; buf = (u_char*) _TIFFmalloc(TIFFStripSize(tif)); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for strip buffer"); return (0); } orientation = img->orientation; TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); scanline = TIFFScanlineSize(tif); fromskew = (w < imagewidth ? imagewidth - w : 0); for (row = 0; row < h; row += rowsperstrip) { nrow = (row + rowsperstrip > h ? h - row : rowsperstrip); if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 0), buf, nrow*scanline) < 0 && img->stoponerr) break; (*callback)(img, udata, 0, row, w, nrow, fromskew, buf); } _TIFFfree(buf); return (1); } /* * Get a strip-organized image with * SamplesPerPixel > 1 * PlanarConfiguration separated * We assume that all such images are RGB. */ static int gtStripSeparate(TIFFImageIter* img, void *udata, uint32 w, uint32 h) { TIFF* tif = img->tif; ImageIterTileSeparateRoutine callback = img->callback.separate; uint16 orientation; u_char *buf; u_char *r, *g, *b, *a; uint32 row, nrow; tsize_t scanline; uint32 rowsperstrip; uint32 imagewidth = img->width; tsize_t stripsize; int32 fromskew; int alpha = img->alpha; stripsize = TIFFStripSize(tif); r = buf = (u_char *)_TIFFmalloc(4*stripsize); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for tile buffer"); return (0); } g = r + stripsize; b = g + stripsize; a = b + stripsize; if (!alpha) memset(a, 0xff, stripsize); orientation = img->orientation; TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); scanline = TIFFScanlineSize(tif); fromskew = (w < imagewidth ? imagewidth - w : 0); for (row = 0; row < h; row += rowsperstrip) { nrow = (row + rowsperstrip > h ? h - row : rowsperstrip); if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 0), r, nrow*scanline) < 0 && img->stoponerr) break; if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 1), g, nrow*scanline) < 0 && img->stoponerr) break; if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 2), b, nrow*scanline) < 0 && img->stoponerr) break; if (alpha && (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 3), a, nrow*scanline) < 0 && img->stoponerr)) break; (*callback)(img, udata, 0, row, w, nrow, fromskew, r, g, b, a); } _TIFFfree(buf); return (1); } DECLAREContigCallbackFunc(TestContigCallback) { printf("Contig Callback called with x = %d, y = %d, w = %d, h = %d, fromskew = %d\n", x, y, w, h, fromskew); } DECLARESepCallbackFunc(TestSepCallback) { printf("Sep Callback called with x = %d, y = %d, w = %d, h = %d, fromskew = %d\n", x, y, w, h, fromskew); } #ifdef MAIN main(int argc, char **argv) { char emsg[1024]; TIFFImageIter img; int ok; int stop = 1; TIFF *tif; unsigned long nx, ny; unsigned short BitsPerSample, SamplesPerPixel; int isColorMapped, isPliFile; unsigned char *ColorMap; unsigned char *data; if (argc < 2) { fprintf(stderr,"usage: %s tiff_file\n",argv[0]); exit(1); } tif = (TIFF *)PLIGetImage(argv[1], (void *) &data, &ColorMap, &nx, &ny, &BitsPerSample, &SamplesPerPixel, &isColorMapped, &isPliFile); if (tif != NULL) { if (TIFFImageIterBegin(&img, tif, stop, emsg)) { /* Here need to set data and callback function! */ if (img.isContig) { img.callback = TestContigCallback; } else { img.callback = TestSepCallback; } ok = TIFFImageIterGet(&img, NULL, img.width, img.height); TIFFImageIterEnd(&img); } else { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), emsg); } } } #endif /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/pds/tif_pdsdirwrite.c0000644000212300117540000007252711403511023015166 00000000000000/* $Header: /cvs/maptools/cvsroot/libtiff/contrib/pds/tif_pdsdirwrite.c,v 1.4 2010-06-08 18:55:15 bfriesen Exp $ */ /* When writing data to TIFF files, it is often useful to store application- specific data in a private TIFF directory so that the tags don't need to be registered and won't conflict with other people's user-defined tags. One needs to have a registered public tag which contains some amount of raw data. That raw data, however, is interpreted at an independent, separate, private tiff directory. This file provides some routines which will be useful for converting that data from its raw binary form into the proper form for your application. */ /* * Copyright (c) 1988-1996 Sam Leffler * Copyright (c) 1991-1996 Silicon Graphics, Inc. * Copyright (c( 1996 USAF Phillips Laboratory * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * These routines written by Conrad J. Poelman on a single late-night of * March 20-21, 1996. * * The entire purpose of this file is to provide a single external function, * TIFFWritePrivateDataSubDirectory(). This function is intended for use * in writing a private subdirectory structure into a TIFF file. The * actual reading of data from the structure is handled by the getFieldFn(), * which is passed to TIFFWritePrivateDataSubDirectory() as a parameter. The * idea is to enable any application wishing to read private subdirectories to * do so easily using this function, without modifying the TIFF library. * * The astute observer will notice that only two functions are at all different * from the original tif_dirwrite.c file: TIFFWritePrivateDataSubDirectory()and * TIFFWriteNormalSubTag(). All the other stuff that makes this file so huge * is only necessary because all of those functions are declared static in * tif_dirwrite.c, so we have to totally duplicate them in order to use them. * * Oh, also please note the bug-fix in the routine TIFFWriteNormalSubTag(), * which equally should be applied to TIFFWriteNormalTag(). * */ #include "tiffiop.h" #if HAVE_IEEEFP #define TIFFCvtNativeToIEEEFloat(tif, n, fp) #define TIFFCvtNativeToIEEEDouble(tif, n, dp) #else extern void TIFFCvtNativeToIEEEFloat(TIFF*, uint32, float*); extern void TIFFCvtNativeToIEEEDouble(TIFF*, uint32, double*); #endif static int TIFFWriteNormalTag(TIFF*, TIFFDirEntry*, const TIFFFieldInfo*); static int TIFFWriteNormalSubTag(TIFF*, TIFFDirEntry*, const TIFFFieldInfo*, int (*getFieldFn)(TIFF *tif,ttag_t tag,...)); static void TIFFSetupShortLong(TIFF*, ttag_t, TIFFDirEntry*, uint32); static int TIFFSetupShortPair(TIFF*, ttag_t, TIFFDirEntry*); static int TIFFWritePerSampleShorts(TIFF*, ttag_t, TIFFDirEntry*); static int TIFFWritePerSampleAnys(TIFF*, TIFFDataType, ttag_t, TIFFDirEntry*); static int TIFFWriteShortTable(TIFF*, ttag_t, TIFFDirEntry*, uint32, uint16**); static int TIFFWriteShortArray(TIFF*, TIFFDataType, ttag_t, TIFFDirEntry*, uint32, uint16*); static int TIFFWriteLongArray(TIFF *, TIFFDataType, ttag_t, TIFFDirEntry*, uint32, uint32*); static int TIFFWriteRationalArray(TIFF *, TIFFDataType, ttag_t, TIFFDirEntry*, uint32, float*); static int TIFFWriteFloatArray(TIFF *, TIFFDataType, ttag_t, TIFFDirEntry*, uint32, float*); static int TIFFWriteDoubleArray(TIFF *, TIFFDataType, ttag_t, TIFFDirEntry*, uint32, double*); static int TIFFWriteByteArray(TIFF*, TIFFDirEntry*, char*); static int TIFFWriteAnyArray(TIFF*, TIFFDataType, ttag_t, TIFFDirEntry*, uint32, double*); #ifdef COLORIMETRY_SUPPORT static int TIFFWriteTransferFunction(TIFF*, TIFFDirEntry*); #endif static int TIFFWriteData(TIFF*, TIFFDirEntry*, char*); static int TIFFLinkDirectory(TIFF*); #define WriteRationalPair(type, tag1, v1, tag2, v2) { \ if (!TIFFWriteRational(tif, type, tag1, dir, v1)) \ goto bad; \ if (!TIFFWriteRational(tif, type, tag2, dir+1, v2)) \ goto bad; \ dir++; \ } #define TIFFWriteRational(tif, type, tag, dir, v) \ TIFFWriteRationalArray((tif), (type), (tag), (dir), 1, &(v)) #ifndef TIFFWriteRational static int TIFFWriteRational(TIFF*, TIFFDataType, ttag_t, TIFFDirEntry*, float); #endif /* This function will write an entire directory to the disk, and return the offset value indicating where in the file it wrote the beginning of the directory structure. This is NOT the same as the offset value before calling this function, because some of the fields may have caused various data items to be written out BEFORE writing the directory structure. This code was basically written by ripping of the TIFFWriteDirectory() code and generalizing it, using RPS's TIFFWritePliIfd() code for inspiration. My original goal was to make this code general enough that the original TIFFWriteDirectory() could be rewritten to just call this function with the appropriate field and field-accessing arguments. However, now I realize that there's a lot of code that gets executed for the main, standard TIFF directories that does not apply to special private subdirectories, so such a reimplementation for the sake of eliminating redundant or duplicate code is probably not possible, unless we also pass in a Main flag to indiciate which type of handling to do, which would be kind of a hack. I've marked those places where I changed or ripped out code which would have to be re-inserted to generalize this function. If it can be done in a clean and graceful way, it would be a great way to generalize the TIFF library. Otherwise, I'll just leave this code here where it duplicates but remains on top of and hopefully mostly independent of the main TIFF library. The caller will probably want to free the sub directory structure after returning from this call, since otherwise once written out, the user is likely to forget about it and leave data lying around. */ toff_t TIFFWritePrivateDataSubDirectory(TIFF* tif, uint32 pdir_fieldsset[], int pdir_fields_last, TIFFFieldInfo *field_info, int (*getFieldFn)(TIFF *tif, ttag_t tag, ...)) { uint16 dircount; uint32 diroff, nextdiroff; ttag_t tag; uint32 nfields; tsize_t dirsize; char* data; TIFFDirEntry* dir; u_long b, *fields, fields_size; toff_t directory_offset; TIFFFieldInfo* fip; /* * Deleted out all of the encoder flushing and such code from here - * not necessary for subdirectories. */ /* Finish writing out any image data. */ TIFFFlushData(tif); /* * Size the directory so that we can calculate * offsets for the data items that aren't kept * in-place in each field. */ nfields = 0; for (b = 0; b <= pdir_fields_last; b++) if (FieldSet(pdir_fieldsset, b)) /* Deleted code to make size of first 4 tags 2 instead of 1. */ nfields += 1; dirsize = nfields * sizeof (TIFFDirEntry); data = (char*) _TIFFmalloc(dirsize); if (data == NULL) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Cannot write private subdirectory, out of space"); return (0); } /* * Place directory in data section of the file. If there isn't one * yet, place it at the end of the file. The directory is treated as * data, so we don't link it into the directory structure at all. */ if (tif->tif_dataoff == 0) tif->tif_dataoff =(TIFFSeekFile(tif, (toff_t) 0, SEEK_END)+1) &~ 1; diroff = tif->tif_dataoff; tif->tif_dataoff = (toff_t)( diroff + sizeof (uint16) + dirsize + sizeof (toff_t)); if (tif->tif_dataoff & 1) tif->tif_dataoff++; (void) TIFFSeekFile(tif, tif->tif_dataoff, SEEK_SET); /*tif->tif_curdir++;*/ dir = (TIFFDirEntry*) data; /* * Setup external form of directory * entries and write data items. */ /* * We make a local copy of the fieldsset here so that we don't mess * up the original one when we call ResetFieldBit(). But I'm not sure * why the original code calls ResetFieldBit(), since we're already * going through the fields in order... * * fields_size is the number of uint32's we will need to hold the * bit-mask for all of the fields. If our highest field number is * 100, then we'll need 100 / (8*4)+1 == 4 uint32's to hold the * fieldset. * * Unlike the original code, we allocate fields dynamically based * on the requested pdir_fields_last value, allowing private * data subdirectories to contain more than the built-in code's limit * of 95 tags in a directory. */ fields_size = pdir_fields_last / (8*sizeof(uint32)) + 1; fields = _TIFFmalloc(fields_size*sizeof(uint32)); _TIFFmemcpy(fields, pdir_fieldsset, fields_size * sizeof(uint32)); /* Deleted "write out extra samples tag" code here. */ /* Deleted code for checking a billion little special cases for the * standard TIFF tags. Should add a general mechanism for overloading * write function for each field, just like Brian kept telling me!!! */ for (fip = field_info; fip->field_tag; fip++) { /* Deleted code to check for FIELD_IGNORE!! */ if (/* fip->field_bit == FIELD_IGNORE || */ !FieldSet(fields, fip->field_bit)) continue; if (!TIFFWriteNormalSubTag(tif, dir, fip, getFieldFn)) goto bad; dir++; ResetFieldBit(fields, fip->field_bit); } /* Now we've written all of the referenced data, and are about to write the main directory structure, so grab the tif_dataoff value now so we can remember where we wrote the directory. */ directory_offset = tif->tif_dataoff; /* * Write directory. */ dircount = (uint16) nfields; /* Deleted code to link to the next directory - we set it to zero! */ nextdiroff = 0; if (tif->tif_flags & TIFF_SWAB) { /* * The file's byte order is opposite to the * native machine architecture. We overwrite * the directory information with impunity * because it'll be released below after we * write it to the file. Note that all the * other tag construction routines assume that * we do this byte-swapping; i.e. they only * byte-swap indirect data. */ for (dir = (TIFFDirEntry*) data; dircount; dir++, dircount--) { TIFFSwabArrayOfShort(&dir->tdir_tag, 2); TIFFSwabArrayOfLong(&dir->tdir_count, 2); } dircount = (uint16) nfields; TIFFSwabShort(&dircount); TIFFSwabLong(&nextdiroff); } (void) TIFFSeekFile(tif, tif->tif_dataoff, SEEK_SET); if (!WriteOK(tif, &dircount, sizeof (dircount))) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error writing private subdirectory count"); goto bad; } if (!WriteOK(tif, data, dirsize)) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error writing private subdirectory contents"); goto bad; } if (!WriteOK(tif, &nextdiroff, sizeof (nextdiroff))) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error writing private subdirectory link"); goto bad; } tif->tif_dataoff += sizeof(dircount) + dirsize + sizeof(nextdiroff); _TIFFfree(data); _TIFFfree(fields); tif->tif_flags &= ~TIFF_DIRTYDIRECT; #if (0) /* This stuff commented out because I don't think we want it for subdirectories, but I could be wrong. */ (*tif->tif_cleanup)(tif); /* * Reset directory-related state for subsequent * directories. */ TIFFDefaultDirectory(tif); tif->tif_curoff = 0; tif->tif_row = (uint32) -1; tif->tif_curstrip = (tstrip_t) -1; #endif return (directory_offset); bad: _TIFFfree(data); _TIFFfree(fields); return (0); } #undef WriteRationalPair /* * Process tags that are not special cased. */ /* The standard function TIFFWriteNormalTag() could definitely be replaced with a simple call to this function, just adding TIFFGetField() as the last argument. */ static int TIFFWriteNormalSubTag(TIFF* tif, TIFFDirEntry* dir, const TIFFFieldInfo* fip, int (*getFieldFn)(TIFF *tif, ttag_t tag, ...)) { u_short wc = (u_short) fip->field_writecount; dir->tdir_tag = fip->field_tag; dir->tdir_type = (u_short) fip->field_type; dir->tdir_count = wc; #define WRITEF(x,y) x(tif, fip->field_type, fip->field_tag, dir, wc, y) switch (fip->field_type) { case TIFF_SHORT: case TIFF_SSHORT: if (wc > 1) { uint16* wp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &wp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &wp); if (!WRITEF(TIFFWriteShortArray, wp)) return (0); } else { uint16 sv; (*getFieldFn)(tif, fip->field_tag, &sv); dir->tdir_offset = TIFFInsertData(tif, dir->tdir_type, sv); } break; case TIFF_LONG: case TIFF_SLONG: if (wc > 1) { uint32* lp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &lp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &lp); if (!WRITEF(TIFFWriteLongArray, lp)) return (0); } else { /* XXX handle LONG->SHORT conversion */ (*getFieldFn)(tif, fip->field_tag, &dir->tdir_offset); } break; case TIFF_RATIONAL: case TIFF_SRATIONAL: if (wc > 1) { float* fp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &fp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &fp); if (!WRITEF(TIFFWriteRationalArray, fp)) return (0); } else { float fv; (*getFieldFn)(tif, fip->field_tag, &fv); if (!WRITEF(TIFFWriteRationalArray, &fv)) return (0); } break; case TIFF_FLOAT: if (wc > 1) { float* fp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &fp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &fp); if (!WRITEF(TIFFWriteFloatArray, fp)) return (0); } else { float fv; (*getFieldFn)(tif, fip->field_tag, &fv); if (!WRITEF(TIFFWriteFloatArray, &fv)) return (0); } break; case TIFF_DOUBLE: /* Hey - I think this is a bug, or at least a "gross inconsistency", in the TIFF library. Look at the original TIFF library code below within the "#if (0) ... #else". Just from the type of *dp, you can see that this code expects TIFFGetField() to be handed a double ** for any TIFF_DOUBLE tag, even for the constant wc==1 case. This is totally inconsistent with other fields (like TIFF_FLOAT, above) and is also inconsistent with the TIFFSetField() function for TIFF_DOUBLEs, which expects to be passed a single double by value for the wc==1 case. (See the handling of TIFFFetchNormalTag() in tif_dirread.c for an example.) Maybe this function was written before TIFFWriteDoubleArray() was written, not that that's an excuse. Anyway, the new code below is a trivial modification of the TIFF_FLOAT code above. The fact that even single doubles get written out in the data segment and get an offset value stored is irrelevant here - that is all handled by TIFFWriteDoubleArray(). */ #if (0) { double* dp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &dp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &dp); TIFFCvtNativeToIEEEDouble(tif, wc, dp); if (!TIFFWriteData(tif, dir, (char*) dp)) return (0); } #else if (wc > 1) { double* dp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &dp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &dp); if (!WRITEF(TIFFWriteDoubleArray, dp)) return (0); } else { double dv; (*getFieldFn)(tif, fip->field_tag, &dv); if (!WRITEF(TIFFWriteDoubleArray, &dv)) return (0); } #endif break; case TIFF_ASCII: { char* cp; (*getFieldFn)(tif, fip->field_tag, &cp); dir->tdir_count = (uint32) (strlen(cp) + 1); if (!TIFFWriteByteArray(tif, dir, cp)) return (0); } break; case TIFF_UNDEFINED: { char* cp; if (wc == (u_short) TIFF_VARIABLE) { (*getFieldFn)(tif, fip->field_tag, &wc, &cp); dir->tdir_count = wc; } else (*getFieldFn)(tif, fip->field_tag, &cp); if (!TIFFWriteByteArray(tif, dir, cp)) return (0); } break; } return (1); } #undef WRITEF /* Everything after this is exactly duplicated from the standard tif_dirwrite.c file, necessitated by the fact that they are declared static there so we can't call them! */ /* * Setup a directory entry with either a SHORT * or LONG type according to the value. */ static void TIFFSetupShortLong(TIFF* tif, ttag_t tag, TIFFDirEntry* dir, uint32 v) { dir->tdir_tag = tag; dir->tdir_count = 1; if (v > 0xffffL) { dir->tdir_type = (short) TIFF_LONG; dir->tdir_offset = v; } else { dir->tdir_type = (short) TIFF_SHORT; dir->tdir_offset = TIFFInsertData(tif, (int) TIFF_SHORT, v); } } #undef MakeShortDirent #ifndef TIFFWriteRational /* * Setup a RATIONAL directory entry and * write the associated indirect value. */ static int TIFFWriteRational(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, float v) { return (TIFFWriteRationalArray(tif, type, tag, dir, 1, &v)); } #endif #define NITEMS(x) (sizeof (x) / sizeof (x[0])) /* * Setup a directory entry that references a * samples/pixel array of SHORT values and * (potentially) write the associated indirect * values. */ static int TIFFWritePerSampleShorts(TIFF* tif, ttag_t tag, TIFFDirEntry* dir) { uint16 buf[10], v; uint16* w = buf; int i, status, samples = tif->tif_dir.td_samplesperpixel; if (samples > NITEMS(buf)) w = (uint16*) _TIFFmalloc(samples * sizeof (uint16)); TIFFGetField(tif, tag, &v); for (i = 0; i < samples; i++) w[i] = v; status = TIFFWriteShortArray(tif, TIFF_SHORT, tag, dir, samples, w); if (w != buf) _TIFFfree((char*) w); return (status); } /* * Setup a directory entry that references a samples/pixel array of ``type'' * values and (potentially) write the associated indirect values. The source * data from TIFFGetField() for the specified tag must be returned as double. */ static int TIFFWritePerSampleAnys(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir) { double buf[10], v; double* w = buf; int i, status; int samples = (int) tif->tif_dir.td_samplesperpixel; if (samples > NITEMS(buf)) w = (double*) _TIFFmalloc(samples * sizeof (double)); TIFFGetField(tif, tag, &v); for (i = 0; i < samples; i++) w[i] = v; status = TIFFWriteAnyArray(tif, type, tag, dir, samples, w); if (w != buf) _TIFFfree(w); return (status); } #undef NITEMS /* * Setup a pair of shorts that are returned by * value, rather than as a reference to an array. */ static int TIFFSetupShortPair(TIFF* tif, ttag_t tag, TIFFDirEntry* dir) { uint16 v[2]; TIFFGetField(tif, tag, &v[0], &v[1]); return (TIFFWriteShortArray(tif, TIFF_SHORT, tag, dir, 2, v)); } /* * Setup a directory entry for an NxM table of shorts, * where M is known to be 2**bitspersample, and write * the associated indirect data. */ static int TIFFWriteShortTable(TIFF* tif, ttag_t tag, TIFFDirEntry* dir, uint32 n, uint16** table) { uint32 i, off; dir->tdir_tag = tag; dir->tdir_type = (short) TIFF_SHORT; /* XXX -- yech, fool TIFFWriteData */ dir->tdir_count = (uint32) (1L<tif_dir.td_bitspersample); off = tif->tif_dataoff; for (i = 0; i < n; i++) if (!TIFFWriteData(tif, dir, (char *)table[i])) return (0); dir->tdir_count *= n; dir->tdir_offset = off; return (1); } /* * Write/copy data associated with an ASCII or opaque tag value. */ static int TIFFWriteByteArray(TIFF* tif, TIFFDirEntry* dir, char* cp) { if (dir->tdir_count > 4) { if (!TIFFWriteData(tif, dir, cp)) return (0); } else _TIFFmemcpy(&dir->tdir_offset, cp, dir->tdir_count); return (1); } /* * Setup a directory entry of an array of SHORT * or SSHORT and write the associated indirect values. */ static int TIFFWriteShortArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, uint16* v) { dir->tdir_tag = tag; dir->tdir_type = (short) type; dir->tdir_count = n; if (n <= 2) { if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) { dir->tdir_offset = (uint32) ((long) v[0] << 16); if (n == 2) dir->tdir_offset |= v[1] & 0xffff; } else { dir->tdir_offset = v[0] & 0xffff; if (n == 2) dir->tdir_offset |= (long) v[1] << 16; } return (1); } else return (TIFFWriteData(tif, dir, (char*) v)); } /* * Setup a directory entry of an array of LONG * or SLONG and write the associated indirect values. */ static int TIFFWriteLongArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, uint32* v) { dir->tdir_tag = tag; dir->tdir_type = (short) type; dir->tdir_count = n; if (n == 1) { dir->tdir_offset = v[0]; return (1); } else return (TIFFWriteData(tif, dir, (char*) v)); } /* * Setup a directory entry of an array of RATIONAL * or SRATIONAL and write the associated indirect values. */ static int TIFFWriteRationalArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, float* v) { uint32 i; uint32* t; int status; dir->tdir_tag = tag; dir->tdir_type = (short) type; dir->tdir_count = n; t = (uint32*) _TIFFmalloc(2*n * sizeof (uint32)); for (i = 0; i < n; i++) { float fv = v[i]; int sign = 1; uint32 den; if (fv < 0) { if (type == TIFF_RATIONAL) { TIFFWarning(tif->tif_name, "\"%s\": Information lost writing value (%g) as (unsigned) RATIONAL", _TIFFFieldWithTag(tif,tag)->field_name, v); fv = 0; } else fv = -fv, sign = -1; } den = 1L; if (fv > 0) { while (fv < 1L<<(31-3) && den < 1L<<(31-3)) fv *= 1<<3, den *= 1L<<3; } t[2*i+0] = sign * (fv + 0.5); t[2*i+1] = den; } status = TIFFWriteData(tif, dir, (char *)t); _TIFFfree((char*) t); return (status); } static int TIFFWriteFloatArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, float* v) { dir->tdir_tag = tag; dir->tdir_type = (short) type; dir->tdir_count = n; TIFFCvtNativeToIEEEFloat(tif, n, v); if (n == 1) { dir->tdir_offset = *(uint32*) &v[0]; return (1); } else return (TIFFWriteData(tif, dir, (char*) v)); } static int TIFFWriteDoubleArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, double* v) { dir->tdir_tag = tag; dir->tdir_type = (short) type; dir->tdir_count = n; TIFFCvtNativeToIEEEDouble(tif, n, v); return (TIFFWriteData(tif, dir, (char*) v)); } /* * Write an array of ``type'' values for a specified tag (i.e. this is a tag * which is allowed to have different types, e.g. SMaxSampleType). * Internally the data values are represented as double since a double can * hold any of the TIFF tag types (yes, this should really be an abstract * type tany_t for portability). The data is converted into the specified * type in a temporary buffer and then handed off to the appropriate array * writer. */ static int TIFFWriteAnyArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, double* v) { char buf[10 * sizeof(double)]; char* w = buf; int i, status = 0; if (n * TIFFDataWidth(type) > sizeof buf) w = (char*) _TIFFmalloc(n * TIFFDataWidth(type)); switch (type) { case TIFF_BYTE: { unsigned char* bp = (unsigned char*) w; for (i = 0; i < n; i++) bp[i] = (unsigned char) v[i]; dir->tdir_tag = tag; dir->tdir_type = (short) type; dir->tdir_count = n; if (!TIFFWriteByteArray(tif, dir, (char*) bp)) goto out; } break; case TIFF_SBYTE: { signed char* bp = (signed char*) w; for (i = 0; i < n; i++) bp[i] = (signed char) v[i]; dir->tdir_tag = tag; dir->tdir_type = (short) type; dir->tdir_count = n; if (!TIFFWriteByteArray(tif, dir, (char*) bp)) goto out; } break; case TIFF_SHORT: { uint16* bp = (uint16*) w; for (i = 0; i < n; i++) bp[i] = (uint16) v[i]; if (!TIFFWriteShortArray(tif, type, tag, dir, n, (uint16*)bp)) goto out; } break; case TIFF_SSHORT: { int16* bp = (int16*) w; for (i = 0; i < n; i++) bp[i] = (int16) v[i]; if (!TIFFWriteShortArray(tif, type, tag, dir, n, (uint16*)bp)) goto out; } break; case TIFF_LONG: { uint32* bp = (uint32*) w; for (i = 0; i < n; i++) bp[i] = (uint32) v[i]; if (!TIFFWriteLongArray(tif, type, tag, dir, n, bp)) goto out; } break; case TIFF_SLONG: { int32* bp = (int32*) w; for (i = 0; i < n; i++) bp[i] = (int32) v[i]; if (!TIFFWriteLongArray(tif, type, tag, dir, n, (uint32*) bp)) goto out; } break; case TIFF_FLOAT: { float* bp = (float*) w; for (i = 0; i < n; i++) bp[i] = (float) v[i]; if (!TIFFWriteFloatArray(tif, type, tag, dir, n, bp)) goto out; } break; case TIFF_DOUBLE: return (TIFFWriteDoubleArray(tif, type, tag, dir, n, v)); default: /* TIFF_NOTYPE */ /* TIFF_ASCII */ /* TIFF_UNDEFINED */ /* TIFF_RATIONAL */ /* TIFF_SRATIONAL */ goto out; } status = 1; out: if (w != buf) _TIFFfree(w); return (status); } #ifdef COLORIMETRY_SUPPORT static int TIFFWriteTransferFunction(TIFF* tif, TIFFDirEntry* dir) { TIFFDirectory* td = &tif->tif_dir; tsize_t n = (1L<td_bitspersample) * sizeof (uint16); uint16** tf = td->td_transferfunction; int ncols; /* * Check if the table can be written as a single column, * or if it must be written as 3 columns. Note that we * write a 3-column tag if there are 2 samples/pixel and * a single column of data won't suffice--hmm. */ switch (td->td_samplesperpixel - td->td_extrasamples) { default: if (_TIFFmemcmp(tf[0], tf[2], n)) { ncols = 3; break; } case 2: if (_TIFFmemcmp(tf[0], tf[1], n)) { ncols = 3; break; } case 1: case 0: ncols = 1; } return (TIFFWriteShortTable(tif, TIFFTAG_TRANSFERFUNCTION, dir, ncols, tf)); } #endif /* * Write a contiguous directory item. */ static int TIFFWriteData(TIFF* tif, TIFFDirEntry* dir, char* cp) { tsize_t cc; if (tif->tif_flags & TIFF_SWAB) { switch (dir->tdir_type) { case TIFF_SHORT: case TIFF_SSHORT: TIFFSwabArrayOfShort((uint16*) cp, dir->tdir_count); break; case TIFF_LONG: case TIFF_SLONG: case TIFF_FLOAT: TIFFSwabArrayOfLong((uint32*) cp, dir->tdir_count); break; case TIFF_RATIONAL: case TIFF_SRATIONAL: TIFFSwabArrayOfLong((uint32*) cp, 2*dir->tdir_count); break; case TIFF_DOUBLE: TIFFSwabArrayOfDouble((double*) cp, dir->tdir_count); break; } } dir->tdir_offset = tif->tif_dataoff; cc = dir->tdir_count * TIFFDataWidth(dir->tdir_type); if (SeekOK(tif, dir->tdir_offset) && WriteOK(tif, cp, cc)) { tif->tif_dataoff += (cc + 1) & ~1; return (1); } TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error writing data for field \"%s\"", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); return (0); } /* * Link the current directory into the * directory chain for the file. */ static int TIFFLinkDirectory(TIFF* tif) { static const char module[] = "TIFFLinkDirectory"; uint32 nextdir; uint32 diroff; tif->tif_diroff = (TIFFSeekFile(tif, (toff_t) 0, SEEK_END)+1) &~ 1; diroff = (uint32) tif->tif_diroff; if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&diroff); #if SUBIFD_SUPPORT if (tif->tif_flags & TIFF_INSUBIFD) { (void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET); if (!WriteOK(tif, &diroff, sizeof (diroff))) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Error writing SubIFD directory link", tif->tif_name); return (0); } /* * Advance to the next SubIFD or, if this is * the last one configured, revert back to the * normal directory linkage. */ if (--tif->tif_nsubifd) tif->tif_subifdoff += sizeof (diroff); else tif->tif_flags &= ~TIFF_INSUBIFD; return (1); } #endif if (tif->tif_header.tiff_diroff == 0) { /* * First directory, overwrite offset in header. */ tif->tif_header.tiff_diroff = (uint32) tif->tif_diroff; #define HDROFF(f) ((toff_t) &(((TIFFHeader*) 0)->f)) (void) TIFFSeekFile(tif, HDROFF(tiff_diroff), SEEK_SET); if (!WriteOK(tif, &diroff, sizeof (diroff))) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error writing TIFF header"); return (0); } return (1); } /* * Not the first directory, search to the last and append. */ nextdir = tif->tif_header.tiff_diroff; do { uint16 dircount; if (!SeekOK(tif, nextdir) || !ReadOK(tif, &dircount, sizeof (dircount))) { TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory count"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); (void) TIFFSeekFile(tif, dircount * sizeof (TIFFDirEntry), SEEK_CUR); if (!ReadOK(tif, &nextdir, sizeof (nextdir))) { TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory link"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&nextdir); } while (nextdir != 0); (void) TIFFSeekFile(tif, -(toff_t) sizeof (nextdir), SEEK_CUR); if (!WriteOK(tif, &diroff, sizeof (diroff))) { TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link"); return (0); } return (1); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/Makefile.am0000644000212300117540000000250310643010564013062 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. EXTRA_DIST = README SUBDIRS = addtiffo dbs iptcutil mfs pds ras stream tags win_dib tiff-4.0.3/contrib/README0000644000212300117540000000010310052721602011674 00000000000000This directory contains various contributions from libtiff users. tiff-4.0.3/contrib/addtiffo/0000755000212300117540000000000012027361330012664 500000000000000tiff-4.0.3/contrib/addtiffo/Makefile.am0000644000212300117540000000274712026613670014660 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. LIBTIFF = $(top_builddir)/libtiff/libtiff.la EXTRA_DIST = README Makefile.vc noinst_PROGRAMS = addtiffo addtiffo_SOURCES = addtiffo.c tif_overview.c tif_ovrcache.c tif_ovrcache.h addtiffo_LDADD = $(LIBTIFF) AM_CPPFLAGS = -I$(top_srcdir)/libtiff tiff-4.0.3/contrib/addtiffo/tif_ovrcache.h0000644000212300117540000000674411403510577015432 00000000000000/****************************************************************************** * tif_ovrcache.h,v 1.3 2005/05/25 09:03:16 dron Exp * * Project: TIFF Overview Builder * Purpose: Library functions to maintain two rows of tiles or two strips * of data for output overviews as an output cache. * Author: Frank Warmerdam, warmerdam@pobox.com * * This code could potentially be used by other applications wanting to * manage a once-through write cache. * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** */ #ifndef TIF_OVRCACHE_H_INCLUDED #define TIF_OVRCACHE_H_INCLUDED #include "tiffio.h" #if defined(__cplusplus) extern "C" { #endif typedef struct { uint32 nXSize; uint32 nYSize; uint16 nBitsPerPixel; uint16 nSamples; uint16 nPlanarConfig; uint32 nBlockXSize; uint32 nBlockYSize; toff_t nBytesPerBlock; toff_t nBytesPerRow; int nBlocksPerRow; int nBlocksPerColumn; int nBlockOffset; /* what block is the first in papabyBlocks? */ unsigned char *pabyRow1Blocks; unsigned char *pabyRow2Blocks; toff_t nDirOffset; TIFF *hTIFF; int bTiled; } TIFFOvrCache; TIFFOvrCache *TIFFCreateOvrCache( TIFF *hTIFF, toff_t nDirOffset ); unsigned char *TIFFGetOvrBlock( TIFFOvrCache *psCache, int iTileX, int iTileY, int iSample ); unsigned char *TIFFGetOvrBlock_Subsampled( TIFFOvrCache *psCache, int iTileX, int iTileY ); void TIFFDestroyOvrCache( TIFFOvrCache * ); void TIFFBuildOverviews( TIFF *, int, int *, int, const char *, int (*)(double,void*), void * ); void TIFF_ProcessFullResBlock( TIFF *, int, int, int, int, int, int *, int, int, TIFFOvrCache **, uint32, uint32, unsigned char *, uint32, uint32, int, const char * ); uint32 TIFF_WriteOverview( TIFF *, uint32, uint32, int, int, int, int, int, int, int, int, int, unsigned short *, unsigned short *, unsigned short *, int, int, int); #if defined(__cplusplus) } #endif #endif /* ndef TIF_OVRCACHE_H_INCLUDED */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/addtiffo/tif_overview.c0000644000212300117540000011074711403510577015500 00000000000000/****************************************************************************** * tif_overview.c,v 1.9 2005/05/25 09:03:16 dron Exp * * Project: TIFF Overview Builder * Purpose: Library function for building overviews in a TIFF file. * Author: Frank Warmerdam, warmerdam@pobox.com * * Notes: * o Currently only images with bits_per_sample of a multiple of eight * will work. * * o The downsampler currently just takes the top left pixel from the * source rectangle. Eventually sampling options of averaging, mode, and * ``center pixel'' should be offered. * * o The code will attempt to use the same kind of compression, * photometric interpretation, and organization as the source image, but * it doesn't copy geotiff tags to the reduced resolution images. * * o Reduced resolution overviews for multi-sample files will currently * always be generated as PLANARCONFIG_SEPARATE. This could be fixed * reasonable easily if needed to improve compatibility with other * packages. Many don't properly support PLANARCONFIG_SEPARATE. * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** */ /* TODO: update notes in header above */ #include #include #include #include #include "tiffio.h" #include "tif_ovrcache.h" #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif #ifndef MAX # define MIN(a,b) ((ab) ? a : b) #endif void TIFFBuildOverviews( TIFF *, int, int *, int, const char *, int (*)(double,void*), void * ); /************************************************************************/ /* TIFF_WriteOverview() */ /* */ /* Create a new directory, without any image data for an overview. */ /* Returns offset of newly created overview directory, but the */ /* current directory is reset to be the one in used when this */ /* function is called. */ /************************************************************************/ uint32 TIFF_WriteOverview( TIFF *hTIFF, uint32 nXSize, uint32 nYSize, int nBitsPerPixel, int nPlanarConfig, int nSamples, int nBlockXSize, int nBlockYSize, int bTiled, int nCompressFlag, int nPhotometric, int nSampleFormat, unsigned short *panRed, unsigned short *panGreen, unsigned short *panBlue, int bUseSubIFDs, int nHorSubsampling, int nVerSubsampling ) { toff_t nBaseDirOffset; toff_t nOffset; (void) bUseSubIFDs; nBaseDirOffset = TIFFCurrentDirOffset( hTIFF ); TIFFCreateDirectory( hTIFF ); /* -------------------------------------------------------------------- */ /* Setup TIFF fields. */ /* -------------------------------------------------------------------- */ TIFFSetField( hTIFF, TIFFTAG_IMAGEWIDTH, nXSize ); TIFFSetField( hTIFF, TIFFTAG_IMAGELENGTH, nYSize ); if( nSamples == 1 ) TIFFSetField( hTIFF, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG ); else TIFFSetField( hTIFF, TIFFTAG_PLANARCONFIG, nPlanarConfig ); TIFFSetField( hTIFF, TIFFTAG_BITSPERSAMPLE, nBitsPerPixel ); TIFFSetField( hTIFF, TIFFTAG_SAMPLESPERPIXEL, nSamples ); TIFFSetField( hTIFF, TIFFTAG_COMPRESSION, nCompressFlag ); TIFFSetField( hTIFF, TIFFTAG_PHOTOMETRIC, nPhotometric ); TIFFSetField( hTIFF, TIFFTAG_SAMPLEFORMAT, nSampleFormat ); if( bTiled ) { TIFFSetField( hTIFF, TIFFTAG_TILEWIDTH, nBlockXSize ); TIFFSetField( hTIFF, TIFFTAG_TILELENGTH, nBlockYSize ); } else TIFFSetField( hTIFF, TIFFTAG_ROWSPERSTRIP, nBlockYSize ); TIFFSetField( hTIFF, TIFFTAG_SUBFILETYPE, FILETYPE_REDUCEDIMAGE ); if( nPhotometric == PHOTOMETRIC_YCBCR || nPhotometric == PHOTOMETRIC_ITULAB ) { TIFFSetField( hTIFF, TIFFTAG_YCBCRSUBSAMPLING, nHorSubsampling, nVerSubsampling); /* TODO: also write YCbCrPositioning and YCbCrCoefficients tag identical to source IFD */ } /* TODO: add command-line parameter for selecting jpeg compression quality * that gets ignored when compression isn't jpeg */ /* -------------------------------------------------------------------- */ /* Write color table if one is present. */ /* -------------------------------------------------------------------- */ if( panRed != NULL ) { TIFFSetField( hTIFF, TIFFTAG_COLORMAP, panRed, panGreen, panBlue ); } /* -------------------------------------------------------------------- */ /* Write directory, and return byte offset. */ /* -------------------------------------------------------------------- */ if( TIFFWriteCheck( hTIFF, bTiled, "TIFFBuildOverviews" ) == 0 ) return 0; TIFFWriteDirectory( hTIFF ); TIFFSetDirectory( hTIFF, (tdir_t) (TIFFNumberOfDirectories(hTIFF)-1) ); nOffset = TIFFCurrentDirOffset( hTIFF ); TIFFSetSubDirectory( hTIFF, nBaseDirOffset ); return nOffset; } /************************************************************************/ /* TIFF_GetSourceSamples() */ /************************************************************************/ static void TIFF_GetSourceSamples( double * padfSamples, unsigned char *pabySrc, int nPixelBytes, int nSampleFormat, uint32 nXSize, uint32 nYSize, int nPixelOffset, int nLineOffset ) { uint32 iXOff, iYOff; int iSample; iSample = 0; for( iYOff = 0; iYOff < nYSize; iYOff++ ) { for( iXOff = 0; iXOff < nXSize; iXOff++ ) { unsigned char *pabyData; pabyData = pabySrc + iYOff * nLineOffset + iXOff * nPixelOffset; if( nSampleFormat == SAMPLEFORMAT_UINT && nPixelBytes == 1 ) { padfSamples[iSample++] = *pabyData; } else if( nSampleFormat == SAMPLEFORMAT_UINT && nPixelBytes == 2 ) { padfSamples[iSample++] = ((uint16 *) pabyData)[0]; } else if( nSampleFormat == SAMPLEFORMAT_UINT && nPixelBytes == 4 ) { padfSamples[iSample++] = ((uint32 *) pabyData)[0]; } else if( nSampleFormat == SAMPLEFORMAT_INT && nPixelBytes == 2 ) { padfSamples[iSample++] = ((int16 *) pabyData)[0]; } else if( nSampleFormat == SAMPLEFORMAT_INT && nPixelBytes == 32 ) { padfSamples[iSample++] = ((int32 *) pabyData)[0]; } else if( nSampleFormat == SAMPLEFORMAT_IEEEFP && nPixelBytes == 4 ) { padfSamples[iSample++] = ((float *) pabyData)[0]; } else if( nSampleFormat == SAMPLEFORMAT_IEEEFP && nPixelBytes == 8 ) { padfSamples[iSample++] = ((double *) pabyData)[0]; } } } } /************************************************************************/ /* TIFF_SetSample() */ /************************************************************************/ static void TIFF_SetSample( unsigned char * pabyData, int nPixelBytes, int nSampleFormat, double dfValue ) { if( nSampleFormat == SAMPLEFORMAT_UINT && nPixelBytes == 1 ) { *pabyData = (unsigned char) MAX(0,MIN(255,dfValue)); } else if( nSampleFormat == SAMPLEFORMAT_UINT && nPixelBytes == 2 ) { *((uint16 *)pabyData) = (uint16) MAX(0,MIN(65535,dfValue)); } else if( nSampleFormat == SAMPLEFORMAT_UINT && nPixelBytes == 4 ) { *((uint32 *)pabyData) = (uint32) dfValue; } else if( nSampleFormat == SAMPLEFORMAT_INT && nPixelBytes == 2 ) { *((int16 *)pabyData) = (int16) MAX(-32768,MIN(32767,dfValue)); } else if( nSampleFormat == SAMPLEFORMAT_INT && nPixelBytes == 32 ) { *((int32 *)pabyData) = (int32) dfValue; } else if( nSampleFormat == SAMPLEFORMAT_IEEEFP && nPixelBytes == 4 ) { *((float *)pabyData) = (float) dfValue; } else if( nSampleFormat == SAMPLEFORMAT_IEEEFP && nPixelBytes == 8 ) { *((double *)pabyData) = dfValue; } } /************************************************************************/ /* TIFF_DownSample() */ /* */ /* Down sample a tile of full res data into a window of a tile */ /* of downsampled data. */ /************************************************************************/ static void TIFF_DownSample( unsigned char *pabySrcTile, uint32 nBlockXSize, uint32 nBlockYSize, int nPixelSkewBits, int nBitsPerPixel, unsigned char * pabyOTile, uint32 nOBlockXSize, uint32 nOBlockYSize, uint32 nTXOff, uint32 nTYOff, int nOMult, int nSampleFormat, const char * pszResampling ) { uint32 i, j; int k, nPixelBytes = (nBitsPerPixel) / 8; int nPixelGroupBytes = (nBitsPerPixel+nPixelSkewBits)/8; unsigned char *pabySrc, *pabyDst; double *padfSamples; assert( nBitsPerPixel >= 8 ); padfSamples = (double *) malloc(sizeof(double) * nOMult * nOMult); /* ==================================================================== */ /* Loop over scanline chunks to process, establishing where the */ /* data is going. */ /* ==================================================================== */ for( j = 0; j*nOMult < nBlockYSize; j++ ) { if( j + nTYOff >= nOBlockYSize ) break; pabyDst = pabyOTile + ((j+nTYOff)*nOBlockXSize + nTXOff) * nPixelBytes * nPixelGroupBytes; /* -------------------------------------------------------------------- */ /* Handler nearest resampling ... we don't even care about the */ /* data type, we just do a bytewise copy. */ /* -------------------------------------------------------------------- */ if( strncmp(pszResampling,"nearest",4) == 0 || strncmp(pszResampling,"NEAR",4) == 0 ) { pabySrc = pabySrcTile + j*nOMult*nBlockXSize * nPixelGroupBytes; for( i = 0; i*nOMult < nBlockXSize; i++ ) { if( i + nTXOff >= nOBlockXSize ) break; /* * For now use simple subsampling, from the top left corner * of the source block of pixels. */ for( k = 0; k < nPixelBytes; k++ ) pabyDst[k] = pabySrc[k]; pabyDst += nPixelBytes * nPixelGroupBytes; pabySrc += nOMult * nPixelGroupBytes; } } /* -------------------------------------------------------------------- */ /* Handle the case of averaging. For this we also have to */ /* handle each sample format we are concerned with. */ /* -------------------------------------------------------------------- */ else if( strncmp(pszResampling,"averag",6) == 0 || strncmp(pszResampling,"AVERAG",6) == 0 ) { pabySrc = pabySrcTile + j*nOMult*nBlockXSize * nPixelGroupBytes; for( i = 0; i*nOMult < nBlockXSize; i++ ) { double dfTotal; uint32 nXSize, nYSize, iSample; if( i + nTXOff >= nOBlockXSize ) break; nXSize = MIN((uint32)nOMult,nBlockXSize-i); nYSize = MIN((uint32)nOMult,nBlockYSize-j); TIFF_GetSourceSamples( padfSamples, pabySrc, nPixelBytes, nSampleFormat, nXSize, nYSize, nPixelGroupBytes, nPixelGroupBytes * nBlockXSize ); dfTotal = 0; for( iSample = 0; iSample < nXSize*nYSize; iSample++ ) { dfTotal += padfSamples[iSample]; } TIFF_SetSample( pabyDst, nPixelBytes, nSampleFormat, dfTotal / (nXSize*nYSize) ); pabySrc += nOMult * nPixelGroupBytes; pabyDst += nPixelBytes; } } } free( padfSamples ); } /************************************************************************/ /* TIFF_DownSample_Subsampled() */ /************************************************************************/ static void TIFF_DownSample_Subsampled( unsigned char *pabySrcTile, int nSample, uint32 nBlockXSize, uint32 nBlockYSize, unsigned char * pabyOTile, uint32 nOBlockXSize, uint32 nOBlockYSize, uint32 nTXOff, uint32 nTYOff, int nOMult, const char *pszResampling, int nHorSubsampling, int nVerSubsampling ) { /* TODO: test with variety of subsampling values, and incovinient tile/strip sizes */ int nSampleBlockSize; int nSourceSampleRowSize; int nDestSampleRowSize; uint32 nSourceX, nSourceY; uint32 nSourceXSec, nSourceYSec; uint32 nSourceXSecEnd, nSourceYSecEnd; uint32 nDestX, nDestY; int nSampleOffsetInSampleBlock; unsigned int nCummulator; unsigned int nCummulatorCount; nSampleBlockSize = nHorSubsampling * nVerSubsampling + 2; nSourceSampleRowSize = ( ( nBlockXSize + nHorSubsampling - 1 ) / nHorSubsampling ) * nSampleBlockSize; nDestSampleRowSize = ( ( nOBlockXSize + nHorSubsampling - 1 ) / nHorSubsampling ) * nSampleBlockSize; if( strncmp(pszResampling,"nearest",4) == 0 || strncmp(pszResampling,"NEAR",4) == 0 ) { if( nSample == 0 ) { for( nSourceY = 0, nDestY = nTYOff; nSourceY < nBlockYSize; nSourceY += nOMult, nDestY ++) { if( nDestY >= nOBlockYSize ) break; for( nSourceX = 0, nDestX = nTXOff; nSourceX < nBlockXSize; nSourceX += nOMult, nDestX ++) { if( nDestX >= nOBlockXSize ) break; * ( pabyOTile + ( nDestY / nVerSubsampling ) * nDestSampleRowSize + ( nDestY % nVerSubsampling ) * nHorSubsampling + ( nDestX / nHorSubsampling ) * nSampleBlockSize + ( nDestX % nHorSubsampling ) ) = * ( pabySrcTile + ( nSourceY / nVerSubsampling ) * nSourceSampleRowSize + ( nSourceY % nVerSubsampling ) * nHorSubsampling + ( nSourceX / nHorSubsampling ) * nSampleBlockSize + ( nSourceX % nHorSubsampling ) ); } } } else { nSampleOffsetInSampleBlock = nHorSubsampling * nVerSubsampling + nSample - 1; for( nSourceY = 0, nDestY = ( nTYOff / nVerSubsampling ); nSourceY < ( nBlockYSize / nVerSubsampling ); nSourceY += nOMult, nDestY ++) { if( nDestY*nVerSubsampling >= nOBlockYSize ) break; for( nSourceX = 0, nDestX = ( nTXOff / nHorSubsampling ); nSourceX < ( nBlockXSize / nHorSubsampling ); nSourceX += nOMult, nDestX ++) { if( nDestX*nHorSubsampling >= nOBlockXSize ) break; * ( pabyOTile + nDestY * nDestSampleRowSize + nDestX * nSampleBlockSize + nSampleOffsetInSampleBlock ) = * ( pabySrcTile + nSourceY * nSourceSampleRowSize + nSourceX * nSampleBlockSize + nSampleOffsetInSampleBlock ); } } } } else if( strncmp(pszResampling,"averag",6) == 0 || strncmp(pszResampling,"AVERAG",6) == 0 ) { if( nSample == 0 ) { for( nSourceY = 0, nDestY = nTYOff; nSourceY < nBlockYSize; nSourceY += nOMult, nDestY ++) { if( nDestY >= nOBlockYSize ) break; for( nSourceX = 0, nDestX = nTXOff; nSourceX < nBlockXSize; nSourceX += nOMult, nDestX ++) { if( nDestX >= nOBlockXSize ) break; nSourceXSecEnd = nSourceX + nOMult; if( nSourceXSecEnd > nBlockXSize ) nSourceXSecEnd = nBlockXSize; nSourceYSecEnd = nSourceY + nOMult; if( nSourceYSecEnd > nBlockYSize ) nSourceYSecEnd = nBlockYSize; nCummulator = 0; for( nSourceYSec = nSourceY; nSourceYSec < nSourceYSecEnd; nSourceYSec ++) { for( nSourceXSec = nSourceX; nSourceXSec < nSourceXSecEnd; nSourceXSec ++) { nCummulator += * ( pabySrcTile + ( nSourceYSec / nVerSubsampling ) * nSourceSampleRowSize + ( nSourceYSec % nVerSubsampling ) * nHorSubsampling + ( nSourceXSec / nHorSubsampling ) * nSampleBlockSize + ( nSourceXSec % nHorSubsampling ) ); } } nCummulatorCount = ( nSourceXSecEnd - nSourceX ) * ( nSourceYSecEnd - nSourceY ); * ( pabyOTile + ( nDestY / nVerSubsampling ) * nDestSampleRowSize + ( nDestY % nVerSubsampling ) * nHorSubsampling + ( nDestX / nHorSubsampling ) * nSampleBlockSize + ( nDestX % nHorSubsampling ) ) = ( ( nCummulator + ( nCummulatorCount >> 1 ) ) / nCummulatorCount ); } } } else { nSampleOffsetInSampleBlock = nHorSubsampling * nVerSubsampling + nSample - 1; for( nSourceY = 0, nDestY = ( nTYOff / nVerSubsampling ); nSourceY < ( nBlockYSize / nVerSubsampling ); nSourceY += nOMult, nDestY ++) { if( nDestY*nVerSubsampling >= nOBlockYSize ) break; for( nSourceX = 0, nDestX = ( nTXOff / nHorSubsampling ); nSourceX < ( nBlockXSize / nHorSubsampling ); nSourceX += nOMult, nDestX ++) { if( nDestX*nHorSubsampling >= nOBlockXSize ) break; nSourceXSecEnd = nSourceX + nOMult; if( nSourceXSecEnd > ( nBlockXSize / nHorSubsampling ) ) nSourceXSecEnd = ( nBlockXSize / nHorSubsampling ); nSourceYSecEnd = nSourceY + nOMult; if( nSourceYSecEnd > ( nBlockYSize / nVerSubsampling ) ) nSourceYSecEnd = ( nBlockYSize / nVerSubsampling ); nCummulator = 0; for( nSourceYSec = nSourceY; nSourceYSec < nSourceYSecEnd; nSourceYSec ++) { for( nSourceXSec = nSourceX; nSourceXSec < nSourceXSecEnd; nSourceXSec ++) { nCummulator += * ( pabySrcTile + nSourceYSec * nSourceSampleRowSize + nSourceXSec * nSampleBlockSize + nSampleOffsetInSampleBlock ); } } nCummulatorCount = ( nSourceXSecEnd - nSourceX ) * ( nSourceYSecEnd - nSourceY ); * ( pabyOTile + nDestY * nDestSampleRowSize + nDestX * nSampleBlockSize + nSampleOffsetInSampleBlock ) = ( ( nCummulator + ( nCummulatorCount >> 1 ) ) / nCummulatorCount ); } } } } } /************************************************************************/ /* TIFF_ProcessFullResBlock() */ /* */ /* Process one block of full res data, downsampling into each */ /* of the overviews. */ /************************************************************************/ void TIFF_ProcessFullResBlock( TIFF *hTIFF, int nPlanarConfig, int bSubsampled, int nHorSubsampling, int nVerSubsampling, int nOverviews, int * panOvList, int nBitsPerPixel, int nSamples, TIFFOvrCache ** papoRawBIs, uint32 nSXOff, uint32 nSYOff, unsigned char *pabySrcTile, uint32 nBlockXSize, uint32 nBlockYSize, int nSampleFormat, const char * pszResampling ) { int iOverview, iSample; for( iSample = 0; iSample < nSamples; iSample++ ) { /* * We have to read a tile/strip for each sample for * PLANARCONFIG_SEPARATE. Otherwise, we just read all the samples * at once when handling the first sample. */ if( nPlanarConfig == PLANARCONFIG_SEPARATE || iSample == 0 ) { if( TIFFIsTiled(hTIFF) ) { TIFFReadEncodedTile( hTIFF, TIFFComputeTile(hTIFF, nSXOff, nSYOff, 0, (tsample_t)iSample ), pabySrcTile, TIFFTileSize(hTIFF)); } else { TIFFReadEncodedStrip( hTIFF, TIFFComputeStrip(hTIFF, nSYOff, (tsample_t) iSample), pabySrcTile, TIFFStripSize(hTIFF) ); } } /* * Loop over destination overview layers */ for( iOverview = 0; iOverview < nOverviews; iOverview++ ) { TIFFOvrCache *poRBI = papoRawBIs[iOverview]; unsigned char *pabyOTile; uint32 nTXOff, nTYOff, nOXOff, nOYOff, nOMult; uint32 nOBlockXSize = poRBI->nBlockXSize; uint32 nOBlockYSize = poRBI->nBlockYSize; int nSkewBits, nSampleByteOffset; /* * Fetch the destination overview tile */ nOMult = panOvList[iOverview]; nOXOff = (nSXOff/nOMult) / nOBlockXSize; nOYOff = (nSYOff/nOMult) / nOBlockYSize; if( bSubsampled ) { pabyOTile = TIFFGetOvrBlock_Subsampled( poRBI, nOXOff, nOYOff ); /* * Establish the offset into this tile at which we should * start placing data. */ nTXOff = (nSXOff - nOXOff*nOMult*nOBlockXSize) / nOMult; nTYOff = (nSYOff - nOYOff*nOMult*nOBlockYSize) / nOMult; #ifdef DBMALLOC malloc_chain_check( 1 ); #endif TIFF_DownSample_Subsampled( pabySrcTile, iSample, nBlockXSize, nBlockYSize, pabyOTile, poRBI->nBlockXSize, poRBI->nBlockYSize, nTXOff, nTYOff, nOMult, pszResampling, nHorSubsampling, nVerSubsampling ); #ifdef DBMALLOC malloc_chain_check( 1 ); #endif } else { pabyOTile = TIFFGetOvrBlock( poRBI, nOXOff, nOYOff, iSample ); /* * Establish the offset into this tile at which we should * start placing data. */ nTXOff = (nSXOff - nOXOff*nOMult*nOBlockXSize) / nOMult; nTYOff = (nSYOff - nOYOff*nOMult*nOBlockYSize) / nOMult; /* * Figure out the skew (extra space between ``our samples'') and * the byte offset to the first sample. */ assert( (nBitsPerPixel % 8) == 0 ); if( nPlanarConfig == PLANARCONFIG_SEPARATE ) { nSkewBits = 0; nSampleByteOffset = 0; } else { nSkewBits = nBitsPerPixel * (nSamples-1); nSampleByteOffset = (nBitsPerPixel/8) * iSample; } /* * Perform the downsampling. */ #ifdef DBMALLOC malloc_chain_check( 1 ); #endif TIFF_DownSample( pabySrcTile + nSampleByteOffset, nBlockXSize, nBlockYSize, nSkewBits, nBitsPerPixel, pabyOTile, poRBI->nBlockXSize, poRBI->nBlockYSize, nTXOff, nTYOff, nOMult, nSampleFormat, pszResampling ); #ifdef DBMALLOC malloc_chain_check( 1 ); #endif } } } } /************************************************************************/ /* TIFF_BuildOverviews() */ /* */ /* Build the requested list of overviews. Overviews are */ /* maintained in a bunch of temporary files and then these are */ /* written back to the TIFF file. Only one pass through the */ /* source TIFF file is made for any number of output */ /* overviews. */ /************************************************************************/ void TIFFBuildOverviews( TIFF *hTIFF, int nOverviews, int * panOvList, int bUseSubIFDs, const char *pszResampleMethod, int (*pfnProgress)( double, void * ), void * pProgressData ) { TIFFOvrCache **papoRawBIs; uint32 nXSize, nYSize, nBlockXSize, nBlockYSize; uint16 nBitsPerPixel, nPhotometric, nCompressFlag, nSamples, nPlanarConfig, nSampleFormat; int bSubsampled; uint16 nHorSubsampling, nVerSubsampling; int bTiled, nSXOff, nSYOff, i; unsigned char *pabySrcTile; uint16 *panRedMap, *panGreenMap, *panBlueMap; TIFFErrorHandler pfnWarning; (void) pfnProgress; (void) pProgressData; /* -------------------------------------------------------------------- */ /* Get the base raster size. */ /* -------------------------------------------------------------------- */ TIFFGetField( hTIFF, TIFFTAG_IMAGEWIDTH, &nXSize ); TIFFGetField( hTIFF, TIFFTAG_IMAGELENGTH, &nYSize ); TIFFGetField( hTIFF, TIFFTAG_BITSPERSAMPLE, &nBitsPerPixel ); /* TODO: nBitsPerPixel seems misnomer and may need renaming to nBitsPerSample */ TIFFGetField( hTIFF, TIFFTAG_SAMPLESPERPIXEL, &nSamples ); TIFFGetFieldDefaulted( hTIFF, TIFFTAG_PLANARCONFIG, &nPlanarConfig ); TIFFGetFieldDefaulted( hTIFF, TIFFTAG_PHOTOMETRIC, &nPhotometric ); TIFFGetFieldDefaulted( hTIFF, TIFFTAG_COMPRESSION, &nCompressFlag ); TIFFGetFieldDefaulted( hTIFF, TIFFTAG_SAMPLEFORMAT, &nSampleFormat ); if( nPhotometric == PHOTOMETRIC_YCBCR || nPhotometric == PHOTOMETRIC_ITULAB ) { if( nBitsPerPixel != 8 || nSamples != 3 || nPlanarConfig != PLANARCONFIG_CONTIG || nSampleFormat != SAMPLEFORMAT_UINT) { /* TODO: use of TIFFError is inconsistent with use of fprintf in addtiffo.c, sort out */ TIFFErrorExt( TIFFClientdata(hTIFF), "TIFFBuildOverviews", "File `%s' has an unsupported subsampling configuration.\n", TIFFFileName(hTIFF) ); /* If you need support for this particular flavor, please contact either * Frank Warmerdam warmerdam@pobox.com * Joris Van Damme info@awaresystems.be */ return; } bSubsampled = 1; TIFFGetField( hTIFF, TIFFTAG_YCBCRSUBSAMPLING, &nHorSubsampling, &nVerSubsampling ); /* TODO: find out if maybe TIFFGetFieldDefaulted is better choice for YCbCrSubsampling tag */ } else { if( nBitsPerPixel < 8 ) { /* TODO: use of TIFFError is inconsistent with use of fprintf in addtiffo.c, sort out */ TIFFErrorExt( TIFFClientdata(hTIFF), "TIFFBuildOverviews", "File `%s' has samples of %d bits per sample. Sample\n" "sizes of less than 8 bits per sample are not supported.\n", TIFFFileName(hTIFF), nBitsPerPixel ); return; } bSubsampled = 0; nHorSubsampling = 1; nVerSubsampling = 1; } /* -------------------------------------------------------------------- */ /* Turn off warnings to avoid alot of repeated warnings while */ /* rereading directories. */ /* -------------------------------------------------------------------- */ pfnWarning = TIFFSetWarningHandler( NULL ); /* -------------------------------------------------------------------- */ /* Get the base raster block size. */ /* -------------------------------------------------------------------- */ if( TIFFGetField( hTIFF, TIFFTAG_ROWSPERSTRIP, &(nBlockYSize) ) ) { nBlockXSize = nXSize; bTiled = FALSE; } else { TIFFGetField( hTIFF, TIFFTAG_TILEWIDTH, &nBlockXSize ); TIFFGetField( hTIFF, TIFFTAG_TILELENGTH, &nBlockYSize ); bTiled = TRUE; } /* -------------------------------------------------------------------- */ /* Capture the pallette if there is one. */ /* -------------------------------------------------------------------- */ if( TIFFGetField( hTIFF, TIFFTAG_COLORMAP, &panRedMap, &panGreenMap, &panBlueMap ) ) { uint16 *panRed2, *panGreen2, *panBlue2; int nColorCount = 1 << nBitsPerPixel; panRed2 = (uint16 *) _TIFFmalloc(2*nColorCount); panGreen2 = (uint16 *) _TIFFmalloc(2*nColorCount); panBlue2 = (uint16 *) _TIFFmalloc(2*nColorCount); memcpy( panRed2, panRedMap, 2 * nColorCount ); memcpy( panGreen2, panGreenMap, 2 * nColorCount ); memcpy( panBlue2, panBlueMap, 2 * nColorCount ); panRedMap = panRed2; panGreenMap = panGreen2; panBlueMap = panBlue2; } else { panRedMap = panGreenMap = panBlueMap = NULL; } /* -------------------------------------------------------------------- */ /* Initialize overviews. */ /* -------------------------------------------------------------------- */ papoRawBIs = (TIFFOvrCache **) _TIFFmalloc(nOverviews*sizeof(void*)); for( i = 0; i < nOverviews; i++ ) { uint32 nOXSize, nOYSize, nOBlockXSize, nOBlockYSize; toff_t nDirOffset; nOXSize = (nXSize + panOvList[i] - 1) / panOvList[i]; nOYSize = (nYSize + panOvList[i] - 1) / panOvList[i]; nOBlockXSize = MIN(nBlockXSize,nOXSize); nOBlockYSize = MIN(nBlockYSize,nOYSize); if( bTiled ) { if( (nOBlockXSize % 16) != 0 ) nOBlockXSize = nOBlockXSize + 16 - (nOBlockXSize % 16); if( (nOBlockYSize % 16) != 0 ) nOBlockYSize = nOBlockYSize + 16 - (nOBlockYSize % 16); } nDirOffset = TIFF_WriteOverview( hTIFF, nOXSize, nOYSize, nBitsPerPixel, nPlanarConfig, nSamples, nOBlockXSize, nOBlockYSize, bTiled, nCompressFlag, nPhotometric, nSampleFormat, panRedMap, panGreenMap, panBlueMap, bUseSubIFDs, nHorSubsampling, nVerSubsampling ); papoRawBIs[i] = TIFFCreateOvrCache( hTIFF, nDirOffset ); } if( panRedMap != NULL ) { _TIFFfree( panRedMap ); _TIFFfree( panGreenMap ); _TIFFfree( panBlueMap ); } /* -------------------------------------------------------------------- */ /* Allocate a buffer to hold a source block. */ /* -------------------------------------------------------------------- */ if( bTiled ) pabySrcTile = (unsigned char *) _TIFFmalloc(TIFFTileSize(hTIFF)); else pabySrcTile = (unsigned char *) _TIFFmalloc(TIFFStripSize(hTIFF)); /* -------------------------------------------------------------------- */ /* Loop over the source raster, applying data to the */ /* destination raster. */ /* -------------------------------------------------------------------- */ for( nSYOff = 0; nSYOff < (int) nYSize; nSYOff += nBlockYSize ) { for( nSXOff = 0; nSXOff < (int) nXSize; nSXOff += nBlockXSize ) { /* * Read and resample into the various overview images. */ TIFF_ProcessFullResBlock( hTIFF, nPlanarConfig, bSubsampled,nHorSubsampling,nVerSubsampling, nOverviews, panOvList, nBitsPerPixel, nSamples, papoRawBIs, nSXOff, nSYOff, pabySrcTile, nBlockXSize, nBlockYSize, nSampleFormat, pszResampleMethod ); } } _TIFFfree( pabySrcTile ); /* -------------------------------------------------------------------- */ /* Cleanup the rawblockedimage files. */ /* -------------------------------------------------------------------- */ for( i = 0; i < nOverviews; i++ ) { TIFFDestroyOvrCache( papoRawBIs[i] ); } if( papoRawBIs != NULL ) _TIFFfree( papoRawBIs ); TIFFSetWarningHandler( pfnWarning ); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/addtiffo/addtiffo.c0000644000212300117540000001375611403511023014535 00000000000000/****************************************************************************** * $Id: addtiffo.c,v 1.7 2010-06-08 18:55:15 bfriesen Exp $ * * Project: GeoTIFF Overview Builder * Purpose: Mainline for building overviews in a TIFF file. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: addtiffo.c,v $ * Revision 1.7 2010-06-08 18:55:15 bfriesen * * contrib: Add an emacs formatting mode footer to all source files * so that emacs can be effectively used. * * Revision 1.6 2005/12/16 05:59:55 fwarmerdam * Major upgrade to support YCbCr subsampled jpeg images * * Revision 1.4 2004/09/21 13:31:23 dron * Add missed include string.h. * * Revision 1.3 2000/04/18 22:48:31 warmerda * Added support for averaging resampling * * Revision 1.2 2000/01/28 15:36:38 warmerda * pass TIFF handle instead of filename to overview builder * * Revision 1.1 1999/08/17 01:47:59 warmerda * New * * Revision 1.1 1999/03/12 17:46:32 warmerda * New * * Revision 1.2 1999/02/11 22:27:12 warmerda * Added multi-sample support * * Revision 1.1 1999/02/11 18:12:30 warmerda * New */ #include #include #include #include "tiffio.h" void TIFFBuildOverviews( TIFF *, int, int *, int, const char *, int (*)(double,void*), void * ); /************************************************************************/ /* main() */ /************************************************************************/ int main( int argc, char ** argv ) { int anOverviews[100]; /* TODO: un-hardwire array length, flexible allocate */ int nOverviewCount = 0; int bUseSubIFD = 0; TIFF *hTIFF; const char *pszResampling = "nearest"; /* -------------------------------------------------------------------- */ /* Usage: */ /* -------------------------------------------------------------------- */ if( argc < 2 ) { printf( "Usage: addtiffo [-r {nearest,average,mode}]\n" " tiff_filename [resolution_reductions]\n" "\n" "Example:\n" " %% addtiffo abc.tif 2 4 8 16\n" ); return( 1 ); } while( argv[1][0] == '-' ) { if( strcmp(argv[1],"-subifd") == 0 ) { bUseSubIFD = 1; argv++; argc--; } else if( strcmp(argv[1],"-r") == 0 ) { argv += 2; argc -= 2; pszResampling = *argv; } else { fprintf( stderr, "Incorrect parameters\n" ); return( 1 ); } } /* TODO: resampling mode parameter needs to be encoded in an integer from this point on */ /* -------------------------------------------------------------------- */ /* Collect the user requested reduction factors. */ /* -------------------------------------------------------------------- */ while( nOverviewCount < argc - 2 && nOverviewCount < 100 ) { anOverviews[nOverviewCount] = atoi(argv[nOverviewCount+2]); if( anOverviews[nOverviewCount] <= 0) { fprintf( stderr, "Incorrect parameters\n" ); return(1); } nOverviewCount++; } /* -------------------------------------------------------------------- */ /* Default to four overview levels. It would be nicer if it */ /* defaulted based on the size of the source image. */ /* -------------------------------------------------------------------- */ /* TODO: make it default based on the size of the source image */ if( nOverviewCount == 0 ) { nOverviewCount = 4; anOverviews[0] = 2; anOverviews[1] = 4; anOverviews[2] = 8; anOverviews[3] = 16; } /* -------------------------------------------------------------------- */ /* Build the overview. */ /* -------------------------------------------------------------------- */ hTIFF = TIFFOpen( argv[1], "r+" ); if( hTIFF == NULL ) { fprintf( stderr, "TIFFOpen(%s) failed.\n", argv[1] ); return( 1 ); } TIFFBuildOverviews( hTIFF, nOverviewCount, anOverviews, bUseSubIFD, pszResampling, NULL, NULL ); TIFFClose( hTIFF ); /* -------------------------------------------------------------------- */ /* Optionally test for memory leaks. */ /* -------------------------------------------------------------------- */ #ifdef DBMALLOC malloc_dump(1); #endif return( 0 ); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/addtiffo/Makefile.in0000644000212300117540000004473112027361162014665 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = addtiffo$(EXEEXT) subdir = contrib/addtiffo DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_addtiffo_OBJECTS = addtiffo.$(OBJEXT) tif_overview.$(OBJEXT) \ tif_ovrcache.$(OBJEXT) addtiffo_OBJECTS = $(am_addtiffo_OBJECTS) addtiffo_DEPENDENCIES = $(LIBTIFF) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/libtiff depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(addtiffo_SOURCES) DIST_SOURCES = $(addtiffo_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ LIBTIFF = $(top_builddir)/libtiff/libtiff.la EXTRA_DIST = README Makefile.vc addtiffo_SOURCES = addtiffo.c tif_overview.c tif_ovrcache.c tif_ovrcache.h addtiffo_LDADD = $(LIBTIFF) AM_CPPFLAGS = -I$(top_srcdir)/libtiff all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/addtiffo/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/addtiffo/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list addtiffo$(EXEEXT): $(addtiffo_OBJECTS) $(addtiffo_DEPENDENCIES) $(EXTRA_addtiffo_DEPENDENCIES) @rm -f addtiffo$(EXEEXT) $(AM_V_CCLD)$(LINK) $(addtiffo_OBJECTS) $(addtiffo_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addtiffo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_overview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_ovrcache.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS cscopelist ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/contrib/addtiffo/Makefile.vc0000755000212300117540000000117110411004543014651 00000000000000# # If libtiff.a is installed in /usr/lib or /usr/local/lib just point # LIBTIFF_DIR there. It doesn't need a full libtiff tree. # !INCLUDE ..\..\nmake.opt LIBTIFF_DIR = ..\..\libtiff # INCL = -I..\..\libtiff LIBS = $(LIBTIFF_DIR)\libtiff.lib addtiffo: addtiffo.obj tif_overview.obj tif_ovrcache.obj $(CC) $(CFLAGS) addtiffo.obj tif_overview.obj tif_ovrcache.obj \ $(LIBS) /Feaddtiffo.exe addtiffo.obj: addtiffo.c $(CC) -c $(CFLAGS) addtiffo.c tif_overview.obj: tif_overview.c $(CC) -c $(CFLAGS) tif_overview.c tif_ovrcache.obj: tif_ovrcache.c $(CC) -c $(CFLAGS) tif_ovrcache.c clean: -del *.obj -del addtiffo.exe tiff-4.0.3/contrib/addtiffo/README0000644000212300117540000001072310347636102013474 00000000000000 addtiffo 1.0 ============ The addtiffo utility is used to add overview pyramids to an existing TIFF or GeoTIFF file. Some applications can take advantage of these overviews to accelerate overview display performance of large rasters. This release of addtiffo is primarily intended for compatibility testing with applications, and to see if there is interest in a cleaner release of the capability ... perhaps incorporation into the libtiff tools distribution. Please feel free to contact me with questions, or problems. warmerda@home.com http://home.gdal.org/~warmerda/ Usage ----- Usage: addtiffo [-r {average/nearest} [-subifd] tiff_filename [resolution_reductions] Example: % addtiffo abc.tif 2 4 8 16 The numeric arguments are the list of reduction factors to generate. In this example a 1/2, 1/4 1/8 and 1/16 Limitations ----------- See tif_overview.cpp for up to date details. o Currently only images with bits_per_sample of a multiple of eight will work. o The code will attempt to use the same kind of compression, photometric interpretation, and organization as the source image, but it doesn't copy geotiff tags to the reduced resolution images. o Reduced resolution overviews for multi-sample files will currently always be generated as PLANARCONFIG_SEPARATE. This could be fixed reasonable easily if needed to improve compatibility with other packages. Many don't properly support PLANARCONFIG_SEPARATE. o Overviews are always written as appended IFDs, rather than using the ``tree of tree's'' approach using the SUBIFD tag. I wanted to implement both, but it isn't currently easy to add a SUBIFD tag to an existing main tiff IFD with libtiff. I hope to try this again later. TIFF File Tags -------------- The results of running addtiffo on a 1024x1024 tiled greyscale file with the arguments ``2 4 8 16'' is to add four additional TIFF directories appended on the file with the SUBFILETYPE flag to 0x1 indicating the extra items are reduced resolution images. The tiffinfo output of such a file might look like this: TIFF Directory at offset 0x118008 Image Width: 1024 Image Length: 1024 Tile Width: 256 Tile Length: 112 Bits/Sample: 8 Compression Scheme: none Photometric Interpretation: min-is-black Samples/Pixel: 1 Planar Configuration: single image plane TIFF Directory at offset 0x15e1d2 Subfile Type: reduced-resolution image (1 = 0x1) Image Width: 512 Image Length: 512 Tile Width: 256 Tile Length: 112 Bits/Sample: 8 Compression Scheme: none Photometric Interpretation: min-is-black Samples/Pixel: 1 Planar Configuration: separate image planes TIFF Directory at offset 0x1732b8 Subfile Type: reduced-resolution image (1 = 0x1) Image Width: 256 Image Length: 256 Tile Width: 256 Tile Length: 112 Bits/Sample: 8 Compression Scheme: none Photometric Interpretation: min-is-black Samples/Pixel: 1 Planar Configuration: separate image planes TIFF Directory at offset 0x17a366 Subfile Type: reduced-resolution image (1 = 0x1) Image Width: 128 Image Length: 128 Tile Width: 128 Tile Length: 112 Bits/Sample: 8 Compression Scheme: none Photometric Interpretation: min-is-black Samples/Pixel: 1 Planar Configuration: separate image planes TIFF Directory at offset 0x17b40c Subfile Type: reduced-resolution image (1 = 0x1) Image Width: 64 Image Length: 64 Tile Width: 64 Tile Length: 64 Bits/Sample: 8 Compression Scheme: none Photometric Interpretation: min-is-black Samples/Pixel: 1 Planar Configuration: separate image planes Building -------- You will need a C compiler. You will need to have libtiff already built and installed. The provided Makefile should work on most Unix systems. A similar file will be needed for Windows, but is not provided. The CFLAGS and LIBS macros in the Makefile will have to be updated to point to the correct location of the libtiff include files, and library. Credits ------- o Intergraph Corporation for partially funding the work. o Global Geomatics for partially funding reorganization of the overview building ability as a separate utility. o Orrin Long, and Ed Grissom of Intergraph for explaining what needed to be done. o Max Martinez of Erdas for his discussion of external overviews. o Atlantis Scientific who supported adding averaging, and some other generalizations. o Frank Warmerdam for writing the bulk of the code. o Sam Leffler since this only exists because of his libtiff. tiff-4.0.3/contrib/addtiffo/tif_ovrcache.c0000644000212300117540000003225111403511023015400 00000000000000/****************************************************************************** * $Id: tif_ovrcache.c,v 1.9 2010-06-08 18:55:15 bfriesen Exp $ * * Project: TIFF Overview Builder * Purpose: Library functions to maintain two rows of tiles or two strips * of data for output overviews as an output cache. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** */ #include "tiffiop.h" #include "tif_ovrcache.h" #include /************************************************************************/ /* TIFFCreateOvrCache() */ /* */ /* Create an overview cache to hold two rows of blocks from an */ /* existing TIFF directory. */ /************************************************************************/ TIFFOvrCache *TIFFCreateOvrCache( TIFF *hTIFF, toff_t nDirOffset ) { TIFFOvrCache *psCache; toff_t nBaseDirOffset; psCache = (TIFFOvrCache *) _TIFFmalloc(sizeof(TIFFOvrCache)); psCache->nDirOffset = nDirOffset; psCache->hTIFF = hTIFF; /* -------------------------------------------------------------------- */ /* Get definition of this raster from the TIFF file itself. */ /* -------------------------------------------------------------------- */ nBaseDirOffset = TIFFCurrentDirOffset( psCache->hTIFF ); TIFFSetSubDirectory( hTIFF, nDirOffset ); TIFFGetField( hTIFF, TIFFTAG_IMAGEWIDTH, &(psCache->nXSize) ); TIFFGetField( hTIFF, TIFFTAG_IMAGELENGTH, &(psCache->nYSize) ); TIFFGetField( hTIFF, TIFFTAG_BITSPERSAMPLE, &(psCache->nBitsPerPixel) ); TIFFGetField( hTIFF, TIFFTAG_SAMPLESPERPIXEL, &(psCache->nSamples) ); TIFFGetField( hTIFF, TIFFTAG_PLANARCONFIG, &(psCache->nPlanarConfig) ); if( !TIFFIsTiled( hTIFF ) ) { TIFFGetField( hTIFF, TIFFTAG_ROWSPERSTRIP, &(psCache->nBlockYSize) ); psCache->nBlockXSize = psCache->nXSize; psCache->nBytesPerBlock = TIFFStripSize(hTIFF); psCache->bTiled = FALSE; } else { TIFFGetField( hTIFF, TIFFTAG_TILEWIDTH, &(psCache->nBlockXSize) ); TIFFGetField( hTIFF, TIFFTAG_TILELENGTH, &(psCache->nBlockYSize) ); psCache->nBytesPerBlock = TIFFTileSize(hTIFF); psCache->bTiled = TRUE; } /* -------------------------------------------------------------------- */ /* Compute some values from this. */ /* -------------------------------------------------------------------- */ psCache->nBlocksPerRow = (psCache->nXSize + psCache->nBlockXSize - 1) / psCache->nBlockXSize; psCache->nBlocksPerColumn = (psCache->nYSize + psCache->nBlockYSize - 1) / psCache->nBlockYSize; if (psCache->nPlanarConfig == PLANARCONFIG_SEPARATE) psCache->nBytesPerRow = psCache->nBytesPerBlock * psCache->nBlocksPerRow * psCache->nSamples; else psCache->nBytesPerRow = psCache->nBytesPerBlock * psCache->nBlocksPerRow; /* -------------------------------------------------------------------- */ /* Allocate and initialize the data buffers. */ /* -------------------------------------------------------------------- */ psCache->pabyRow1Blocks = (unsigned char *) _TIFFmalloc(psCache->nBytesPerRow); psCache->pabyRow2Blocks = (unsigned char *) _TIFFmalloc(psCache->nBytesPerRow); if( psCache->pabyRow1Blocks == NULL || psCache->pabyRow2Blocks == NULL ) { TIFFErrorExt( hTIFF->tif_clientdata, hTIFF->tif_name, "Can't allocate memory for overview cache." ); /* TODO: use of TIFFError is inconsistent with use of fprintf in addtiffo.c, sort out */ return NULL; } _TIFFmemset( psCache->pabyRow1Blocks, 0, psCache->nBytesPerRow ); _TIFFmemset( psCache->pabyRow2Blocks, 0, psCache->nBytesPerRow ); psCache->nBlockOffset = 0; TIFFSetSubDirectory( psCache->hTIFF, nBaseDirOffset ); return psCache; } /************************************************************************/ /* TIFFWriteOvrRow() */ /* */ /* Write one entire row of blocks (row 1) to the tiff file, and */ /* then rotate the block buffers, essentially moving things */ /* down by one block. */ /************************************************************************/ static void TIFFWriteOvrRow( TIFFOvrCache * psCache ) { int nRet, iTileX, iTileY = psCache->nBlockOffset; unsigned char *pabyData; toff_t nBaseDirOffset; uint32 RowsInStrip; /* -------------------------------------------------------------------- */ /* If the output cache is multi-byte per sample, and the file */ /* being written to is of a different byte order than the current */ /* platform, we will need to byte swap the data. */ /* -------------------------------------------------------------------- */ if( TIFFIsByteSwapped(psCache->hTIFF) ) { if( psCache->nBitsPerPixel == 16 ) TIFFSwabArrayOfShort( (uint16 *) psCache->pabyRow1Blocks, (psCache->nBytesPerBlock * psCache->nSamples) / 2 ); else if( psCache->nBitsPerPixel == 32 ) TIFFSwabArrayOfLong( (uint32 *) psCache->pabyRow1Blocks, (psCache->nBytesPerBlock * psCache->nSamples) / 4 ); else if( psCache->nBitsPerPixel == 64 ) TIFFSwabArrayOfDouble( (double *) psCache->pabyRow1Blocks, (psCache->nBytesPerBlock * psCache->nSamples) / 8 ); } /* -------------------------------------------------------------------- */ /* Record original directory position, so we can restore it at */ /* end. */ /* -------------------------------------------------------------------- */ nBaseDirOffset = TIFFCurrentDirOffset( psCache->hTIFF ); nRet = TIFFSetSubDirectory( psCache->hTIFF, psCache->nDirOffset ); assert( nRet == 1 ); /* -------------------------------------------------------------------- */ /* Write blocks to TIFF file. */ /* -------------------------------------------------------------------- */ for( iTileX = 0; iTileX < psCache->nBlocksPerRow; iTileX++ ) { int nTileID; if (psCache->nPlanarConfig == PLANARCONFIG_SEPARATE) { int iSample; for( iSample = 0; iSample < psCache->nSamples; iSample++ ) { pabyData = TIFFGetOvrBlock( psCache, iTileX, iTileY, iSample ); if( psCache->bTiled ) { nTileID = TIFFComputeTile( psCache->hTIFF, iTileX * psCache->nBlockXSize, iTileY * psCache->nBlockYSize, 0, (tsample_t) iSample ); TIFFWriteEncodedTile( psCache->hTIFF, nTileID, pabyData, TIFFTileSize(psCache->hTIFF) ); } else { nTileID = TIFFComputeStrip( psCache->hTIFF, iTileY * psCache->nBlockYSize, (tsample_t) iSample ); RowsInStrip=psCache->nBlockYSize; if ((iTileY+1)*psCache->nBlockYSize>psCache->nYSize) RowsInStrip=psCache->nYSize-iTileY*psCache->nBlockYSize; TIFFWriteEncodedStrip( psCache->hTIFF, nTileID, pabyData, TIFFVStripSize(psCache->hTIFF,RowsInStrip) ); } } } else { pabyData = TIFFGetOvrBlock( psCache, iTileX, iTileY, 0 ); if( psCache->bTiled ) { nTileID = TIFFComputeTile( psCache->hTIFF, iTileX * psCache->nBlockXSize, iTileY * psCache->nBlockYSize, 0, 0 ); TIFFWriteEncodedTile( psCache->hTIFF, nTileID, pabyData, TIFFTileSize(psCache->hTIFF) ); } else { nTileID = TIFFComputeStrip( psCache->hTIFF, iTileY * psCache->nBlockYSize, 0 ); RowsInStrip=psCache->nBlockYSize; if ((iTileY+1)*psCache->nBlockYSize>psCache->nYSize) RowsInStrip=psCache->nYSize-iTileY*psCache->nBlockYSize; TIFFWriteEncodedStrip( psCache->hTIFF, nTileID, pabyData, TIFFVStripSize(psCache->hTIFF,RowsInStrip) ); } } } /* TODO: add checks on error status return of TIFFWriteEncodedTile and TIFFWriteEncodedStrip */ /* -------------------------------------------------------------------- */ /* Rotate buffers. */ /* -------------------------------------------------------------------- */ pabyData = psCache->pabyRow1Blocks; psCache->pabyRow1Blocks = psCache->pabyRow2Blocks; psCache->pabyRow2Blocks = pabyData; _TIFFmemset( pabyData, 0, psCache->nBytesPerRow ); psCache->nBlockOffset++; /* -------------------------------------------------------------------- */ /* Restore access to original directory. */ /* -------------------------------------------------------------------- */ TIFFFlush( psCache->hTIFF ); /* TODO: add checks on error status return of TIFFFlush */ TIFFSetSubDirectory( psCache->hTIFF, nBaseDirOffset ); /* TODO: add checks on error status return of TIFFSetSubDirectory */ } /************************************************************************/ /* TIFFGetOvrBlock() */ /************************************************************************/ /* TODO: make TIFF_Downsample handle iSample offset, so that we can * do with a single TIFFGetOvrBlock and no longer need TIFFGetOvrBlock_Subsampled */ unsigned char *TIFFGetOvrBlock( TIFFOvrCache *psCache, int iTileX, int iTileY, int iSample ) { int nRowOffset; if( iTileY > psCache->nBlockOffset + 1 ) TIFFWriteOvrRow( psCache ); assert( iTileX >= 0 && iTileX < psCache->nBlocksPerRow ); assert( iTileY >= 0 && iTileY < psCache->nBlocksPerColumn ); assert( iTileY >= psCache->nBlockOffset && iTileY < psCache->nBlockOffset+2 ); assert( iSample >= 0 && iSample < psCache->nSamples ); if (psCache->nPlanarConfig == PLANARCONFIG_SEPARATE) nRowOffset = ((iTileX * psCache->nSamples) + iSample) * psCache->nBytesPerBlock; else nRowOffset = iTileX * psCache->nBytesPerBlock + (psCache->nBitsPerPixel + 7) / 8 * iSample; if( iTileY == psCache->nBlockOffset ) return psCache->pabyRow1Blocks + nRowOffset; else return psCache->pabyRow2Blocks + nRowOffset; } /************************************************************************/ /* TIFFGetOvrBlock_Subsampled() */ /************************************************************************/ unsigned char *TIFFGetOvrBlock_Subsampled( TIFFOvrCache *psCache, int iTileX, int iTileY ) { int nRowOffset; if( iTileY > psCache->nBlockOffset + 1 ) TIFFWriteOvrRow( psCache ); assert( iTileX >= 0 && iTileX < psCache->nBlocksPerRow ); assert( iTileY >= 0 && iTileY < psCache->nBlocksPerColumn ); assert( iTileY >= psCache->nBlockOffset && iTileY < psCache->nBlockOffset+2 ); assert( psCache->nPlanarConfig != PLANARCONFIG_SEPARATE ); nRowOffset = iTileX * psCache->nBytesPerBlock; if( iTileY == psCache->nBlockOffset ) return psCache->pabyRow1Blocks + nRowOffset; else return psCache->pabyRow2Blocks + nRowOffset; } /************************************************************************/ /* TIFFDestroyOvrCache() */ /************************************************************************/ void TIFFDestroyOvrCache( TIFFOvrCache * psCache ) { while( psCache->nBlockOffset < psCache->nBlocksPerColumn ) TIFFWriteOvrRow( psCache ); _TIFFfree( psCache->pabyRow1Blocks ); _TIFFfree( psCache->pabyRow2Blocks ); _TIFFfree( psCache ); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/mfs/0000755000212300117540000000000012027361331011672 500000000000000tiff-4.0.3/contrib/mfs/Makefile.am0000644000212300117540000000241510411004544013643 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. EXTRA_DIST = README mfs_file.c tiff-4.0.3/contrib/mfs/Makefile.in0000644000212300117540000003130412027361162013662 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = contrib/mfs DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README mfs_file.c all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/mfs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/mfs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/contrib/mfs/mfs_file.c0000644000212300117540000003533711403510577013562 00000000000000/* -------------------------------------------------------------------------------- - Module : mem_file.c - Description : A general purpose library for manipulating a memory area - as if it were a file. - mfs_ stands for memory file system. - Author : Mike Johnson - Banctec AB 03/07/96 - -------------------------------------------------------------------------------- */ /* Copyright (c) 1996 Mike Johnson Copyright (c) 1996 BancTec AB Permission to use, copy, modify, distribute, and sell this software for any purpose is hereby granted without fee, provided that (i) the above copyright notices and this permission notice appear in all copies of the software and related documentation, and (ii) the names of Mike Johnson and BancTec may not be used in any advertising or publicity relating to the software. THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MIKE JOHNSON OR BANCTEC BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* -------------------------------------------------------------------------------- - Includes -------------------------------------------------------------------------------- */ #include #include #include /* -------------------------------------------------------------------------------- - Definitions -------------------------------------------------------------------------------- */ #define MAX_BUFFS 20 #define FALSE 0 #define TRUE 1 /* -------------------------------------------------------------------------------- - Globals -------------------------------------------------------------------------------- */ static char *buf[MAX_BUFFS]; /* Memory for each open buf */ static long buf_off[MAX_BUFFS]; /* File pointer for each buf */ static long buf_size[MAX_BUFFS]; /* Count of bytes allocated for each buf */ static long fds[MAX_BUFFS]; /* File descriptor status */ static int buf_mode[MAX_BUFFS]; /* Mode of buffer (r, w, a) */ static int library_init_done = FALSE; /* -------------------------------------------------------------------------------- - Function prototypes -------------------------------------------------------------------------------- */ int mfs_open (void *ptr, int size, char *mode); int mfs_lseek (int fd, int offset, int whence); int mfs_read (int fd, void *buf, int size); int mfs_write (int fd, void *buf, int size); int mfs_size (int fd); int mfs_map (int fd, char **addr, size_t *len); int mfs_unmap (int fd); int mfs_close (int fd); static int extend_mem_file (int fd, int size); static void mem_init (); /* -------------------------------------------------------------------------------- - Function code -------------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------------- - Function : mfs_open () - - Arguments : Pointer to allocated buffer, initial size of buffer, - mode spec (r, w, a) - - Returns : File descriptor or -1 if error. - - Description : Register this area of memory (which has been allocated - and has a file read into it) under the mem_file library. - A file descriptor is returned which can the be passed - back to TIFFClientOpen and used as if it was a disk - based fd. - If the call is for mode 'w' then pass (void *)NULL as - the buffer and zero size and the library will - allocate memory for you. - If the mode is append then pass (void *)NULL and size - zero or with a valid address. - -------------------------------------------------------------------------------- */ int mfs_open (void *buffer, int size, char *mode) { int ret, i; void *tmp; if (library_init_done == FALSE) { mem_init (); library_init_done = TRUE; } ret = -1; /* Find a free fd */ for (i = 0; i < MAX_BUFFS; i++) { if (fds[i] == -1) { ret = i; break; } } if (i == MAX_BUFFS) /* No more free descriptors */ { ret = -1; errno = EMFILE; } if (ret >= 0 && *mode == 'r') { if (buffer == (void *)NULL) { ret = -1; errno = EINVAL; } else { buf[ret] = (char *)buffer; buf_size[ret] = size; buf_off[ret] = 0; } } else if (ret >= 0 && *mode == 'w') { if (buffer != (void *)NULL) { ret = -1; errno = EINVAL; } else { tmp = malloc (0); /* Get a pointer */ if (tmp == (void *)NULL) { ret = -1; errno = EDQUOT; } else { buf[ret] = (char *)tmp; buf_size[ret] = 0; buf_off[ret] = 0; } } } else if (ret >= 0 && *mode == 'a') { if (buffer == (void *) NULL) /* Create space for client */ { tmp = malloc (0); /* Get a pointer */ if (tmp == (void *)NULL) { ret = -1; errno = EDQUOT; } else { buf[ret] = (char *)tmp; buf_size[ret] = 0; buf_off[ret] = 0; } } else /* Client has file read in already */ { buf[ret] = (char *)buffer; buf_size[ret] = size; buf_off[ret] = 0; } } else /* Some other invalid combination of parameters */ { ret = -1; errno = EINVAL; } if (ret != -1) { fds[ret] = 0; buf_mode[ret] = *mode; } return (ret); } /* -------------------------------------------------------------------------------- - Function : mfs_lseek () - - Arguments : File descriptor, offset, whence - - Returns : as per man lseek (2) - - Description : Does the same as lseek (2) except on a memory based file. - Note: the memory area will be extended if the caller - attempts to seek past the current end of file (memory). - -------------------------------------------------------------------------------- */ int mfs_lseek (int fd, int offset, int whence) { int ret; long test_off; if (fds[fd] == -1) /* Not open */ { ret = -1; errno = EBADF; } else if (offset < 0 && whence == SEEK_SET) { ret = -1; errno = EINVAL; } else { switch (whence) { case SEEK_SET: if (offset > buf_size[fd]) extend_mem_file (fd, offset); buf_off[fd] = offset; ret = offset; break; case SEEK_CUR: test_off = buf_off[fd] + offset; if (test_off < 0) { ret = -1; errno = EINVAL; } else { if (test_off > buf_size[fd]) extend_mem_file (fd, test_off); buf_off[fd] = test_off; ret = test_off; } break; case SEEK_END: test_off = buf_size[fd] + offset; if (test_off < 0) { ret = -1; errno = EINVAL; } else { if (test_off > buf_size[fd]) extend_mem_file (fd, test_off); buf_off[fd] = test_off; ret = test_off; } break; default: errno = EINVAL; ret = -1; break; } } return (ret); } /* -------------------------------------------------------------------------------- - Function : mfs_read () - - Arguments : File descriptor, buffer, size - - Returns : as per man read (2) - - Description : Does the same as read (2) except on a memory based file. - Note: An attempt to read past the end of memory currently - allocated to the file will return 0 (End Of File) - -------------------------------------------------------------------------------- */ int mfs_read (int fd, void *clnt_buf, int size) { int ret; if (fds[fd] == -1 || buf_mode[fd] != 'r') { /* File is either not open, or not opened for read */ ret = -1; errno = EBADF; } else if (buf_off[fd] + size > buf_size[fd]) { ret = 0; /* EOF */ } else { memcpy (clnt_buf, (void *) (buf[fd] + buf_off[fd]), size); buf_off[fd] = buf_off[fd] + size; ret = size; } return (ret); } /* -------------------------------------------------------------------------------- - Function : mfs_write () - - Arguments : File descriptor, buffer, size - - Returns : as per man write (2) - - Description : Does the same as write (2) except on a memory based file. - Note: the memory area will be extended if the caller - attempts to write past the current end of file (memory). - -------------------------------------------------------------------------------- */ int mfs_write (int fd, void *clnt_buf, int size) { int ret; if (fds[fd] == -1 || buf_mode[fd] == 'r') { /* Either the file is not open or it is opened for reading only */ ret = -1; errno = EBADF; } else if (buf_mode[fd] == 'w') { /* Write */ if (buf_off[fd] + size > buf_size[fd]) { extend_mem_file (fd, buf_off[fd] + size); buf_size[fd] = (buf_off[fd] + size); } memcpy ((buf[fd] + buf_off[fd]), clnt_buf, size); buf_off[fd] = buf_off[fd] + size; ret = size; } else { /* Append */ if (buf_off[fd] != buf_size[fd]) buf_off[fd] = buf_size[fd]; extend_mem_file (fd, buf_off[fd] + size); buf_size[fd] += size; memcpy ((buf[fd] + buf_off[fd]), clnt_buf, size); buf_off[fd] = buf_off[fd] + size; ret = size; } return (ret); } /* -------------------------------------------------------------------------------- - Function : mfs_size () - - Arguments : File descriptor - - Returns : integer file size - - Description : This function returns the current size of the file in bytes. - -------------------------------------------------------------------------------- */ int mfs_size (int fd) { int ret; if (fds[fd] == -1) /* Not open */ { ret = -1; errno = EBADF; } else ret = buf_size[fd]; return (ret); } /* -------------------------------------------------------------------------------- - Function : mfs_map () - - Arguments : File descriptor, ptr to address, ptr to length - - Returns : Map status (succeeded or otherwise) - - Description : This function tells the client where the file is mapped - in memory and what size the mapped area is. It is provided - to satisfy the MapProc function in libtiff. It pretends - that the file has been mmap (2)ped. - -------------------------------------------------------------------------------- */ int mfs_map (int fd, char **addr, size_t *len) { int ret; if (fds[fd] == -1) /* Not open */ { ret = -1; errno = EBADF; } else { *addr = buf[fd]; *len = buf_size[fd]; ret = 0; } return (ret); } /* -------------------------------------------------------------------------------- - Function : mfs_unmap () - - Arguments : File descriptor - - Returns : UnMap status (succeeded or otherwise) - - Description : This function does nothing as the file is always - in memory. - -------------------------------------------------------------------------------- */ int mfs_unmap (int fd) { return (0); } /* -------------------------------------------------------------------------------- - Function : mfs_close () - - Arguments : File descriptor - - Returns : close status (succeeded or otherwise) - - Description : Close the open memory file. (Make fd available again.) - -------------------------------------------------------------------------------- */ int mfs_close (int fd) { int ret; if (fds[fd] == -1) /* Not open */ { ret = -1; errno = EBADF; } else { fds[fd] = -1; ret = 0; } return (ret); } /* -------------------------------------------------------------------------------- - Function : extend_mem_file () - - Arguments : File descriptor, length to extend to. - - Returns : 0 - All OK, -1 - realloc () failed. - - Description : Increase the amount of memory allocated to a file. - -------------------------------------------------------------------------------- */ static int extend_mem_file (int fd, int size) { void *new_mem; int ret; if ((new_mem = realloc (buf[fd], size)) == (void *) NULL) ret = -1; else { buf[fd] = (char *) new_mem; ret = 0; } return (ret); } /* -------------------------------------------------------------------------------- - Function : mem_init () - - Arguments : None - - Returns : void - - Description : Initialise the library. - -------------------------------------------------------------------------------- */ static void mem_init () { int i; for (i = 0; i < MAX_BUFFS; i++) { fds[i] = -1; buf[i] = (char *)NULL; buf_size[i] = 0; buf_off[i] = 0; } } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/mfs/README0000644000212300117540000000247606747424643012525 00000000000000Date: Mon, 23 Jun 1997 13:30:48 +0200 To: From: "Mike Johnson" Subject: libtiff - Thanks Return-Path: mikehunt@swipnet.se Delivery-Date: Mon, 23 Jun 1997 06:53:39 -0700 Hi Sam, I noticed in the README from libtiff that you would like to know about what people have done with libtiff, so I thought I would drop you a line. We have used libtiff to create and convert TIFF images of financial documents which are sent from and to major document processing systems in Sweden and Denmark. I would like to express my deep gratitude to yourself and Sillicon Graphics for making this excellent library available for public use. There is obviously a lot of work that has gone in to libtiff and the quality of the code and documentation is an example to others. One thing that libtiff did not do was work on a memory area rather than files. In my applications I had already read a TIFF or other format file in to memory and did not want to waste I/O writing it out again for libtiff's benefit. I therefore constructed a set of functions to pass up to TIFFClientOpen to simulate a file in memory. I have attached my mfs (memory file system) source code for you to use or junk, as you see fit. :-) Once again, thanks very much for making my life simpler. Best Regards, Mike Johnson. tiff-4.0.3/contrib/win_dib/0000755000212300117540000000000012027361331012520 500000000000000tiff-4.0.3/contrib/win_dib/README.Tiffile0000644000212300117540000000232507501540120014677 00000000000000Frank, I attached a file that uses RGBA interface (tif_getimage.c) to read a tiff file and convert to a DIB. It's advantage is that it is easy to read *any* tiff file suported by libtiff and easily convert it to a DIB. The disadvantage is that bilevel (B&W) bitmaps (and all other non-rgba images) are also converted to RGBA, thus taking up 32x as much memory as needed (4 bytes per pixel, rather than 1 bit). I read tiff files, but don't need to write them. And my files are typically small, so the overhead is mostly inconsequential. But for bilevel images, I overrode the get() and put() routines of the RGBA interface to just copy the data from the input raster to the output raster, rather than expanding out to full 32 bit format. It would be nice if there were a simple way to handle all palletized images, but that would take more custom routines, and it's not that important to me. Usage: m_pDIB = (PBITMAPINFOHEADER)::ReadTIFF(pathName); if (m_pDIB != 0) { m_format = IMAGETYPE_TIF; } This is intended as Win32, but the modifications for new get() and put() routines may be independent of platform. Thanks for your work supporting the forum and the library! Regards, Mark James mark@james.net tiff-4.0.3/contrib/win_dib/Tiffile.cpp0000644000212300117540000003141011403510043014516 00000000000000#include "StdAfx.h" //#define STRICT #include #include #include #include // MAX_ constants #include "diblib.h" /*-------------------------------------------------------------------- READ TIFF Load the TIFF data from the file into memory. Return a pointer to a valid DIB (or NULL for errors). Uses the TIFFRGBA interface to libtiff.lib to convert most file formats to a useable form. We just keep the 32 bit form of the data to display, rather than optimizing for the display. Main entry points: int ChkTIFF ( LPCTSTR lpszPath ) PVOID ReadTIFF ( LPCTSTR lpszPath ) RETURN A valid DIB pointer for success; NULL for failure. --------------------------------------------------------------------*/ #include "TiffLib/tiff.h" #include "TiffLib/tiffio.h" #include #include // piggyback some data on top of the RGBA Image struct TIFFDibImage { TIFFRGBAImage tif; int dibinstalled; } ; HANDLE LoadTIFFinDIB(LPCTSTR lpFileName); HANDLE TIFFRGBA2DIB(TIFFDibImage* dib, uint32* raster) ; static void MyWarningHandler(const char* module, const char* fmt, va_list ap) { // ignore all warnings (unused tags, etc) return; } static void MyErrorHandler(const char* module, const char* fmt, va_list ap) { return; } // Turn off the error and warning handlers to check if a valid file. // Necessary because of the way that the Doc loads images and restart files. int ChkTIFF ( LPCTSTR lpszPath ) { int rtn = 0; TIFFErrorHandler eh; TIFFErrorHandler wh; eh = TIFFSetErrorHandler(NULL); wh = TIFFSetWarningHandler(NULL); TIFF* tif = TIFFOpen(lpszPath, "r"); if (tif) { rtn = 1; TIFFClose(tif); } TIFFSetErrorHandler(eh); TIFFSetWarningHandler(wh); return rtn; } void DibInstallHack(TIFFDibImage* img) ; PVOID ReadTIFF ( LPCTSTR lpszPath ) { void* pDIB = 0; TIFFErrorHandler wh; wh = TIFFSetWarningHandler(MyWarningHandler); if (ChkTIFF(lpszPath)) { TIFF* tif = TIFFOpen(lpszPath, "r"); if (tif) { char emsg[1024]; if (TIFFRGBAImageOK(tif, emsg)) { TIFFDibImage img; char emsg[1024]; if (TIFFRGBAImageBegin(&img.tif, tif, -1, emsg)) { size_t npixels; uint32* raster; DibInstallHack(&img); npixels = img.tif.width * img.tif.height; raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32)); if (raster != NULL) { if (TIFFRGBAImageGet(&img.tif, raster, img.tif.width, img.tif.height)) { pDIB = TIFFRGBA2DIB(&img, raster); } } _TIFFfree(raster); } TIFFRGBAImageEnd(&img.tif); } else { TRACE("Unable to open image(%s): %s\n", lpszPath, emsg ); } TIFFClose(tif); } } TIFFSetWarningHandler(wh); return pDIB; } HANDLE TIFFRGBA2DIB(TIFFDibImage* dib, uint32* raster) { void* pDIB = 0; TIFFRGBAImage* img = &dib->tif; uint32 imageLength; uint32 imageWidth; uint16 BitsPerSample; uint16 SamplePerPixel; uint32 RowsPerStrip; uint16 PhotometricInterpretation; BITMAPINFOHEADER bi; int dwDIBSize ; TIFFGetField(img->tif, TIFFTAG_IMAGEWIDTH, &imageWidth); TIFFGetField(img->tif, TIFFTAG_IMAGELENGTH, &imageLength); TIFFGetField(img->tif, TIFFTAG_BITSPERSAMPLE, &BitsPerSample); TIFFGetField(img->tif, TIFFTAG_ROWSPERSTRIP, &RowsPerStrip); TIFFGetField(img->tif, TIFFTAG_SAMPLESPERPIXEL, &SamplePerPixel); TIFFGetField(img->tif, TIFFTAG_PHOTOMETRIC, &PhotometricInterpretation); if ( BitsPerSample == 1 && SamplePerPixel == 1 && dib->dibinstalled ) { // bilevel bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = imageWidth; bi.biHeight = imageLength; bi.biPlanes = 1; // always bi.biBitCount = 1; bi.biCompression = BI_RGB; bi.biSizeImage = WIDTHBYTES(bi.biWidth * bi.biBitCount) * bi.biHeight; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; // must be zero for RGB compression (none) bi.biClrImportant = 0; // always // Get the size of the DIB dwDIBSize = GetDIBSize( &bi ); // Allocate for the BITMAPINFO structure and the color table. pDIB = GlobalAllocPtr( GHND, dwDIBSize ); if (pDIB == 0) { return( NULL ); } // Copy the header info *((BITMAPINFOHEADER*)pDIB) = bi; // Get a pointer to the color table RGBQUAD *pRgbq = (RGBQUAD *)((LPSTR)pDIB + sizeof(BITMAPINFOHEADER)); pRgbq[0].rgbRed = 0; pRgbq[0].rgbBlue = 0; pRgbq[0].rgbGreen = 0; pRgbq[0].rgbReserved = 0; pRgbq[1].rgbRed = 255; pRgbq[1].rgbBlue = 255; pRgbq[1].rgbGreen = 255; pRgbq[1].rgbReserved = 255; // Pointers to the bits //PVOID pbiBits = (LPSTR)pRgbq + bi.biClrUsed * sizeof(RGBQUAD); // // In the BITMAPINFOHEADER documentation, it appears that // there should be no color table for 32 bit images, but // experience shows that the image is off by 3 words if it // is not included. So here it is. PVOID pbiBits = GetDIBImagePtr((BITMAPINFOHEADER*)pDIB); //(LPSTR)pRgbq + 3 * sizeof(RGBQUAD); int sizeWords = bi.biSizeImage/4; RGBQUAD* rgbDib = (RGBQUAD*)pbiBits; long* rgbTif = (long*)raster; _TIFFmemcpy(pbiBits, raster, bi.biSizeImage); } // For now just always default to the RGB 32 bit form. // save as 32 bit for simplicity else if ( true /*BitsPerSample == 8 && SamplePerPixel == 3*/ ) { // 24 bit color bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = imageWidth; bi.biHeight = imageLength; bi.biPlanes = 1; // always bi.biBitCount = 32; bi.biCompression = BI_RGB; bi.biSizeImage = WIDTHBYTES(bi.biWidth * bi.biBitCount) * bi.biHeight; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; // must be zero for RGB compression (none) bi.biClrImportant = 0; // always // Get the size of the DIB dwDIBSize = GetDIBSize( &bi ); // Allocate for the BITMAPINFO structure and the color table. pDIB = GlobalAllocPtr( GHND, dwDIBSize ); if (pDIB == 0) { return( NULL ); } // Copy the header info *((BITMAPINFOHEADER*)pDIB) = bi; // Get a pointer to the color table RGBQUAD *pRgbq = (RGBQUAD *)((LPSTR)pDIB + sizeof(BITMAPINFOHEADER)); // Pointers to the bits //PVOID pbiBits = (LPSTR)pRgbq + bi.biClrUsed * sizeof(RGBQUAD); // // In the BITMAPINFOHEADER documentation, it appears that // there should be no color table for 32 bit images, but // experience shows that the image is off by 3 words if it // is not included. So here it is. PVOID pbiBits = (LPSTR)pRgbq + 3 * sizeof(RGBQUAD); int sizeWords = bi.biSizeImage/4; RGBQUAD* rgbDib = (RGBQUAD*)pbiBits; long* rgbTif = (long*)raster; // Swap the byte order while copying for ( int i = 0 ; i < sizeWords ; ++i ) { rgbDib[i].rgbRed = TIFFGetR(rgbTif[i]); rgbDib[i].rgbBlue = TIFFGetB(rgbTif[i]); rgbDib[i].rgbGreen = TIFFGetG(rgbTif[i]); rgbDib[i].rgbReserved = 0; } } return pDIB; } /////////////////////////////////////////////////////////////// // // Hacked from tif_getimage.c in libtiff in v3.5.7 // // typedef unsigned char u_char; #define DECLAREContigPutFunc(name) \ static void name(\ TIFFRGBAImage* img, \ uint32* cp, \ uint32 x, uint32 y, \ uint32 w, uint32 h, \ int32 fromskew, int32 toskew, \ u_char* pp \ ) #define DECLARESepPutFunc(name) \ static void name(\ TIFFRGBAImage* img,\ uint32* cp,\ uint32 x, uint32 y, \ uint32 w, uint32 h,\ int32 fromskew, int32 toskew,\ u_char* r, u_char* g, u_char* b, u_char* a\ ) DECLAREContigPutFunc(putContig1bitTile); static int getStripContig1Bit(TIFFRGBAImage* img, uint32* uraster, uint32 w, uint32 h); //typdef struct TIFFDibImage { // TIFFRGBAImage tif; // dibinstalled; //} TIFFDibImage ; void DibInstallHack(TIFFDibImage* dib) { TIFFRGBAImage* img = &dib->tif; dib->dibinstalled = false; switch (img->photometric) { case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: switch (img->bitspersample) { case 1: img->put.contig = putContig1bitTile; img->get = getStripContig1Bit; dib->dibinstalled = true; break; } break; } } /* * 1-bit packed samples => 1-bit * * Override to just copy the data */ DECLAREContigPutFunc(putContig1bitTile) { int samplesperpixel = img->samplesperpixel; (void) y; fromskew *= samplesperpixel; int wb = WIDTHBYTES(w); u_char* ucp = (u_char*)cp; /* Conver 'w' to bytes from pixels (rounded up) */ w = (w+7)/8; while (h-- > 0) { _TIFFmemcpy(ucp, pp, w); /* for (x = wb; x-- > 0;) { *cp++ = rgbi(Map[pp[0]], Map[pp[1]], Map[pp[2]]); pp += samplesperpixel; } */ ucp += (wb + toskew); pp += (w + fromskew); } } /* * Hacked from the tif_getimage.c file. */ static uint32 setorientation(TIFFRGBAImage* img, uint32 h) { TIFF* tif = img->tif; uint32 y; switch (img->orientation) { case ORIENTATION_BOTRIGHT: case ORIENTATION_RIGHTBOT: /* XXX */ case ORIENTATION_LEFTBOT: /* XXX */ TIFFWarning(TIFFFileName(tif), "using bottom-left orientation"); img->orientation = ORIENTATION_BOTLEFT; /* fall thru... */ case ORIENTATION_BOTLEFT: y = 0; break; case ORIENTATION_TOPRIGHT: case ORIENTATION_RIGHTTOP: /* XXX */ case ORIENTATION_LEFTTOP: /* XXX */ default: TIFFWarning(TIFFFileName(tif), "using top-left orientation"); img->orientation = ORIENTATION_TOPLEFT; /* fall thru... */ case ORIENTATION_TOPLEFT: y = h-1; break; } return (y); } /* * Get a strip-organized image that has * PlanarConfiguration contiguous if SamplesPerPixel > 1 * or * SamplesPerPixel == 1 * * Hacked from the tif_getimage.c file. * * This is set up to allow us to just copy the data to the raster * for 1-bit bitmaps */ static int getStripContig1Bit(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) { TIFF* tif = img->tif; tileContigRoutine put = img->put.contig; uint16 orientation; uint32 row, y, nrow, rowstoread; uint32 pos; u_char* buf; uint32 rowsperstrip; uint32 imagewidth = img->width; tsize_t scanline; int32 fromskew, toskew; tstrip_t strip; tsize_t stripsize; u_char* braster = (u_char*)raster; // byte wide raster uint32 wb = WIDTHBYTES(w); int ret = 1; buf = (u_char*) _TIFFmalloc(TIFFStripSize(tif)); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for strip buffer"); return (0); } y = setorientation(img, h); orientation = img->orientation; toskew = -(int32) (orientation == ORIENTATION_TOPLEFT ? wb+wb : wb-wb); TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); scanline = TIFFScanlineSize(tif); fromskew = (w < imagewidth ? imagewidth - w : 0)/8; for (row = 0; row < h; row += nrow) { rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip; nrow = (row + rowstoread > h ? h - row : rowstoread); strip = TIFFComputeStrip(tif,row+img->row_offset, 0); stripsize = ((row + img->row_offset)%rowsperstrip + nrow) * scanline; if (TIFFReadEncodedStrip(tif, strip, buf, stripsize ) < 0 && img->stoponerr) { ret = 0; break; } pos = ((row + img->row_offset) % rowsperstrip) * scanline; (*put)(img, (uint32*)(braster+y*wb), 0, y, w, nrow, fromskew, toskew, buf + pos); y += (orientation == ORIENTATION_TOPLEFT ?-(int32) nrow : (int32) nrow); } _TIFFfree(buf); return (ret); } /* * Local Variables: * mode: c++ * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/win_dib/README.tiff2dib0000644000212300117540000000303707501540120015007 00000000000000 Date: 04 Dec 95 10:34:23 EST From: Philippe <100423.3705@compuserve.com> To: TIFF/sam Leffler Subject: TIFF library and Windows 95 Message-Id: <951204153422_100423.3705_BHG101-1@CompuServe.COM> Sam, First, let me thanks all of you how have worked on that great TIFF library ! Here is some information that may help someone. I build the library under Windows 95 as a 32-bit library. The contribution of Scott Wagner (tif_win32.c) worked fine, but the makefile "makefile.msc" was unsable because it was written for DOS or Windows 3.1 and all the files names are limited to 8 characters. Here is the makefile I used : makefile.w95 Also, I had to disable fax3 support because I wasn't able to build (as it is) the tool "mkg3states" to generate the include file "g3states.h". This source file must be modify to be build under Windows 95. To build the library under Windows 95 with Visual C++ 2.0, I had to : - undefine CCITT_SUPPORT in "tiffconf.h" - create the file version.h with this line : #define VERSION "3.4beta024" - build the makefile "makefile.w95" I also join the source file "tif2dib.c" that I created, it contain the function LoadTIFFinDIB that load a TIFF file and build a memory DIB with it and return the HANDLE (HDIB) of the memory bloc containing this DIB. Since DIB is the "natural" bitmap format for Windows 3.1, 95 and NT, this function sould be usefull for some Windows 95 (or NT) developer. Sorry for my approximate english ... Regards, Philippe Tenenhaus 100423.3705@compuserve.com Paris tiff-4.0.3/contrib/win_dib/Makefile.w950000644000212300117540000000627407501540120014530 00000000000000# $Header: /usr/people/sam/tiff/libtiff/RCS/Makefile.w95,v 1.2 1994/11/28 06:13:31 sam Exp $ # # Tag Image File Format Library # # Copyright (c) 1988, 1989, 1990, 1991, 1992 Sam Leffler # Copyright (c) 1991, 1992 Silicon Graphics, Inc. # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # # This Makefile is for use with microsoft nmake version 1.50 and # Microsoft 32-bit C/C++ Compiler 9.00 # DESTDIR=. # IPATH= -I. CONF_LIBRARY=$(NULL) COPTS= -Oxa -DBSDTYPES -Zd CFLAGS= $(COPTS) $(CONF_LIBRARY) # INCS= tiff.h tiffio.h SRCS= tif_aux.c \ tif_close.c \ tif_codec.c \ tif_compress.c \ tif_dir.c \ tif_dirinfo.c \ tif_dirread.c \ tif_dirwrite.c \ tif_dumpmode.c \ tif_error.c \ tif_getimage.c \ tif_jpeg.c \ tif_flush.c \ tif_lzw.c \ tif_next.c \ tif_open.c \ tif_packbits.c \ tif_predict \ tif_print.c \ tif_read.c \ tif_swab.c \ tif_strip.c \ tif_thunder.c \ tif_tile.c \ tif_version.c \ tif_warning.c \ tif_write.c \ tif_win32.c OBJS= tif_aux.obj \ tif_close.obj \ tif_codec.obj \ tif_compress.obj \ tif_dir.obj \ tif_dirinfo.obj \ tif_dirread.obj \ tif_dirwrite.obj \ tif_dumpmode.obj \ tif_error.obj \ tif_getimage.obj \ tif_jpeg.obj \ tif_flush.obj \ tif_lzw.obj \ tif_next.obj \ tif_open.obj \ tif_packbits.obj \ tif_predict.obj \ tif_print.obj \ tif_read.obj \ tif_swab.obj \ tif_strip.obj \ tif_thunder.obj \ tif_tile.obj \ tif_version.obj \ tif_warning.obj \ tif_write.obj \ tif_win32.obj ALL= libtiff.lib all: $(ALL) %.obj : %.c $(CC) $(CFLAGS) -c $*.c #.INCLUDE .IGNORE : depend libtiff.lib: $(OBJS) - del libtiff.lib lib /OUT:libtiff.lib $(OBJS) #To include fax3 support, you need to modify mkg3states.c so it could run #under windows 95 or NT. This application make the file g3state.h. #after that, you have to add to the build script : tif_fax3.c and tif_fax3.obj #and define CCITT_SUPPORT in the file tifconf.h #$(OBJS): tiffio.h tiff.h tiffcomp.h tiffiop.h tiffconf.h #tif_fax3.obj: tif_fax3.c g3states.h t4.h tif_fax3.h #g3states.h: mkg3states.c t4.h # $(CC) $(CFLAGS) mkg3states.c # mkg3states -c > g3states.h clean: del *.obj del mkg3stat del g3states.h tags: $(SRCS) $(CTAGS) $(SRCS) tiff-4.0.3/contrib/win_dib/tiff2dib.c0000644000212300117540000002550211403510577014306 00000000000000/************************************************************************* * * Source file for Windows 95/Win32. * * The function LoadTIFFinDIB in this source file let you load * a TIFF file and build a memory DIB with it and return the * HANDLE (HDIB) of the memory bloc containing the DIB. * * Example : * * HDIB hDIB; * hDIB = LoadTIFFinDIB("sample.tif"); * * * To build this source file you must include the TIFF library * in your project. * * 4/12/95 Philippe Tenenhaus 100423.3705@compuserve.com * ************************************************************************/ #include "tiffio.h" #define HDIB HANDLE #define IS_WIN30_DIB(lpbi) ((*(LPDWORD)(lpbi)) == sizeof(BITMAPINFOHEADER)) #define CVT(x) (((x) * 255L) / ((1L<<16)-1)) static HDIB CreateDIB(DWORD dwWidth, DWORD dwHeight, WORD wBitCount); static LPSTR FindDIBBits(LPSTR lpDIB); static WORD PaletteSize(LPSTR lpDIB); static WORD DIBNumColors(LPSTR lpDIB); static int checkcmap(int n, uint16* r, uint16* g, uint16* b); /************************************************************************* * * HDIB LoadTIFFinDIB(LPSTR lpFileName) * * Parameter: * * LPSTR lpDIB - File name of a tiff imag * * Return Value: * * LPSTR - HANDLE of a DIB * * Description: * * This function load a TIFF file and build a memory DIB with it * and return the HANDLE (HDIB) of the memory bloc containing * the DIB. * * 4/12/95 Philippe Tenenhaus 100423.3705@compuserve.com * ************************************************************************/ HDIB LoadTIFFinDIB(LPSTR lpFileName) { TIFF *tif; unsigned long imageLength; unsigned long imageWidth; unsigned int BitsPerSample; unsigned long LineSize; unsigned int SamplePerPixel; unsigned long RowsPerStrip; int PhotometricInterpretation; long nrow; unsigned long row; char *buf; LPBITMAPINFOHEADER lpDIB; HDIB hDIB; char *lpBits; HGLOBAL hStrip; int i,l; int Align; tif = TIFFOpen(lpFileName, "r"); if (!tif) goto TiffOpenError; TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &imageWidth); TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imageLength); TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &BitsPerSample); TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &RowsPerStrip); TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &RowsPerStrip); TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &PhotometricInterpretation); LineSize = TIFFScanlineSize(tif); //Number of byte in ine line SamplePerPixel = (int) (LineSize/imageWidth); //Align = Number of byte to add at the end of each line of the DIB Align = 4 - (LineSize % 4); if (Align == 4) Align = 0; //Create a new DIB hDIB = CreateDIB((DWORD) imageWidth, (DWORD) imageLength, (WORD) (BitsPerSample*SamplePerPixel)); lpDIB = (LPBITMAPINFOHEADER) GlobalLock(hDIB); if (!lpDIB) goto OutOfDIBMemory; if (lpDIB) lpBits = FindDIBBits((LPSTR) lpDIB); //In the tiff file the lines are save from up to down //In a DIB the lines must be save from down to up if (lpBits) { lpBits = FindDIBBits((LPSTR) lpDIB); lpBits+=((imageWidth*SamplePerPixel)+Align)*(imageLength-1); //now lpBits pointe on the bottom line hStrip = GlobalAlloc(GHND,TIFFStripSize(tif)); buf = GlobalLock(hStrip); if (!buf) goto OutOfBufMemory; //PhotometricInterpretation = 2 image is RGB //PhotometricInterpretation = 3 image have a color palette if (PhotometricInterpretation == 3) { uint16* red; uint16* green; uint16* blue; int16 i; LPBITMAPINFO lpbmi; int Palette16Bits; TIFFGetField(tif, TIFFTAG_COLORMAP, &red, &green, &blue); //Is the palette 16 or 8 bits ? if (checkcmap(1<= 0; i--) { if (Palette16Bits) { lpbmi->bmiColors[i].rgbRed =(BYTE) CVT(red[i]); lpbmi->bmiColors[i].rgbGreen = (BYTE) CVT(green[i]); lpbmi->bmiColors[i].rgbBlue = (BYTE) CVT(blue[i]); } else { lpbmi->bmiColors[i].rgbRed = (BYTE) red[i]; lpbmi->bmiColors[i].rgbGreen = (BYTE) green[i]; lpbmi->bmiColors[i].rgbBlue = (BYTE) blue[i]; } } } //read the tiff lines and save them in the DIB //with RGB mode, we have to change the order of the 3 samples RGB <=> BGR for (row = 0; row < imageLength; row += RowsPerStrip) { nrow = (row + RowsPerStrip > imageLength ? imageLength - row : RowsPerStrip); if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 0), buf, nrow*LineSize)==-1) { goto TiffReadError; } else { for (l = 0; l < nrow; l++) { if (SamplePerPixel == 3) for (i=0;i< (int) (imageWidth);i++) { lpBits[i*SamplePerPixel+0]=buf[l*LineSize+i*Sample PerPixel+2]; lpBits[i*SamplePerPixel+1]=buf[l*LineSize+i*Sample PerPixel+1]; lpBits[i*SamplePerPixel+2]=buf[l*LineSize+i*Sample PerPixel+0]; } else memcpy(lpBits, &buf[(int) (l*LineSize)], (int) imageWidth*SamplePerPixel); lpBits-=imageWidth*SamplePerPixel+Align; } } } GlobalUnlock(hStrip); GlobalFree(hStrip); GlobalUnlock(hDIB); TIFFClose(tif); } return hDIB; OutOfBufMemory: TiffReadError: GlobalUnlock(hDIB); GlobalFree(hStrip); OutOfDIBMemory: TIFFClose(tif); TiffOpenError: return (HANDLE) 0; } static int checkcmap(int n, uint16* r, uint16* g, uint16* b) { while (n-- > 0) if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256) return (16); return (8); } /************************************************************************* * All the following functions were created by microsoft, they are * parts of the sample project "wincap" given with the SDK Win32. * * Microsoft says that : * * You have a royalty-free right to use, modify, reproduce and * distribute the Sample Files (and/or any modified version) in * any way you find useful, provided that you agree that * Microsoft has no warranty obligations or liability for any * Sample Application Files which are modified. * ************************************************************************/ HDIB CreateDIB(DWORD dwWidth, DWORD dwHeight, WORD wBitCount) { BITMAPINFOHEADER bi; // bitmap header LPBITMAPINFOHEADER lpbi; // pointer to BITMAPINFOHEADER DWORD dwLen; // size of memory block HDIB hDIB; DWORD dwBytesPerLine; // Number of bytes per scanline // Make sure bits per pixel is valid if (wBitCount <= 1) wBitCount = 1; else if (wBitCount <= 4) wBitCount = 4; else if (wBitCount <= 8) wBitCount = 8; else if (wBitCount <= 24) wBitCount = 24; else wBitCount = 4; // set default value to 4 if parameter is bogus // initialize BITMAPINFOHEADER bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = dwWidth; // fill in width from parameter bi.biHeight = dwHeight; // fill in height from parameter bi.biPlanes = 1; // must be 1 bi.biBitCount = wBitCount; // from parameter bi.biCompression = BI_RGB; bi.biSizeImage = (dwWidth*dwHeight*wBitCount)/8; //0; // 0's here mean "default" bi.biXPelsPerMeter = 2834; //0; bi.biYPelsPerMeter = 2834; //0; bi.biClrUsed = 0; bi.biClrImportant = 0; // calculate size of memory block required to store the DIB. This // block should be big enough to hold the BITMAPINFOHEADER, the color // table, and the bits dwBytesPerLine = (((wBitCount * dwWidth) + 31) / 32 * 4); dwLen = bi.biSize + PaletteSize((LPSTR)&bi) + (dwBytesPerLine * dwHeight); // alloc memory block to store our bitmap hDIB = GlobalAlloc(GHND, dwLen); // major bummer if we couldn't get memory block if (!hDIB) { return NULL; } // lock memory and get pointer to it lpbi = (VOID FAR *)GlobalLock(hDIB); // use our bitmap info structure to fill in first part of // our DIB with the BITMAPINFOHEADER *lpbi = bi; // Since we don't know what the colortable and bits should contain, // just leave these blank. Unlock the DIB and return the HDIB. GlobalUnlock(hDIB); /* return handle to the DIB */ return hDIB; } LPSTR FAR FindDIBBits(LPSTR lpDIB) { return (lpDIB + *(LPDWORD)lpDIB + PaletteSize(lpDIB)); } WORD FAR PaletteSize(LPSTR lpDIB) { /* calculate the size required by the palette */ if (IS_WIN30_DIB (lpDIB)) return (DIBNumColors(lpDIB) * sizeof(RGBQUAD)); else return (DIBNumColors(lpDIB) * sizeof(RGBTRIPLE)); } WORD DIBNumColors(LPSTR lpDIB) { WORD wBitCount; // DIB bit count /* If this is a Windows-style DIB, the number of colors in the * color table can be less than the number of bits per pixel * allows for (i.e. lpbi->biClrUsed can be set to some value). * If this is the case, return the appropriate value. */ if (IS_WIN30_DIB(lpDIB)) { DWORD dwClrUsed; dwClrUsed = ((LPBITMAPINFOHEADER)lpDIB)->biClrUsed; if (dwClrUsed) return (WORD)dwClrUsed; } /* Calculate the number of colors in the color table based on * the number of bits per pixel for the DIB. */ if (IS_WIN30_DIB(lpDIB)) wBitCount = ((LPBITMAPINFOHEADER)lpDIB)->biBitCount; else wBitCount = ((LPBITMAPCOREHEADER)lpDIB)->bcBitCount; /* return number of colors based on bits per pixel */ switch (wBitCount) { case 1: return 2; case 4: return 16; case 8: return 256; default: return 0; } } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/win_dib/Makefile.am0000644000212300117540000000247610411004546014502 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. EXTRA_DIST = Makefile.w95 README.Tiffile README.tiff2dib Tiffile.cpp tiff2dib.c tiff-4.0.3/contrib/win_dib/Makefile.in0000644000212300117540000003137212027361163014516 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = contrib/win_dib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = Makefile.w95 README.Tiffile README.tiff2dib Tiffile.cpp tiff2dib.c all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/win_dib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/win_dib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/contrib/ras/0000755000212300117540000000000012027361331011672 500000000000000tiff-4.0.3/contrib/ras/Makefile.in0000644000212300117540000003131512027361163013665 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = contrib/ras DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README ras2tif.c tif2ras.c all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/ras/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/ras/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/contrib/ras/README0000644000212300117540000000051006747424643012510 00000000000000Sun May 19 22:28:16 PDT 1991 These programs are from Patrick Naughton (naughton@wind.sun.com). I've tried to update them to reflect changes to the library, but I am unable to verify that they operate properly, because they require the Sun pixrect library. Please contact Patrick directly if you have questions/problems. Sam tiff-4.0.3/contrib/ras/ras2tif.c0000644000212300117540000001515411403510577013343 00000000000000#ifndef lint static char sccsid[] = "@(#)ras2tif.c 1.2 90/03/06"; #endif /*- * ras2tif.c - Converts from a Sun Rasterfile to a Tagged Image File. * * Copyright (c) 1990 by Sun Microsystems, Inc. * * Author: Patrick J. Naughton * naughton@wind.sun.com * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation. * * This file is provided AS IS with no warranties of any kind. The author * shall have no liability with respect to the infringement of copyrights, * trade secrets or any patents by this file or any part thereof. In no * event will the author be liable for any lost revenue or profits or * other special, indirect and consequential damages. * * Comments and additions should be sent to the author: * * Patrick J. Naughton * Sun Microsystems * 2550 Garcia Ave, MS 14-40 * Mountain View, CA 94043 * (415) 336-1080 * * Revision History: * 11-Jan-89: Created. * 06-Mar-90: fix bug in SCALE() macro. * got rid of xres and yres, (they weren't working anyways). * fixed bpsl calculation. * 25-Nov-99: y2k fix (year as 1900 + tm_year) * * Description: * This program takes a Sun Rasterfile [see rasterfile(5)] as input and * writes a MicroSoft/Aldus "Tagged Image File Format" image or "TIFF" file. * The input file may be standard input, but the output TIFF file must be a * real file since seek(2) is used. */ #include #include #include #include "tiffio.h" typedef int boolean; #define True (1) #define False (0) #define SCALE(x) (((x)*((1L<<16)-1))/255) boolean Verbose = False; boolean dummyinput = False; char *pname; /* program name (used for error messages) */ void error(s1, s2) char *s1, *s2; { fprintf(stderr, s1, pname, s2); exit(1); } void usage() { error("usage: %s -[vq] [-|rasterfile] TIFFfile\n", NULL); } main(argc, argv) int argc; char *argv[]; { char *inf = NULL; char *outf = NULL; FILE *fp; int depth, i; long row; TIFF *tif; Pixrect *pix; /* The Sun Pixrect */ colormap_t Colormap; /* The Pixrect Colormap */ u_short red[256], green[256], blue[256]; struct tm *ct; struct timeval tv; long width, height; long rowsperstrip; int year; short photometric; short samplesperpixel; short bitspersample; int bpsl; static char *version = "ras2tif 1.0"; static char *datetime = "1990:01:01 12:00:00"; gettimeofday(&tv, (struct timezone *) NULL); ct = localtime(&tv.tv_sec); year=1900 + ct->tm_year; sprintf(datetime, "%04d:%02d:%02d %02d:%02d:%02d", year, ct->tm_mon + 1, ct->tm_mday, ct->tm_hour, ct->tm_min, ct->tm_sec); setbuf(stderr, NULL); pname = argv[0]; while (--argc) { if ((++argv)[0][0] == '-') { switch (argv[0][1]) { case 'v': Verbose = True; break; case 'q': usage(); break; case '\0': if (inf == NULL) dummyinput = True; else usage(); break; default: fprintf(stderr, "%s: illegal option -%c.\n", pname, argv[0][1]); exit(1); } } else if (inf == NULL && !dummyinput) { inf = argv[0]; } else if (outf == NULL) outf = argv[0]; else usage(); } if (outf == NULL) error("%s: can't write output file to a stream.\n", NULL); if (dummyinput || inf == NULL) { inf = "Standard Input"; fp = stdin; } else if ((fp = fopen(inf, "r")) == NULL) error("%s: %s couldn't be opened.\n", inf); if (Verbose) fprintf(stderr, "Reading rasterfile from %s...", inf); pix = pr_load(fp, &Colormap); if (pix == NULL) error("%s: %s is not a raster file.\n", inf); if (Verbose) fprintf(stderr, "done.\n"); if (Verbose) fprintf(stderr, "Writing %s...", outf); tif = TIFFOpen(outf, "w"); if (tif == NULL) error("%s: error opening TIFF file %s", outf); width = pix->pr_width; height = pix->pr_height; depth = pix->pr_depth; switch (depth) { case 1: samplesperpixel = 1; bitspersample = 1; photometric = PHOTOMETRIC_MINISBLACK; break; case 8: samplesperpixel = 1; bitspersample = 8; photometric = PHOTOMETRIC_PALETTE; break; case 24: samplesperpixel = 3; bitspersample = 8; photometric = PHOTOMETRIC_RGB; break; case 32: samplesperpixel = 4; bitspersample = 8; photometric = PHOTOMETRIC_RGB; break; default: error("%s: bogus depth: %d\n", depth); } bpsl = ((depth * width + 15) >> 3) & ~1; rowsperstrip = (8 * 1024) / bpsl; TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bitspersample); TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_LZW); TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photometric); TIFFSetField(tif, TIFFTAG_DOCUMENTNAME, inf); TIFFSetField(tif, TIFFTAG_IMAGEDESCRIPTION, "converted Sun rasterfile"); TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, samplesperpixel); TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip); TIFFSetField(tif, TIFFTAG_STRIPBYTECOUNTS, height / rowsperstrip); TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tif, TIFFTAG_SOFTWARE, version); TIFFSetField(tif, TIFFTAG_DATETIME, datetime); memset(red, 0, sizeof(red)); memset(green, 0, sizeof(green)); memset(blue, 0, sizeof(blue)); if (depth == 8) { TIFFSetField(tif, TIFFTAG_COLORMAP, red, green, blue); for (i = 0; i < Colormap.length; i++) { red[i] = SCALE(Colormap.map[0][i]); green[i] = SCALE(Colormap.map[1][i]); blue[i] = SCALE(Colormap.map[2][i]); } } if (Verbose) fprintf(stderr, "%dx%dx%d image, ", width, height, depth); for (row = 0; row < height; row++) if (TIFFWriteScanline(tif, (u_char *) mprd_addr(mpr_d(pix), 0, row), row, 0) < 0) { fprintf("failed a scanline write (%d)\n", row); break; } TIFFFlushData(tif); TIFFClose(tif); if (Verbose) fprintf(stderr, "done.\n"); pr_destroy(pix); exit(0); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/ras/Makefile.am0000644000212300117540000000242610411004545013646 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. EXTRA_DIST = README ras2tif.c tif2ras.c tiff-4.0.3/contrib/ras/tif2ras.c0000644000212300117540000002165111403511023013325 00000000000000#ifndef lint static char id[] = "$Id: tif2ras.c,v 1.3 2010-06-08 18:55:15 bfriesen Exp $"; #endif /*- * tif2ras.c - Converts from a Tagged Image File Format image to a Sun Raster. * * Copyright (c) 1990 by Sun Microsystems, Inc. * * Author: Patrick J. Naughton * naughton@wind.sun.com * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation. * * This file is provided AS IS with no warranties of any kind. The author * shall have no liability with respect to the infringement of copyrights, * trade secrets or any patents by this file or any part thereof. In no * event will the author be liable for any lost revenue or profits or * other special, indirect and consequential damages. * * Comments and additions should be sent to the author: * * Patrick J. Naughton * Sun Microsystems * 2550 Garcia Ave, MS 14-40 * Mountain View, CA 94043 * (415) 336-1080 * * Revision History: * 10-Jan-89: Created. * 06-Mar-90: Change to byte encoded rasterfiles. * fix bug in call to ReadScanline(). * fix bug in CVT() macro. * fix assignment of td, (missing &). * * Description: * This program takes a MicroSoft/Aldus "Tagged Image File Format" image or * "TIFF" file as input and writes a Sun Rasterfile [see rasterfile(5)]. The * output file may be standard output, but the input TIFF file must be a real * file since seek(2) is used. */ #include #include #include "tiffio.h" typedef int boolean; #define True (1) #define False (0) #define CVT(x) (((x) * 255) / ((1L<<16)-1)) boolean Verbose = False; char *pname; /* program name (used for error messages) */ void error(s1, s2) char *s1, *s2; { fprintf(stderr, s1, pname, s2); exit(1); } void usage() { error("usage: %s -[vq] TIFFfile [rasterfile]\n", NULL); } main(argc, argv) int argc; char *argv[]; { char *inf = NULL; char *outf = NULL; FILE *fp; long width, height; int depth, numcolors; register TIFF *tif; TIFFDirectory *td; register u_char *inp, *outp; register int col, i; register long row; u_char *Map = NULL; u_char *buf; short bitspersample; short samplesperpixel; short photometric; u_short *redcolormap, *bluecolormap, *greencolormap; Pixrect *pix; /* The Sun Pixrect */ colormap_t Colormap; /* The Pixrect Colormap */ u_char red[256], green[256], blue[256]; setbuf(stderr, NULL); pname = argv[0]; while (--argc) { if ((++argv)[0][0] == '-') switch (argv[0][1]) { case 'v': Verbose = True; break; case 'q': usage(); break; default: fprintf(stderr, "%s: illegal option -%c.\n", pname, argv[0][1]); exit(1); } else if (inf == NULL) inf = argv[0]; else if (outf == NULL) outf = argv[0]; else usage(); } if (inf == NULL) error("%s: can't read input file from a stream.\n", NULL); if (Verbose) fprintf(stderr, "Reading %s...", inf); tif = TIFFOpen(inf, "r"); if (tif == NULL) error("%s: error opening TIFF file %s", inf); if (Verbose) TIFFPrintDirectory(tif, stderr, True, False, False); TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bitspersample); if (bitspersample > 8) error("%s: can't handle more than 8-bits per sample\n", NULL); TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel); switch (samplesperpixel) { case 1: if (bitspersample == 1) depth = 1; else depth = 8; break; case 3: case 4: depth = 24; break; default: error("%s: only handle 1-channel gray scale or 3-channel color\n"); } TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width); TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height); if (Verbose) fprintf(stderr, "%dx%dx%d image, ", width, height, depth); if (Verbose) fprintf(stderr, "%d bits/sample, %d samples/pixel, ", bitspersample, samplesperpixel); pix = mem_create(width, height, depth); if (pix == (Pixrect *) NULL) error("%s: can't allocate memory for output pixrect...\n", NULL); numcolors = (1 << bitspersample); TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric); if (numcolors == 2) { if (Verbose) fprintf(stderr, "monochrome "); Colormap.type = RMT_NONE; Colormap.length = 0; Colormap.map[0] = Colormap.map[1] = Colormap.map[2] = NULL; } else { switch (photometric) { case PHOTOMETRIC_MINISBLACK: if (Verbose) fprintf(stderr, "%d graylevels (min=black), ", numcolors); Map = (u_char *) malloc(numcolors * sizeof(u_char)); for (i = 0; i < numcolors; i++) Map[i] = (255 * i) / numcolors; Colormap.type = RMT_EQUAL_RGB; Colormap.length = numcolors; Colormap.map[0] = Colormap.map[1] = Colormap.map[2] = Map; break; case PHOTOMETRIC_MINISWHITE: if (Verbose) fprintf(stderr, "%d graylevels (min=white), ", numcolors); Map = (u_char *) malloc(numcolors * sizeof(u_char)); for (i = 0; i < numcolors; i++) Map[i] = 255 - ((255 * i) / numcolors); Colormap.type = RMT_EQUAL_RGB; Colormap.length = numcolors; Colormap.map[0] = Colormap.map[1] = Colormap.map[2] = Map; break; case PHOTOMETRIC_RGB: if (Verbose) fprintf(stderr, "truecolor "); Colormap.type = RMT_NONE; Colormap.length = 0; Colormap.map[0] = Colormap.map[1] = Colormap.map[2] = NULL; break; case PHOTOMETRIC_PALETTE: if (Verbose) fprintf(stderr, "colormapped "); Colormap.type = RMT_EQUAL_RGB; Colormap.length = numcolors; memset(red, 0, sizeof(red)); memset(green, 0, sizeof(green)); memset(blue, 0, sizeof(blue)); TIFFGetField(tif, TIFFTAG_COLORMAP, &redcolormap, &greencolormap, &bluecolormap); for (i = 0; i < numcolors; i++) { red[i] = (u_char) CVT(redcolormap[i]); green[i] = (u_char) CVT(greencolormap[i]); blue[i] = (u_char) CVT(bluecolormap[i]); } Colormap.map[0] = red; Colormap.map[1] = green; Colormap.map[2] = blue; break; case PHOTOMETRIC_MASK: error("%s: Don't know how to handle PHOTOMETRIC_MASK\n"); break; case PHOTOMETRIC_DEPTH: error("%s: Don't know how to handle PHOTOMETRIC_DEPTH\n"); break; default: error("%s: unknown photometric (cmap): %d\n", photometric); } } buf = (u_char *) malloc(TIFFScanlineSize(tif)); if (buf == NULL) error("%s: can't allocate memory for scanline buffer...\n", NULL); for (row = 0; row < height; row++) { if (TIFFReadScanline(tif, buf, row, 0) < 0) error("%s: bad data read on line: %d\n", row); inp = buf; outp = (u_char *) mprd_addr(mpr_d(pix), 0, row); switch (photometric) { case PHOTOMETRIC_RGB: if (samplesperpixel == 4) for (col = 0; col < width; col++) { *outp++ = *inp++; /* Blue */ *outp++ = *inp++; /* Green */ *outp++ = *inp++; /* Red */ inp++; /* skip alpha channel */ } else for (col = 0; col < width; col++) { *outp++ = *inp++; /* Blue */ *outp++ = *inp++; /* Green */ *outp++ = *inp++; /* Red */ } break; case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: switch (bitspersample) { case 1: for (col = 0; col < ((width + 7) / 8); col++) *outp++ = *inp++; break; case 2: for (col = 0; col < ((width + 3) / 4); col++) { *outp++ = (*inp >> 6) & 3; *outp++ = (*inp >> 4) & 3; *outp++ = (*inp >> 2) & 3; *outp++ = *inp++ & 3; } break; case 4: for (col = 0; col < width / 2; col++) { *outp++ = *inp >> 4; *outp++ = *inp++ & 0xf; } break; case 8: for (col = 0; col < width; col++) *outp++ = *inp++; break; default: error("%s: bad bits/sample: %d\n", bitspersample); } break; case PHOTOMETRIC_PALETTE: memcpy(outp, inp, width); break; default: error("%s: unknown photometric (write): %d\n", photometric); } } free((char *) buf); if (Verbose) fprintf(stderr, "done.\n"); if (outf == NULL || strcmp(outf, "Standard Output") == 0) { outf = "Standard Output"; fp = stdout; } else { if (!(fp = fopen(outf, "w"))) error("%s: %s couldn't be opened for writing.\n", outf); } if (Verbose) fprintf(stderr, "Writing rasterfile in %s...", outf); if (pr_dump(pix, fp, &Colormap, RT_BYTE_ENCODED, 0) == PIX_ERR) error("%s: error writing Sun Rasterfile: %s\n", outf); if (Verbose) fprintf(stderr, "done.\n"); pr_destroy(pix); if (fp != stdout) fclose(fp); exit(0); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/tags/0000755000212300117540000000000012027361331012043 500000000000000tiff-4.0.3/contrib/tags/xtiffiop.h0000644000212300117540000000400711403510577013772 00000000000000/* * Private Extended TIFF library interface. * * uses private LIBTIFF interface. * * The portions of this module marked "XXX" should be * modified to support your tags instead. * * written by: Niles D. Ritter * */ #ifndef __xtiffiop_h #define __xtiffiop_h #include "tiffiop.h" #include "xtiffio.h" /********************************************************************** * User Configuration **********************************************************************/ /* XXX - Define number of your extended tags here */ #define NUM_XFIELD 3 #define XFIELD_BASE (FIELD_LAST-NUM_XFIELD) /* XXX - Define your Tag Fields here */ #define FIELD_EXAMPLE_MULTI (XFIELD_BASE+0) #define FIELD_EXAMPLE_SINGLE (XFIELD_BASE+1) #define FIELD_EXAMPLE_ASCII (XFIELD_BASE+2) /* XXX - Define Private directory tag structure here */ struct XTIFFDirectory { uint16 xd_num_multi; /* dir-count for the multi tag */ double* xd_example_multi; uint32 xd_example_single; char* xd_example_ascii; }; typedef struct XTIFFDirectory XTIFFDirectory; /********************************************************************** * Nothing below this line should need to be changed by the user. **********************************************************************/ struct xtiff { TIFF *xtif_tif; /* parent TIFF pointer */ uint32 xtif_flags; #define XTIFFP_PRINT 0x00000001 XTIFFDirectory xtif_dir; /* internal rep of current directory */ TIFFVSetMethod xtif_vsetfield; /* inherited tag set routine */ TIFFVGetMethod xtif_vgetfield; /* inherited tag get routine */ TIFFPrintMethod xtif_printdir; /* inherited dir print method */ }; typedef struct xtiff xtiff; #define PARENT(xt,pmember) ((xt)->xtif_ ## pmember) #define TIFFMEMBER(tf,pmember) ((tf)->tif_ ## pmember) #define XTIFFDIR(tif) ((xtiff *)TIFFMEMBER(tif,clientdir)) /* Extended TIFF flags */ #define XTIFF_INITIALIZED 0x80000000 #endif /* __xtiffiop_h */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/tags/listtif.c0000644000212300117540000000114311403510577013611 00000000000000/* * listtif.c -- lists a tiff file. */ #include "xtiffio.h" #include void main(int argc,char *argv[]) { char *fname="newtif.tif"; int flags; TIFF *tif=(TIFF*)0; /* TIFF-level descriptor */ if (argc>1) fname=argv[1]; tif=XTIFFOpen(fname,"r"); if (!tif) goto failure; /* We want the double array listed */ flags = TIFFPRINT_MYMULTIDOUBLES; TIFFPrintDirectory(tif,stdout,flags); XTIFFClose(tif); exit (0); failure: printf("failure in listtif\n"); if (tif) XTIFFClose(tif); exit (-1); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/tags/README0000644000212300117540000001136610120457560012654 00000000000000 NOTE: Sept/2004 The following described approach to managing tag extensions has been mostly superceeded since libtiff 3.6.0. The described approach requires internal knowledge of the libtiff API and tends to be very fragile in the face of libtiff upgrades. Please read over the html/addingtags.html in preference to the below described approach. ================================== Client module for adding to LIBTIFF tagset ------------------------------------------- Author: Niles Ritter In the past, users of the "libtiff" package had to modify the source code of the library if they required additional private tags or codes not recognized by libtiff. Thus, whenever a new revision of libtiff came out the client would have to perform modifications to six or seven different files to re-install their tags. The latest versions of libtiff now provide client software new routines, giving them the opportunity to install private extensions at runtime, rather than compile-time. This means that the client may encapsulate all of their private tags into a separate module, which need only be recompiled when new versions of libtiff are released; no manual editing of files is required. How it works ------------ The mechanism for overriding the tag access has been enabled with a single new routine, which has the following calling sequence: TIFFExtendProc old_extender; old_extender = TIFFSetTagExtender(tag_extender); which must be called prior to opening or creating TIFF files. This routine sets a static pointer to the user-specified function , which in turn is called by TIFFDefaultDirectory(), just after the usual TIFFSetField() and TIFFGetField() methods are defined, and just before the compression tag is set. It also returns a pointer to the previously-defined value of the tag-extender, so that multiple clients may be installed. The TIFFExtendProc method that you define should be used to override the TIFF file's "vsetfield" and "vgetfield" methods, so that you can trap your new, private tags, and install their values into a private directory structure. For your convienience, a new pointer has also been added to the "TIFF" file structure: tidata_t tif_clientdir; /* client TIFF directory */ into which you may install whatever private directory structures you like. You should also override the tag-printing method from within your "vsetfield" method, to permit the symbolic printing of your new tags. Example Client Code: -------------------- An example module has been provided as a template for installing your own tags into a client tag extender. The module is called "xtif_dir.c", and defines all of the interface routines, tag field access, tag printing, etc. for most purpose. To see how the client module operates, there are three "fake" tags currently installed. If you use the existing makefile you can build them with: make all -f Makefile.gcc !or Makefile.mpw maketif listtif This will build two example programs called "maketif" and "listtif" and then run them. These programs do nothing more than create a small file called "newtif.tif", install the fake tags, and then list them out using TIFFPrintDirectory(). Installing Private Tags ----------------------- To use this module for installing your own tags, edit each of the files xtif_dir.c xtiffio.h xtiffiop.h and search for the string "XXX". At these locations the comments will direct you how to install your own tag values, define their types, etc. Three examples tags are currently installed, demonstrating how to implement multi-valued tags, single-valued tags, and ASCII tags. The examples are not valid, registered tags, so you must replace them with your own. To test the routines, also edit the test programs "maketif.c" and "listtif.c" and replace the portions of the code that set the private tag values and list them. Once you have edited these files, you may build the client module with the Makefile provided, and run the test programs. To use these files in your own code, the "xtif_dir.c" module defines replacement routines for the standard "TIFFOpen()" "TIFFFdOpen", and "TIFFClose()" routines, called XTIFFOpen, XTIFFFdOpen and XTIFFClose. You must use these routines in order to have the extended tag handlers installed. Once installed, the standard TIFFGetField() and TIFFSetField routines may be used as before. Adding Extended Tags to "tools" ------------------------------- To create an extended-tag savvy "tiffinfo" program or other utility, you may simply recompile and link the tools to your "libxtiff" library, adding -DTIFFOpen=XTIFFOpen -DTIFFClose=XTIFFClose -DTIFFFdOpen=XTIFFFdOpen to the compile statement. Bugs, Comments Etc: ------------------ Send all reports and suggestions to ndr@tazboy.jpl.nasa.gov (Niles Ritter). tiff-4.0.3/contrib/tags/Makefile.am0000644000212300117540000000246610411004545014023 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. EXTRA_DIST = README listtif.c maketif.c xtif_dir.c xtiffio.h xtiffiop.h tiff-4.0.3/contrib/tags/maketif.c0000644000212300117540000000311511403510577013554 00000000000000/* * maketif.c -- creates a little TIFF file, with * the XTIFF extended tiff example tags. */ #include #include "xtiffio.h" void SetUpTIFFDirectory(TIFF *tif); void WriteImage(TIFF *tif); #define WIDTH 20 #define HEIGHT 20 void main() { TIFF *tif=(TIFF*)0; /* TIFF-level descriptor */ tif=XTIFFOpen("newtif.tif","w"); if (!tif) goto failure; SetUpTIFFDirectory(tif); WriteImage(tif); XTIFFClose(tif); exit (0); failure: printf("failure in maketif\n"); if (tif) XTIFFClose(tif); exit (-1); } void SetUpTIFFDirectory(TIFF *tif) { double mymulti[6]={0.0,1.0,2.0, 3.1415926, 5.0,1.0}; uint32 mysingle=3456; char *ascii="This file was produced by Steven Spielberg. NOT"; TIFFSetField(tif,TIFFTAG_IMAGEWIDTH,WIDTH); TIFFSetField(tif,TIFFTAG_IMAGELENGTH,HEIGHT); TIFFSetField(tif,TIFFTAG_COMPRESSION,COMPRESSION_NONE); TIFFSetField(tif,TIFFTAG_PHOTOMETRIC,PHOTOMETRIC_MINISBLACK); TIFFSetField(tif,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG); TIFFSetField(tif,TIFFTAG_BITSPERSAMPLE,8); TIFFSetField(tif,TIFFTAG_ROWSPERSTRIP,20); /* Install the extended TIFF tag examples */ TIFFSetField(tif,TIFFTAG_EXAMPLE_MULTI,6,mymulti); TIFFSetField(tif,TIFFTAG_EXAMPLE_SINGLE,mysingle); TIFFSetField(tif,TIFFTAG_EXAMPLE_ASCII,ascii); } void WriteImage(TIFF *tif) { int i; char buffer[WIDTH]; memset(buffer,0,sizeof(buffer)); for (i=0;itif_clientdata, "WriteImage","failure in WriteScanline\n"); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/tags/xtif_dir.c0000644000212300117540000002030611403510577013745 00000000000000/* * xtif_dir.c * * Extended TIFF Directory Tag Support. * * You may use this file as a template to add your own * extended tags to the library. Only the parts of the code * marked with "XXX" require modification. Three example tags * are shown; you should replace them with your own. * * Author: Niles D. Ritter */ #include "xtiffiop.h" #include /* Tiff info structure. * * Entry format: * { TAGNUMBER, ReadCount, WriteCount, DataType, FIELDNUM, * OkToChange, PassDirCountOnSet, AsciiName } * * For ReadCount, WriteCount, -1 = unknown; used for mult-valued * tags and ASCII. */ static const TIFFFieldInfo xtiffFieldInfo[] = { /* XXX Replace these example tags with your own extended tags */ { TIFFTAG_EXAMPLE_MULTI, -1,-1, TIFF_DOUBLE, FIELD_EXAMPLE_MULTI, TRUE, TRUE, "MyMultivaluedTag" }, { TIFFTAG_EXAMPLE_SINGLE, 1, 1, TIFF_LONG, FIELD_EXAMPLE_SINGLE, TRUE, FALSE, "MySingleLongTag" }, { TIFFTAG_EXAMPLE_ASCII, -1,-1, TIFF_ASCII, FIELD_EXAMPLE_ASCII, TRUE, FALSE, "MyAsciiTag" }, }; #define N(a) (sizeof (a) / sizeof (a[0])) static void _XTIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) { xtiff *xt = XTIFFDIR(tif); XTIFFDirectory *xd = &xt->xtif_dir; int i,num; /* call the inherited method */ if (PARENT(xt,printdir)) (PARENT(xt,printdir))(tif,fd,flags); /* XXX Add field printing here. Replace the three example * tags implemented below with your own. */ fprintf(fd,"--My Example Tags--\n"); /* Our first example tag may have a lot of values, so we * will only print them out if the TIFFPRINT_MYMULTIDOUBLES * flag is passed into the print method. */ if (TIFFFieldSet(tif,FIELD_EXAMPLE_MULTI)) { fprintf(fd, " My Multi-Valued Doubles:"); if (flags & TIFFPRINT_MYMULTIDOUBLES) { double *value = xd->xd_example_multi; num = xd->xd_num_multi; fprintf(fd,"("); for (i=0;ixd_example_single); } if (TIFFFieldSet(tif,FIELD_EXAMPLE_ASCII)) { _TIFFprintAsciiTag(fd,"My ASCII Tag", xd->xd_example_ascii); } } static int _XTIFFVSetField(TIFF* tif, ttag_t tag, va_list ap) { xtiff *xt = XTIFFDIR(tif); XTIFFDirectory* xd = &xt->xtif_dir; int status = 1; uint32 v32=0; int i=0, v=0; va_list ap1 = ap; /* va_start is called by the calling routine */ switch (tag) { /* * XXX put your extended tags here; replace the implemented * example tags with your own. */ case TIFFTAG_EXAMPLE_MULTI: /* multi-valued tags need to store the count as well */ xd->xd_num_multi = (uint16) va_arg(ap, int); _TIFFsetDoubleArray(&xd->xd_example_multi, va_arg(ap, double*), (long) xd->xd_num_multi); break; case TIFFTAG_EXAMPLE_SINGLE: xd->xd_example_single = va_arg(ap, uint32); break; case TIFFTAG_EXAMPLE_ASCII: _TIFFsetString(&xd->xd_example_ascii, va_arg(ap, char*)); break; default: /* call the inherited method */ return (PARENT(xt,vsetfield))(tif,tag,ap); break; } if (status) { /* we have to override the print method here, * after the compression tags have gotten to it. * This makes sense because the only time we would * need the extended print method is if an extended * tag is set by the reader. */ if (!(xt->xtif_flags & XTIFFP_PRINT)) { PARENT(xt,printdir) = TIFFMEMBER(tif,printdir); TIFFMEMBER(tif,printdir) = _XTIFFPrintDirectory; xt->xtif_flags |= XTIFFP_PRINT; } TIFFSetFieldBit(tif, _TIFFFieldWithTag(tif, tag)->field_bit); tif->tif_flags |= TIFF_DIRTYDIRECT; } va_end(ap); return (status); badvalue: TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%d: Bad value for \"%s\"", v, _TIFFFieldWithTag(tif, tag)->field_name); va_end(ap); return (0); badvalue32: TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%ld: Bad value for \"%s\"", v32, _TIFFFieldWithTag(tif, tag)->field_name); va_end(ap); return (0); } static int _XTIFFVGetField(TIFF* tif, ttag_t tag, va_list ap) { xtiff *xt = XTIFFDIR(tif); XTIFFDirectory* xd = &xt->xtif_dir; switch (tag) { /* * XXX put your extended tags here; replace the implemented * example tags with your own. */ case TIFFTAG_EXAMPLE_MULTI: *va_arg(ap, uint16*) = xd->xd_num_multi; *va_arg(ap, double**) = xd->xd_example_multi; break; case TIFFTAG_EXAMPLE_ASCII: *va_arg(ap, char**) = xd->xd_example_ascii; break; case TIFFTAG_EXAMPLE_SINGLE: *va_arg(ap, uint32*) = xd->xd_example_single; break; default: /* return inherited method */ return (PARENT(xt,vgetfield))(tif,tag,ap); break; } return (1); } #define CleanupField(member) { \ if (xd->member) { \ _TIFFfree(xd->member); \ xd->member = 0; \ } \ } /* * Release storage associated with a directory. */ static void _XTIFFFreeDirectory(xtiff* xt) { XTIFFDirectory* xd = &xt->xtif_dir; /* * XXX - Purge all Your allocated memory except * for the xtiff directory itself. This includes * all fields that require a _TIFFsetXXX call in * _XTIFFVSetField(). */ CleanupField(xd_example_multi); CleanupField(xd_example_ascii); } #undef CleanupField static void _XTIFFLocalDefaultDirectory(TIFF *tif) { xtiff *xt = XTIFFDIR(tif); XTIFFDirectory* xd = &xt->xtif_dir; /* Install the extended Tag field info */ _TIFFMergeFieldInfo(tif, xtiffFieldInfo, N(xtiffFieldInfo)); /* * free up any dynamically allocated arrays * before the new directory is read in. */ _XTIFFFreeDirectory(xt); _TIFFmemset(xt,0,sizeof(xtiff)); /* Override the tag access methods */ PARENT(xt,vsetfield) = TIFFMEMBER(tif,vsetfield); TIFFMEMBER(tif,vsetfield) = _XTIFFVSetField; PARENT(xt,vgetfield) = TIFFMEMBER(tif,vgetfield); TIFFMEMBER(tif,vgetfield) = _XTIFFVGetField; /* * XXX Set up any default values here. */ xd->xd_example_single = 234; } /********************************************************************** * Nothing below this line should need to be changed. **********************************************************************/ static TIFFExtendProc _ParentExtender; /* * This is the callback procedure, and is * called by the DefaultDirectory method * every time a new TIFF directory is opened. */ static void _XTIFFDefaultDirectory(TIFF *tif) { xtiff *xt; /* Allocate Directory Structure if first time, and install it */ if (!(tif->tif_flags & XTIFF_INITIALIZED)) { xt = _TIFFmalloc(sizeof(xtiff)); if (!xt) { /* handle memory allocation failure here ! */ return; } _TIFFmemset(xt,0,sizeof(xtiff)); /* * Install into TIFF structure. */ TIFFMEMBER(tif,clientdir) = (tidata_t)xt; tif->tif_flags |= XTIFF_INITIALIZED; /* dont do this again! */ } /* set up our own defaults */ _XTIFFLocalDefaultDirectory(tif); /* Since an XTIFF client module may have overridden * the default directory method, we call it now to * allow it to set up the rest of its own methods. */ if (_ParentExtender) (*_ParentExtender)(tif); } /* * XTIFF Initializer -- sets up the callback * procedure for the TIFF module. */ static void _XTIFFInitialize(void) { static first_time=1; if (! first_time) return; /* Been there. Done that. */ first_time = 0; /* Grab the inherited method and install */ _ParentExtender = TIFFSetTagExtender(_XTIFFDefaultDirectory); } /* * Public File I/O Routines. */ TIFF* XTIFFOpen(const char* name, const char* mode) { /* Set up the callback */ _XTIFFInitialize(); /* Open the file; the callback will set everything up */ return TIFFOpen(name, mode); } TIFF* XTIFFFdOpen(int fd, const char* name, const char* mode) { /* Set up the callback */ _XTIFFInitialize(); /* Open the file; the callback will set everything up */ return TIFFFdOpen(fd, name, mode); } void XTIFFClose(TIFF *tif) { xtiff *xt = XTIFFDIR(tif); /* call inherited function first */ TIFFClose(tif); /* Free up extended allocated memory */ _XTIFFFreeDirectory(xt); _TIFFfree(xt); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/tags/Makefile.in0000644000212300117540000003136012027361163014036 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = contrib/tags DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README listtif.c maketif.c xtif_dir.c xtiffio.h xtiffiop.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/tags/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/tags/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/contrib/tags/xtiffio.h0000644000212300117540000000274411403510577013620 00000000000000/* * xtiffio.h -- Public interface to Extended TIFF tags * * This is a template for defining a client module * which supports tag extensions to the standard libtiff * set. Only portions of the code marked "XXX" need to * be changed to support your tag set. * * written by: Niles D. Ritter */ #ifndef __xtiffio_h #define __xtiffio_h #include "tiffio.h" /* * XXX Define your private Tag names and values here */ /* These tags are not valid, but are provided for example */ #define TIFFTAG_EXAMPLE_MULTI 61234 #define TIFFTAG_EXAMPLE_SINGLE 61235 #define TIFFTAG_EXAMPLE_ASCII 61236 /* * XXX Define Printing method flags. These * flags may be passed in to TIFFPrintDirectory() to * indicate that those particular field values should * be printed out in full, rather than just an indicator * of whether they are present or not. */ #define TIFFPRINT_MYMULTIDOUBLES 0x80000000 /********************************************************************** * Nothing below this line should need to be changed by the user. **********************************************************************/ #if defined(__cplusplus) extern "C" { #endif extern TIFF* XTIFFOpen(const char* name, const char* mode); extern TIFF* XTIFFFdOpen(int fd, const char* name, const char* mode); extern void XTIFFClose(TIFF *tif); #if defined(__cplusplus) } #endif #endif /* __xtiffio_h */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/stream/0000755000212300117540000000000012027361331012400 500000000000000tiff-4.0.3/contrib/stream/tiffstream.cpp0000644000212300117540000001076111403510043015166 00000000000000// tiff stream interface class implementation #include "tiffstream.h" const char* TiffStream::m_name = "TiffStream"; TiffStream::TiffStream() { m_tif = NULL; m_inStream = NULL; m_outStream = NULL; m_ioStream = NULL; m_streamLength = 0; m_this = reinterpret_cast(this); }; TiffStream::~TiffStream() { if(m_tif != NULL) TIFFClose(m_tif); } TIFF* TiffStream::makeFileStream(istream* str) { m_inStream = str; m_outStream = NULL; m_ioStream = NULL; m_streamLength = getSize(m_this); m_tif = TIFFClientOpen(m_name, "r", m_this, read, write, seek, close, size, map, unmap); return m_tif; } TIFF* TiffStream::makeFileStream(ostream* str) { m_inStream = NULL; m_outStream = str; m_ioStream = NULL; m_streamLength = getSize(m_this); m_tif = TIFFClientOpen(m_name, "w", m_this, read, write, seek, close, size, map, unmap); return m_tif; } TIFF* TiffStream::makeFileStream(iostream* str) { m_inStream = NULL; m_outStream = NULL; m_ioStream = str; m_streamLength = getSize(m_this); m_tif = TIFFClientOpen(m_name, "r+w", m_this, read, write, seek, close, size, map, unmap); return m_tif; } tsize_t TiffStream::read(thandle_t fd, tdata_t buf, tsize_t size) { istream* istr; TiffStream* ts = reinterpret_cast(fd); if(ts->m_inStream != NULL) { istr = ts->m_inStream; } else if(ts->m_ioStream != NULL) { istr = ts->m_ioStream; } int remain = ts->m_streamLength - ts->tell(fd); int actual = remain < size ? remain : size; istr->read(reinterpret_cast(buf), actual); return istr->gcount(); } tsize_t TiffStream::write(thandle_t fd, tdata_t buf, tsize_t size) { TiffStream* ts = reinterpret_cast(fd); ostream* ostr; if(ts->m_outStream != NULL) { ostr = ts->m_outStream; } else if(ts->m_ioStream != NULL) { ostr = ts->m_ioStream; } streampos start = ostr->tellp(); ostr->write(reinterpret_cast(buf), size); return ostr->tellp() - start; } toff_t TiffStream::seek(thandle_t fd, toff_t offset, int origin) { TiffStream* ts = reinterpret_cast(fd); if(ts->seekInt(fd, offset, origin) == true) return offset; else return -1; } int TiffStream::close(thandle_t fd) { TiffStream* ts = reinterpret_cast(fd); if(ts->m_inStream != NULL) { ts->m_inStream = NULL; return 0; } else if(ts->m_outStream != NULL) { ts->m_outStream = NULL; return 0; } else if(ts->m_ioStream != NULL) { ts->m_ioStream = NULL; return 0; } return -1; } toff_t TiffStream::size(thandle_t fd) { TiffStream* ts = reinterpret_cast(fd); return ts->getSize(fd); } int TiffStream::map(thandle_t fd, tdata_t* phase, toff_t* psize) { return 0; } void TiffStream::unmap(thandle_t fd, tdata_t base, tsize_t size) { } unsigned int TiffStream::getSize(thandle_t fd) { if(!isOpen(fd)) return 0; unsigned int pos = tell(fd); seekInt(fd, 0, end); unsigned int size = tell(fd); seekInt(fd, pos, beg); return size; } unsigned int TiffStream::tell(thandle_t fd) { TiffStream* ts = reinterpret_cast(fd); if(ts->m_inStream != NULL) { return ts->m_inStream->tellg(); } else if(ts->m_outStream != NULL) { return ts->m_outStream->tellp(); } else if(ts->m_ioStream != NULL) { return ts->m_ioStream->tellg(); } return 0; } bool TiffStream::seekInt(thandle_t fd, unsigned int offset, int origin) { if(!isOpen(fd)) return false; ios::seek_dir org; switch(origin) { case beg: org = ios::beg; break; case cur: org = ios::cur; break; case end: org = ios::end; break; } TiffStream* ts = reinterpret_cast(fd); if(ts->m_inStream != NULL) { ts->m_inStream->seekg(offset, org); return true; } else if(ts->m_outStream != NULL) { ts->m_outStream->seekp(offset, org); return true; } else if(ts->m_ioStream != NULL) { ts->m_ioStream->seekg(offset, org); ts->m_ioStream->seekp(offset, org); return true; } return false; } bool TiffStream::isOpen(thandle_t fd) { TiffStream* ts = reinterpret_cast(fd); return (ts->m_inStream != NULL || ts->m_outStream != NULL || ts->m_ioStream != NULL); }/* * Local Variables: * mode: c++ * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/contrib/stream/README0000644000212300117540000000300707070746732013216 00000000000000Subject: tiff stream interface (contrib) Date: Thu, 30 Mar 2000 10:48:51 -0800 From: "Avi Bleiweiss" To: , Here at Shutterfly we have augmented the file based tiff library to support C++ streams. The implementation is an adaptor class, which takes any C++ stream from the user and in return it deposits i/o operation method pointers (e.g. read, write, seek and close) into the tiff's library client state. The class TiffStream has an overloaded factory method - makeFileStream - which takes the C++ stream as an argument, calls TIFFClientOpen and returns a tiff handle. The class retains the tiff handle in its local state and provides a helper function (getTiffHandle) to query the handle at any time. Additional helper method - getStreamSize - provides the stream size to the user. The implementation assumes client responsibility to delete the stream object. The class calls TIFFClose at destruction time. Attached are a definition (tiffstream.h) and an implementation (tiffstream.cpp) files of the TiffStream class. No changes are required to the tiff core piece and the class sits on top of the library. The code is fairly tested at this point and is used internally in Shutterfly imaging software. The code is portable across WindowsNT/Linux/Solaris. We at Shutterfly believe this software has benefits to the larger community of tiff library users and would like to contribute this software to be part of the tiff distributed package. Let me know of any issue. Thanks Avi tiff-4.0.3/contrib/stream/Makefile.in0000644000212300117540000003133612027361163014376 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = contrib/stream DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README tiffstream.cpp tiffstream.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/stream/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/stream/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/contrib/stream/Makefile.am0000644000212300117540000000243610411004545014355 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. EXTRA_DIST = README tiffstream.cpp tiffstream.h tiff-4.0.3/contrib/stream/tiffstream.h0000644000212300117540000000265011403510662014640 00000000000000// tiff stream interface class definition #ifndef _TIFF_STREAM_H_ #define _TIFF_STREAM_H_ #include #include "tiffio.h" class TiffStream { public: // ctor/dtor TiffStream(); ~TiffStream(); public: enum SeekDir { beg, cur, end, }; public: // factory methods TIFF* makeFileStream(iostream* str); TIFF* makeFileStream(istream* str); TIFF* makeFileStream(ostream* str); public: // tiff client methods static tsize_t read(thandle_t fd, tdata_t buf, tsize_t size); static tsize_t write(thandle_t fd, tdata_t buf, tsize_t size); static toff_t seek(thandle_t fd, toff_t offset, int origin); static toff_t size(thandle_t fd); static int close(thandle_t fd); static int map(thandle_t fd, tdata_t* phase, toff_t* psize); static void unmap(thandle_t fd, tdata_t base, tsize_t size); public: // query method TIFF* getTiffHandle() const { return m_tif; } unsigned int getStreamLength() { return m_streamLength; } private: // internal methods unsigned int getSize(thandle_t fd); unsigned int tell(thandle_t fd); bool seekInt(thandle_t fd, unsigned int offset, int origin); bool isOpen(thandle_t fd); private: thandle_t m_this; TIFF* m_tif; static const char* m_name; istream* m_inStream; ostream* m_outStream; iostream* m_ioStream; int m_streamLength; }; #endif // _TIFF_STREAM_H_ /* * Local Variables: * mode: c++ * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/README.vms0000644000212300117540000000063710422165301011053 00000000000000Dear OpenVMS user to make this library, execute $@CONFIGURE $@BUILD Build process should be error and warning free. When process will be finished, LIBTIFF$STRATUP.COM file containing all required definitions, will be created. Please call it from system startup procedure or individual user procedure LOGIN.COM To link software with libtiff, use TIFF:LIBTIFF.OPT best regards, Alexey Chupahin, elvis_75@mail.ru tiff-4.0.3/tools/0000755000212300117540000000000012027361330010604 500000000000000tiff-4.0.3/tools/fax2tiff.c0000644000212300117540000003363411345765561012432 00000000000000/* $Id: fax2tiff.c,v 1.22 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1990-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * Convert a CCITT Group 3 or 4 FAX file to TIFF Group 3 or 4 format. */ #include "tif_config.h" #include #include /* should have atof & getopt */ #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_IO_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffiop.h" #ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 #endif #ifndef EXIT_FAILURE # define EXIT_FAILURE 1 #endif #define TIFFhowmany8(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3) TIFF *faxTIFF; char *rowbuf; char *refbuf; uint32 xsize = 1728; int verbose; int stretch; uint16 badfaxrun; uint32 badfaxlines; int copyFaxFile(TIFF* tifin, TIFF* tifout); static void usage(void); int main(int argc, char* argv[]) { FILE *in; TIFF *out = NULL; TIFFErrorHandler whandler = NULL; int compression_in = COMPRESSION_CCITTFAX3; int compression_out = COMPRESSION_CCITTFAX3; int fillorder_in = FILLORDER_LSB2MSB; int fillorder_out = FILLORDER_LSB2MSB; uint32 group3options_in = 0; /* 1d-encoded */ uint32 group3options_out = 0; /* 1d-encoded */ uint32 group4options_in = 0; /* compressed */ uint32 group4options_out = 0; /* compressed */ uint32 defrowsperstrip = (uint32) 0; uint32 rowsperstrip; int photometric_in = PHOTOMETRIC_MINISWHITE; int photometric_out = PHOTOMETRIC_MINISWHITE; int mode = FAXMODE_CLASSF; int rows; int c; int pn, npages; float resY = 196.0; extern int optind; extern char* optarg; while ((c = getopt(argc, argv, "R:X:o:1234ABLMPUW5678abcflmprsuvwz?")) != -1) switch (c) { /* input-related options */ case '3': /* input is g3-encoded */ compression_in = COMPRESSION_CCITTFAX3; break; case '4': /* input is g4-encoded */ compression_in = COMPRESSION_CCITTFAX4; break; case 'U': /* input is uncompressed (g3 and g4) */ group3options_in |= GROUP3OPT_UNCOMPRESSED; group4options_in |= GROUP4OPT_UNCOMPRESSED; break; case '1': /* input is 1d-encoded (g3 only) */ group3options_in &= ~GROUP3OPT_2DENCODING; break; case '2': /* input is 2d-encoded (g3 only) */ group3options_in |= GROUP3OPT_2DENCODING; break; case 'P': /* input has not-aligned EOL (g3 only) */ group3options_in &= ~GROUP3OPT_FILLBITS; break; case 'A': /* input has aligned EOL (g3 only) */ group3options_in |= GROUP3OPT_FILLBITS; break; case 'W': /* input has 0 mean white */ photometric_in = PHOTOMETRIC_MINISWHITE; break; case 'B': /* input has 0 mean black */ photometric_in = PHOTOMETRIC_MINISBLACK; break; case 'L': /* input has lsb-to-msb fillorder */ fillorder_in = FILLORDER_LSB2MSB; break; case 'M': /* input has msb-to-lsb fillorder */ fillorder_in = FILLORDER_MSB2LSB; break; case 'R': /* input resolution */ resY = (float) atof(optarg); break; case 'X': /* input width */ xsize = (uint32) atoi(optarg); break; /* output-related options */ case '7': /* generate g3-encoded output */ compression_out = COMPRESSION_CCITTFAX3; break; case '8': /* generate g4-encoded output */ compression_out = COMPRESSION_CCITTFAX4; break; case 'u': /* generate uncompressed output (g3 and g4) */ group3options_out |= GROUP3OPT_UNCOMPRESSED; group4options_out |= GROUP4OPT_UNCOMPRESSED; break; case '5': /* generate 1d-encoded output (g3 only) */ group3options_out &= ~GROUP3OPT_2DENCODING; break; case '6': /* generate 2d-encoded output (g3 only) */ group3options_out |= GROUP3OPT_2DENCODING; break; case 'c': /* generate "classic" g3 format */ mode = FAXMODE_CLASSIC; break; case 'f': /* generate Class F format */ mode = FAXMODE_CLASSF; break; case 'm': /* output's fillorder is msb-to-lsb */ fillorder_out = FILLORDER_MSB2LSB; break; case 'l': /* output's fillorder is lsb-to-msb */ fillorder_out = FILLORDER_LSB2MSB; break; case 'o': out = TIFFOpen(optarg, "w"); if (out == NULL) { fprintf(stderr, "%s: Can not create or open %s\n", argv[0], optarg); return EXIT_FAILURE; } break; case 'a': /* generate EOL-aligned output (g3 only) */ group3options_out |= GROUP3OPT_FILLBITS; break; case 'p': /* generate not EOL-aligned output (g3 only) */ group3options_out &= ~GROUP3OPT_FILLBITS; break; case 'r': /* rows/strip */ defrowsperstrip = atol(optarg); break; case 's': /* stretch image by dup'ng scanlines */ stretch = 1; break; case 'w': /* undocumented -- for testing */ photometric_out = PHOTOMETRIC_MINISWHITE; break; case 'b': /* undocumented -- for testing */ photometric_out = PHOTOMETRIC_MINISBLACK; break; case 'z': /* undocumented -- for testing */ compression_out = COMPRESSION_LZW; break; case 'v': /* -v for info */ verbose++; break; case '?': usage(); /*NOTREACHED*/ } npages = argc - optind; if (npages < 1) usage(); rowbuf = _TIFFmalloc(TIFFhowmany8(xsize)); refbuf = _TIFFmalloc(TIFFhowmany8(xsize)); if (rowbuf == NULL || refbuf == NULL) { fprintf(stderr, "%s: Not enough memory\n", argv[0]); return (EXIT_FAILURE); } if (out == NULL) { out = TIFFOpen("fax.tif", "w"); if (out == NULL) { fprintf(stderr, "%s: Can not create fax.tif\n", argv[0]); return (EXIT_FAILURE); } } faxTIFF = TIFFClientOpen("(FakeInput)", "w", /* TIFFClientOpen() fails if we don't set existing value here */ TIFFClientdata(out), TIFFGetReadProc(out), TIFFGetWriteProc(out), TIFFGetSeekProc(out), TIFFGetCloseProc(out), TIFFGetSizeProc(out), TIFFGetMapFileProc(out), TIFFGetUnmapFileProc(out)); if (faxTIFF == NULL) { fprintf(stderr, "%s: Can not create fake input file\n", argv[0]); return (EXIT_FAILURE); } TIFFSetMode(faxTIFF, O_RDONLY); TIFFSetField(faxTIFF, TIFFTAG_IMAGEWIDTH, xsize); TIFFSetField(faxTIFF, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(faxTIFF, TIFFTAG_BITSPERSAMPLE, 1); TIFFSetField(faxTIFF, TIFFTAG_FILLORDER, fillorder_in); TIFFSetField(faxTIFF, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(faxTIFF, TIFFTAG_PHOTOMETRIC, photometric_in); TIFFSetField(faxTIFF, TIFFTAG_YRESOLUTION, resY); TIFFSetField(faxTIFF, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); /* NB: this must be done after directory info is setup */ TIFFSetField(faxTIFF, TIFFTAG_COMPRESSION, compression_in); if (compression_in == COMPRESSION_CCITTFAX3) TIFFSetField(faxTIFF, TIFFTAG_GROUP3OPTIONS, group3options_in); else if (compression_in == COMPRESSION_CCITTFAX4) TIFFSetField(faxTIFF, TIFFTAG_GROUP4OPTIONS, group4options_in); for (pn = 0; optind < argc; pn++, optind++) { in = fopen(argv[optind], "rb"); if (in == NULL) { fprintf(stderr, "%s: %s: Can not open\n", argv[0], argv[optind]); continue; } #if defined(_WIN32) && defined(USE_WIN32_FILEIO) TIFFSetClientdata(faxTIFF, (thandle_t)_get_osfhandle(fileno(in))); #else TIFFSetClientdata(faxTIFF, (thandle_t)fileno(in)); #endif TIFFSetFileName(faxTIFF, (const char*)argv[optind]); TIFFSetField(out, TIFFTAG_IMAGEWIDTH, xsize); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 1); TIFFSetField(out, TIFFTAG_COMPRESSION, compression_out); TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric_out); TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 1); switch (compression_out) { /* g3 */ case COMPRESSION_CCITTFAX3: TIFFSetField(out, TIFFTAG_GROUP3OPTIONS, group3options_out); TIFFSetField(out, TIFFTAG_FAXMODE, mode); rowsperstrip = (defrowsperstrip)?defrowsperstrip:(uint32)-1L; break; /* g4 */ case COMPRESSION_CCITTFAX4: TIFFSetField(out, TIFFTAG_GROUP4OPTIONS, group4options_out); TIFFSetField(out, TIFFTAG_FAXMODE, mode); rowsperstrip = (defrowsperstrip)?defrowsperstrip:(uint32)-1L; break; default: rowsperstrip = (defrowsperstrip) ? defrowsperstrip : TIFFDefaultStripSize(out, 0); } TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip); TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(out, TIFFTAG_FILLORDER, fillorder_out); TIFFSetField(out, TIFFTAG_SOFTWARE, "fax2tiff"); TIFFSetField(out, TIFFTAG_XRESOLUTION, 204.0); if (!stretch) { TIFFGetField(faxTIFF, TIFFTAG_YRESOLUTION, &resY); TIFFSetField(out, TIFFTAG_YRESOLUTION, resY); } else TIFFSetField(out, TIFFTAG_YRESOLUTION, 196.); TIFFSetField(out, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); TIFFSetField(out, TIFFTAG_PAGENUMBER, pn, npages); if (!verbose) whandler = TIFFSetWarningHandler(NULL); rows = copyFaxFile(faxTIFF, out); fclose(in); if (!verbose) (void) TIFFSetWarningHandler(whandler); TIFFSetField(out, TIFFTAG_IMAGELENGTH, rows); if (verbose) { fprintf(stderr, "%s:\n", argv[optind]); fprintf(stderr, "%d rows in input\n", rows); fprintf(stderr, "%ld total bad rows\n", (long) badfaxlines); fprintf(stderr, "%d max consecutive bad rows\n", badfaxrun); } if (compression_out == COMPRESSION_CCITTFAX3 && mode == FAXMODE_CLASSF) { TIFFSetField(out, TIFFTAG_BADFAXLINES, badfaxlines); TIFFSetField(out, TIFFTAG_CLEANFAXDATA, badfaxlines ? CLEANFAXDATA_REGENERATED : CLEANFAXDATA_CLEAN); TIFFSetField(out, TIFFTAG_CONSECUTIVEBADFAXLINES, badfaxrun); } TIFFWriteDirectory(out); } TIFFClose(out); _TIFFfree(rowbuf); _TIFFfree(refbuf); return (EXIT_SUCCESS); } int copyFaxFile(TIFF* tifin, TIFF* tifout) { uint32 row; uint32 linesize = TIFFhowmany8(xsize); uint16 badrun; int ok; tifin->tif_rawdatasize = (tmsize_t)TIFFGetFileSize(tifin); tifin->tif_rawdata = _TIFFmalloc(tifin->tif_rawdatasize); if (tifin->tif_rawdata == NULL) { TIFFError(tifin->tif_name, "Not enough memory"); return (0); } if (!ReadOK(tifin, tifin->tif_rawdata, tifin->tif_rawdatasize)) { TIFFError(tifin->tif_name, "Read error at scanline 0"); return (0); } tifin->tif_rawcp = tifin->tif_rawdata; tifin->tif_rawcc = tifin->tif_rawdatasize; (*tifin->tif_setupdecode)(tifin); (*tifin->tif_predecode)(tifin, (tsample_t) 0); tifin->tif_row = 0; badfaxlines = 0; badfaxrun = 0; _TIFFmemset(refbuf, 0, linesize); row = 0; badrun = 0; /* current run of bad lines */ while (tifin->tif_rawcc > 0) { ok = (*tifin->tif_decoderow)(tifin, (tdata_t) rowbuf, linesize, 0); if (!ok) { badfaxlines++; badrun++; /* regenerate line from previous good line */ _TIFFmemcpy(rowbuf, refbuf, linesize); } else { if (badrun > badfaxrun) badfaxrun = badrun; badrun = 0; _TIFFmemcpy(refbuf, rowbuf, linesize); } tifin->tif_row++; if (TIFFWriteScanline(tifout, rowbuf, row, 0) < 0) { fprintf(stderr, "%s: Write error at row %ld.\n", tifout->tif_name, (long) row); break; } row++; if (stretch) { if (TIFFWriteScanline(tifout, rowbuf, row, 0) < 0) { fprintf(stderr, "%s: Write error at row %ld.\n", tifout->tif_name, (long) row); break; } row++; } } if (badrun > badfaxrun) badfaxrun = badrun; _TIFFfree(tifin->tif_rawdata); return (row); } char* stuff[] = { "usage: fax2tiff [options] input.raw...", "where options are:", " -3 input data is G3-encoded [default]", " -4 input data is G4-encoded", " -U input data is uncompressed (G3 or G4)", " -1 input data is 1D-encoded (G3 only) [default]", " -2 input data is 2D-encoded (G3 only)", " -P input is not EOL-aligned (G3 only) [default]", " -A input is EOL-aligned (G3 only)", " -M input data has MSB2LSB bit order", " -L input data has LSB2MSB bit order [default]", " -B input data has min 0 means black", " -W input data has min 0 means white [default]", " -R # input data has # resolution (lines/inch) [default is 196]", " -X # input data has # width [default is 1728]", "", " -o out.tif write output to out.tif", " -7 generate G3-encoded output [default]", " -8 generate G4-encoded output", " -u generate uncompressed output (G3 or G4)", " -5 generate 1D-encoded output (G3 only)", " -6 generate 2D-encoded output (G3 only) [default]", " -p generate not EOL-aligned output (G3 only)", " -a generate EOL-aligned output (G3 only) [default]", " -c generate \"classic\" TIFF format", " -f generate TIFF Class F (TIFF/F) format [default]", " -m output fill order is MSB2LSB", " -l output fill order is LSB2MSB [default]", " -r # make each strip have no more than # rows", " -s stretch image by duplicating scanlines", " -v print information about conversion work", " -z generate LZW compressed output", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(EXIT_FAILURE); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/tiffset.c0000644000212300117540000003110412005263022012326 00000000000000/****************************************************************************** * $Id: tiffset.c,v 1.17 2012-07-29 15:45:30 tgl Exp $ * * Project: libtiff tools * Purpose: Mainline for setting metadata in existing TIFF files. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. ****************************************************************************** */ #include #include #include #include "tiffio.h" static char* usageMsg[] = { "usage: tiffset [options] filename", "where options are:", " -s [count] ... set the tag value", " -d set the directory", " -sd set the subdirectory", " -sf read the tag value from file (for ASCII tags only)", NULL }; static void usage(void) { int i; for (i = 0; usageMsg[i]; i++) fprintf(stderr, "%s\n", usageMsg[i]); exit(-1); } static const TIFFField * GetField(TIFF *tiff, const char *tagname) { const TIFFField *fip; if( atoi(tagname) > 0 ) fip = TIFFFieldWithTag(tiff, (ttag_t)atoi(tagname)); else fip = TIFFFieldWithName(tiff, tagname); if (!fip) { fprintf( stderr, "Field name \"%s\" is not recognised.\n", tagname ); return (TIFFField *)NULL; } return fip; } int main(int argc, char* argv[]) { TIFF *tiff; int arg_index; if (argc < 2) usage(); tiff = TIFFOpen(argv[argc-1], "r+"); if (tiff == NULL) return 2; for( arg_index = 1; arg_index < argc-1; arg_index++ ) { if (strcmp(argv[arg_index],"-d") == 0 && arg_index < argc-2) { arg_index++; if( TIFFSetDirectory(tiff, atoi(argv[arg_index]) ) != 1 ) { fprintf( stderr, "Failed to set directory=%s\n", argv[arg_index] ); return 6; } arg_index++; } if (strcmp(argv[arg_index],"-sd") == 0 && arg_index < argc-2) { arg_index++; if( TIFFSetSubDirectory(tiff, atoi(argv[arg_index]) ) != 1 ) { fprintf( stderr, "Failed to set sub directory=%s\n", argv[arg_index] ); return 7; } arg_index++; } if (strcmp(argv[arg_index],"-s") == 0 && arg_index < argc-3) { const TIFFField *fip; const char *tagname; arg_index++; tagname = argv[arg_index]; fip = GetField(tiff, tagname); if (!fip) return 3; arg_index++; if (TIFFFieldDataType(fip) == TIFF_ASCII) { if (TIFFSetField(tiff, TIFFFieldTag(fip), argv[arg_index]) != 1) fprintf( stderr, "Failed to set %s=%s\n", TIFFFieldName(fip), argv[arg_index] ); } else if (TIFFFieldWriteCount(fip) > 0 || TIFFFieldWriteCount(fip) == TIFF_VARIABLE) { int ret = 1; short wc; if (TIFFFieldWriteCount(fip) == TIFF_VARIABLE) wc = atoi(argv[arg_index++]); else wc = TIFFFieldWriteCount(fip); if (argc - arg_index < wc) { fprintf( stderr, "Number of tag values is not enough. " "Expected %d values for %s tag, got %d\n", wc, TIFFFieldName(fip), argc - arg_index); return 4; } if (wc > 1) { int i, size; void *array; switch (TIFFFieldDataType(fip)) { /* * XXX: We can't use TIFFDataWidth() * to determine the space needed to store * the value. For TIFF_RATIONAL values * TIFFDataWidth() returns 8, but we use 4-byte * float to represent rationals. */ case TIFF_BYTE: case TIFF_ASCII: case TIFF_SBYTE: case TIFF_UNDEFINED: default: size = 1; break; case TIFF_SHORT: case TIFF_SSHORT: size = 2; break; case TIFF_LONG: case TIFF_SLONG: case TIFF_FLOAT: case TIFF_IFD: case TIFF_RATIONAL: case TIFF_SRATIONAL: size = 4; break; case TIFF_DOUBLE: size = 8; break; } array = _TIFFmalloc(wc * size); if (!array) { fprintf(stderr, "No space for %s tag\n", tagname); return 4; } switch (TIFFFieldDataType(fip)) { case TIFF_BYTE: for (i = 0; i < wc; i++) ((uint8 *)array)[i] = atoi(argv[arg_index+i]); break; case TIFF_SHORT: for (i = 0; i < wc; i++) ((uint16 *)array)[i] = atoi(argv[arg_index+i]); break; case TIFF_SBYTE: for (i = 0; i < wc; i++) ((int8 *)array)[i] = atoi(argv[arg_index+i]); break; case TIFF_SSHORT: for (i = 0; i < wc; i++) ((int16 *)array)[i] = atoi(argv[arg_index+i]); break; case TIFF_LONG: for (i = 0; i < wc; i++) ((uint32 *)array)[i] = atol(argv[arg_index+i]); break; case TIFF_SLONG: case TIFF_IFD: for (i = 0; i < wc; i++) ((uint32 *)array)[i] = atol(argv[arg_index+i]); break; case TIFF_DOUBLE: for (i = 0; i < wc; i++) ((double *)array)[i] = atof(argv[arg_index+i]); break; case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: for (i = 0; i < wc; i++) ((float *)array)[i] = (float)atof(argv[arg_index+i]); break; default: break; } if (TIFFFieldPassCount(fip)) { ret = TIFFSetField(tiff, TIFFFieldTag(fip), wc, array); } else if (TIFFFieldTag(fip) == TIFFTAG_PAGENUMBER || TIFFFieldTag(fip) == TIFFTAG_HALFTONEHINTS || TIFFFieldTag(fip) == TIFFTAG_YCBCRSUBSAMPLING || TIFFFieldTag(fip) == TIFFTAG_DOTRANGE) { if (TIFFFieldDataType(fip) == TIFF_BYTE) { ret = TIFFSetField(tiff, TIFFFieldTag(fip), ((uint8 *)array)[0], ((uint8 *)array)[1]); } else if (TIFFFieldDataType(fip) == TIFF_SHORT) { ret = TIFFSetField(tiff, TIFFFieldTag(fip), ((uint16 *)array)[0], ((uint16 *)array)[1]); } } else { ret = TIFFSetField(tiff, TIFFFieldTag(fip), array); } _TIFFfree(array); } else { switch (TIFFFieldDataType(fip)) { case TIFF_BYTE: case TIFF_SHORT: case TIFF_SBYTE: case TIFF_SSHORT: ret = TIFFSetField(tiff, TIFFFieldTag(fip), atoi(argv[arg_index++])); break; case TIFF_LONG: case TIFF_SLONG: case TIFF_IFD: ret = TIFFSetField(tiff, TIFFFieldTag(fip), atol(argv[arg_index++])); break; case TIFF_DOUBLE: ret = TIFFSetField(tiff, TIFFFieldTag(fip), atof(argv[arg_index++])); break; case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: ret = TIFFSetField(tiff, TIFFFieldTag(fip), (float)atof(argv[arg_index++])); break; default: break; } } if (ret != 1) fprintf(stderr, "Failed to set %s\n", TIFFFieldName(fip)); arg_index += wc; } } else if (strcmp(argv[arg_index],"-sf") == 0 && arg_index < argc-3) { FILE *fp; const TIFFField *fip; char *text; size_t len; arg_index++; fip = GetField(tiff, argv[arg_index]); if (!fip) return 3; if (TIFFFieldDataType(fip) != TIFF_ASCII) { fprintf( stderr, "Only ASCII tags can be set from file. " "%s is not ASCII tag.\n", TIFFFieldName(fip) ); return 5; } arg_index++; fp = fopen( argv[arg_index], "rt" ); if(fp == NULL) { perror( argv[arg_index] ); continue; } text = (char *) malloc(1000000); len = fread( text, 1, 999999, fp ); text[len] = '\0'; fclose( fp ); if(TIFFSetField( tiff, TIFFFieldTag(fip), text ) != 1) { fprintf(stderr, "Failed to set %s from file %s\n", TIFFFieldName(fip), argv[arg_index]); } _TIFFfree( text ); arg_index++; } else { fprintf(stderr, "Unrecognised option: %s\n", argv[arg_index]); usage(); } } TIFFRewriteDirectory(tiff); TIFFClose(tiff); return 0; } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/gif2tiff.c0000644000212300117540000003207711502035625012403 00000000000000/* $Id: gif2tiff.c,v 1.12 2010-12-15 00:22:44 faxguy Exp $ */ /* * Copyright (c) 1990-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * convert a GIF file into a TIFF file. * based on Paul Haeberli's fromgif program which in turn is * based on a GIF file reader by Marcel J.E. Mol March 23 1989 * * if input is 320 by 200 pixel aspect is probably 1.2 * if input is 640 350 pixel aspect is probably 1.37 * */ #include "tif_config.h" #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" #define GIFGAMMA (1.5) /* smaller makes output img brighter */ #define IMAX 0xffff /* max intensity value */ #define EXTRAFUDGE 128 /* some people write BAD .gif files */ #define streq(a,b) (strcmp(a,b) == 0) #define strneq(a,b,n) (strncmp(a,b,n) == 0) unsigned short gamtab[256]; void makegamtab(float gam) { int i; for(i=0; i<256; i++) gamtab[i] = (unsigned short) (IMAX*pow(i/255.0,gam)+0.5); } char* stuff[] = { "usage: gif2tiff [options] input.gif output.tif", "where options are:", " -r # make each strip have no more than # rows", "", " -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", " -c zip[:opts] compress output with deflate encoding", " -c packbits compress output with packbits encoding", " -c none use no compression algorithm on output", "", "LZW and deflate options:", " # set predictor value", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } #define COLSIZE 256 unsigned char *stackp; unsigned int prefix[4096]; unsigned char suffix[4096]; unsigned char stack[4096]; int datasize,codesize,codemask; /* Decoder working variables */ int clear,eoi; /* Special code values */ int avail, oldcode; FILE *infile; int global; /* Is there a global color map? */ int globalbits; /* Number of bits of global colors */ unsigned char globalmap[COLSIZE][3];/* RGB values for global color map */ unsigned char *raster; /* Decoded image data */ unsigned long width, height; unsigned short red[COLSIZE]; unsigned short green[COLSIZE]; unsigned short blue[COLSIZE]; char *filename, *imagename; static uint16 compression = COMPRESSION_PACKBITS; static uint16 predictor = 0; static uint32 rowsperstrip = (uint32) -1; static int processCompressOptions(char*); int convert(void); int checksignature(void); void readscreen(void); int readgifimage(char*); void readextension(void); int readraster(void); int process(int, unsigned char**); void initcolors(unsigned char [COLSIZE][3], int); void rasterize(int, char*); int main(int argc, char* argv[]) { extern int optind; extern char *optarg; int c, status; while ((c = getopt(argc, argv, "c:r:")) != -1) switch (c) { case 'c': /* compression scheme */ if (!processCompressOptions(optarg)) usage(); break; case 'r': /* rows/strip */ rowsperstrip = atoi(optarg); break; case '?': usage(); /*NOTREACHED*/ } if (argc - optind != 2) usage(); makegamtab(GIFGAMMA); filename = argv[optind]; imagename = argv[optind+1]; if ((infile = fopen(imagename, "rb")) != NULL) { int c; fclose(infile); printf("overwrite %s? ", imagename); fflush(stdout); c = getc(stdin); if (c != 'y' && c != 'Y') return (1); } if ((infile = fopen(filename, "rb")) == NULL) { perror(filename); return (1); } status = convert(); fclose(infile); return (status); } static int processCompressOptions(char* opt) { if (streq(opt, "none")) compression = COMPRESSION_NONE; else if (streq(opt, "packbits")) compression = COMPRESSION_PACKBITS; else if (strneq(opt, "lzw", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_LZW; } else if (strneq(opt, "zip", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_DEFLATE; } else return (0); return (1); } int convert(void) { int ch; char* mode = "w"; if (!checksignature()) return (-1); readscreen(); while ((ch = getc(infile)) != ';' && ch != EOF) { switch (ch) { case '\0': break; /* this kludge for non-standard files */ case ',': if (!readgifimage(mode)) return (-1); mode = "a"; /* subsequent images append */ break; case '!': readextension(); break; default: fprintf(stderr, "illegal GIF block type\n"); return (-1); } } return (0); } int checksignature(void) { char buf[6]; fread(buf,1,6,infile); if (strncmp(buf,"GIF",3)) { fprintf(stderr, "file is not a GIF file\n"); return 0; } if (strncmp(&buf[3],"87a",3)) { fprintf(stderr, "unknown GIF version number\n"); return 0; } return 1; } /* * readscreen - * Get information which is global to all the images stored * in the file */ void readscreen(void) { unsigned char buf[7]; fread(buf,1,7,infile); global = buf[4] & 0x80; if (global) { globalbits = (buf[4] & 0x07) + 1; fread(globalmap,3,((size_t)1)< 0; count = getc(infile)) { fread(buf,1,count,infile); for (ch=buf; count-- > 0; ch++) { datum += (unsigned long) *ch << bits; bits += 8; while (bits >= codesize) { code = datum & codemask; datum >>= codesize; bits -= codesize; if (code == eoi) { /* This kludge put in */ goto exitloop; /* because some GIF files*/ } /* aren't standard */ if (!process(code, &fill)) { status = 0; goto exitloop; } } } if (fill >= raster + width*height) { fprintf(stderr, "raster full before eoi code\n"); break; } } exitloop: if (fill != raster + width*height) { fprintf(stderr, "warning: wrong rastersize: %ld bytes\n", (long) (fill-raster)); fprintf(stderr, " instead of %ld bytes\n", (long) width*height); } return status; } /* * process - * Process a compression code. "clear" resets the code table. * Otherwise make a new code table entry, and output the bytes * associated with the code. */ int process(register int code, unsigned char** fill) { int incode; static unsigned char firstchar; if (code == clear) { codesize = datasize + 1; codemask = (1 << codesize) - 1; avail = clear + 2; oldcode = -1; return 1; } if (oldcode == -1) { *(*fill)++ = suffix[code]; firstchar = oldcode = code; return 1; } if (code > avail) { fprintf(stderr, "code %d too large for %d\n", code, avail); return 0; } incode = code; if (code == avail) { /* the first code is always < avail */ *stackp++ = firstchar; code = oldcode; } while (code > clear) { *stackp++ = suffix[code]; code = prefix[code]; } *stackp++ = firstchar = suffix[code]; prefix[avail] = oldcode; suffix[avail] = firstchar; avail++; if (((avail & codemask) == 0) && (avail < 4096)) { codesize++; codemask += avail; } oldcode = incode; do { *(*fill)++ = *--stackp; } while (stackp > stack); return 1; } /* * initcolors - * Convert a color map (local or global) to arrays with R, G and B * values. * */ void initcolors(unsigned char colormap[COLSIZE][3], int ncolors) { register int i; for (i = 0; i < ncolors; i++) { red[i] = gamtab[colormap[i][0]]; green[i] = gamtab[colormap[i][1]]; blue[i] = gamtab[colormap[i][2]]; } } void rasterize(int interleaved, char* mode) { register unsigned long row; unsigned char *newras; unsigned char *ras; TIFF *tif; tstrip_t strip; tsize_t stripsize; if ((newras = (unsigned char*) _TIFFmalloc(width*height+EXTRAFUDGE)) == NULL) { fprintf(stderr, "not enough memory for image\n"); return; } #define DRAWSEGMENT(offset, step) { \ for (row = offset; row < height; row += step) { \ _TIFFmemcpy(newras + row*width, ras, width);\ ras += width; \ } \ } ras = raster; if (interleaved) { DRAWSEGMENT(0, 8); DRAWSEGMENT(4, 8); DRAWSEGMENT(2, 4); DRAWSEGMENT(1, 2); } else DRAWSEGMENT(0, 1); #undef DRAWSEGMENT tif = TIFFOpen(imagename, mode); if (!tif) { TIFFError(imagename,"Can not open output image"); exit(-1); } TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, (uint32) width); TIFFSetField(tif, TIFFTAG_IMAGELENGTH, (uint32) height); TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE); TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip = TIFFDefaultStripSize(tif, rowsperstrip)); TIFFSetField(tif, TIFFTAG_COMPRESSION, compression); switch (compression) { case COMPRESSION_LZW: case COMPRESSION_DEFLATE: if (predictor != 0) TIFFSetField(tif, TIFFTAG_PREDICTOR, predictor); break; } TIFFSetField(tif, TIFFTAG_COLORMAP, red, green, blue); TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); strip = 0; stripsize = TIFFStripSize(tif); for (row=0; row height-row) { rowsperstrip = height-row; stripsize = TIFFVStripSize(tif, rowsperstrip); } if (TIFFWriteEncodedStrip(tif, strip, newras+row*width, stripsize) < 0) break; strip++; } TIFFClose(tif); _TIFFfree(newras); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/rasterfile.h0000644000212300117540000000344007754503231013047 00000000000000/* $Header: /cvs/libtiff/tools/rasterfile.h,v 1.3 2003/11/12 19:14:33 dron Exp $ */ /* * Description of header for files containing raster images */ struct rasterfile { char ras_magic[4]; /* magic number */ long ras_width; /* width (pixels) of image */ long ras_height; /* height (pixels) of image */ long ras_depth; /* depth (1, 8, or 24 bits) of pixel */ long ras_length; /* length (bytes) of image */ long ras_type; /* type of file; see RT_* below */ long ras_maptype; /* type of colormap; see RMT_* below */ long ras_maplength; /* length (bytes) of following map */ /* color map follows for ras_maplength bytes, followed by image */ }; #define RAS_MAGIC "\x59\xa6\x6a\x95" #define RAS_MAGIC_INV "\x95\x6a\xa6\x59" /* Sun supported ras_type's */ #define RT_OLD 0 /* Raw pixrect image in 68000 byte order */ #define RT_STANDARD 1 /* Raw pixrect image in 68000 byte order */ #define RT_BYTE_ENCODED 2 /* Run-length compression of bytes */ #define RT_EXPERIMENTAL 0xffff /* Reserved for testing */ /* Sun registered ras_maptype's */ #define RMT_RAW 2 /* Sun supported ras_maptype's */ #define RMT_NONE 0 /* ras_maplength is expected to be 0 */ #define RMT_EQUAL_RGB 1 /* red[ras_maplength/3],green[],blue[] */ /* * NOTES: * Each line of the image is rounded out to a multiple of 16 bits. * This corresponds to the rounding convention used by the memory pixrect * package (/usr/include/pixrect/memvar.h) of the SunWindows system. * The ras_encoding field (always set to 0 by Sun's supported software) * was renamed to ras_length in release 2.0. As a result, rasterfiles * of type 0 generated by the old software claim to have 0 length; for * compatibility, code reading rasterfiles must be prepared to compute the * true length from the width, height, and depth fields. */ tiff-4.0.3/tools/thumbnail.c0000644000212300117540000004227411415374160012671 00000000000000/* $Id: thumbnail.c,v 1.16 2010-07-02 12:02:56 dron Exp $ */ /* * Copyright (c) 1994-1997 Sam Leffler * Copyright (c) 1994-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" #ifndef HAVE_GETOPT extern int getopt(int, char**, char*); #endif #define streq(a,b) (strcmp(a,b) == 0) #ifndef TIFFhowmany8 # define TIFFhowmany8(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3) #endif typedef enum { EXP50, EXP60, EXP70, EXP80, EXP90, EXP, LINEAR } Contrast; static uint32 tnw = 216; /* thumbnail width */ static uint32 tnh = 274; /* thumbnail height */ static Contrast contrast = LINEAR; /* current contrast */ static uint8* thumbnail; static int cpIFD(TIFF*, TIFF*); static int generateThumbnail(TIFF*, TIFF*); static void initScale(); static void usage(void); extern char* optarg; extern int optind; int main(int argc, char* argv[]) { TIFF* in; TIFF* out; int c; while ((c = getopt(argc, argv, "w:h:c:")) != -1) { switch (c) { case 'w': tnw = strtoul(optarg, NULL, 0); break; case 'h': tnh = strtoul(optarg, NULL, 0); break; case 'c': contrast = streq(optarg, "exp50") ? EXP50 : streq(optarg, "exp60") ? EXP60 : streq(optarg, "exp70") ? EXP70 : streq(optarg, "exp80") ? EXP80 : streq(optarg, "exp90") ? EXP90 : streq(optarg, "exp") ? EXP : streq(optarg, "linear")? LINEAR : EXP; break; default: usage(); } } if (argc-optind != 2) usage(); out = TIFFOpen(argv[optind+1], "w"); if (out == NULL) return 2; in = TIFFOpen(argv[optind], "r"); if( in == NULL ) return 2; thumbnail = (uint8*) _TIFFmalloc(tnw * tnh); if (!thumbnail) { TIFFError(TIFFFileName(in), "Can't allocate space for thumbnail buffer."); return 1; } if (in != NULL) { initScale(); do { if (!generateThumbnail(in, out)) goto bad; if (!cpIFD(in, out) || !TIFFWriteDirectory(out)) goto bad; } while (TIFFReadDirectory(in)); (void) TIFFClose(in); } (void) TIFFClose(out); return 0; bad: (void) TIFFClose(out); return 1; } #define CopyField(tag, v) \ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) #define CopyField2(tag, v1, v2) \ if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2) #define CopyField3(tag, v1, v2, v3) \ if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3) #define CopyField4(tag, v1, v2, v3, v4) \ if (TIFFGetField(in, tag, &v1, &v2, &v3, &v4)) TIFFSetField(out, tag, v1, v2, v3, v4) static void cpTag(TIFF* in, TIFF* out, uint16 tag, uint16 count, TIFFDataType type) { switch (type) { case TIFF_SHORT: if (count == 1) { uint16 shortv; CopyField(tag, shortv); } else if (count == 2) { uint16 shortv1, shortv2; CopyField2(tag, shortv1, shortv2); } else if (count == 4) { uint16 *tr, *tg, *tb, *ta; CopyField4(tag, tr, tg, tb, ta); } else if (count == (uint16) -1) { uint16 shortv1; uint16* shortav; CopyField2(tag, shortv1, shortav); } break; case TIFF_LONG: { uint32 longv; CopyField(tag, longv); } break; case TIFF_LONG8: { uint64 longv8; CopyField(tag, longv8); } break; case TIFF_SLONG8: { int64 longv8; CopyField(tag, longv8); } break; case TIFF_RATIONAL: if (count == 1) { float floatv; CopyField(tag, floatv); } else if (count == (uint16) -1) { float* floatav; CopyField(tag, floatav); } break; case TIFF_ASCII: { char* stringv; CopyField(tag, stringv); } break; case TIFF_DOUBLE: if (count == 1) { double doublev; CopyField(tag, doublev); } else if (count == (uint16) -1) { double* doubleav; CopyField(tag, doubleav); } break; case TIFF_IFD8: { toff_t ifd8; CopyField(tag, ifd8); } break; default: TIFFError(TIFFFileName(in), "Data type %d is not supported, tag %d skipped.", tag, type); } } #undef CopyField4 #undef CopyField3 #undef CopyField2 #undef CopyField static struct cpTag { uint16 tag; uint16 count; TIFFDataType type; } tags[] = { { TIFFTAG_IMAGEWIDTH, 1, TIFF_LONG }, { TIFFTAG_IMAGELENGTH, 1, TIFF_LONG }, { TIFFTAG_BITSPERSAMPLE, 1, TIFF_SHORT }, { TIFFTAG_COMPRESSION, 1, TIFF_SHORT }, { TIFFTAG_FILLORDER, 1, TIFF_SHORT }, { TIFFTAG_SAMPLESPERPIXEL, 1, TIFF_SHORT }, { TIFFTAG_ROWSPERSTRIP, 1, TIFF_LONG }, { TIFFTAG_PLANARCONFIG, 1, TIFF_SHORT }, { TIFFTAG_GROUP3OPTIONS, 1, TIFF_LONG }, { TIFFTAG_SUBFILETYPE, 1, TIFF_LONG }, { TIFFTAG_PHOTOMETRIC, 1, TIFF_SHORT }, { TIFFTAG_THRESHHOLDING, 1, TIFF_SHORT }, { TIFFTAG_DOCUMENTNAME, 1, TIFF_ASCII }, { TIFFTAG_IMAGEDESCRIPTION, 1, TIFF_ASCII }, { TIFFTAG_MAKE, 1, TIFF_ASCII }, { TIFFTAG_MODEL, 1, TIFF_ASCII }, { TIFFTAG_ORIENTATION, 1, TIFF_SHORT }, { TIFFTAG_MINSAMPLEVALUE, 1, TIFF_SHORT }, { TIFFTAG_MAXSAMPLEVALUE, 1, TIFF_SHORT }, { TIFFTAG_XRESOLUTION, 1, TIFF_RATIONAL }, { TIFFTAG_YRESOLUTION, 1, TIFF_RATIONAL }, { TIFFTAG_PAGENAME, 1, TIFF_ASCII }, { TIFFTAG_XPOSITION, 1, TIFF_RATIONAL }, { TIFFTAG_YPOSITION, 1, TIFF_RATIONAL }, { TIFFTAG_GROUP4OPTIONS, 1, TIFF_LONG }, { TIFFTAG_RESOLUTIONUNIT, 1, TIFF_SHORT }, { TIFFTAG_PAGENUMBER, 2, TIFF_SHORT }, { TIFFTAG_SOFTWARE, 1, TIFF_ASCII }, { TIFFTAG_DATETIME, 1, TIFF_ASCII }, { TIFFTAG_ARTIST, 1, TIFF_ASCII }, { TIFFTAG_HOSTCOMPUTER, 1, TIFF_ASCII }, { TIFFTAG_WHITEPOINT, 2, TIFF_RATIONAL }, { TIFFTAG_PRIMARYCHROMATICITIES, (uint16) -1,TIFF_RATIONAL }, { TIFFTAG_HALFTONEHINTS, 2, TIFF_SHORT }, { TIFFTAG_BADFAXLINES, 1, TIFF_LONG }, { TIFFTAG_CLEANFAXDATA, 1, TIFF_SHORT }, { TIFFTAG_CONSECUTIVEBADFAXLINES, 1, TIFF_LONG }, { TIFFTAG_INKSET, 1, TIFF_SHORT }, { TIFFTAG_INKNAMES, 1, TIFF_ASCII }, { TIFFTAG_DOTRANGE, 2, TIFF_SHORT }, { TIFFTAG_TARGETPRINTER, 1, TIFF_ASCII }, { TIFFTAG_SAMPLEFORMAT, 1, TIFF_SHORT }, { TIFFTAG_YCBCRCOEFFICIENTS, (uint16) -1,TIFF_RATIONAL }, { TIFFTAG_YCBCRSUBSAMPLING, 2, TIFF_SHORT }, { TIFFTAG_YCBCRPOSITIONING, 1, TIFF_SHORT }, { TIFFTAG_REFERENCEBLACKWHITE, (uint16) -1,TIFF_RATIONAL }, { TIFFTAG_EXTRASAMPLES, (uint16) -1, TIFF_SHORT }, }; #define NTAGS (sizeof (tags) / sizeof (tags[0])) static void cpTags(TIFF* in, TIFF* out) { struct cpTag *p; for (p = tags; p < &tags[NTAGS]; p++) cpTag(in, out, p->tag, p->count, p->type); } #undef NTAGS static int cpStrips(TIFF* in, TIFF* out) { tsize_t bufsize = TIFFStripSize(in); unsigned char *buf = (unsigned char *)_TIFFmalloc(bufsize); if (buf) { tstrip_t s, ns = TIFFNumberOfStrips(in); uint64 *bytecounts; TIFFGetField(in, TIFFTAG_STRIPBYTECOUNTS, &bytecounts); for (s = 0; s < ns; s++) { if (bytecounts[s] > (uint64) bufsize) { buf = (unsigned char *)_TIFFrealloc(buf, (tmsize_t)bytecounts[s]); if (!buf) goto bad; bufsize = (tmsize_t)bytecounts[s]; } if (TIFFReadRawStrip(in, s, buf, (tmsize_t)bytecounts[s]) < 0 || TIFFWriteRawStrip(out, s, buf, (tmsize_t)bytecounts[s]) < 0) { _TIFFfree(buf); return 0; } } _TIFFfree(buf); return 1; } bad: TIFFError(TIFFFileName(in), "Can't allocate space for strip buffer."); return 0; } static int cpTiles(TIFF* in, TIFF* out) { tsize_t bufsize = TIFFTileSize(in); unsigned char *buf = (unsigned char *)_TIFFmalloc(bufsize); if (buf) { ttile_t t, nt = TIFFNumberOfTiles(in); uint64 *bytecounts; TIFFGetField(in, TIFFTAG_TILEBYTECOUNTS, &bytecounts); for (t = 0; t < nt; t++) { if (bytecounts[t] > (uint64) bufsize) { buf = (unsigned char *)_TIFFrealloc(buf, (tmsize_t)bytecounts[t]); if (!buf) goto bad; bufsize = (tmsize_t)bytecounts[t]; } if (TIFFReadRawTile(in, t, buf, (tmsize_t)bytecounts[t]) < 0 || TIFFWriteRawTile(out, t, buf, (tmsize_t)bytecounts[t]) < 0) { _TIFFfree(buf); return 0; } } _TIFFfree(buf); return 1; } bad: TIFFError(TIFFFileName(in), "Can't allocate space for tile buffer."); return (0); } static int cpIFD(TIFF* in, TIFF* out) { cpTags(in, out); if (TIFFIsTiled(in)) { if (!cpTiles(in, out)) return (0); } else { if (!cpStrips(in, out)) return (0); } return (1); } static uint16 photometric; /* current photometric of raster */ static uint16 filterWidth; /* filter width in pixels */ static uint32 stepSrcWidth; /* src image stepping width */ static uint32 stepDstWidth; /* dest stepping width */ static uint8* src0; /* horizontal bit stepping (start) */ static uint8* src1; /* horizontal bit stepping (middle) */ static uint8* src2; /* horizontal bit stepping (end) */ static uint32* rowoff; /* row offset for stepping */ static uint8 cmap[256]; /* colormap indexes */ static uint8 bits[256]; /* count of bits set */ static void setupBitsTables() { int i; for (i = 0; i < 256; i++) { int n = 0; if (i&0x01) n++; if (i&0x02) n++; if (i&0x04) n++; if (i&0x08) n++; if (i&0x10) n++; if (i&0x20) n++; if (i&0x40) n++; if (i&0x80) n++; bits[i] = n; } } static int clamp(float v, int low, int high) { return (v < low ? low : v > high ? high : (int)v); } #ifndef M_E #define M_E 2.7182818284590452354 #endif static void expFill(float pct[], uint32 p, uint32 n) { uint32 i; uint32 c = (p * n) / 100; for (i = 1; i < c; i++) pct[i] = (float) (1-exp(i/((double)(n-1)))/ M_E); for (; i < n; i++) pct[i] = 0.; } static void setupCmap() { float pct[256]; /* known to be large enough */ uint32 i; pct[0] = 1; /* force white */ switch (contrast) { case EXP50: expFill(pct, 50, 256); break; case EXP60: expFill(pct, 60, 256); break; case EXP70: expFill(pct, 70, 256); break; case EXP80: expFill(pct, 80, 256); break; case EXP90: expFill(pct, 90, 256); break; case EXP: expFill(pct, 100, 256); break; case LINEAR: for (i = 1; i < 256; i++) pct[i] = 1-((float)i)/(256-1); break; } switch (photometric) { case PHOTOMETRIC_MINISWHITE: for (i = 0; i < 256; i++) cmap[i] = clamp(255*pct[(256-1)-i], 0, 255); break; case PHOTOMETRIC_MINISBLACK: for (i = 0; i < 256; i++) cmap[i] = clamp(255*pct[i], 0, 255); break; } } static void initScale() { src0 = (uint8*) _TIFFmalloc(sizeof (uint8) * tnw); src1 = (uint8*) _TIFFmalloc(sizeof (uint8) * tnw); src2 = (uint8*) _TIFFmalloc(sizeof (uint8) * tnw); rowoff = (uint32*) _TIFFmalloc(sizeof (uint32) * tnw); filterWidth = 0; stepDstWidth = stepSrcWidth = 0; setupBitsTables(); } /* * Calculate the horizontal accumulation parameteres * according to the widths of the src and dst images. */ static void setupStepTables(uint32 sw) { if (stepSrcWidth != sw || stepDstWidth != tnw) { int step = sw; int limit = tnw; int err = 0; uint32 sx = 0; uint32 x; int fw; uint8 b; for (x = 0; x < tnw; x++) { uint32 sx0 = sx; err += step; while (err >= limit) { err -= limit; sx++; } rowoff[x] = sx0 >> 3; fw = sx - sx0; /* width */ b = (fw < 8) ? 0xff<<(8-fw) : 0xff; src0[x] = b >> (sx0&7); fw -= 8 - (sx0&7); if (fw < 0) fw = 0; src1[x] = fw >> 3; fw -= (fw>>3)<<3; src2[x] = 0xff << (8-fw); } stepSrcWidth = sw; stepDstWidth = tnw; } } static void setrow(uint8* row, uint32 nrows, const uint8* rows[]) { uint32 x; uint32 area = nrows * filterWidth; for (x = 0; x < tnw; x++) { uint32 mask0 = src0[x]; uint32 fw = src1[x]; uint32 mask1 = src1[x]; uint32 off = rowoff[x]; uint32 acc = 0; uint32 y, i; for (y = 0; y < nrows; y++) { const uint8* src = rows[y] + off; acc += bits[*src++ & mask0]; switch (fw) { default: for (i = fw; i > 8; i--) acc += bits[*src++]; /* fall thru... */ case 8: acc += bits[*src++]; case 7: acc += bits[*src++]; case 6: acc += bits[*src++]; case 5: acc += bits[*src++]; case 4: acc += bits[*src++]; case 3: acc += bits[*src++]; case 2: acc += bits[*src++]; case 1: acc += bits[*src++]; case 0: break; } acc += bits[*src & mask1]; } *row++ = cmap[(255*acc)/area]; } } /* * Install the specified image. The * image is resized to fit the display page using * a box filter. The resultant pixels are mapped * with a user-selectable contrast curve. */ static void setImage1(const uint8* br, uint32 rw, uint32 rh) { int step = rh; int limit = tnh; int err = 0; int bpr = TIFFhowmany8(rw); int sy = 0; uint8* row = thumbnail; uint32 dy; for (dy = 0; dy < tnh; dy++) { const uint8* rows[256]; uint32 nrows = 1; fprintf(stderr, "bpr=%d, sy=%d, bpr*sy=%d\n", bpr, sy, bpr*sy); rows[0] = br + bpr*sy; err += step; while (err >= limit) { err -= limit; sy++; if (err >= limit) rows[nrows++] = br + bpr*sy; } setrow(row, nrows, rows); row += tnw; } } static void setImage(const uint8* br, uint32 rw, uint32 rh) { filterWidth = (uint16) ceil((double) rw / (double) tnw); setupStepTables(rw); setImage1(br, rw, rh); } static int generateThumbnail(TIFF* in, TIFF* out) { unsigned char* raster; unsigned char* rp; uint32 sw, sh, rps; uint16 bps, spp; tsize_t rowsize, rastersize; tstrip_t s, ns = TIFFNumberOfStrips(in); toff_t diroff[1]; TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &sw); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &sh); TIFFGetFieldDefaulted(in, TIFFTAG_BITSPERSAMPLE, &bps); TIFFGetFieldDefaulted(in, TIFFTAG_SAMPLESPERPIXEL, &spp); TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &rps); if (spp != 1 || bps != 1) return 0; rowsize = TIFFScanlineSize(in); rastersize = sh * rowsize; fprintf(stderr, "rastersize=%u\n", (unsigned int)rastersize); raster = (unsigned char*)_TIFFmalloc(rastersize); if (!raster) { TIFFError(TIFFFileName(in), "Can't allocate space for raster buffer."); return 0; } rp = raster; for (s = 0; s < ns; s++) { (void) TIFFReadEncodedStrip(in, s, rp, -1); rp += rps * rowsize; } TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &photometric); setupCmap(); setImage(raster, sw, sh); _TIFFfree(raster); TIFFSetField(out, TIFFTAG_SUBFILETYPE, FILETYPE_REDUCEDIMAGE); TIFFSetField(out, TIFFTAG_IMAGEWIDTH, (uint32) tnw); TIFFSetField(out, TIFFTAG_IMAGELENGTH, (uint32) tnh); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, (uint16) 8); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, (uint16) 1); TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_PACKBITS); TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE); TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); cpTag(in, out, TIFFTAG_SOFTWARE, (uint16) -1, TIFF_ASCII); cpTag(in, out, TIFFTAG_IMAGEDESCRIPTION, (uint16) -1, TIFF_ASCII); cpTag(in, out, TIFFTAG_DATETIME, (uint16) -1, TIFF_ASCII); cpTag(in, out, TIFFTAG_HOSTCOMPUTER, (uint16) -1, TIFF_ASCII); diroff[0] = 0UL; TIFFSetField(out, TIFFTAG_SUBIFD, 1, diroff); return (TIFFWriteEncodedStrip(out, 0, thumbnail, tnw*tnh) != -1 && TIFFWriteDirectory(out) != -1); } char* stuff[] = { "usage: thumbnail [options] input.tif output.tif", "where options are:", " -h # specify thumbnail image height (default is 274)", " -w # specify thumbnail image width (default is 216)", "", " -c linear use linear contrast curve", " -c exp50 use 50% exponential contrast curve", " -c exp60 use 60% exponential contrast curve", " -c exp70 use 70% exponential contrast curve", " -c exp80 use 80% exponential contrast curve", " -c exp90 use 90% exponential contrast curve", " -c exp use pure exponential contrast curve", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/tiffcp.c0000644000212300117540000014326411504662152012162 00000000000000/* $Id: tiffcp.c,v 1.49 2010-12-23 13:38:47 dron Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Revised: 2/18/01 BAR -- added syntax for extracting single images from * multi-image TIFF files. * * New syntax is: sourceFileName,image# * * image# ranges from 0.. where n is the # of images in the file. * There may be no white space between the comma and the filename or * image number. * * Example: tiffcp source.tif,1 destination.tif * * Copies the 2nd image in source.tif to the destination. * ***** * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #include "tiffio.h" #ifndef HAVE_GETOPT extern int getopt(int, char**, char*); #endif #if defined(VMS) # define unlink delete #endif #define streq(a,b) (strcmp(a,b) == 0) #define strneq(a,b,n) (strncmp(a,b,n) == 0) #define TRUE 1 #define FALSE 0 static int outtiled = -1; static uint32 tilewidth; static uint32 tilelength; static uint16 config; static uint16 compression; static uint16 predictor; static int preset; static uint16 fillorder; static uint16 orientation; static uint32 rowsperstrip; static uint32 g3opts; static int ignore = FALSE; /* if true, ignore read errors */ static uint32 defg3opts = (uint32) -1; static int quality = 75; /* JPEG quality */ static int jpegcolormode = JPEGCOLORMODE_RGB; static uint16 defcompression = (uint16) -1; static uint16 defpredictor = (uint16) -1; static int defpreset = -1; static int tiffcp(TIFF*, TIFF*); static int processCompressOptions(char*); static void usage(void); static char comma = ','; /* (default) comma separator character */ static TIFF* bias = NULL; static int pageNum = 0; static int pageInSeq = 0; static int nextSrcImage (TIFF *tif, char **imageSpec) /* seek to the next image specified in *imageSpec returns 1 if success, 0 if no more images to process *imageSpec=NULL if subsequent images should be processed in sequence */ { if (**imageSpec == comma) { /* if not @comma, we've done all images */ char *start = *imageSpec + 1; tdir_t nextImage = (tdir_t)strtol(start, imageSpec, 0); if (start == *imageSpec) nextImage = TIFFCurrentDirectory (tif); if (**imageSpec) { if (**imageSpec == comma) { /* a trailing comma denotes remaining images in sequence */ if ((*imageSpec)[1] == '\0') *imageSpec = NULL; }else{ fprintf (stderr, "Expected a %c separated image # list after %s\n", comma, TIFFFileName (tif)); exit (-4); /* syntax error */ } } if (TIFFSetDirectory (tif, nextImage)) return 1; fprintf (stderr, "%s%c%d not found!\n", TIFFFileName(tif), comma, (int) nextImage); } return 0; } static TIFF* openSrcImage (char **imageSpec) /* imageSpec points to a pointer to a filename followed by optional ,image#'s Open the TIFF file and assign *imageSpec to either NULL if there are no images specified, or a pointer to the next image number text */ { TIFF *tif; char *fn = *imageSpec; *imageSpec = strchr (fn, comma); if (*imageSpec) { /* there is at least one image number specifier */ **imageSpec = '\0'; tif = TIFFOpen (fn, "r"); /* but, ignore any single trailing comma */ if (!(*imageSpec)[1]) {*imageSpec = NULL; return tif;} if (tif) { **imageSpec = comma; /* replace the comma */ if (!nextSrcImage(tif, imageSpec)) { TIFFClose (tif); tif = NULL; } } }else tif = TIFFOpen (fn, "r"); return tif; } int main(int argc, char* argv[]) { uint16 defconfig = (uint16) -1; uint16 deffillorder = 0; uint32 deftilewidth = (uint32) -1; uint32 deftilelength = (uint32) -1; uint32 defrowsperstrip = (uint32) 0; uint64 diroff = 0; TIFF* in; TIFF* out; char mode[10]; char* mp = mode; int c; extern int optind; extern char* optarg; *mp++ = 'w'; *mp = '\0'; while ((c = getopt(argc, argv, ",:b:c:f:l:o:z:p:r:w:aistBLMC8x")) != -1) switch (c) { case ',': if (optarg[0] != '=') usage(); comma = optarg[1]; break; case 'b': /* this file is bias image subtracted from others */ if (bias) { fputs ("Only 1 bias image may be specified\n", stderr); exit (-2); } { uint16 samples = (uint16) -1; char **biasFn = &optarg; bias = openSrcImage (biasFn); if (!bias) exit (-5); if (TIFFIsTiled (bias)) { fputs ("Bias image must be organized in strips\n", stderr); exit (-7); } TIFFGetField(bias, TIFFTAG_SAMPLESPERPIXEL, &samples); if (samples != 1) { fputs ("Bias image must be monochrome\n", stderr); exit (-7); } } break; case 'a': /* append to output */ mode[0] = 'a'; break; case 'c': /* compression scheme */ if (!processCompressOptions(optarg)) usage(); break; case 'f': /* fill order */ if (streq(optarg, "lsb2msb")) deffillorder = FILLORDER_LSB2MSB; else if (streq(optarg, "msb2lsb")) deffillorder = FILLORDER_MSB2LSB; else usage(); break; case 'i': /* ignore errors */ ignore = TRUE; break; case 'l': /* tile length */ outtiled = TRUE; deftilelength = atoi(optarg); break; case 'o': /* initial directory offset */ diroff = strtoul(optarg, NULL, 0); break; case 'p': /* planar configuration */ if (streq(optarg, "separate")) defconfig = PLANARCONFIG_SEPARATE; else if (streq(optarg, "contig")) defconfig = PLANARCONFIG_CONTIG; else usage(); break; case 'r': /* rows/strip */ defrowsperstrip = atol(optarg); break; case 's': /* generate stripped output */ outtiled = FALSE; break; case 't': /* generate tiled output */ outtiled = TRUE; break; case 'w': /* tile width */ outtiled = TRUE; deftilewidth = atoi(optarg); break; case 'B': *mp++ = 'b'; *mp = '\0'; break; case 'L': *mp++ = 'l'; *mp = '\0'; break; case 'M': *mp++ = 'm'; *mp = '\0'; break; case 'C': *mp++ = 'c'; *mp = '\0'; break; case '8': *mp++ = '8'; *mp = '\0'; break; case 'x': pageInSeq = 1; break; case '?': usage(); /*NOTREACHED*/ } if (argc - optind < 2) usage(); out = TIFFOpen(argv[argc-1], mode); if (out == NULL) return (-2); if ((argc - optind) == 2) pageNum = -1; for (; optind < argc-1 ; optind++) { char *imageCursor = argv[optind]; in = openSrcImage (&imageCursor); if (in == NULL) { (void) TIFFClose(out); return (-3); } if (diroff != 0 && !TIFFSetSubDirectory(in, diroff)) { TIFFError(TIFFFileName(in), "Error, setting subdirectory at " TIFF_UINT64_FORMAT, diroff); (void) TIFFClose(in); (void) TIFFClose(out); return (1); } for (;;) { config = defconfig; compression = defcompression; predictor = defpredictor; preset = defpreset; fillorder = deffillorder; rowsperstrip = defrowsperstrip; tilewidth = deftilewidth; tilelength = deftilelength; g3opts = defg3opts; if (!tiffcp(in, out) || !TIFFWriteDirectory(out)) { (void) TIFFClose(in); (void) TIFFClose(out); return (1); } if (imageCursor) { /* seek next image directory */ if (!nextSrcImage(in, &imageCursor)) break; }else if (!TIFFReadDirectory(in)) break; } (void) TIFFClose(in); } (void) TIFFClose(out); return (0); } static void processZIPOptions(char* cp) { if ( (cp = strchr(cp, ':')) ) { do { cp++; if (isdigit((int)*cp)) defpredictor = atoi(cp); else if (*cp == 'p') defpreset = atoi(++cp); else usage(); } while( (cp = strchr(cp, ':')) ); } } static void processG3Options(char* cp) { if( (cp = strchr(cp, ':')) ) { if (defg3opts == (uint32) -1) defg3opts = 0; do { cp++; if (strneq(cp, "1d", 2)) defg3opts &= ~GROUP3OPT_2DENCODING; else if (strneq(cp, "2d", 2)) defg3opts |= GROUP3OPT_2DENCODING; else if (strneq(cp, "fill", 4)) defg3opts |= GROUP3OPT_FILLBITS; else usage(); } while( (cp = strchr(cp, ':')) ); } } static int processCompressOptions(char* opt) { if (streq(opt, "none")) { defcompression = COMPRESSION_NONE; } else if (streq(opt, "packbits")) { defcompression = COMPRESSION_PACKBITS; } else if (strneq(opt, "jpeg", 4)) { char* cp = strchr(opt, ':'); defcompression = COMPRESSION_JPEG; while( cp ) { if (isdigit((int)cp[1])) quality = atoi(cp+1); else if (cp[1] == 'r' ) jpegcolormode = JPEGCOLORMODE_RAW; else usage(); cp = strchr(cp+1,':'); } } else if (strneq(opt, "g3", 2)) { processG3Options(opt); defcompression = COMPRESSION_CCITTFAX3; } else if (streq(opt, "g4")) { defcompression = COMPRESSION_CCITTFAX4; } else if (strneq(opt, "lzw", 3)) { char* cp = strchr(opt, ':'); if (cp) defpredictor = atoi(cp+1); defcompression = COMPRESSION_LZW; } else if (strneq(opt, "zip", 3)) { processZIPOptions(opt); defcompression = COMPRESSION_ADOBE_DEFLATE; } else if (strneq(opt, "lzma", 4)) { processZIPOptions(opt); defcompression = COMPRESSION_LZMA; } else if (strneq(opt, "jbig", 4)) { defcompression = COMPRESSION_JBIG; } else if (strneq(opt, "sgilog", 6)) { defcompression = COMPRESSION_SGILOG; } else return (0); return (1); } char* stuff[] = { "usage: tiffcp [options] input... output", "where options are:", " -a append to output instead of overwriting", " -o offset set initial directory offset", " -p contig pack samples contiguously (e.g. RGBRGB...)", " -p separate store samples separately (e.g. RRR...GGG...BBB...)", " -s write output in strips", " -t write output in tiles", " -8 write BigTIFF instead of default ClassicTIFF", " -i ignore read errors", " -b file[,#] bias (dark) monochrome image to be subtracted from all others", " -,=% use % rather than , to separate image #'s (per Note below)", "", " -r # make each strip have no more than # rows", " -w # set output tile width (pixels)", " -l # set output tile length (pixels)", "", " -f lsb2msb force lsb-to-msb FillOrder for output", " -f msb2lsb force msb-to-lsb FillOrder for output", "", " -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", " -c zip[:opts] compress output with deflate encoding", " -c lzma[:opts] compress output with LZMA2 encoding", " -c jpeg[:opts] compress output with JPEG encoding", " -c jbig compress output with ISO JBIG encoding", " -c packbits compress output with packbits encoding", " -c g3[:opts] compress output with CCITT Group 3 encoding", " -c g4 compress output with CCITT Group 4 encoding", " -c sgilog compress output with SGILOG encoding", " -c none use no compression algorithm on output", " -x force the merged tiff pages in sequence", "", "Group 3 options:", " 1d use default CCITT Group 3 1D-encoding", " 2d use optional CCITT Group 3 2D-encoding", " fill byte-align EOL codes", "For example, -c g3:2d:fill to get G3-2D-encoded data with byte-aligned EOLs", "", "JPEG options:", " # set compression quality level (0-100, default 75)", " r output color image as RGB rather than YCbCr", "For example, -c jpeg:r:50 to get JPEG-encoded RGB data with 50% comp. quality", "", "LZW, Deflate (ZIP) and LZMA2 options:", " # set predictor value", " p# set compression level (preset)", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing,", "-c zip:3:p9 for Deflate encoding with maximum compression level and floating", "point predictor.", "", "Note that input filenames may be of the form filename,x,y,z", "where x, y, and z specify image numbers in the filename to copy.", "example: tiffcp -c none -b esp.tif,1 esp.tif,0 test.tif", " subtract 2nd image in esp.tif from 1st yielding uncompressed result test.tif", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } #define CopyField(tag, v) \ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) #define CopyField2(tag, v1, v2) \ if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2) #define CopyField3(tag, v1, v2, v3) \ if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3) #define CopyField4(tag, v1, v2, v3, v4) \ if (TIFFGetField(in, tag, &v1, &v2, &v3, &v4)) TIFFSetField(out, tag, v1, v2, v3, v4) static void cpTag(TIFF* in, TIFF* out, uint16 tag, uint16 count, TIFFDataType type) { switch (type) { case TIFF_SHORT: if (count == 1) { uint16 shortv; CopyField(tag, shortv); } else if (count == 2) { uint16 shortv1, shortv2; CopyField2(tag, shortv1, shortv2); } else if (count == 4) { uint16 *tr, *tg, *tb, *ta; CopyField4(tag, tr, tg, tb, ta); } else if (count == (uint16) -1) { uint16 shortv1; uint16* shortav; CopyField2(tag, shortv1, shortav); } break; case TIFF_LONG: { uint32 longv; CopyField(tag, longv); } break; case TIFF_RATIONAL: if (count == 1) { float floatv; CopyField(tag, floatv); } else if (count == (uint16) -1) { float* floatav; CopyField(tag, floatav); } break; case TIFF_ASCII: { char* stringv; CopyField(tag, stringv); } break; case TIFF_DOUBLE: if (count == 1) { double doublev; CopyField(tag, doublev); } else if (count == (uint16) -1) { double* doubleav; CopyField(tag, doubleav); } break; default: TIFFError(TIFFFileName(in), "Data type %d is not supported, tag %d skipped.", tag, type); } } static struct cpTag { uint16 tag; uint16 count; TIFFDataType type; } tags[] = { { TIFFTAG_SUBFILETYPE, 1, TIFF_LONG }, { TIFFTAG_THRESHHOLDING, 1, TIFF_SHORT }, { TIFFTAG_DOCUMENTNAME, 1, TIFF_ASCII }, { TIFFTAG_IMAGEDESCRIPTION, 1, TIFF_ASCII }, { TIFFTAG_MAKE, 1, TIFF_ASCII }, { TIFFTAG_MODEL, 1, TIFF_ASCII }, { TIFFTAG_MINSAMPLEVALUE, 1, TIFF_SHORT }, { TIFFTAG_MAXSAMPLEVALUE, 1, TIFF_SHORT }, { TIFFTAG_XRESOLUTION, 1, TIFF_RATIONAL }, { TIFFTAG_YRESOLUTION, 1, TIFF_RATIONAL }, { TIFFTAG_PAGENAME, 1, TIFF_ASCII }, { TIFFTAG_XPOSITION, 1, TIFF_RATIONAL }, { TIFFTAG_YPOSITION, 1, TIFF_RATIONAL }, { TIFFTAG_RESOLUTIONUNIT, 1, TIFF_SHORT }, { TIFFTAG_SOFTWARE, 1, TIFF_ASCII }, { TIFFTAG_DATETIME, 1, TIFF_ASCII }, { TIFFTAG_ARTIST, 1, TIFF_ASCII }, { TIFFTAG_HOSTCOMPUTER, 1, TIFF_ASCII }, { TIFFTAG_WHITEPOINT, (uint16) -1, TIFF_RATIONAL }, { TIFFTAG_PRIMARYCHROMATICITIES,(uint16) -1,TIFF_RATIONAL }, { TIFFTAG_HALFTONEHINTS, 2, TIFF_SHORT }, { TIFFTAG_INKSET, 1, TIFF_SHORT }, { TIFFTAG_DOTRANGE, 2, TIFF_SHORT }, { TIFFTAG_TARGETPRINTER, 1, TIFF_ASCII }, { TIFFTAG_SAMPLEFORMAT, 1, TIFF_SHORT }, { TIFFTAG_YCBCRCOEFFICIENTS, (uint16) -1,TIFF_RATIONAL }, { TIFFTAG_YCBCRSUBSAMPLING, 2, TIFF_SHORT }, { TIFFTAG_YCBCRPOSITIONING, 1, TIFF_SHORT }, { TIFFTAG_REFERENCEBLACKWHITE, (uint16) -1,TIFF_RATIONAL }, { TIFFTAG_EXTRASAMPLES, (uint16) -1, TIFF_SHORT }, { TIFFTAG_SMINSAMPLEVALUE, 1, TIFF_DOUBLE }, { TIFFTAG_SMAXSAMPLEVALUE, 1, TIFF_DOUBLE }, { TIFFTAG_STONITS, 1, TIFF_DOUBLE }, }; #define NTAGS (sizeof (tags) / sizeof (tags[0])) #define CopyTag(tag, count, type) cpTag(in, out, tag, count, type) typedef int (*copyFunc) (TIFF* in, TIFF* out, uint32 l, uint32 w, uint16 samplesperpixel); static copyFunc pickCopyFunc(TIFF*, TIFF*, uint16, uint16); /* PODD */ static int tiffcp(TIFF* in, TIFF* out) { uint16 bitspersample, samplesperpixel; uint16 input_compression, input_photometric; copyFunc cf; uint32 width, length; struct cpTag* p; CopyField(TIFFTAG_IMAGEWIDTH, width); CopyField(TIFFTAG_IMAGELENGTH, length); CopyField(TIFFTAG_BITSPERSAMPLE, bitspersample); CopyField(TIFFTAG_SAMPLESPERPIXEL, samplesperpixel); if (compression != (uint16)-1) TIFFSetField(out, TIFFTAG_COMPRESSION, compression); else CopyField(TIFFTAG_COMPRESSION, compression); TIFFGetFieldDefaulted(in, TIFFTAG_COMPRESSION, &input_compression); TIFFGetFieldDefaulted(in, TIFFTAG_PHOTOMETRIC, &input_photometric); if (input_compression == COMPRESSION_JPEG) { /* Force conversion to RGB */ TIFFSetField(in, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); } else if (input_photometric == PHOTOMETRIC_YCBCR) { /* Otherwise, can't handle subsampled input */ uint16 subsamplinghor,subsamplingver; TIFFGetFieldDefaulted(in, TIFFTAG_YCBCRSUBSAMPLING, &subsamplinghor, &subsamplingver); if (subsamplinghor!=1 || subsamplingver!=1) { fprintf(stderr, "tiffcp: %s: Can't copy/convert subsampled image.\n", TIFFFileName(in)); return FALSE; } } if (compression == COMPRESSION_JPEG) { if (input_photometric == PHOTOMETRIC_RGB && jpegcolormode == JPEGCOLORMODE_RGB) TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR); else TIFFSetField(out, TIFFTAG_PHOTOMETRIC, input_photometric); } else if (compression == COMPRESSION_SGILOG || compression == COMPRESSION_SGILOG24) TIFFSetField(out, TIFFTAG_PHOTOMETRIC, samplesperpixel == 1 ? PHOTOMETRIC_LOGL : PHOTOMETRIC_LOGLUV); else CopyTag(TIFFTAG_PHOTOMETRIC, 1, TIFF_SHORT); if (fillorder != 0) TIFFSetField(out, TIFFTAG_FILLORDER, fillorder); else CopyTag(TIFFTAG_FILLORDER, 1, TIFF_SHORT); /* * Will copy `Orientation' tag from input image */ TIFFGetFieldDefaulted(in, TIFFTAG_ORIENTATION, &orientation); switch (orientation) { case ORIENTATION_BOTRIGHT: case ORIENTATION_RIGHTBOT: /* XXX */ TIFFWarning(TIFFFileName(in), "using bottom-left orientation"); orientation = ORIENTATION_BOTLEFT; /* fall thru... */ case ORIENTATION_LEFTBOT: /* XXX */ case ORIENTATION_BOTLEFT: break; case ORIENTATION_TOPRIGHT: case ORIENTATION_RIGHTTOP: /* XXX */ default: TIFFWarning(TIFFFileName(in), "using top-left orientation"); orientation = ORIENTATION_TOPLEFT; /* fall thru... */ case ORIENTATION_LEFTTOP: /* XXX */ case ORIENTATION_TOPLEFT: break; } TIFFSetField(out, TIFFTAG_ORIENTATION, orientation); /* * Choose tiles/strip for the output image according to * the command line arguments (-tiles, -strips) and the * structure of the input image. */ if (outtiled == -1) outtiled = TIFFIsTiled(in); if (outtiled) { /* * Setup output file's tile width&height. If either * is not specified, use either the value from the * input image or, if nothing is defined, use the * library default. */ if (tilewidth == (uint32) -1) TIFFGetField(in, TIFFTAG_TILEWIDTH, &tilewidth); if (tilelength == (uint32) -1) TIFFGetField(in, TIFFTAG_TILELENGTH, &tilelength); TIFFDefaultTileSize(out, &tilewidth, &tilelength); TIFFSetField(out, TIFFTAG_TILEWIDTH, tilewidth); TIFFSetField(out, TIFFTAG_TILELENGTH, tilelength); } else { /* * RowsPerStrip is left unspecified: use either the * value from the input image or, if nothing is defined, * use the library default. */ if (rowsperstrip == (uint32) 0) { if (!TIFFGetField(in, TIFFTAG_ROWSPERSTRIP, &rowsperstrip)) { rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip); } if (rowsperstrip > length && rowsperstrip != (uint32)-1) rowsperstrip = length; } else if (rowsperstrip == (uint32) -1) rowsperstrip = length; TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip); } if (config != (uint16) -1) TIFFSetField(out, TIFFTAG_PLANARCONFIG, config); else CopyField(TIFFTAG_PLANARCONFIG, config); if (samplesperpixel <= 4) CopyTag(TIFFTAG_TRANSFERFUNCTION, 4, TIFF_SHORT); CopyTag(TIFFTAG_COLORMAP, 4, TIFF_SHORT); /* SMinSampleValue & SMaxSampleValue */ switch (compression) { case COMPRESSION_JPEG: TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality); TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode); break; case COMPRESSION_JBIG: CopyTag(TIFFTAG_FAXRECVPARAMS, 1, TIFF_LONG); CopyTag(TIFFTAG_FAXRECVTIME, 1, TIFF_LONG); CopyTag(TIFFTAG_FAXSUBADDRESS, 1, TIFF_ASCII); CopyTag(TIFFTAG_FAXDCS, 1, TIFF_ASCII); break; case COMPRESSION_LZW: case COMPRESSION_ADOBE_DEFLATE: case COMPRESSION_DEFLATE: case COMPRESSION_LZMA: if (predictor != (uint16)-1) TIFFSetField(out, TIFFTAG_PREDICTOR, predictor); else CopyField(TIFFTAG_PREDICTOR, predictor); if (preset != -1) { if (compression == COMPRESSION_ADOBE_DEFLATE || compression == COMPRESSION_DEFLATE) TIFFSetField(out, TIFFTAG_ZIPQUALITY, preset); else if (compression == COMPRESSION_LZMA) TIFFSetField(out, TIFFTAG_LZMAPRESET, preset); } break; case COMPRESSION_CCITTFAX3: case COMPRESSION_CCITTFAX4: if (compression == COMPRESSION_CCITTFAX3) { if (g3opts != (uint32) -1) TIFFSetField(out, TIFFTAG_GROUP3OPTIONS, g3opts); else CopyField(TIFFTAG_GROUP3OPTIONS, g3opts); } else CopyTag(TIFFTAG_GROUP4OPTIONS, 1, TIFF_LONG); CopyTag(TIFFTAG_BADFAXLINES, 1, TIFF_LONG); CopyTag(TIFFTAG_CLEANFAXDATA, 1, TIFF_LONG); CopyTag(TIFFTAG_CONSECUTIVEBADFAXLINES, 1, TIFF_LONG); CopyTag(TIFFTAG_FAXRECVPARAMS, 1, TIFF_LONG); CopyTag(TIFFTAG_FAXRECVTIME, 1, TIFF_LONG); CopyTag(TIFFTAG_FAXSUBADDRESS, 1, TIFF_ASCII); break; } { uint32 len32; void** data; if (TIFFGetField(in, TIFFTAG_ICCPROFILE, &len32, &data)) TIFFSetField(out, TIFFTAG_ICCPROFILE, len32, data); } { uint16 ninks; const char* inknames; if (TIFFGetField(in, TIFFTAG_NUMBEROFINKS, &ninks)) { TIFFSetField(out, TIFFTAG_NUMBEROFINKS, ninks); if (TIFFGetField(in, TIFFTAG_INKNAMES, &inknames)) { int inknameslen = strlen(inknames) + 1; const char* cp = inknames; while (ninks > 1) { cp = strchr(cp, '\0'); cp++; inknameslen += (strlen(cp) + 1); ninks--; } TIFFSetField(out, TIFFTAG_INKNAMES, inknameslen, inknames); } } } { unsigned short pg0, pg1; if (pageInSeq == 1) { if (pageNum < 0) /* only one input file */ { if (TIFFGetField(in, TIFFTAG_PAGENUMBER, &pg0, &pg1)) TIFFSetField(out, TIFFTAG_PAGENUMBER, pg0, pg1); } else TIFFSetField(out, TIFFTAG_PAGENUMBER, pageNum++, 0); } else { if (TIFFGetField(in, TIFFTAG_PAGENUMBER, &pg0, &pg1)) { if (pageNum < 0) /* only one input file */ TIFFSetField(out, TIFFTAG_PAGENUMBER, pg0, pg1); else TIFFSetField(out, TIFFTAG_PAGENUMBER, pageNum++, 0); } } } for (p = tags; p < &tags[NTAGS]; p++) CopyTag(p->tag, p->count, p->type); cf = pickCopyFunc(in, out, bitspersample, samplesperpixel); return (cf ? (*cf)(in, out, length, width, samplesperpixel) : FALSE); } /* * Copy Functions. */ #define DECLAREcpFunc(x) \ static int x(TIFF* in, TIFF* out, \ uint32 imagelength, uint32 imagewidth, tsample_t spp) #define DECLAREreadFunc(x) \ static int x(TIFF* in, \ uint8* buf, uint32 imagelength, uint32 imagewidth, tsample_t spp) typedef int (*readFunc)(TIFF*, uint8*, uint32, uint32, tsample_t); #define DECLAREwriteFunc(x) \ static int x(TIFF* out, \ uint8* buf, uint32 imagelength, uint32 imagewidth, tsample_t spp) typedef int (*writeFunc)(TIFF*, uint8*, uint32, uint32, tsample_t); /* * Contig -> contig by scanline for rows/strip change. */ DECLAREcpFunc(cpContig2ContigByRow) { tsize_t scanlinesize = TIFFScanlineSize(in); tdata_t buf; uint32 row; buf = _TIFFmalloc(scanlinesize); if (!buf) return 0; _TIFFmemset(buf, 0, scanlinesize); (void) imagewidth; (void) spp; for (row = 0; row < imagelength; row++) { if (TIFFReadScanline(in, buf, row, 0) < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read scanline %lu", (unsigned long) row); goto bad; } if (TIFFWriteScanline(out, buf, row, 0) < 0) { TIFFError(TIFFFileName(out), "Error, can't write scanline %lu", (unsigned long) row); goto bad; } } _TIFFfree(buf); return 1; bad: _TIFFfree(buf); return 0; } typedef void biasFn (void *image, void *bias, uint32 pixels); #define subtract(bits) \ static void subtract##bits (void *i, void *b, uint32 pixels)\ {\ uint##bits *image = i;\ uint##bits *bias = b;\ while (pixels--) {\ *image = *image > *bias ? *image-*bias : 0;\ image++, bias++; \ } \ } subtract(8) subtract(16) subtract(32) static biasFn *lineSubtractFn (unsigned bits) { switch (bits) { case 8: return subtract8; case 16: return subtract16; case 32: return subtract32; } return NULL; } /* * Contig -> contig by scanline while subtracting a bias image. */ DECLAREcpFunc(cpBiasedContig2Contig) { if (spp == 1) { tsize_t biasSize = TIFFScanlineSize(bias); tsize_t bufSize = TIFFScanlineSize(in); tdata_t buf, biasBuf; uint32 biasWidth = 0, biasLength = 0; TIFFGetField(bias, TIFFTAG_IMAGEWIDTH, &biasWidth); TIFFGetField(bias, TIFFTAG_IMAGELENGTH, &biasLength); if (biasSize == bufSize && imagelength == biasLength && imagewidth == biasWidth) { uint16 sampleBits = 0; biasFn *subtractLine; TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &sampleBits); subtractLine = lineSubtractFn (sampleBits); if (subtractLine) { uint32 row; buf = _TIFFmalloc(bufSize); biasBuf = _TIFFmalloc(bufSize); for (row = 0; row < imagelength; row++) { if (TIFFReadScanline(in, buf, row, 0) < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read scanline %lu", (unsigned long) row); goto bad; } if (TIFFReadScanline(bias, biasBuf, row, 0) < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read biased scanline %lu", (unsigned long) row); goto bad; } subtractLine (buf, biasBuf, imagewidth); if (TIFFWriteScanline(out, buf, row, 0) < 0) { TIFFError(TIFFFileName(out), "Error, can't write scanline %lu", (unsigned long) row); goto bad; } } _TIFFfree(buf); _TIFFfree(biasBuf); TIFFSetDirectory(bias, TIFFCurrentDirectory(bias)); /* rewind */ return 1; bad: _TIFFfree(buf); _TIFFfree(biasBuf); return 0; } else { TIFFError(TIFFFileName(in), "No support for biasing %d bit pixels\n", sampleBits); return 0; } } TIFFError(TIFFFileName(in), "Bias image %s,%d\nis not the same size as %s,%d\n", TIFFFileName(bias), TIFFCurrentDirectory(bias), TIFFFileName(in), TIFFCurrentDirectory(in)); return 0; } else { TIFFError(TIFFFileName(in), "Can't bias %s,%d as it has >1 Sample/Pixel\n", TIFFFileName(in), TIFFCurrentDirectory(in)); return 0; } } /* * Strip -> strip for change in encoding. */ DECLAREcpFunc(cpDecodedStrips) { tsize_t stripsize = TIFFStripSize(in); tdata_t buf = _TIFFmalloc(stripsize); (void) imagewidth; (void) spp; if (buf) { tstrip_t s, ns = TIFFNumberOfStrips(in); uint32 row = 0; _TIFFmemset(buf, 0, stripsize); for (s = 0; s < ns; s++) { tsize_t cc = (row + rowsperstrip > imagelength) ? TIFFVStripSize(in, imagelength - row) : stripsize; if (TIFFReadEncodedStrip(in, s, buf, cc) < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read strip %lu", (unsigned long) s); goto bad; } if (TIFFWriteEncodedStrip(out, s, buf, cc) < 0) { TIFFError(TIFFFileName(out), "Error, can't write strip %lu", (unsigned long) s); goto bad; } row += rowsperstrip; } _TIFFfree(buf); return 1; } else { TIFFError(TIFFFileName(in), "Error, can't allocate memory buffer of size %lu " "to read strips", (unsigned long) stripsize); return 0; } bad: _TIFFfree(buf); return 0; } /* * Separate -> separate by row for rows/strip change. */ DECLAREcpFunc(cpSeparate2SeparateByRow) { tsize_t scanlinesize = TIFFScanlineSize(in); tdata_t buf; uint32 row; tsample_t s; (void) imagewidth; buf = _TIFFmalloc(scanlinesize); if (!buf) return 0; _TIFFmemset(buf, 0, scanlinesize); for (s = 0; s < spp; s++) { for (row = 0; row < imagelength; row++) { if (TIFFReadScanline(in, buf, row, s) < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read scanline %lu", (unsigned long) row); goto bad; } if (TIFFWriteScanline(out, buf, row, s) < 0) { TIFFError(TIFFFileName(out), "Error, can't write scanline %lu", (unsigned long) row); goto bad; } } } _TIFFfree(buf); return 1; bad: _TIFFfree(buf); return 0; } /* * Contig -> separate by row. */ DECLAREcpFunc(cpContig2SeparateByRow) { tsize_t scanlinesizein = TIFFScanlineSize(in); tsize_t scanlinesizeout = TIFFScanlineSize(out); tdata_t inbuf; tdata_t outbuf; register uint8 *inp, *outp; register uint32 n; uint32 row; tsample_t s; inbuf = _TIFFmalloc(scanlinesizein); outbuf = _TIFFmalloc(scanlinesizeout); if (!inbuf || !outbuf) return 0; _TIFFmemset(inbuf, 0, scanlinesizein); _TIFFmemset(outbuf, 0, scanlinesizeout); /* unpack channels */ for (s = 0; s < spp; s++) { for (row = 0; row < imagelength; row++) { if (TIFFReadScanline(in, inbuf, row, 0) < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read scanline %lu", (unsigned long) row); goto bad; } inp = ((uint8*)inbuf) + s; outp = (uint8*)outbuf; for (n = imagewidth; n-- > 0;) { *outp++ = *inp; inp += spp; } if (TIFFWriteScanline(out, outbuf, row, s) < 0) { TIFFError(TIFFFileName(out), "Error, can't write scanline %lu", (unsigned long) row); goto bad; } } } if (inbuf) _TIFFfree(inbuf); if (outbuf) _TIFFfree(outbuf); return 1; bad: if (inbuf) _TIFFfree(inbuf); if (outbuf) _TIFFfree(outbuf); return 0; } /* * Separate -> contig by row. */ DECLAREcpFunc(cpSeparate2ContigByRow) { tsize_t scanlinesizein = TIFFScanlineSize(in); tsize_t scanlinesizeout = TIFFScanlineSize(out); tdata_t inbuf; tdata_t outbuf; register uint8 *inp, *outp; register uint32 n; uint32 row; tsample_t s; inbuf = _TIFFmalloc(scanlinesizein); outbuf = _TIFFmalloc(scanlinesizeout); if (!inbuf || !outbuf) return 0; _TIFFmemset(inbuf, 0, scanlinesizein); _TIFFmemset(outbuf, 0, scanlinesizeout); for (row = 0; row < imagelength; row++) { /* merge channels */ for (s = 0; s < spp; s++) { if (TIFFReadScanline(in, inbuf, row, s) < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read scanline %lu", (unsigned long) row); goto bad; } inp = (uint8*)inbuf; outp = ((uint8*)outbuf) + s; for (n = imagewidth; n-- > 0;) { *outp = *inp++; outp += spp; } } if (TIFFWriteScanline(out, outbuf, row, 0) < 0) { TIFFError(TIFFFileName(out), "Error, can't write scanline %lu", (unsigned long) row); goto bad; } } if (inbuf) _TIFFfree(inbuf); if (outbuf) _TIFFfree(outbuf); return 1; bad: if (inbuf) _TIFFfree(inbuf); if (outbuf) _TIFFfree(outbuf); return 0; } static void cpStripToTile(uint8* out, uint8* in, uint32 rows, uint32 cols, int outskew, int inskew) { while (rows-- > 0) { uint32 j = cols; while (j-- > 0) *out++ = *in++; out += outskew; in += inskew; } } static void cpContigBufToSeparateBuf(uint8* out, uint8* in, uint32 rows, uint32 cols, int outskew, int inskew, tsample_t spp, int bytes_per_sample ) { while (rows-- > 0) { uint32 j = cols; while (j-- > 0) { int n = bytes_per_sample; while( n-- ) { *out++ = *in++; } in += (spp-1) * bytes_per_sample; } out += outskew; in += inskew; } } static void cpSeparateBufToContigBuf(uint8* out, uint8* in, uint32 rows, uint32 cols, int outskew, int inskew, tsample_t spp, int bytes_per_sample) { while (rows-- > 0) { uint32 j = cols; while (j-- > 0) { int n = bytes_per_sample; while( n-- ) { *out++ = *in++; } out += (spp-1)*bytes_per_sample; } out += outskew; in += inskew; } } static int cpImage(TIFF* in, TIFF* out, readFunc fin, writeFunc fout, uint32 imagelength, uint32 imagewidth, tsample_t spp) { int status = 0; tdata_t buf = NULL; tsize_t scanlinesize = TIFFRasterScanlineSize(in); tsize_t bytes = scanlinesize * (tsize_t)imagelength; /* * XXX: Check for integer overflow. */ if (scanlinesize && imagelength && bytes / (tsize_t)imagelength == scanlinesize) { buf = _TIFFmalloc(bytes); if (buf) { if ((*fin)(in, (uint8*)buf, imagelength, imagewidth, spp)) { status = (*fout)(out, (uint8*)buf, imagelength, imagewidth, spp); } _TIFFfree(buf); } else { TIFFError(TIFFFileName(in), "Error, can't allocate space for image buffer"); } } else { TIFFError(TIFFFileName(in), "Error, no space for image buffer"); } return status; } DECLAREreadFunc(readContigStripsIntoBuffer) { tsize_t scanlinesize = TIFFScanlineSize(in); uint8* bufp = buf; uint32 row; (void) imagewidth; (void) spp; for (row = 0; row < imagelength; row++) { if (TIFFReadScanline(in, (tdata_t) bufp, row, 0) < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read scanline %lu", (unsigned long) row); return 0; } bufp += scanlinesize; } return 1; } DECLAREreadFunc(readSeparateStripsIntoBuffer) { int status = 1; tsize_t scanlinesize = TIFFScanlineSize(in); tdata_t scanline; if (!scanlinesize) return 0; scanline = _TIFFmalloc(scanlinesize); if (!scanline) return 0; _TIFFmemset(scanline, 0, scanlinesize); (void) imagewidth; if (scanline) { uint8* bufp = (uint8*) buf; uint32 row; tsample_t s; for (row = 0; row < imagelength; row++) { /* merge channels */ for (s = 0; s < spp; s++) { uint8* bp = bufp + s; tsize_t n = scanlinesize; uint8* sbuf = scanline; if (TIFFReadScanline(in, scanline, row, s) < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read scanline %lu", (unsigned long) row); status = 0; goto done; } while (n-- > 0) *bp = *sbuf++, bp += spp; } bufp += scanlinesize * spp; } } done: _TIFFfree(scanline); return status; } DECLAREreadFunc(readContigTilesIntoBuffer) { int status = 1; tsize_t tilesize = TIFFTileSize(in); tdata_t tilebuf; uint32 imagew = TIFFScanlineSize(in); uint32 tilew = TIFFTileRowSize(in); int iskew = imagew - tilew; uint8* bufp = (uint8*) buf; uint32 tw, tl; uint32 row; (void) spp; tilebuf = _TIFFmalloc(tilesize); if (tilebuf == 0) return 0; _TIFFmemset(tilebuf, 0, tilesize); (void) TIFFGetField(in, TIFFTAG_TILEWIDTH, &tw); (void) TIFFGetField(in, TIFFTAG_TILELENGTH, &tl); for (row = 0; row < imagelength; row += tl) { uint32 nrow = (row+tl > imagelength) ? imagelength-row : tl; uint32 colb = 0; uint32 col; for (col = 0; col < imagewidth; col += tw) { if (TIFFReadTile(in, tilebuf, col, row, 0, 0) < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read tile at %lu %lu", (unsigned long) col, (unsigned long) row); status = 0; goto done; } if (colb + tilew > imagew) { uint32 width = imagew - colb; uint32 oskew = tilew - width; cpStripToTile(bufp + colb, tilebuf, nrow, width, oskew + iskew, oskew ); } else cpStripToTile(bufp + colb, tilebuf, nrow, tilew, iskew, 0); colb += tilew; } bufp += imagew * nrow; } done: _TIFFfree(tilebuf); return status; } DECLAREreadFunc(readSeparateTilesIntoBuffer) { int status = 1; uint32 imagew = TIFFRasterScanlineSize(in); uint32 tilew = TIFFTileRowSize(in); int iskew = imagew - tilew*spp; tsize_t tilesize = TIFFTileSize(in); tdata_t tilebuf; uint8* bufp = (uint8*) buf; uint32 tw, tl; uint32 row; uint16 bps, bytes_per_sample; tilebuf = _TIFFmalloc(tilesize); if (tilebuf == 0) return 0; _TIFFmemset(tilebuf, 0, tilesize); (void) TIFFGetField(in, TIFFTAG_TILEWIDTH, &tw); (void) TIFFGetField(in, TIFFTAG_TILELENGTH, &tl); (void) TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bps); assert( bps % 8 == 0 ); bytes_per_sample = bps/8; for (row = 0; row < imagelength; row += tl) { uint32 nrow = (row+tl > imagelength) ? imagelength-row : tl; uint32 colb = 0; uint32 col; for (col = 0; col < imagewidth; col += tw) { tsample_t s; for (s = 0; s < spp; s++) { if (TIFFReadTile(in, tilebuf, col, row, 0, s) < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read tile at %lu %lu, " "sample %lu", (unsigned long) col, (unsigned long) row, (unsigned long) s); status = 0; goto done; } /* * Tile is clipped horizontally. Calculate * visible portion and skewing factors. */ if (colb + tilew*spp > imagew) { uint32 width = imagew - colb; int oskew = tilew*spp - width; cpSeparateBufToContigBuf( bufp+colb+s*bytes_per_sample, tilebuf, nrow, width/(spp*bytes_per_sample), oskew + iskew, oskew/spp, spp, bytes_per_sample); } else cpSeparateBufToContigBuf( bufp+colb+s*bytes_per_sample, tilebuf, nrow, tw, iskew, 0, spp, bytes_per_sample); } colb += tilew*spp; } bufp += imagew * nrow; } done: _TIFFfree(tilebuf); return status; } DECLAREwriteFunc(writeBufferToContigStrips) { uint32 row, rowsperstrip; tstrip_t strip = 0; (void) imagewidth; (void) spp; (void) TIFFGetFieldDefaulted(out, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); for (row = 0; row < imagelength; row += rowsperstrip) { uint32 nrows = (row+rowsperstrip > imagelength) ? imagelength-row : rowsperstrip; tsize_t stripsize = TIFFVStripSize(out, nrows); if (TIFFWriteEncodedStrip(out, strip++, buf, stripsize) < 0) { TIFFError(TIFFFileName(out), "Error, can't write strip %u", strip - 1); return 0; } buf += stripsize; } return 1; } DECLAREwriteFunc(writeBufferToSeparateStrips) { uint32 rowsize = imagewidth * spp; uint32 rowsperstrip; tsize_t stripsize = TIFFStripSize(out); tdata_t obuf; tstrip_t strip = 0; tsample_t s; obuf = _TIFFmalloc(stripsize); if (obuf == NULL) return (0); _TIFFmemset(obuf, 0, stripsize); (void) TIFFGetFieldDefaulted(out, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); for (s = 0; s < spp; s++) { uint32 row; for (row = 0; row < imagelength; row += rowsperstrip) { uint32 nrows = (row+rowsperstrip > imagelength) ? imagelength-row : rowsperstrip; tsize_t stripsize = TIFFVStripSize(out, nrows); cpContigBufToSeparateBuf( obuf, (uint8*) buf + row*rowsize + s, nrows, imagewidth, 0, 0, spp, 1); if (TIFFWriteEncodedStrip(out, strip++, obuf, stripsize) < 0) { TIFFError(TIFFFileName(out), "Error, can't write strip %u", strip - 1); _TIFFfree(obuf); return 0; } } } _TIFFfree(obuf); return 1; } DECLAREwriteFunc(writeBufferToContigTiles) { uint32 imagew = TIFFScanlineSize(out); uint32 tilew = TIFFTileRowSize(out); int iskew = imagew - tilew; tsize_t tilesize = TIFFTileSize(out); tdata_t obuf; uint8* bufp = (uint8*) buf; uint32 tl, tw; uint32 row; (void) spp; obuf = _TIFFmalloc(TIFFTileSize(out)); if (obuf == NULL) return 0; _TIFFmemset(obuf, 0, tilesize); (void) TIFFGetField(out, TIFFTAG_TILELENGTH, &tl); (void) TIFFGetField(out, TIFFTAG_TILEWIDTH, &tw); for (row = 0; row < imagelength; row += tilelength) { uint32 nrow = (row+tl > imagelength) ? imagelength-row : tl; uint32 colb = 0; uint32 col; for (col = 0; col < imagewidth; col += tw) { /* * Tile is clipped horizontally. Calculate * visible portion and skewing factors. */ if (colb + tilew > imagew) { uint32 width = imagew - colb; int oskew = tilew - width; cpStripToTile(obuf, bufp + colb, nrow, width, oskew, oskew + iskew); } else cpStripToTile(obuf, bufp + colb, nrow, tilew, 0, iskew); if (TIFFWriteTile(out, obuf, col, row, 0, 0) < 0) { TIFFError(TIFFFileName(out), "Error, can't write tile at %lu %lu", (unsigned long) col, (unsigned long) row); _TIFFfree(obuf); return 0; } colb += tilew; } bufp += nrow * imagew; } _TIFFfree(obuf); return 1; } DECLAREwriteFunc(writeBufferToSeparateTiles) { uint32 imagew = TIFFScanlineSize(out); tsize_t tilew = TIFFTileRowSize(out); uint32 iimagew = TIFFRasterScanlineSize(out); int iskew = iimagew - tilew*spp; tsize_t tilesize = TIFFTileSize(out); tdata_t obuf; uint8* bufp = (uint8*) buf; uint32 tl, tw; uint32 row; uint16 bps, bytes_per_sample; obuf = _TIFFmalloc(TIFFTileSize(out)); if (obuf == NULL) return 0; _TIFFmemset(obuf, 0, tilesize); (void) TIFFGetField(out, TIFFTAG_TILELENGTH, &tl); (void) TIFFGetField(out, TIFFTAG_TILEWIDTH, &tw); (void) TIFFGetField(out, TIFFTAG_BITSPERSAMPLE, &bps); assert( bps % 8 == 0 ); bytes_per_sample = bps/8; for (row = 0; row < imagelength; row += tl) { uint32 nrow = (row+tl > imagelength) ? imagelength-row : tl; uint32 colb = 0; uint32 col; for (col = 0; col < imagewidth; col += tw) { tsample_t s; for (s = 0; s < spp; s++) { /* * Tile is clipped horizontally. Calculate * visible portion and skewing factors. */ if (colb + tilew > imagew) { uint32 width = (imagew - colb); int oskew = tilew - width; cpContigBufToSeparateBuf(obuf, bufp + (colb*spp) + s, nrow, width/bytes_per_sample, oskew, (oskew*spp)+iskew, spp, bytes_per_sample); } else cpContigBufToSeparateBuf(obuf, bufp + (colb*spp) + s, nrow, tilewidth, 0, iskew, spp, bytes_per_sample); if (TIFFWriteTile(out, obuf, col, row, 0, s) < 0) { TIFFError(TIFFFileName(out), "Error, can't write tile at %lu %lu " "sample %lu", (unsigned long) col, (unsigned long) row, (unsigned long) s); _TIFFfree(obuf); return 0; } } colb += tilew; } bufp += nrow * iimagew; } _TIFFfree(obuf); return 1; } /* * Contig strips -> contig tiles. */ DECLAREcpFunc(cpContigStrips2ContigTiles) { return cpImage(in, out, readContigStripsIntoBuffer, writeBufferToContigTiles, imagelength, imagewidth, spp); } /* * Contig strips -> separate tiles. */ DECLAREcpFunc(cpContigStrips2SeparateTiles) { return cpImage(in, out, readContigStripsIntoBuffer, writeBufferToSeparateTiles, imagelength, imagewidth, spp); } /* * Separate strips -> contig tiles. */ DECLAREcpFunc(cpSeparateStrips2ContigTiles) { return cpImage(in, out, readSeparateStripsIntoBuffer, writeBufferToContigTiles, imagelength, imagewidth, spp); } /* * Separate strips -> separate tiles. */ DECLAREcpFunc(cpSeparateStrips2SeparateTiles) { return cpImage(in, out, readSeparateStripsIntoBuffer, writeBufferToSeparateTiles, imagelength, imagewidth, spp); } /* * Contig strips -> contig tiles. */ DECLAREcpFunc(cpContigTiles2ContigTiles) { return cpImage(in, out, readContigTilesIntoBuffer, writeBufferToContigTiles, imagelength, imagewidth, spp); } /* * Contig tiles -> separate tiles. */ DECLAREcpFunc(cpContigTiles2SeparateTiles) { return cpImage(in, out, readContigTilesIntoBuffer, writeBufferToSeparateTiles, imagelength, imagewidth, spp); } /* * Separate tiles -> contig tiles. */ DECLAREcpFunc(cpSeparateTiles2ContigTiles) { return cpImage(in, out, readSeparateTilesIntoBuffer, writeBufferToContigTiles, imagelength, imagewidth, spp); } /* * Separate tiles -> separate tiles (tile dimension change). */ DECLAREcpFunc(cpSeparateTiles2SeparateTiles) { return cpImage(in, out, readSeparateTilesIntoBuffer, writeBufferToSeparateTiles, imagelength, imagewidth, spp); } /* * Contig tiles -> contig tiles (tile dimension change). */ DECLAREcpFunc(cpContigTiles2ContigStrips) { return cpImage(in, out, readContigTilesIntoBuffer, writeBufferToContigStrips, imagelength, imagewidth, spp); } /* * Contig tiles -> separate strips. */ DECLAREcpFunc(cpContigTiles2SeparateStrips) { return cpImage(in, out, readContigTilesIntoBuffer, writeBufferToSeparateStrips, imagelength, imagewidth, spp); } /* * Separate tiles -> contig strips. */ DECLAREcpFunc(cpSeparateTiles2ContigStrips) { return cpImage(in, out, readSeparateTilesIntoBuffer, writeBufferToContigStrips, imagelength, imagewidth, spp); } /* * Separate tiles -> separate strips. */ DECLAREcpFunc(cpSeparateTiles2SeparateStrips) { return cpImage(in, out, readSeparateTilesIntoBuffer, writeBufferToSeparateStrips, imagelength, imagewidth, spp); } /* * Select the appropriate copy function to use. */ static copyFunc pickCopyFunc(TIFF* in, TIFF* out, uint16 bitspersample, uint16 samplesperpixel) { uint16 shortv; uint32 w, l, tw, tl; int bychunk; (void) TIFFGetField(in, TIFFTAG_PLANARCONFIG, &shortv); if (shortv != config && bitspersample != 8 && samplesperpixel > 1) { fprintf(stderr, "%s: Cannot handle different planar configuration w/ bits/sample != 8\n", TIFFFileName(in)); return (NULL); } TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &w); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &l); if (!(TIFFIsTiled(out) || TIFFIsTiled(in))) { uint32 irps = (uint32) -1L; TIFFGetField(in, TIFFTAG_ROWSPERSTRIP, &irps); /* if biased, force decoded copying to allow image subtraction */ bychunk = !bias && (rowsperstrip == irps); }else{ /* either in or out is tiled */ if (bias) { fprintf(stderr, "%s: Cannot handle tiled configuration w/bias image\n", TIFFFileName(in)); return (NULL); } if (TIFFIsTiled(out)) { if (!TIFFGetField(in, TIFFTAG_TILEWIDTH, &tw)) tw = w; if (!TIFFGetField(in, TIFFTAG_TILELENGTH, &tl)) tl = l; bychunk = (tw == tilewidth && tl == tilelength); } else { /* out's not, so in must be tiled */ TIFFGetField(in, TIFFTAG_TILEWIDTH, &tw); TIFFGetField(in, TIFFTAG_TILELENGTH, &tl); bychunk = (tw == w && tl == rowsperstrip); } } #define T 1 #define F 0 #define pack(a,b,c,d,e) ((long)(((a)<<11)|((b)<<3)|((c)<<2)|((d)<<1)|(e))) switch(pack(shortv,config,TIFFIsTiled(in),TIFFIsTiled(out),bychunk)) { /* Strips -> Tiles */ case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, F,T,F): case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, F,T,T): return cpContigStrips2ContigTiles; case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, F,T,F): case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, F,T,T): return cpContigStrips2SeparateTiles; case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, F,T,F): case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, F,T,T): return cpSeparateStrips2ContigTiles; case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, F,T,F): case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, F,T,T): return cpSeparateStrips2SeparateTiles; /* Tiles -> Tiles */ case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, T,T,F): case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, T,T,T): return cpContigTiles2ContigTiles; case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, T,T,F): case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, T,T,T): return cpContigTiles2SeparateTiles; case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, T,T,F): case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, T,T,T): return cpSeparateTiles2ContigTiles; case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, T,T,F): case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, T,T,T): return cpSeparateTiles2SeparateTiles; /* Tiles -> Strips */ case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, T,F,F): case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, T,F,T): return cpContigTiles2ContigStrips; case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, T,F,F): case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, T,F,T): return cpContigTiles2SeparateStrips; case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, T,F,F): case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, T,F,T): return cpSeparateTiles2ContigStrips; case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, T,F,F): case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, T,F,T): return cpSeparateTiles2SeparateStrips; /* Strips -> Strips */ case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, F,F,F): return bias ? cpBiasedContig2Contig : cpContig2ContigByRow; case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG, F,F,T): return cpDecodedStrips; case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, F,F,F): case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE, F,F,T): return cpContig2SeparateByRow; case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, F,F,F): case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG, F,F,T): return cpSeparate2ContigByRow; case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, F,F,F): case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE, F,F,T): return cpSeparate2SeparateByRow; } #undef pack #undef F #undef T fprintf(stderr, "tiffcp: %s: Don't know how to copy/convert image.\n", TIFFFileName(in)); return (NULL); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/rgb2ycbcr.c0000644000212300117540000002502111571217524012557 00000000000000/* $Id: rgb2ycbcr.c,v 1.14 2011-05-31 17:03:16 bfriesen Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffiop.h" #include "tiffio.h" #define streq(a,b) (strcmp(a,b) == 0) #define CopyField(tag, v) \ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) #ifndef howmany #define howmany(x, y) (((x)+((y)-1))/(y)) #endif #define roundup(x, y) (howmany(x,y)*((uint32)(y))) #define LumaRed ycbcrCoeffs[0] #define LumaGreen ycbcrCoeffs[1] #define LumaBlue ycbcrCoeffs[2] uint16 compression = COMPRESSION_PACKBITS; uint32 rowsperstrip = (uint32) -1; uint16 horizSubSampling = 2; /* YCbCr horizontal subsampling */ uint16 vertSubSampling = 2; /* YCbCr vertical subsampling */ float ycbcrCoeffs[3] = { .299F, .587F, .114F }; /* default coding range is CCIR Rec 601-1 with no headroom/footroom */ float refBlackWhite[6] = { 0.F, 255.F, 128.F, 255.F, 128.F, 255.F }; static int tiffcvt(TIFF* in, TIFF* out); static void usage(int code); static void setupLumaTables(void); int main(int argc, char* argv[]) { TIFF *in, *out; int c; extern int optind; extern char *optarg; while ((c = getopt(argc, argv, "c:h:r:v:z")) != -1) switch (c) { case 'c': if (streq(optarg, "none")) compression = COMPRESSION_NONE; else if (streq(optarg, "packbits")) compression = COMPRESSION_PACKBITS; else if (streq(optarg, "lzw")) compression = COMPRESSION_LZW; else if (streq(optarg, "jpeg")) compression = COMPRESSION_JPEG; else if (streq(optarg, "zip")) compression = COMPRESSION_ADOBE_DEFLATE; else usage(-1); break; case 'h': horizSubSampling = atoi(optarg); break; case 'v': vertSubSampling = atoi(optarg); break; case 'r': rowsperstrip = atoi(optarg); break; case 'z': /* CCIR Rec 601-1 w/ headroom/footroom */ refBlackWhite[0] = 16.; refBlackWhite[1] = 235.; refBlackWhite[2] = 128.; refBlackWhite[3] = 240.; refBlackWhite[4] = 128.; refBlackWhite[5] = 240.; break; case '?': usage(0); /*NOTREACHED*/ } if (argc - optind < 2) usage(-1); out = TIFFOpen(argv[argc-1], "w"); if (out == NULL) return (-2); setupLumaTables(); for (; optind < argc-1; optind++) { in = TIFFOpen(argv[optind], "r"); if (in != NULL) { do { if (!tiffcvt(in, out) || !TIFFWriteDirectory(out)) { (void) TIFFClose(out); return (1); } } while (TIFFReadDirectory(in)); (void) TIFFClose(in); } } (void) TIFFClose(out); return (0); } float *lumaRed; float *lumaGreen; float *lumaBlue; float D1, D2; int Yzero; static float* setupLuma(float c) { float *v = (float *)_TIFFmalloc(256 * sizeof (float)); int i; for (i = 0; i < 256; i++) v[i] = c * i; return (v); } static unsigned V2Code(float f, float RB, float RW, int CR) { unsigned int c = (unsigned int)((((f)*(RW-RB)/CR)+RB)+.5); return (c > 255 ? 255 : c); } static void setupLumaTables(void) { lumaRed = setupLuma(LumaRed); lumaGreen = setupLuma(LumaGreen); lumaBlue = setupLuma(LumaBlue); D1 = 1.F/(2.F - 2.F*LumaBlue); D2 = 1.F/(2.F - 2.F*LumaRed); Yzero = V2Code(0, refBlackWhite[0], refBlackWhite[1], 255); } static void cvtClump(unsigned char* op, uint32* raster, uint32 ch, uint32 cw, uint32 w) { float Y, Cb = 0, Cr = 0; uint32 j, k; /* * Convert ch-by-cw block of RGB * to YCbCr and sample accordingly. */ for (k = 0; k < ch; k++) { for (j = 0; j < cw; j++) { uint32 RGB = (raster - k*w)[j]; Y = lumaRed[TIFFGetR(RGB)] + lumaGreen[TIFFGetG(RGB)] + lumaBlue[TIFFGetB(RGB)]; /* accumulate chrominance */ Cb += (TIFFGetB(RGB) - Y) * D1; Cr += (TIFFGetR(RGB) - Y) * D2; /* emit luminence */ *op++ = V2Code(Y, refBlackWhite[0], refBlackWhite[1], 255); } for (; j < horizSubSampling; j++) *op++ = Yzero; } for (; k < vertSubSampling; k++) { for (j = 0; j < horizSubSampling; j++) *op++ = Yzero; } /* emit sampled chrominance values */ *op++ = V2Code(Cb / (ch*cw), refBlackWhite[2], refBlackWhite[3], 127); *op++ = V2Code(Cr / (ch*cw), refBlackWhite[4], refBlackWhite[5], 127); } #undef LumaRed #undef LumaGreen #undef LumaBlue #undef V2Code /* * Convert a strip of RGB data to YCbCr and * sample to generate the output data. */ static void cvtStrip(unsigned char* op, uint32* raster, uint32 nrows, uint32 width) { uint32 x; int clumpSize = vertSubSampling * horizSubSampling + 2; uint32 *tp; for (; nrows >= vertSubSampling; nrows -= vertSubSampling) { tp = raster; for (x = width; x >= horizSubSampling; x -= horizSubSampling) { cvtClump(op, tp, vertSubSampling, horizSubSampling, width); op += clumpSize; tp += horizSubSampling; } if (x > 0) { cvtClump(op, tp, vertSubSampling, x, width); op += clumpSize; } raster -= vertSubSampling*width; } if (nrows > 0) { tp = raster; for (x = width; x >= horizSubSampling; x -= horizSubSampling) { cvtClump(op, tp, nrows, horizSubSampling, width); op += clumpSize; tp += horizSubSampling; } if (x > 0) cvtClump(op, tp, nrows, x, width); } } static int cvtRaster(TIFF* tif, uint32* raster, uint32 width, uint32 height) { uint32 y; tstrip_t strip = 0; tsize_t cc, acc; unsigned char* buf; uint32 rwidth = roundup(width, horizSubSampling); uint32 rheight = roundup(height, vertSubSampling); uint32 nrows = (rowsperstrip > rheight ? rheight : rowsperstrip); uint32 rnrows = roundup(nrows,vertSubSampling); cc = rnrows*rwidth + 2*((rnrows*rwidth) / (horizSubSampling*vertSubSampling)); buf = (unsigned char*)_TIFFmalloc(cc); // FIXME unchecked malloc for (y = height; (int32) y > 0; y -= nrows) { uint32 nr = (y > nrows ? nrows : y); cvtStrip(buf, raster + (y-1)*width, nr, width); nr = roundup(nr, vertSubSampling); acc = nr*rwidth + 2*((nr*rwidth)/(horizSubSampling*vertSubSampling)); if (!TIFFWriteEncodedStrip(tif, strip++, buf, acc)) { _TIFFfree(buf); return (0); } } _TIFFfree(buf); return (1); } static int tiffcvt(TIFF* in, TIFF* out) { uint32 width, height; /* image width & height */ uint32* raster; /* retrieve RGBA image */ uint16 shortv; float floatv; char *stringv; uint32 longv; int result; size_t pixel_count; TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height); pixel_count = width * height; /* XXX: Check the integer overflow. */ if (!width || !height || pixel_count / width != height) { TIFFError(TIFFFileName(in), "Malformed input file; " "can't allocate buffer for raster of %lux%lu size", (unsigned long)width, (unsigned long)height); return 0; } raster = (uint32*)_TIFFCheckMalloc(in, pixel_count, sizeof(uint32), "raster buffer"); if (raster == 0) { TIFFError(TIFFFileName(in), "Failed to allocate buffer (%lu elements of %lu each)", (unsigned long)pixel_count, (unsigned long)sizeof(uint32)); return (0); } if (!TIFFReadRGBAImage(in, width, height, raster, 0)) { _TIFFfree(raster); return (0); } CopyField(TIFFTAG_SUBFILETYPE, longv); TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width); TIFFSetField(out, TIFFTAG_IMAGELENGTH, height); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(out, TIFFTAG_COMPRESSION, compression); TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR); if (compression == COMPRESSION_JPEG) TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RAW); CopyField(TIFFTAG_FILLORDER, shortv); TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 3); CopyField(TIFFTAG_XRESOLUTION, floatv); CopyField(TIFFTAG_YRESOLUTION, floatv); CopyField(TIFFTAG_RESOLUTIONUNIT, shortv); TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); { char buf[2048]; char *cp = strrchr(TIFFFileName(in), '/'); sprintf(buf, "YCbCr conversion of %s", cp ? cp+1 : TIFFFileName(in)); TIFFSetField(out, TIFFTAG_IMAGEDESCRIPTION, buf); } TIFFSetField(out, TIFFTAG_SOFTWARE, TIFFGetVersion()); CopyField(TIFFTAG_DOCUMENTNAME, stringv); TIFFSetField(out, TIFFTAG_REFERENCEBLACKWHITE, refBlackWhite); TIFFSetField(out, TIFFTAG_YCBCRSUBSAMPLING, horizSubSampling, vertSubSampling); TIFFSetField(out, TIFFTAG_YCBCRPOSITIONING, YCBCRPOSITION_CENTERED); TIFFSetField(out, TIFFTAG_YCBCRCOEFFICIENTS, ycbcrCoeffs); rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip); TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip); result = cvtRaster(out, raster, width, height); _TIFFfree(raster); return result; } char* stuff[] = { "usage: rgb2ycbcr [-c comp] [-r rows] [-h N] [-v N] input... output\n", "where comp is one of the following compression algorithms:\n", " jpeg\t\tJPEG encoding\n", " lzw\t\tLempel-Ziv & Welch encoding\n", " zip\t\tdeflate encoding\n", " packbits\tPackBits encoding (default)\n", " none\t\tno compression\n", "and the other options are:\n", " -r\trows/strip\n", " -h\thorizontal sampling factor (1,2,4)\n", " -v\tvertical sampling factor (1,2,4)\n", NULL }; static void usage(int code) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(code); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/tiffcrop.c0000644000212300117540000110752411501676264012531 00000000000000/* $Id: tiffcrop.c,v 1.20 2010-12-14 02:03:24 faxguy Exp $ */ /* tiffcrop.c -- a port of tiffcp.c extended to include manipulations of * the image data through additional options listed below * * Original code: * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * Additions (c) Richard Nolde 2006-2010 * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS OR ANY OTHER COPYRIGHT * HOLDERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE * OR PERFORMANCE OF THIS SOFTWARE. * * Some portions of the current code are derived from tiffcp, primarly in * the areas of lowlevel reading and writing of TAGS, scanlines and tiles though * some of the original functions have been extended to support arbitrary bit * depths. These functions are presented at the top of this file. * * Add support for the options below to extract sections of image(s) * and to modify the whole image or selected portions of each image by * rotations, mirroring, and colorscale/colormap inversion of selected * types of TIFF images when appropriate. Some color model dependent * functions are restricted to bilevel or 8 bit per sample data. * See the man page for the full explanations. * * New Options: * -h Display the syntax guide. * -v Report the version and last build date for tiffcrop and libtiff. * -z x1,y1,x2,y2:x3,y3,x4,y4:..xN,yN,xN + 1, yN + 1 * Specify a series of coordinates to define rectangular * regions by the top left and lower right corners. * -e c|d|i|m|s export mode for images and selections from input images * combined All images and selections are written to a single file (default) * with multiple selections from one image combined into a single image * divided All images and selections are written to a single file * with each selection from one image written to a new image * image Each input image is written to a new file (numeric filename sequence) * with multiple selections from the image combined into one image * multiple Each input image is written to a new file (numeric filename sequence) * with each selection from the image written to a new image * separated Individual selections from each image are written to separate files * -U units [in, cm, px ] inches, centimeters or pixels * -H # Set horizontal resolution of output images to # * -V # Set vertical resolution of output images to # * -J # Horizontal margin of output page to # expressed in current * units when sectioning image into columns x rows * using the -S cols:rows option. * -K # Vertical margin of output page to # expressed in current * units when sectioning image into columns x rows * using the -S cols:rows option. * -X # Horizontal dimension of region to extract expressed in current * units * -Y # Vertical dimension of region to extract expressed in current * units * -O orient Orientation for output image, portrait, landscape, auto * -P page Page size for output image segments, eg letter, legal, tabloid, * etc. * -S cols:rows Divide the image into equal sized segments using cols across * and rows down * -E t|l|r|b Edge to use as origin * -m #,#,#,# Margins from edges for selection: top, left, bottom, right * (commas separated) * -Z #:#,#:# Zones of the image designated as zone X of Y, * eg 1:3 would be first of three equal portions measured * from reference edge * -N odd|even|#,#-#,#|last * Select sequences and/or ranges of images within file * to process. The words odd or even may be used to specify * all odd or even numbered images the word last may be used * in place of a number in the sequence to indicate the final * image in the file without knowing how many images there are. * -R # Rotate image or crop selection by 90,180,or 270 degrees * clockwise * -F h|v Flip (mirror) image or crop selection horizontally * or vertically * -I [black|white|data|both] * Invert color space, eg dark to light for bilevel and grayscale images * If argument is white or black, set the PHOTOMETRIC_INTERPRETATION * tag to MinIsBlack or MinIsWhite without altering the image data * If the argument is data or both, the image data are modified: * both inverts the data and the PHOTOMETRIC_INTERPRETATION tag, * data inverts the data but not the PHOTOMETRIC_INTERPRETATION tag * -D input:,output:,format:,level:N,debug:N * Dump raw data for input and/or output images to individual files * in raw (binary) format or text (ASCII) representing binary data * as strings of 1s and 0s. The filename arguments are used as stems * from which individual files are created for each image. Text format * includes annotations for image parameters and scanline info. Level * selects which functions dump data, with higher numbers selecting * lower level, scanline level routines. Debug reports a limited set * of messages to monitor progess without enabling dump logs. */ static char tiffcrop_version_id[] = "2.4"; static char tiffcrop_rev_date[] = "12-13-2010"; #include "tif_config.h" #include "tiffiop.h" #include #include #include #include #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifndef HAVE_GETOPT extern int getopt(int, char**, char*); #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" #if defined(VMS) # define unlink delete #endif #ifndef PATH_MAX #define PATH_MAX 1024 #endif #ifndef streq #define streq(a,b) (strcmp((a),(b)) == 0) #endif #define strneq(a,b,n) (strncmp((a),(b),(n)) == 0) #define TRUE 1 #define FALSE 0 #ifndef TIFFhowmany #define TIFFhowmany(x, y) ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y))) #define TIFFhowmany8(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3) #endif /* * Definitions and data structures required to support cropping and image * manipulations. */ #define EDGE_TOP 1 #define EDGE_LEFT 2 #define EDGE_BOTTOM 3 #define EDGE_RIGHT 4 #define EDGE_CENTER 5 #define MIRROR_HORIZ 1 #define MIRROR_VERT 2 #define MIRROR_BOTH 3 #define ROTATECW_90 8 #define ROTATECW_180 16 #define ROTATECW_270 32 #define ROTATE_ANY ROTATECW_90 || ROTATECW_180 || ROTATECW_270 #define CROP_NONE 0 #define CROP_MARGINS 1 #define CROP_WIDTH 2 #define CROP_LENGTH 4 #define CROP_ZONES 8 #define CROP_REGIONS 16 #define CROP_ROTATE 32 #define CROP_MIRROR 64 #define CROP_INVERT 128 /* Modes for writing out images and selections */ #define ONE_FILE_COMPOSITE 0 /* One file, sections combined sections */ #define ONE_FILE_SEPARATED 1 /* One file, sections to new IFDs */ #define FILE_PER_IMAGE_COMPOSITE 2 /* One file per image, combined sections */ #define FILE_PER_IMAGE_SEPARATED 3 /* One file per input image */ #define FILE_PER_SELECTION 4 /* One file per selection */ #define COMPOSITE_IMAGES 0 /* Selections combined into one image */ #define SEPARATED_IMAGES 1 /* Selections saved to separate images */ #define STRIP 1 #define TILE 2 #define MAX_REGIONS 8 /* number of regions to extract from a single page */ #define MAX_OUTBUFFS 8 /* must match larger of zones or regions */ #define MAX_SECTIONS 32 /* number of sections per page to write to output */ #define MAX_IMAGES 2048 /* number of images in descrete list, not in the file */ #define MAX_SAMPLES 8 /* maximum number of samples per pixel supported */ #define MAX_BITS_PER_SAMPLE 64 /* maximum bit depth supported */ #define MAX_EXPORT_PAGES 999999 /* maximum number of export pages per file */ #define DUMP_NONE 0 #define DUMP_TEXT 1 #define DUMP_RAW 2 /* Offsets into buffer for margins and fixed width and length segments */ struct offset { uint32 tmargin; uint32 lmargin; uint32 bmargin; uint32 rmargin; uint32 crop_width; uint32 crop_length; uint32 startx; uint32 endx; uint32 starty; uint32 endy; }; /* Description of a zone within the image. Position 1 of 3 zones would be * the first third of the image. These are computed after margins and * width/length requests are applied so that you can extract multiple * zones from within a larger region for OCR or barcode recognition. */ struct buffinfo { uint32 size; /* size of this buffer */ unsigned char *buffer; /* address of the allocated buffer */ }; struct zone { int position; /* ordinal of segment to be extracted */ int total; /* total equal sized divisions of crop area */ }; struct pageseg { uint32 x1; /* index of left edge */ uint32 x2; /* index of right edge */ uint32 y1; /* index of top edge */ uint32 y2; /* index of bottom edge */ int position; /* ordinal of segment to be extracted */ int total; /* total equal sized divisions of crop area */ uint32 buffsize; /* size of buffer needed to hold the cropped zone */ }; struct coordpairs { double X1; /* index of left edge in current units */ double X2; /* index of right edge in current units */ double Y1; /* index of top edge in current units */ double Y2; /* index of bottom edge in current units */ }; struct region { uint32 x1; /* pixel offset of left edge */ uint32 x2; /* pixel offset of right edge */ uint32 y1; /* pixel offset of top edge */ uint32 y2; /* picel offset of bottom edge */ uint32 width; /* width in pixels */ uint32 length; /* length in pixels */ uint32 buffsize; /* size of buffer needed to hold the cropped region */ unsigned char *buffptr; /* address of start of the region */ }; /* Cropping parameters from command line and image data * Note: This should be renamed to proc_opts and expanded to include all current globals * if possible, but each function that accesses global variables will have to be redone. */ struct crop_mask { double width; /* Selection width for master crop region in requested units */ double length; /* Selection length for master crop region in requesed units */ double margins[4]; /* Top, left, bottom, right margins */ float xres; /* Horizontal resolution read from image*/ float yres; /* Vertical resolution read from image */ uint32 combined_width; /* Width of combined cropped zones */ uint32 combined_length; /* Length of combined cropped zones */ uint32 bufftotal; /* Size of buffer needed to hold all the cropped region */ uint16 img_mode; /* Composite or separate images created from zones or regions */ uint16 exp_mode; /* Export input images or selections to one or more files */ uint16 crop_mode; /* Crop options to be applied */ uint16 res_unit; /* Resolution unit for margins and selections */ uint16 edge_ref; /* Reference edge for sections extraction and combination */ uint16 rotation; /* Clockwise rotation of the extracted region or image */ uint16 mirror; /* Mirror extracted region or image horizontally or vertically */ uint16 invert; /* Invert the color map of image or region */ uint16 photometric; /* Status of photometric interpretation for inverted image */ uint16 selections; /* Number of regions or zones selected */ uint16 regions; /* Number of regions delimited by corner coordinates */ struct region regionlist[MAX_REGIONS]; /* Regions within page or master crop region */ uint16 zones; /* Number of zones delimited by Ordinal:Total requested */ struct zone zonelist[MAX_REGIONS]; /* Zones indices to define a region */ struct coordpairs corners[MAX_REGIONS]; /* Coordinates of upper left and lower right corner */ }; #define MAX_PAPERNAMES 49 #define MAX_PAPERNAME_LENGTH 15 #define DEFAULT_RESUNIT RESUNIT_INCH #define DEFAULT_PAGE_HEIGHT 14.0 #define DEFAULT_PAGE_WIDTH 8.5 #define DEFAULT_RESOLUTION 300 #define DEFAULT_PAPER_SIZE "legal" #define ORIENTATION_NONE 0 #define ORIENTATION_PORTRAIT 1 #define ORIENTATION_LANDSCAPE 2 #define ORIENTATION_SEASCAPE 4 #define ORIENTATION_AUTO 16 #define PAGE_MODE_NONE 0 #define PAGE_MODE_RESOLUTION 1 #define PAGE_MODE_PAPERSIZE 2 #define PAGE_MODE_MARGINS 4 #define PAGE_MODE_ROWSCOLS 8 #define INVERT_DATA_ONLY 10 #define INVERT_DATA_AND_TAG 11 struct paperdef { char name[MAX_PAPERNAME_LENGTH]; double width; double length; double asratio; }; /* European page sizes corrected from update sent by * thomas . jarosch @ intra2net . com on 5/7/2010 * Paper Size Width Length Aspect Ratio */ struct paperdef PaperTable[MAX_PAPERNAMES] = { {"default", 8.500, 14.000, 0.607}, {"pa4", 8.264, 11.000, 0.751}, {"letter", 8.500, 11.000, 0.773}, {"legal", 8.500, 14.000, 0.607}, {"half-letter", 8.500, 5.514, 1.542}, {"executive", 7.264, 10.528, 0.690}, {"tabloid", 11.000, 17.000, 0.647}, {"11x17", 11.000, 17.000, 0.647}, {"ledger", 17.000, 11.000, 1.545}, {"archa", 9.000, 12.000, 0.750}, {"archb", 12.000, 18.000, 0.667}, {"archc", 18.000, 24.000, 0.750}, {"archd", 24.000, 36.000, 0.667}, {"arche", 36.000, 48.000, 0.750}, {"csheet", 17.000, 22.000, 0.773}, {"dsheet", 22.000, 34.000, 0.647}, {"esheet", 34.000, 44.000, 0.773}, {"superb", 11.708, 17.042, 0.687}, {"commercial", 4.139, 9.528, 0.434}, {"monarch", 3.889, 7.528, 0.517}, {"envelope-dl", 4.333, 8.681, 0.499}, {"envelope-c5", 6.389, 9.028, 0.708}, {"europostcard", 4.139, 5.833, 0.710}, {"a0", 33.110, 46.811, 0.707}, {"a1", 23.386, 33.110, 0.706}, {"a2", 16.535, 23.386, 0.707}, {"a3", 11.693, 16.535, 0.707}, {"a4", 8.268, 11.693, 0.707}, {"a5", 5.827, 8.268, 0.705}, {"a6", 4.134, 5.827, 0.709}, {"a7", 2.913, 4.134, 0.705}, {"a8", 2.047, 2.913, 0.703}, {"a9", 1.457, 2.047, 0.712}, {"a10", 1.024, 1.457, 0.703}, {"b0", 39.370, 55.669, 0.707}, {"b1", 27.835, 39.370, 0.707}, {"b2", 19.685, 27.835, 0.707}, {"b3", 13.898, 19.685, 0.706}, {"b4", 9.843, 13.898, 0.708}, {"b5", 6.929, 9.843, 0.704}, {"b6", 4.921, 6.929, 0.710}, {"c0", 36.102, 51.063, 0.707}, {"c1", 25.512, 36.102, 0.707}, {"c2", 18.031, 25.512, 0.707}, {"c3", 12.756, 18.031, 0.707}, {"c4", 9.016, 12.756, 0.707}, {"c5", 6.378, 9.016, 0.707}, {"c6", 4.488, 6.378, 0.704}, {"", 0.000, 0.000, 1.000} }; /* Structure to define input image parameters */ struct image_data { float xres; float yres; uint32 width; uint32 length; uint16 res_unit; uint16 bps; uint16 spp; uint16 planar; uint16 photometric; uint16 orientation; uint16 compression; uint16 adjustments; }; /* Structure to define the output image modifiers */ struct pagedef { char name[16]; double width; /* width in pixels */ double length; /* length in pixels */ double hmargin; /* margins to subtract from width of sections */ double vmargin; /* margins to subtract from height of sections */ double hres; /* horizontal resolution for output */ double vres; /* vertical resolution for output */ uint32 mode; /* bitmask of modifiers to page format */ uint16 res_unit; /* resolution unit for output image */ unsigned int rows; /* number of section rows */ unsigned int cols; /* number of section cols */ unsigned int orient; /* portrait, landscape, seascape, auto */ }; struct dump_opts { int debug; int format; int level; char mode[4]; char infilename[PATH_MAX + 1]; char outfilename[PATH_MAX + 1]; FILE *infile; FILE *outfile; }; /* globals */ static int outtiled = -1; static uint32 tilewidth = 0; static uint32 tilelength = 0; static uint16 config = 0; static uint16 compression = 0; static uint16 predictor = 0; static uint16 fillorder = 0; static uint32 rowsperstrip = 0; static uint32 g3opts = 0; static int ignore = FALSE; /* if true, ignore read errors */ static uint32 defg3opts = (uint32) -1; static int quality = 100; /* JPEG quality */ /* static int jpegcolormode = -1; was JPEGCOLORMODE_RGB; */ static int jpegcolormode = JPEGCOLORMODE_RGB; static uint16 defcompression = (uint16) -1; static uint16 defpredictor = (uint16) -1; static int pageNum = 0; static int little_endian = 1; /* Functions adapted from tiffcp with additions or significant modifications */ static int readContigStripsIntoBuffer (TIFF*, uint8*); static int readSeparateStripsIntoBuffer (TIFF*, uint8*, uint32, uint32, tsample_t, struct dump_opts *); static int readContigTilesIntoBuffer (TIFF*, uint8*, uint32, uint32, uint32, uint32, tsample_t, uint16); static int readSeparateTilesIntoBuffer (TIFF*, uint8*, uint32, uint32, uint32, uint32, tsample_t, uint16); static int writeBufferToContigStrips (TIFF*, uint8*, uint32); static int writeBufferToContigTiles (TIFF*, uint8*, uint32, uint32, tsample_t, struct dump_opts *); static int writeBufferToSeparateStrips (TIFF*, uint8*, uint32, uint32, tsample_t, struct dump_opts *); static int writeBufferToSeparateTiles (TIFF*, uint8*, uint32, uint32, tsample_t, struct dump_opts *); static int extractContigSamplesToBuffer (uint8 *, uint8 *, uint32, uint32, tsample_t, uint16, uint16, struct dump_opts *); static int processCompressOptions(char*); static void usage(void); /* All other functions by Richard Nolde, not found in tiffcp */ static void initImageData (struct image_data *); static void initCropMasks (struct crop_mask *); static void initPageSetup (struct pagedef *, struct pageseg *, struct buffinfo []); static void initDumpOptions(struct dump_opts *); /* Command line and file naming functions */ void process_command_opts (int, char *[], char *, char *, uint32 *, uint16 *, uint16 *, uint32 *, uint32 *, uint32 *, struct crop_mask *, struct pagedef *, struct dump_opts *, unsigned int *, unsigned int *); static int update_output_file (TIFF **, char *, int, char *, unsigned int *); /* * High level functions for whole image manipulation */ static int get_page_geometry (char *, struct pagedef*); static int computeInputPixelOffsets(struct crop_mask *, struct image_data *, struct offset *); static int computeOutputPixelOffsets (struct crop_mask *, struct image_data *, struct pagedef *, struct pageseg *, struct dump_opts *); static int loadImage(TIFF *, struct image_data *, struct dump_opts *, unsigned char **); static int correct_orientation(struct image_data *, unsigned char **); static int getCropOffsets(struct image_data *, struct crop_mask *, struct dump_opts *); static int processCropSelections(struct image_data *, struct crop_mask *, unsigned char **, struct buffinfo []); static int writeSelections(TIFF *, TIFF **, struct crop_mask *, struct image_data *, struct dump_opts *, struct buffinfo [], char *, char *, unsigned int*, unsigned int); /* Section functions */ static int createImageSection(uint32, unsigned char **); static int extractImageSection(struct image_data *, struct pageseg *, unsigned char *, unsigned char *); static int writeSingleSection(TIFF *, TIFF *, struct image_data *, struct dump_opts *, uint32, uint32, double, double, unsigned char *); static int writeImageSections(TIFF *, TIFF *, struct image_data *, struct pagedef *, struct pageseg *, struct dump_opts *, unsigned char *, unsigned char **); /* Whole image functions */ static int createCroppedImage(struct image_data *, struct crop_mask *, unsigned char **, unsigned char **); static int writeCroppedImage(TIFF *, TIFF *, struct image_data *image, struct dump_opts * dump, uint32, uint32, unsigned char *, int, int); /* Image manipulation functions */ static int rotateContigSamples8bits(uint16, uint16, uint16, uint32, uint32, uint32, uint8 *, uint8 *); static int rotateContigSamples16bits(uint16, uint16, uint16, uint32, uint32, uint32, uint8 *, uint8 *); static int rotateContigSamples24bits(uint16, uint16, uint16, uint32, uint32, uint32, uint8 *, uint8 *); static int rotateContigSamples32bits(uint16, uint16, uint16, uint32, uint32, uint32, uint8 *, uint8 *); static int rotateImage(uint16, struct image_data *, uint32 *, uint32 *, unsigned char **); static int mirrorImage(uint16, uint16, uint16, uint32, uint32, unsigned char *); static int invertImage(uint16, uint16, uint16, uint32, uint32, unsigned char *); /* Functions to reverse the sequence of samples in a scanline */ static int reverseSamples8bits (uint16, uint16, uint32, uint8 *, uint8 *); static int reverseSamples16bits (uint16, uint16, uint32, uint8 *, uint8 *); static int reverseSamples24bits (uint16, uint16, uint32, uint8 *, uint8 *); static int reverseSamples32bits (uint16, uint16, uint32, uint8 *, uint8 *); static int reverseSamplesBytes (uint16, uint16, uint32, uint8 *, uint8 *); /* Functions for manipulating individual samples in an image */ static int extractSeparateRegion(struct image_data *, struct crop_mask *, unsigned char *, unsigned char *, int); static int extractCompositeRegions(struct image_data *, struct crop_mask *, unsigned char *, unsigned char *); static int extractContigSamples8bits (uint8 *, uint8 *, uint32, tsample_t, uint16, uint16, tsample_t, uint32, uint32); static int extractContigSamples16bits (uint8 *, uint8 *, uint32, tsample_t, uint16, uint16, tsample_t, uint32, uint32); static int extractContigSamples24bits (uint8 *, uint8 *, uint32, tsample_t, uint16, uint16, tsample_t, uint32, uint32); static int extractContigSamples32bits (uint8 *, uint8 *, uint32, tsample_t, uint16, uint16, tsample_t, uint32, uint32); static int extractContigSamplesBytes (uint8 *, uint8 *, uint32, tsample_t, uint16, uint16, tsample_t, uint32, uint32); static int extractContigSamplesShifted8bits (uint8 *, uint8 *, uint32, tsample_t, uint16, uint16, tsample_t, uint32, uint32, int); static int extractContigSamplesShifted16bits (uint8 *, uint8 *, uint32, tsample_t, uint16, uint16, tsample_t, uint32, uint32, int); static int extractContigSamplesShifted24bits (uint8 *, uint8 *, uint32, tsample_t, uint16, uint16, tsample_t, uint32, uint32, int); static int extractContigSamplesShifted32bits (uint8 *, uint8 *, uint32, tsample_t, uint16, uint16, tsample_t, uint32, uint32, int); static int extractContigSamplesToTileBuffer(uint8 *, uint8 *, uint32, uint32, uint32, uint32, tsample_t, uint16, uint16, uint16, struct dump_opts *); /* Functions to combine separate planes into interleaved planes */ static int combineSeparateSamples8bits (uint8 *[], uint8 *, uint32, uint32, uint16, uint16, FILE *, int, int); static int combineSeparateSamples16bits (uint8 *[], uint8 *, uint32, uint32, uint16, uint16, FILE *, int, int); static int combineSeparateSamples24bits (uint8 *[], uint8 *, uint32, uint32, uint16, uint16, FILE *, int, int); static int combineSeparateSamples32bits (uint8 *[], uint8 *, uint32, uint32, uint16, uint16, FILE *, int, int); static int combineSeparateSamplesBytes (unsigned char *[], unsigned char *, uint32, uint32, tsample_t, uint16, FILE *, int, int); static int combineSeparateTileSamples8bits (uint8 *[], uint8 *, uint32, uint32, uint32, uint32, uint16, uint16, FILE *, int, int); static int combineSeparateTileSamples16bits (uint8 *[], uint8 *, uint32, uint32, uint32, uint32, uint16, uint16, FILE *, int, int); static int combineSeparateTileSamples24bits (uint8 *[], uint8 *, uint32, uint32, uint32, uint32, uint16, uint16, FILE *, int, int); static int combineSeparateTileSamples32bits (uint8 *[], uint8 *, uint32, uint32, uint32, uint32, uint16, uint16, FILE *, int, int); static int combineSeparateTileSamplesBytes (unsigned char *[], unsigned char *, uint32, uint32, uint32, uint32, tsample_t, uint16, FILE *, int, int); /* Dump functions for debugging */ static void dump_info (FILE *, int, char *, char *, ...); static int dump_data (FILE *, int, char *, unsigned char *, uint32); static int dump_byte (FILE *, int, char *, unsigned char); static int dump_short (FILE *, int, char *, uint16); static int dump_long (FILE *, int, char *, uint32); static int dump_wide (FILE *, int, char *, uint64); static int dump_buffer (FILE *, int, uint32, uint32, uint32, unsigned char *); /* End function declarations */ /* Functions derived in whole or in part from tiffcp */ /* The following functions are taken largely intact from tiffcp */ static char* usage_info[] = { "usage: tiffcrop [options] source1 ... sourceN destination", "where options are:", " -h Print this syntax listing", " -v Print tiffcrop version identifier and last revision date", " ", " -a Append to output instead of overwriting", " -d offset Set initial directory offset, counting first image as one, not zero", " -p contig Pack samples contiguously (e.g. RGBRGB...)", " -p separate Store samples separately (e.g. RRR...GGG...BBB...)", " -s Write output in strips", " -t Write output in tiles", " -i Ignore read errors", " ", " -r # Make each strip have no more than # rows", " -w # Set output tile width (pixels)", " -l # Set output tile length (pixels)", " ", " -f lsb2msb Force lsb-to-msb FillOrder for output", " -f msb2lsb Force msb-to-lsb FillOrder for output", "", " -c lzw[:opts] Compress output with Lempel-Ziv & Welch encoding", " -c zip[:opts] Compress output with deflate encoding", " -c jpeg[:opts] Compress output with JPEG encoding", " -c packbits Compress output with packbits encoding", " -c g3[:opts] Compress output with CCITT Group 3 encoding", " -c g4 Compress output with CCITT Group 4 encoding", " -c none Use no compression algorithm on output", " ", "Group 3 options:", " 1d Use default CCITT Group 3 1D-encoding", " 2d Use optional CCITT Group 3 2D-encoding", " fill Byte-align EOL codes", "For example, -c g3:2d:fill to get G3-2D-encoded data with byte-aligned EOLs", " ", "JPEG options:", " # Set compression quality level (0-100, default 100)", " raw Output color image as raw YCbCr", " rgb Output color image as RGB", "For example, -c jpeg:rgb:50 to get JPEG-encoded RGB data with 50% comp. quality", " ", "LZW and deflate options:", " # Set predictor value", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", " ", "Page and selection options:", " -N odd|even|#,#-#,#|last sequences and ranges of images within file to process", " The words odd or even may be used to specify all odd or even numbered images.", " The word last may be used in place of a number in the sequence to indicate.", " The final image in the file without knowing how many images there are.", " Numbers are counted from one even though TIFF IFDs are counted from zero.", " ", " -E t|l|r|b edge to use as origin for width and length of crop region", " -U units [in, cm, px ] inches, centimeters or pixels", " ", " -m #,#,#,# margins from edges for selection: top, left, bottom, right separated by commas", " -X # horizontal dimension of region to extract expressed in current units", " -Y # vertical dimension of region to extract expressed in current units", " -Z #:#,#:# zones of the image designated as position X of Y,", " eg 1:3 would be first of three equal portions measured from reference edge", " -z x1,y1,x2,y2:...:xN,yN,xN+1,yN+1", " regions of the image designated by upper left and lower right coordinates", "", "Export grouping options:", " -e c|d|i|m|s export mode for images and selections from input images.", " When exporting a composite image from multiple zones or regions", " (combined and image modes), the selections must have equal sizes", " for the axis perpendicular to the edge specified with -E.", " c|combined All images and selections are written to a single file (default).", " with multiple selections from one image combined into a single image.", " d|divided All images and selections are written to a single file", " with each selection from one image written to a new image.", " i|image Each input image is written to a new file (numeric filename sequence)", " with multiple selections from the image combined into one image.", " m|multiple Each input image is written to a new file (numeric filename sequence)", " with each selection from the image written to a new image.", " s|separated Individual selections from each image are written to separate files.", "", "Output options:", " -H # Set horizontal resolution of output images to #", " -V # Set vertical resolution of output images to #", " -J # Set horizontal margin of output page to # expressed in current units", " when sectioning image into columns x rows using the -S cols:rows option", " -K # Set verticalal margin of output page to # expressed in current units", " when sectioning image into columns x rows using the -S cols:rows option", " ", " -O orient orientation for output image, portrait, landscape, auto", " -P page page size for output image segments, eg letter, legal, tabloid, etc", " use #.#x#.# to specify a custom page size in the currently defined units", " where #.# represents the width and length", " -S cols:rows Divide the image into equal sized segments using cols across and rows down.", " ", " -F hor|vert|both", " flip (mirror) image or region horizontally, vertically, or both", " -R # [90,180,or 270] degrees clockwise rotation of image or extracted region", " -I [black|white|data|both]", " invert color space, eg dark to light for bilevel and grayscale images", " If argument is white or black, set the PHOTOMETRIC_INTERPRETATION ", " tag to MinIsBlack or MinIsWhite without altering the image data", " If the argument is data or both, the image data are modified:", " both inverts the data and the PHOTOMETRIC_INTERPRETATION tag,", " data inverts the data but not the PHOTOMETRIC_INTERPRETATION tag", " ", "-D opt1:value1,opt2:value2,opt3:value3:opt4:value4", " Debug/dump program progress and/or data to non-TIFF files.", " Options include the following and must be joined as a comma", " separate list. The use of this option is generally limited to", " program debugging and development of future options.", " ", " debug:N Display limited program progress indicators where larger N", " increase the level of detail. Note: Tiffcrop may be compiled with", " -DDEVELMODE to enable additional very low level debug reporting.", "", " Format:txt|raw Format any logged data as ASCII text or raw binary ", " values. ASCII text dumps include strings of ones and zeroes", " representing the binary values in the image data plus identifying headers.", " ", " level:N Specify the level of detail presented in the dump files.", " This can vary from dumps of the entire input or output image data to dumps", " of data processed by specific functions. Current range of levels is 1 to 3.", " ", " input:full-path-to-directory/input-dumpname", " ", " output:full-path-to-directory/output-dumpnaem", " ", " When dump files are being written, each image will be written to a separate", " file with the name built by adding a numeric sequence value to the dumpname", " and an extension of .txt for ASCII dumps or .bin for binary dumps.", " ", " The four debug/dump options are independent, though it makes little sense to", " specify a dump file without specifying a detail level.", " ", NULL }; /* This function could be modified to pass starting sample offset * and number of samples as args to select fewer than spp * from input image. These would then be passed to individual * extractContigSampleXX routines. */ static int readContigTilesIntoBuffer (TIFF* in, uint8* buf, uint32 imagelength, uint32 imagewidth, uint32 tw, uint32 tl, tsample_t spp, uint16 bps) { int status = 1; tsample_t sample = 0; tsample_t count = spp; uint32 row, col, trow; uint32 nrow, ncol; uint32 dst_rowsize, shift_width; uint32 bytes_per_sample, bytes_per_pixel; uint32 trailing_bits, prev_trailing_bits; uint32 tile_rowsize = TIFFTileRowSize(in); uint32 src_offset, dst_offset; uint32 row_offset, col_offset; uint8 *bufp = (uint8*) buf; unsigned char *src = NULL; unsigned char *dst = NULL; tsize_t tbytes = 0, tile_buffsize = 0; tsize_t tilesize = TIFFTileSize(in); unsigned char *tilebuf = NULL; bytes_per_sample = (bps + 7) / 8; bytes_per_pixel = ((bps * spp) + 7) / 8; if ((bps % 8) == 0) shift_width = 0; else { if (bytes_per_pixel < (bytes_per_sample + 1)) shift_width = bytes_per_pixel; else shift_width = bytes_per_sample + 1; } tile_buffsize = tilesize; if (tilesize < (tsize_t)(tl * tile_rowsize)) { #ifdef DEBUG2 TIFFError("readContigTilesIntoBuffer", "Tilesize %lu is too small, using alternate calculation %u", tilesize, tl * tile_rowsize); #endif tile_buffsize = tl * tile_rowsize; } tilebuf = _TIFFmalloc(tile_buffsize); if (tilebuf == 0) return 0; dst_rowsize = ((imagewidth * bps * spp) + 7) / 8; for (row = 0; row < imagelength; row += tl) { nrow = (row + tl > imagelength) ? imagelength - row : tl; for (col = 0; col < imagewidth; col += tw) { tbytes = TIFFReadTile(in, tilebuf, col, row, 0, 0); if (tbytes < tilesize && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read tile at row %lu col %lu, Read %lu bytes of %lu", (unsigned long) col, (unsigned long) row, (unsigned long)tbytes, (unsigned long)tilesize); status = 0; _TIFFfree(tilebuf); return status; } row_offset = row * dst_rowsize; col_offset = ((col * bps * spp) + 7)/ 8; bufp = buf + row_offset + col_offset; if (col + tw > imagewidth) ncol = imagewidth - col; else ncol = tw; /* Each tile scanline will start on a byte boundary but it * has to be merged into the scanline for the entire * image buffer and the previous segment may not have * ended on a byte boundary */ /* Optimization for common bit depths, all samples */ if (((bps % 8) == 0) && (count == spp)) { for (trow = 0; trow < nrow; trow++) { src_offset = trow * tile_rowsize; _TIFFmemcpy (bufp, tilebuf + src_offset, (ncol * spp * bps) / 8); bufp += (imagewidth * bps * spp) / 8; } } else { /* Bit depths not a multiple of 8 and/or extract fewer than spp samples */ prev_trailing_bits = trailing_bits = 0; trailing_bits = (ncol * bps * spp) % 8; /* for (trow = 0; tl < nrow; trow++) */ for (trow = 0; trow < nrow; trow++) { src_offset = trow * tile_rowsize; src = tilebuf + src_offset; dst_offset = (row + trow) * dst_rowsize; dst = buf + dst_offset + col_offset; switch (shift_width) { case 0: if (extractContigSamplesBytes (src, dst, ncol, sample, spp, bps, count, 0, ncol)) { TIFFError("readContigTilesIntoBuffer", "Unable to extract row %d from tile %lu", row, (unsigned long)TIFFCurrentTile(in)); return 1; } break; case 1: if (bps == 1) { if (extractContigSamplesShifted8bits (src, dst, ncol, sample, spp, bps, count, 0, ncol, prev_trailing_bits)) { TIFFError("readContigTilesIntoBuffer", "Unable to extract row %d from tile %lu", row, (unsigned long)TIFFCurrentTile(in)); return 1; } break; } else if (extractContigSamplesShifted16bits (src, dst, ncol, sample, spp, bps, count, 0, ncol, prev_trailing_bits)) { TIFFError("readContigTilesIntoBuffer", "Unable to extract row %d from tile %lu", row, (unsigned long)TIFFCurrentTile(in)); return 1; } break; case 2: if (extractContigSamplesShifted24bits (src, dst, ncol, sample, spp, bps, count, 0, ncol, prev_trailing_bits)) { TIFFError("readContigTilesIntoBuffer", "Unable to extract row %d from tile %lu", row, (unsigned long)TIFFCurrentTile(in)); return 1; } break; case 3: case 4: case 5: if (extractContigSamplesShifted32bits (src, dst, ncol, sample, spp, bps, count, 0, ncol, prev_trailing_bits)) { TIFFError("readContigTilesIntoBuffer", "Unable to extract row %d from tile %lu", row, (unsigned long)TIFFCurrentTile(in)); return 1; } break; default: TIFFError("readContigTilesIntoBuffer", "Unsupported bit depth %d", bps); return 1; } } prev_trailing_bits += trailing_bits; if (prev_trailing_bits > 7) prev_trailing_bits-= 8; } } } _TIFFfree(tilebuf); return status; } static int readSeparateTilesIntoBuffer (TIFF* in, uint8 *obuf, uint32 imagelength, uint32 imagewidth, uint32 tw, uint32 tl, uint16 spp, uint16 bps) { int i, status = 1, sample; int shift_width, bytes_per_pixel; uint16 bytes_per_sample; uint32 row, col; /* Current row and col of image */ uint32 nrow, ncol; /* Number of rows and cols in current tile */ uint32 row_offset, col_offset; /* Output buffer offsets */ tsize_t tbytes = 0, tilesize = TIFFTileSize(in); tsample_t s; uint8* bufp = (uint8*)obuf; unsigned char *srcbuffs[MAX_SAMPLES]; unsigned char *tbuff = NULL; bytes_per_sample = (bps + 7) / 8; for (sample = 0; (sample < spp) && (sample < MAX_SAMPLES); sample++) { srcbuffs[sample] = NULL; tbuff = (unsigned char *)_TIFFmalloc(tilesize + 8); if (!tbuff) { TIFFError ("readSeparateTilesIntoBuffer", "Unable to allocate tile read buffer for sample %d", sample); for (i = 0; i < sample; i++) _TIFFfree (srcbuffs[i]); return 0; } srcbuffs[sample] = tbuff; } /* Each tile contains only the data for a single plane * arranged in scanlines of tw * bytes_per_sample bytes. */ for (row = 0; row < imagelength; row += tl) { nrow = (row + tl > imagelength) ? imagelength - row : tl; for (col = 0; col < imagewidth; col += tw) { for (s = 0; s < spp; s++) { /* Read each plane of a tile set into srcbuffs[s] */ tbytes = TIFFReadTile(in, srcbuffs[s], col, row, 0, s); if (tbytes < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read tile for row %lu col %lu, " "sample %lu", (unsigned long) col, (unsigned long) row, (unsigned long) s); status = 0; for (sample = 0; (sample < spp) && (sample < MAX_SAMPLES); sample++) { tbuff = srcbuffs[sample]; if (tbuff != NULL) _TIFFfree(tbuff); } return status; } } /* Tiles on the right edge may be padded out to tw * which must be a multiple of 16. * Ncol represents the visible (non padding) portion. */ if (col + tw > imagewidth) ncol = imagewidth - col; else ncol = tw; row_offset = row * (((imagewidth * spp * bps) + 7) / 8); col_offset = ((col * spp * bps) + 7) / 8; bufp = obuf + row_offset + col_offset; if ((bps % 8) == 0) { if (combineSeparateTileSamplesBytes(srcbuffs, bufp, ncol, nrow, imagewidth, tw, spp, bps, NULL, 0, 0)) { status = 0; break; } } else { bytes_per_pixel = ((bps * spp) + 7) / 8; if (bytes_per_pixel < (bytes_per_sample + 1)) shift_width = bytes_per_pixel; else shift_width = bytes_per_sample + 1; switch (shift_width) { case 1: if (combineSeparateTileSamples8bits (srcbuffs, bufp, ncol, nrow, imagewidth, tw, spp, bps, NULL, 0, 0)) { status = 0; break; } break; case 2: if (combineSeparateTileSamples16bits (srcbuffs, bufp, ncol, nrow, imagewidth, tw, spp, bps, NULL, 0, 0)) { status = 0; break; } break; case 3: if (combineSeparateTileSamples24bits (srcbuffs, bufp, ncol, nrow, imagewidth, tw, spp, bps, NULL, 0, 0)) { status = 0; break; } break; case 4: case 5: case 6: case 7: case 8: if (combineSeparateTileSamples32bits (srcbuffs, bufp, ncol, nrow, imagewidth, tw, spp, bps, NULL, 0, 0)) { status = 0; break; } break; default: TIFFError ("readSeparateTilesIntoBuffer", "Unsupported bit depth: %d", bps); status = 0; break; } } } } for (sample = 0; (sample < spp) && (sample < MAX_SAMPLES); sample++) { tbuff = srcbuffs[sample]; if (tbuff != NULL) _TIFFfree(tbuff); } return status; } static int writeBufferToContigStrips(TIFF* out, uint8* buf, uint32 imagelength) { uint32 row, nrows, rowsperstrip; tstrip_t strip = 0; tsize_t stripsize; TIFFGetFieldDefaulted(out, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); for (row = 0; row < imagelength; row += rowsperstrip) { nrows = (row + rowsperstrip > imagelength) ? imagelength - row : rowsperstrip; stripsize = TIFFVStripSize(out, nrows); if (TIFFWriteEncodedStrip(out, strip++, buf, stripsize) < 0) { TIFFError(TIFFFileName(out), "Error, can't write strip %u", strip - 1); return 1; } buf += stripsize; } return 0; } /* Abandon plans to modify code so that plannar orientation separate images * do not have all samples for each channel written before all samples * for the next channel have been abandoned. * Libtiff internals seem to depend on all data for a given sample * being contiguous within a strip or tile when PLANAR_CONFIG is * separate. All strips or tiles of a given plane are written * before any strips or tiles of a different plane are stored. */ static int writeBufferToSeparateStrips (TIFF* out, uint8* buf, uint32 length, uint32 width, uint16 spp, struct dump_opts *dump) { uint8 *src; uint16 bps; uint32 row, nrows, rowsize, rowsperstrip; uint32 bytes_per_sample; tsample_t s; tstrip_t strip = 0; tsize_t stripsize = TIFFStripSize(out); tsize_t rowstripsize, scanlinesize = TIFFScanlineSize(out); tsize_t total_bytes = 0; tdata_t obuf; (void) TIFFGetFieldDefaulted(out, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); (void) TIFFGetField(out, TIFFTAG_BITSPERSAMPLE, &bps); bytes_per_sample = (bps + 7) / 8; rowsize = ((bps * spp * width) + 7) / 8; /* source has interleaved samples */ rowstripsize = rowsperstrip * bytes_per_sample * (width + 1); obuf = _TIFFmalloc (rowstripsize); if (obuf == NULL) return 1; for (s = 0; s < spp; s++) { for (row = 0; row < length; row += rowsperstrip) { nrows = (row + rowsperstrip > length) ? length - row : rowsperstrip; stripsize = TIFFVStripSize(out, nrows); src = buf + (row * rowsize); total_bytes += stripsize; memset (obuf, '\0', rowstripsize); if (extractContigSamplesToBuffer(obuf, src, nrows, width, s, spp, bps, dump)) { _TIFFfree(obuf); return 1; } if ((dump->outfile != NULL) && (dump->level == 1)) { dump_info(dump->outfile, dump->format,"", "Sample %2d, Strip: %2d, bytes: %4d, Row %4d, bytes: %4d, Input offset: %6d", s + 1, strip + 1, stripsize, row + 1, scanlinesize, src - buf); dump_buffer(dump->outfile, dump->format, nrows, scanlinesize, row, obuf); } if (TIFFWriteEncodedStrip(out, strip++, obuf, stripsize) < 0) { TIFFError(TIFFFileName(out), "Error, can't write strip %u", strip - 1); _TIFFfree(obuf); return 1; } } } _TIFFfree(obuf); return 0; } /* Extract all planes from contiguous buffer into a single tile buffer * to be written out as a tile. */ static int writeBufferToContigTiles (TIFF* out, uint8* buf, uint32 imagelength, uint32 imagewidth, tsample_t spp, struct dump_opts* dump) { uint16 bps; uint32 tl, tw; uint32 row, col, nrow, ncol; uint32 src_rowsize, col_offset; uint32 tile_rowsize = TIFFTileRowSize(out); uint8* bufp = (uint8*) buf; tsize_t tile_buffsize = 0; tsize_t tilesize = TIFFTileSize(out); unsigned char *tilebuf = NULL; TIFFGetField(out, TIFFTAG_TILELENGTH, &tl); TIFFGetField(out, TIFFTAG_TILEWIDTH, &tw); TIFFGetField(out, TIFFTAG_BITSPERSAMPLE, &bps); tile_buffsize = tilesize; if (tilesize < (tsize_t)(tl * tile_rowsize)) { #ifdef DEBUG2 TIFFError("writeBufferToContigTiles", "Tilesize %lu is too small, using alternate calculation %u", tilesize, tl * tile_rowsize); #endif tile_buffsize = tl * tile_rowsize; } tilebuf = _TIFFmalloc(tile_buffsize); if (tilebuf == 0) return 1; src_rowsize = ((imagewidth * spp * bps) + 7) / 8; for (row = 0; row < imagelength; row += tl) { nrow = (row + tl > imagelength) ? imagelength - row : tl; for (col = 0; col < imagewidth; col += tw) { /* Calculate visible portion of tile. */ if (col + tw > imagewidth) ncol = imagewidth - col; else ncol = tw; col_offset = (((col * bps * spp) + 7) / 8); bufp = buf + (row * src_rowsize) + col_offset; if (extractContigSamplesToTileBuffer(tilebuf, bufp, nrow, ncol, imagewidth, tw, 0, spp, spp, bps, dump) > 0) { TIFFError("writeBufferToContigTiles", "Unable to extract data to tile for row %lu, col %lu", (unsigned long) row, (unsigned long)col); _TIFFfree(tilebuf); return 1; } if (TIFFWriteTile(out, tilebuf, col, row, 0, 0) < 0) { TIFFError("writeBufferToContigTiles", "Cannot write tile at %lu %lu", (unsigned long) col, (unsigned long) row); _TIFFfree(tilebuf); return 1; } } } _TIFFfree(tilebuf); return 0; } /* end writeBufferToContigTiles */ /* Extract each plane from contiguous buffer into a single tile buffer * to be written out as a tile. */ static int writeBufferToSeparateTiles (TIFF* out, uint8* buf, uint32 imagelength, uint32 imagewidth, tsample_t spp, struct dump_opts * dump) { tdata_t obuf = _TIFFmalloc(TIFFTileSize(out)); uint32 tl, tw; uint32 row, col, nrow, ncol; uint32 src_rowsize, col_offset; uint16 bps; tsample_t s; uint8* bufp = (uint8*) buf; if (obuf == NULL) return 1; TIFFGetField(out, TIFFTAG_TILELENGTH, &tl); TIFFGetField(out, TIFFTAG_TILEWIDTH, &tw); TIFFGetField(out, TIFFTAG_BITSPERSAMPLE, &bps); src_rowsize = ((imagewidth * spp * bps) + 7) / 8; for (row = 0; row < imagelength; row += tl) { nrow = (row + tl > imagelength) ? imagelength - row : tl; for (col = 0; col < imagewidth; col += tw) { /* Calculate visible portion of tile. */ if (col + tw > imagewidth) ncol = imagewidth - col; else ncol = tw; col_offset = (((col * bps * spp) + 7) / 8); bufp = buf + (row * src_rowsize) + col_offset; for (s = 0; s < spp; s++) { if (extractContigSamplesToTileBuffer(obuf, bufp, nrow, ncol, imagewidth, tw, s, 1, spp, bps, dump) > 0) { TIFFError("writeBufferToSeparateTiles", "Unable to extract data to tile for row %lu, col %lu sample %d", (unsigned long) row, (unsigned long)col, (int)s); _TIFFfree(obuf); return 1; } if (TIFFWriteTile(out, obuf, col, row, 0, s) < 0) { TIFFError("writeBufferToseparateTiles", "Cannot write tile at %lu %lu sample %lu", (unsigned long) col, (unsigned long) row, (unsigned long) s); _TIFFfree(obuf); return 1; } } } } _TIFFfree(obuf); return 0; } /* end writeBufferToSeparateTiles */ static void processG3Options(char* cp) { if( (cp = strchr(cp, ':')) ) { if (defg3opts == (uint32) -1) defg3opts = 0; do { cp++; if (strneq(cp, "1d", 2)) defg3opts &= ~GROUP3OPT_2DENCODING; else if (strneq(cp, "2d", 2)) defg3opts |= GROUP3OPT_2DENCODING; else if (strneq(cp, "fill", 4)) defg3opts |= GROUP3OPT_FILLBITS; else usage(); } while( (cp = strchr(cp, ':')) ); } } static int processCompressOptions(char* opt) { char* cp = NULL; if (strneq(opt, "none",4)) { defcompression = COMPRESSION_NONE; } else if (streq(opt, "packbits")) { defcompression = COMPRESSION_PACKBITS; } else if (strneq(opt, "jpeg", 4)) { cp = strchr(opt, ':'); defcompression = COMPRESSION_JPEG; while (cp) { if (isdigit((int)cp[1])) quality = atoi(cp + 1); else if (strneq(cp + 1, "raw", 3 )) jpegcolormode = JPEGCOLORMODE_RAW; else if (strneq(cp + 1, "rgb", 3 )) jpegcolormode = JPEGCOLORMODE_RGB; else usage(); cp = strchr(cp + 1, ':'); } } else if (strneq(opt, "g3", 2)) { processG3Options(opt); defcompression = COMPRESSION_CCITTFAX3; } else if (streq(opt, "g4")) { defcompression = COMPRESSION_CCITTFAX4; } else if (strneq(opt, "lzw", 3)) { cp = strchr(opt, ':'); if (cp) defpredictor = atoi(cp+1); defcompression = COMPRESSION_LZW; } else if (strneq(opt, "zip", 3)) { cp = strchr(opt, ':'); if (cp) defpredictor = atoi(cp+1); defcompression = COMPRESSION_ADOBE_DEFLATE; } else return (0); return (1); } static void usage(void) { int i; fprintf(stderr, "\n%s\n", TIFFGetVersion()); for (i = 0; usage_info[i] != NULL; i++) fprintf(stderr, "%s\n", usage_info[i]); exit(-1); } #define CopyField(tag, v) \ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) #define CopyField2(tag, v1, v2) \ if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2) #define CopyField3(tag, v1, v2, v3) \ if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3) #define CopyField4(tag, v1, v2, v3, v4) \ if (TIFFGetField(in, tag, &v1, &v2, &v3, &v4)) TIFFSetField(out, tag, v1, v2, v3, v4) static void cpTag(TIFF* in, TIFF* out, uint16 tag, uint16 count, TIFFDataType type) { switch (type) { case TIFF_SHORT: if (count == 1) { uint16 shortv; CopyField(tag, shortv); } else if (count == 2) { uint16 shortv1, shortv2; CopyField2(tag, shortv1, shortv2); } else if (count == 4) { uint16 *tr, *tg, *tb, *ta; CopyField4(tag, tr, tg, tb, ta); } else if (count == (uint16) -1) { uint16 shortv1; uint16* shortav; CopyField2(tag, shortv1, shortav); } break; case TIFF_LONG: { uint32 longv; CopyField(tag, longv); } break; case TIFF_RATIONAL: if (count == 1) { float floatv; CopyField(tag, floatv); } else if (count == (uint16) -1) { float* floatav; CopyField(tag, floatav); } break; case TIFF_ASCII: { char* stringv; CopyField(tag, stringv); } break; case TIFF_DOUBLE: if (count == 1) { double doublev; CopyField(tag, doublev); } else if (count == (uint16) -1) { double* doubleav; CopyField(tag, doubleav); } break; default: TIFFError(TIFFFileName(in), "Data type %d is not supported, tag %d skipped", tag, type); } } static struct cpTag { uint16 tag; uint16 count; TIFFDataType type; } tags[] = { { TIFFTAG_SUBFILETYPE, 1, TIFF_LONG }, { TIFFTAG_THRESHHOLDING, 1, TIFF_SHORT }, { TIFFTAG_DOCUMENTNAME, 1, TIFF_ASCII }, { TIFFTAG_IMAGEDESCRIPTION, 1, TIFF_ASCII }, { TIFFTAG_MAKE, 1, TIFF_ASCII }, { TIFFTAG_MODEL, 1, TIFF_ASCII }, { TIFFTAG_MINSAMPLEVALUE, 1, TIFF_SHORT }, { TIFFTAG_MAXSAMPLEVALUE, 1, TIFF_SHORT }, { TIFFTAG_XRESOLUTION, 1, TIFF_RATIONAL }, { TIFFTAG_YRESOLUTION, 1, TIFF_RATIONAL }, { TIFFTAG_PAGENAME, 1, TIFF_ASCII }, { TIFFTAG_XPOSITION, 1, TIFF_RATIONAL }, { TIFFTAG_YPOSITION, 1, TIFF_RATIONAL }, { TIFFTAG_RESOLUTIONUNIT, 1, TIFF_SHORT }, { TIFFTAG_SOFTWARE, 1, TIFF_ASCII }, { TIFFTAG_DATETIME, 1, TIFF_ASCII }, { TIFFTAG_ARTIST, 1, TIFF_ASCII }, { TIFFTAG_HOSTCOMPUTER, 1, TIFF_ASCII }, { TIFFTAG_WHITEPOINT, (uint16) -1, TIFF_RATIONAL }, { TIFFTAG_PRIMARYCHROMATICITIES,(uint16) -1,TIFF_RATIONAL }, { TIFFTAG_HALFTONEHINTS, 2, TIFF_SHORT }, { TIFFTAG_INKSET, 1, TIFF_SHORT }, { TIFFTAG_DOTRANGE, 2, TIFF_SHORT }, { TIFFTAG_TARGETPRINTER, 1, TIFF_ASCII }, { TIFFTAG_SAMPLEFORMAT, 1, TIFF_SHORT }, { TIFFTAG_YCBCRCOEFFICIENTS, (uint16) -1,TIFF_RATIONAL }, { TIFFTAG_YCBCRSUBSAMPLING, 2, TIFF_SHORT }, { TIFFTAG_YCBCRPOSITIONING, 1, TIFF_SHORT }, { TIFFTAG_REFERENCEBLACKWHITE, (uint16) -1,TIFF_RATIONAL }, { TIFFTAG_EXTRASAMPLES, (uint16) -1, TIFF_SHORT }, { TIFFTAG_SMINSAMPLEVALUE, 1, TIFF_DOUBLE }, { TIFFTAG_SMAXSAMPLEVALUE, 1, TIFF_DOUBLE }, { TIFFTAG_STONITS, 1, TIFF_DOUBLE }, }; #define NTAGS (sizeof (tags) / sizeof (tags[0])) #define CopyTag(tag, count, type) cpTag(in, out, tag, count, type) /* Functions written by Richard Nolde, with exceptions noted. */ void process_command_opts (int argc, char *argv[], char *mp, char *mode, uint32 *dirnum, uint16 *defconfig, uint16 *deffillorder, uint32 *deftilewidth, uint32 *deftilelength, uint32 *defrowsperstrip, struct crop_mask *crop_data, struct pagedef *page, struct dump_opts *dump, unsigned int *imagelist, unsigned int *image_count ) { int c, good_args = 0; char *opt_offset = NULL; /* Position in string of value sought */ char *opt_ptr = NULL; /* Pointer to next token in option set */ char *sep = NULL; /* Pointer to a token separator */ unsigned int i, j, start, end; extern int optind; extern char* optarg; *mp++ = 'w'; *mp = '\0'; while ((c = getopt(argc, argv, "ac:d:e:f:hil:m:p:r:stvw:z:BCD:E:F:H:I:J:K:LMN:O:P:R:S:U:V:X:Y:Z:")) != -1) { good_args++; switch (c) { case 'a': mode[0] = 'a'; /* append to output */ break; case 'c': if (!processCompressOptions(optarg)) /* compression scheme */ { TIFFError ("Unknown compression option", "%s", optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } break; case 'd': start = strtoul(optarg, NULL, 0); /* initial IFD offset */ if (start == 0) { TIFFError ("","Directory offset must be greater than zero"); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } *dirnum = start - 1; break; case 'e': switch (tolower(optarg[0])) /* image export modes*/ { case 'c': crop_data->exp_mode = ONE_FILE_COMPOSITE; crop_data->img_mode = COMPOSITE_IMAGES; break; /* Composite */ case 'd': crop_data->exp_mode = ONE_FILE_SEPARATED; crop_data->img_mode = SEPARATED_IMAGES; break; /* Divided */ case 'i': crop_data->exp_mode = FILE_PER_IMAGE_COMPOSITE; crop_data->img_mode = COMPOSITE_IMAGES; break; /* Image */ case 'm': crop_data->exp_mode = FILE_PER_IMAGE_SEPARATED; crop_data->img_mode = SEPARATED_IMAGES; break; /* Multiple */ case 's': crop_data->exp_mode = FILE_PER_SELECTION; crop_data->img_mode = SEPARATED_IMAGES; break; /* Sections */ default: TIFFError ("Unknown export mode","%s", optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } break; case 'f': if (streq(optarg, "lsb2msb")) /* fill order */ *deffillorder = FILLORDER_LSB2MSB; else if (streq(optarg, "msb2lsb")) *deffillorder = FILLORDER_MSB2LSB; else { TIFFError ("Unknown fill order", "%s", optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } break; case 'h': usage(); break; case 'i': ignore = TRUE; /* ignore errors */ break; case 'l': outtiled = TRUE; /* tile length */ *deftilelength = atoi(optarg); break; case 'p': /* planar configuration */ if (streq(optarg, "separate")) *defconfig = PLANARCONFIG_SEPARATE; else if (streq(optarg, "contig")) *defconfig = PLANARCONFIG_CONTIG; else { TIFFError ("Unkown planar configuration", "%s", optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } break; case 'r': /* rows/strip */ *defrowsperstrip = atol(optarg); break; case 's': /* generate stripped output */ outtiled = FALSE; break; case 't': /* generate tiled output */ outtiled = TRUE; break; case 'v': TIFFError("Library Release", "%s", TIFFGetVersion()); TIFFError ("Tiffcrop version", "%s, last updated: %s", tiffcrop_version_id, tiffcrop_rev_date); TIFFError ("Tiffcp code", "Copyright (c) 1988-1997 Sam Leffler"); TIFFError (" ", "Copyright (c) 1991-1997 Silicon Graphics, Inc"); TIFFError ("Tiffcrop additions", "Copyright (c) 2007-2010 Richard Nolde"); exit (0); break; case 'w': /* tile width */ outtiled = TRUE; *deftilewidth = atoi(optarg); break; case 'z': /* regions of an image specified as x1,y1,x2,y2:x3,y3,x4,y4 etc */ crop_data->crop_mode |= CROP_REGIONS; for (i = 0, opt_ptr = strtok (optarg, ":"); ((opt_ptr != NULL) && (i < MAX_REGIONS)); (opt_ptr = strtok (NULL, ":")), i++) { crop_data->regions++; if (sscanf(opt_ptr, "%lf,%lf,%lf,%lf", &crop_data->corners[i].X1, &crop_data->corners[i].Y1, &crop_data->corners[i].X2, &crop_data->corners[i].Y2) != 4) { TIFFError ("Unable to parse coordinates for region", "%d %s", i, optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } } /* check for remaining elements over MAX_REGIONS */ if ((opt_ptr != NULL) && (i >= MAX_REGIONS)) { TIFFError ("Region list exceeds limit of", "%d regions %s", MAX_REGIONS, optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1);; } break; /* options for file open modes */ case 'B': *mp++ = 'b'; *mp = '\0'; break; case 'L': *mp++ = 'l'; *mp = '\0'; break; case 'M': *mp++ = 'm'; *mp = '\0'; break; case 'C': *mp++ = 'c'; *mp = '\0'; break; /* options for Debugging / data dump */ case 'D': for (i = 0, opt_ptr = strtok (optarg, ","); (opt_ptr != NULL); (opt_ptr = strtok (NULL, ",")), i++) { opt_offset = strpbrk(opt_ptr, ":="); if (opt_offset == NULL) { TIFFError("Invalid dump option", "%s", optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } *opt_offset = '\0'; /* convert option to lowercase */ end = strlen (opt_ptr); for (i = 0; i < end; i++) *(opt_ptr + i) = tolower(*(opt_ptr + i)); /* Look for dump format specification */ if (strncmp(opt_ptr, "for", 3) == 0) { /* convert value to lowercase */ end = strlen (opt_offset + 1); for (i = 1; i <= end; i++) *(opt_offset + i) = tolower(*(opt_offset + i)); /* check dump format value */ if (strncmp (opt_offset + 1, "txt", 3) == 0) { dump->format = DUMP_TEXT; strcpy (dump->mode, "w"); } else { if (strncmp(opt_offset + 1, "raw", 3) == 0) { dump->format = DUMP_RAW; strcpy (dump->mode, "wb"); } else { TIFFError("parse_command_opts", "Unknown dump format %s", opt_offset + 1); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } } } else { /* Look for dump level specification */ if (strncmp (opt_ptr, "lev", 3) == 0) dump->level = atoi(opt_offset + 1); /* Look for input data dump file name */ if (strncmp (opt_ptr, "in", 2) == 0) { strncpy (dump->infilename, opt_offset + 1, PATH_MAX - 20); dump->infilename[PATH_MAX - 20] = '\0'; } /* Look for output data dump file name */ if (strncmp (opt_ptr, "out", 3) == 0) { strncpy (dump->outfilename, opt_offset + 1, PATH_MAX - 20); dump->outfilename[PATH_MAX - 20] = '\0'; } if (strncmp (opt_ptr, "deb", 3) == 0) dump->debug = atoi(opt_offset + 1); } } if ((strlen(dump->infilename)) || (strlen(dump->outfilename))) { if (dump->level == 1) TIFFError("","Defaulting to dump level 1, no data."); if (dump->format == DUMP_NONE) { TIFFError("", "You must specify a dump format for dump files"); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } } break; /* image manipulation routine options */ case 'm': /* margins to exclude from selection, uppercase M was already used */ /* order of values must be TOP, LEFT, BOTTOM, RIGHT */ crop_data->crop_mode |= CROP_MARGINS; for (i = 0, opt_ptr = strtok (optarg, ",:"); ((opt_ptr != NULL) && (i < 4)); (opt_ptr = strtok (NULL, ",:")), i++) { crop_data->margins[i] = atof(opt_ptr); } break; case 'E': /* edge reference */ switch (tolower(optarg[0])) { case 't': crop_data->edge_ref = EDGE_TOP; break; case 'b': crop_data->edge_ref = EDGE_BOTTOM; break; case 'l': crop_data->edge_ref = EDGE_LEFT; break; case 'r': crop_data->edge_ref = EDGE_RIGHT; break; default: TIFFError ("Edge reference must be top, bottom, left, or right", "%s", optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } break; case 'F': /* flip eg mirror image or cropped segment, M was already used */ crop_data->crop_mode |= CROP_MIRROR; switch (tolower(optarg[0])) { case 'h': crop_data->mirror = MIRROR_HORIZ; break; case 'v': crop_data->mirror = MIRROR_VERT; break; case 'b': crop_data->mirror = MIRROR_BOTH; break; default: TIFFError ("Flip mode must be horiz, vert, or both", "%s", optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } break; case 'H': /* set horizontal resolution to new value */ page->hres = atof (optarg); page->mode |= PAGE_MODE_RESOLUTION; break; case 'I': /* invert the color space, eg black to white */ crop_data->crop_mode |= CROP_INVERT; /* The PHOTOMETIC_INTERPRETATION tag may be updated */ if (streq(optarg, "black")) { crop_data->photometric = PHOTOMETRIC_MINISBLACK; continue; } if (streq(optarg, "white")) { crop_data->photometric = PHOTOMETRIC_MINISWHITE; continue; } if (streq(optarg, "data")) { crop_data->photometric = INVERT_DATA_ONLY; continue; } if (streq(optarg, "both")) { crop_data->photometric = INVERT_DATA_AND_TAG; continue; } TIFFError("Missing or unknown option for inverting PHOTOMETRIC_INTERPRETATION", "%s", optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); break; case 'J': /* horizontal margin for sectioned ouput pages */ page->hmargin = atof(optarg); page->mode |= PAGE_MODE_MARGINS; break; case 'K': /* vertical margin for sectioned ouput pages*/ page->vmargin = atof(optarg); page->mode |= PAGE_MODE_MARGINS; break; case 'N': /* list of images to process */ for (i = 0, opt_ptr = strtok (optarg, ","); ((opt_ptr != NULL) && (i < MAX_IMAGES)); (opt_ptr = strtok (NULL, ","))) { /* We do not know how many images are in file yet * so we build a list to include the maximum allowed * and follow it until we hit the end of the file. * Image count is not accurate for odd, even, last * so page numbers won't be valid either. */ if (streq(opt_ptr, "odd")) { for (j = 1; j <= MAX_IMAGES; j += 2) imagelist[i++] = j; *image_count = (MAX_IMAGES - 1) / 2; break; } else { if (streq(opt_ptr, "even")) { for (j = 2; j <= MAX_IMAGES; j += 2) imagelist[i++] = j; *image_count = MAX_IMAGES / 2; break; } else { if (streq(opt_ptr, "last")) imagelist[i++] = MAX_IMAGES; else /* single value between commas */ { sep = strpbrk(opt_ptr, ":-"); if (!sep) imagelist[i++] = atoi(opt_ptr); else { *sep = '\0'; start = atoi (opt_ptr); if (!strcmp((sep + 1), "last")) end = MAX_IMAGES; else end = atoi (sep + 1); for (j = start; j <= end && j - start + i < MAX_IMAGES; j++) imagelist[i++] = j; } } } } } *image_count = i; break; case 'O': /* page orientation */ switch (tolower(optarg[0])) { case 'a': page->orient = ORIENTATION_AUTO; break; case 'p': page->orient = ORIENTATION_PORTRAIT; break; case 'l': page->orient = ORIENTATION_LANDSCAPE; break; default: TIFFError ("Orientation must be portrait, landscape, or auto.", "%s", optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } break; case 'P': /* page size selection */ if (sscanf(optarg, "%lfx%lf", &page->width, &page->length) == 2) { strcpy (page->name, "Custom"); page->mode |= PAGE_MODE_PAPERSIZE; break; } if (get_page_geometry (optarg, page)) { if (!strcmp(optarg, "list")) { TIFFError("", "Name Width Length (in inches)"); for (i = 0; i < MAX_PAPERNAMES - 1; i++) TIFFError ("", "%-15.15s %5.2f %5.2f", PaperTable[i].name, PaperTable[i].width, PaperTable[i].length); exit (-1); } TIFFError ("Invalid paper size", "%s", optarg); TIFFError ("", "Select one of:"); TIFFError("", "Name Width Length (in inches)"); for (i = 0; i < MAX_PAPERNAMES - 1; i++) TIFFError ("", "%-15.15s %5.2f %5.2f", PaperTable[i].name, PaperTable[i].width, PaperTable[i].length); exit (-1); } else { page->mode |= PAGE_MODE_PAPERSIZE; } break; case 'R': /* rotate image or cropped segment */ crop_data->crop_mode |= CROP_ROTATE; switch (strtoul(optarg, NULL, 0)) { case 90: crop_data->rotation = (uint16)90; break; case 180: crop_data->rotation = (uint16)180; break; case 270: crop_data->rotation = (uint16)270; break; default: TIFFError ("Rotation must be 90, 180, or 270 degrees clockwise", "%s", optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } break; case 'S': /* subdivide into Cols:Rows sections, eg 3:2 would be 3 across and 2 down */ sep = strpbrk(optarg, ",:"); if (sep) { *sep = '\0'; page->cols = atoi(optarg); page->rows = atoi(sep +1); } else { page->cols = atoi(optarg); page->rows = atoi(optarg); } if ((page->cols * page->rows) > MAX_SECTIONS) { TIFFError ("Limit for subdivisions, ie rows x columns, exceeded", "%d", MAX_SECTIONS); exit (-1); } page->mode |= PAGE_MODE_ROWSCOLS; break; case 'U': /* units for measurements and offsets */ if (streq(optarg, "in")) { crop_data->res_unit = RESUNIT_INCH; page->res_unit = RESUNIT_INCH; } else if (streq(optarg, "cm")) { crop_data->res_unit = RESUNIT_CENTIMETER; page->res_unit = RESUNIT_CENTIMETER; } else if (streq(optarg, "px")) { crop_data->res_unit = RESUNIT_NONE; page->res_unit = RESUNIT_NONE; } else { TIFFError ("Illegal unit of measure","%s", optarg); TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); } break; case 'V': /* set vertical resolution to new value */ page->vres = atof (optarg); page->mode |= PAGE_MODE_RESOLUTION; break; case 'X': /* selection width */ crop_data->crop_mode |= CROP_WIDTH; crop_data->width = atof(optarg); break; case 'Y': /* selection length */ crop_data->crop_mode |= CROP_LENGTH; crop_data->length = atof(optarg); break; case 'Z': /* zones of an image X:Y read as zone X of Y */ crop_data->crop_mode |= CROP_ZONES; for (i = 0, opt_ptr = strtok (optarg, ","); ((opt_ptr != NULL) && (i < MAX_REGIONS)); (opt_ptr = strtok (NULL, ",")), i++) { crop_data->zones++; opt_offset = strchr(opt_ptr, ':'); *opt_offset = '\0'; crop_data->zonelist[i].position = atoi(opt_ptr); crop_data->zonelist[i].total = atoi(opt_offset + 1); } /* check for remaining elements over MAX_REGIONS */ if ((opt_ptr != NULL) && (i >= MAX_REGIONS)) { TIFFError("Zone list exceeds region limit", "%d", MAX_REGIONS); exit (-1); } break; case '?': TIFFError ("For valid options type", "tiffcrop -h"); exit (-1); /*NOTREACHED*/ } } } /* end process_command_opts */ /* Start a new output file if one has not been previously opened or * autoindex is set to non-zero. Update page and file counters * so TIFFTAG PAGENUM will be correct in image. */ static int update_output_file (TIFF **tiffout, char *mode, int autoindex, char *outname, unsigned int *page) { static int findex = 0; /* file sequence indicator */ char *sep; char filenum[16]; char export_ext[16]; char exportname[PATH_MAX]; if (autoindex && (*tiffout != NULL)) { /* Close any export file that was previously opened */ TIFFClose (*tiffout); *tiffout = NULL; } strcpy (export_ext, ".tiff"); memset (exportname, '\0', PATH_MAX); /* Leave room for page number portion of the new filename */ strncpy (exportname, outname, PATH_MAX - 16); if (*tiffout == NULL) /* This is a new export file */ { if (autoindex) { /* create a new filename for each export */ findex++; if ((sep = strstr(exportname, ".tif")) || (sep = strstr(exportname, ".TIF"))) { strncpy (export_ext, sep, 5); *sep = '\0'; } else strncpy (export_ext, ".tiff", 5); export_ext[5] = '\0'; /* MAX_EXPORT_PAGES limited to 6 digits to prevent string overflow of pathname */ if (findex > MAX_EXPORT_PAGES) { TIFFError("update_output_file", "Maximum of %d pages per file exceeded", MAX_EXPORT_PAGES); return 1; } sprintf (filenum, "-%03d%s", findex, export_ext); filenum[14] = '\0'; strncat (exportname, filenum, 15); } exportname[PATH_MAX - 1] = '\0'; *tiffout = TIFFOpen(exportname, mode); if (*tiffout == NULL) { TIFFError("update_output_file", "Unable to open output file %s", exportname); return 1; } *page = 0; return 0; } else (*page)++; return 0; } /* end update_output_file */ int main(int argc, char* argv[]) { extern int optind; uint16 defconfig = (uint16) -1; uint16 deffillorder = 0; uint32 deftilewidth = (uint32) 0; uint32 deftilelength = (uint32) 0; uint32 defrowsperstrip = (uint32) 0; uint32 dirnum = 0; TIFF *in = NULL; TIFF *out = NULL; char mode[10]; char *mp = mode; /** RJN additions **/ struct image_data image; /* Image parameters for one image */ struct crop_mask crop; /* Cropping parameters for all images */ struct pagedef page; /* Page definition for output pages */ struct pageseg sections[MAX_SECTIONS]; /* Sections of one output page */ struct buffinfo seg_buffs[MAX_SECTIONS]; /* Segment buffer sizes and pointers */ struct dump_opts dump; /* Data dump options */ unsigned char *read_buff = NULL; /* Input image data buffer */ unsigned char *crop_buff = NULL; /* Crop area buffer */ unsigned char *sect_buff = NULL; /* Image section buffer */ unsigned char *sect_src = NULL; /* Image section buffer pointer */ unsigned int imagelist[MAX_IMAGES + 1]; /* individually specified images */ unsigned int image_count = 0; unsigned int dump_images = 0; unsigned int next_image = 0; unsigned int next_page = 0; unsigned int total_pages = 0; unsigned int total_images = 0; unsigned int end_of_input = FALSE; int seg, length; char temp_filename[PATH_MAX + 1]; little_endian = *((unsigned char *)&little_endian) & '1'; initImageData(&image); initCropMasks(&crop); initPageSetup(&page, sections, seg_buffs); initDumpOptions(&dump); process_command_opts (argc, argv, mp, mode, &dirnum, &defconfig, &deffillorder, &deftilewidth, &deftilelength, &defrowsperstrip, &crop, &page, &dump, imagelist, &image_count); if (argc - optind < 2) usage(); if ((argc - optind) == 2) pageNum = -1; else total_images = 0; /* read multiple input files and write to output file(s) */ while (optind < argc - 1) { in = TIFFOpen (argv[optind], "r"); if (in == NULL) return (-3); /* If only one input file is specified, we can use directory count */ total_images = TIFFNumberOfDirectories(in); if (image_count == 0) { dirnum = 0; total_pages = total_images; /* Only valid with single input file */ } else { dirnum = (tdir_t)(imagelist[next_image] - 1); next_image++; /* Total pages only valid for enumerated list of pages not derived * using odd, even, or last keywords. */ if (image_count > total_images) image_count = total_images; total_pages = image_count; } /* MAX_IMAGES is used for special case "last" in selection list */ if (dirnum == (MAX_IMAGES - 1)) dirnum = total_images - 1; if (dirnum > (total_images)) { TIFFError (TIFFFileName(in), "Invalid image number %d, File contains only %d images", (int)dirnum + 1, total_images); if (out != NULL) (void) TIFFClose(out); return (1); } if (dirnum != 0 && !TIFFSetDirectory(in, (tdir_t)dirnum)) { TIFFError(TIFFFileName(in),"Error, setting subdirectory at %d", dirnum); if (out != NULL) (void) TIFFClose(out); return (1); } end_of_input = FALSE; while (end_of_input == FALSE) { config = defconfig; compression = defcompression; predictor = defpredictor; fillorder = deffillorder; rowsperstrip = defrowsperstrip; tilewidth = deftilewidth; tilelength = deftilelength; g3opts = defg3opts; if (dump.format != DUMP_NONE) { /* manage input and/or output dump files here */ dump_images++; length = strlen(dump.infilename); if (length > 0) { if (dump.infile != NULL) fclose (dump.infile); /* dump.infilename is guaranteed to be NUL termimated and have 20 bytes fewer than PATH_MAX */ memset (temp_filename, '\0', PATH_MAX + 1); sprintf (temp_filename, "%s-read-%03d.%s", dump.infilename, dump_images, (dump.format == DUMP_TEXT) ? "txt" : "raw"); if ((dump.infile = fopen(temp_filename, dump.mode)) == NULL) { TIFFError ("Unable to open dump file for writing", "%s", temp_filename); exit (-1); } dump_info(dump.infile, dump.format, "Reading image","%d from %s", dump_images, TIFFFileName(in)); } length = strlen(dump.outfilename); if (length > 0) { if (dump.outfile != NULL) fclose (dump.outfile); /* dump.outfilename is guaranteed to be NUL termimated and have 20 bytes fewer than PATH_MAX */ memset (temp_filename, '\0', PATH_MAX + 1); sprintf (temp_filename, "%s-write-%03d.%s", dump.outfilename, dump_images, (dump.format == DUMP_TEXT) ? "txt" : "raw"); if ((dump.outfile = fopen(temp_filename, dump.mode)) == NULL) { TIFFError ("Unable to open dump file for writing", "%s", temp_filename); exit (-1); } dump_info(dump.outfile, dump.format, "Writing image","%d from %s", dump_images, TIFFFileName(in)); } } if (dump.debug) TIFFError("main", "Reading image %4d of %4d total pages.", dirnum + 1, total_pages); if (loadImage(in, &image, &dump, &read_buff)) { TIFFError("main", "Unable to load source image"); exit (-1); } /* Correct the image orientation if it was not ORIENTATION_TOPLEFT. */ if (image.adjustments != 0) { if (correct_orientation(&image, &read_buff)) TIFFError("main", "Unable to correct image orientation"); } if (getCropOffsets(&image, &crop, &dump)) { TIFFError("main", "Unable to define crop regions"); exit (-1); } if (crop.selections > 0) { if (processCropSelections(&image, &crop, &read_buff, seg_buffs)) { TIFFError("main", "Unable to process image selections"); exit (-1); } } else /* Single image segment without zones or regions */ { if (createCroppedImage(&image, &crop, &read_buff, &crop_buff)) { TIFFError("main", "Unable to create output image"); exit (-1); } } if (page.mode == PAGE_MODE_NONE) { /* Whole image or sections not based on output page size */ if (crop.selections > 0) { writeSelections(in, &out, &crop, &image, &dump, seg_buffs, mp, argv[argc - 1], &next_page, total_pages); } else /* One file all images and sections */ { if (update_output_file (&out, mp, crop.exp_mode, argv[argc - 1], &next_page)) exit (1); if (writeCroppedImage(in, out, &image, &dump,crop.combined_width, crop.combined_length, crop_buff, next_page, total_pages)) { TIFFError("main", "Unable to write new image"); exit (-1); } } } else { /* If we used a crop buffer, our data is there, otherwise it is * in the read_buffer */ if (crop_buff != NULL) sect_src = crop_buff; else sect_src = read_buff; /* Break input image into pages or rows and columns */ if (computeOutputPixelOffsets(&crop, &image, &page, sections, &dump)) { TIFFError("main", "Unable to compute output section data"); exit (-1); } /* If there are multiple files on the command line, the final one is assumed * to be the output filename into which the images are written. */ if (update_output_file (&out, mp, crop.exp_mode, argv[argc - 1], &next_page)) exit (1); if (writeImageSections(in, out, &image, &page, sections, &dump, sect_src, §_buff)) { TIFFError("main", "Unable to write image sections"); exit (-1); } } /* No image list specified, just read the next image */ if (image_count == 0) dirnum++; else { dirnum = (tdir_t)(imagelist[next_image] - 1); next_image++; } if (dirnum == MAX_IMAGES - 1) dirnum = TIFFNumberOfDirectories(in) - 1; if (!TIFFSetDirectory(in, (tdir_t)dirnum)) end_of_input = TRUE; } TIFFClose(in); optind++; } /* If we did not use the read buffer as the crop buffer */ if (read_buff) _TIFFfree(read_buff); if (crop_buff) _TIFFfree(crop_buff); if (sect_buff) _TIFFfree(sect_buff); /* Clean up any segment buffers used for zones or regions */ for (seg = 0; seg < crop.selections; seg++) _TIFFfree (seg_buffs[seg].buffer); if (dump.format != DUMP_NONE) { if (dump.infile != NULL) fclose (dump.infile); if (dump.outfile != NULL) { dump_info (dump.outfile, dump.format, "", "Completed run for %s", TIFFFileName(out)); fclose (dump.outfile); } } TIFFClose(out); return (0); } /* end main */ /* Debugging functions */ static int dump_data (FILE *dumpfile, int format, char *dump_tag, unsigned char *data, uint32 count) { int j, k; uint32 i; char dump_array[10]; unsigned char bitset; if (dumpfile == NULL) { TIFFError ("", "Invalid FILE pointer for dump file"); return (1); } if (format == DUMP_TEXT) { fprintf (dumpfile," %s ", dump_tag); for (i = 0; i < count; i++) { for (j = 0, k = 7; j < 8; j++, k--) { bitset = (*(data + i)) & (((unsigned char)1 << k)) ? 1 : 0; sprintf(&dump_array[j], (bitset) ? "1" : "0"); } dump_array[8] = '\0'; fprintf (dumpfile," %s", dump_array); } fprintf (dumpfile,"\n"); } else { if ((fwrite (data, 1, count, dumpfile)) != count) { TIFFError ("", "Unable to write binary data to dump file"); return (1); } } return (0); } static int dump_byte (FILE *dumpfile, int format, char *dump_tag, unsigned char data) { int j, k; char dump_array[10]; unsigned char bitset; if (dumpfile == NULL) { TIFFError ("", "Invalid FILE pointer for dump file"); return (1); } if (format == DUMP_TEXT) { fprintf (dumpfile," %s ", dump_tag); for (j = 0, k = 7; j < 8; j++, k--) { bitset = data & (((unsigned char)1 << k)) ? 1 : 0; sprintf(&dump_array[j], (bitset) ? "1" : "0"); } dump_array[8] = '\0'; fprintf (dumpfile," %s\n", dump_array); } else { if ((fwrite (&data, 1, 1, dumpfile)) != 1) { TIFFError ("", "Unable to write binary data to dump file"); return (1); } } return (0); } static int dump_short (FILE *dumpfile, int format, char *dump_tag, uint16 data) { int j, k; char dump_array[20]; unsigned char bitset; if (dumpfile == NULL) { TIFFError ("", "Invalid FILE pointer for dump file"); return (1); } if (format == DUMP_TEXT) { fprintf (dumpfile," %s ", dump_tag); for (j = 0, k = 15; k >= 0; j++, k--) { bitset = data & (((unsigned char)1 << k)) ? 1 : 0; sprintf(&dump_array[j], (bitset) ? "1" : "0"); if ((k % 8) == 0) sprintf(&dump_array[++j], " "); } dump_array[17] = '\0'; fprintf (dumpfile," %s\n", dump_array); } else { if ((fwrite (&data, 2, 1, dumpfile)) != 2) { TIFFError ("", "Unable to write binary data to dump file"); return (1); } } return (0); } static int dump_long (FILE *dumpfile, int format, char *dump_tag, uint32 data) { int j, k; char dump_array[40]; unsigned char bitset; if (dumpfile == NULL) { TIFFError ("", "Invalid FILE pointer for dump file"); return (1); } if (format == DUMP_TEXT) { fprintf (dumpfile," %s ", dump_tag); for (j = 0, k = 31; k >= 0; j++, k--) { bitset = data & (((uint32)1 << k)) ? 1 : 0; sprintf(&dump_array[j], (bitset) ? "1" : "0"); if ((k % 8) == 0) sprintf(&dump_array[++j], " "); } dump_array[35] = '\0'; fprintf (dumpfile," %s\n", dump_array); } else { if ((fwrite (&data, 4, 1, dumpfile)) != 4) { TIFFError ("", "Unable to write binary data to dump file"); return (1); } } return (0); } static int dump_wide (FILE *dumpfile, int format, char *dump_tag, uint64 data) { int j, k; char dump_array[80]; unsigned char bitset; if (dumpfile == NULL) { TIFFError ("", "Invalid FILE pointer for dump file"); return (1); } if (format == DUMP_TEXT) { fprintf (dumpfile," %s ", dump_tag); for (j = 0, k = 63; k >= 0; j++, k--) { bitset = data & (((uint64)1 << k)) ? 1 : 0; sprintf(&dump_array[j], (bitset) ? "1" : "0"); if ((k % 8) == 0) sprintf(&dump_array[++j], " "); } dump_array[71] = '\0'; fprintf (dumpfile," %s\n", dump_array); } else { if ((fwrite (&data, 8, 1, dumpfile)) != 8) { TIFFError ("", "Unable to write binary data to dump file"); return (1); } } return (0); } static void dump_info(FILE *dumpfile, int format, char *prefix, char *msg, ...) { if (format == DUMP_TEXT) { va_list ap; va_start(ap, msg); fprintf(dumpfile, "%s ", prefix); vfprintf(dumpfile, msg, ap); fprintf(dumpfile, "\n"); } } static int dump_buffer (FILE* dumpfile, int format, uint32 rows, uint32 width, uint32 row, unsigned char *buff) { int j, k; uint32 i; unsigned char * dump_ptr; if (dumpfile == NULL) { TIFFError ("", "Invalid FILE pointer for dump file"); return (1); } for (i = 0; i < rows; i++) { dump_ptr = buff + (i * width); if (format == DUMP_TEXT) dump_info (dumpfile, format, "", "Row %4d, %d bytes at offset %d", row + i + 1, width, row * width); for (j = 0, k = width; k >= 10; j += 10, k -= 10, dump_ptr += 10) dump_data (dumpfile, format, "", dump_ptr, 10); if (k > 0) dump_data (dumpfile, format, "", dump_ptr, k); } return (0); } /* Extract one or more samples from an interleaved buffer. If count == 1, * only the sample plane indicated by sample will be extracted. If count > 1, * count samples beginning at sample will be extracted. Portions of a * scanline can be extracted by specifying a start and end value. */ static int extractContigSamplesBytes (uint8 *in, uint8 *out, uint32 cols, tsample_t sample, uint16 spp, uint16 bps, tsample_t count, uint32 start, uint32 end) { int i, bytes_per_sample, sindex; uint32 col, dst_rowsize, bit_offset; uint32 src_byte, src_bit; uint8 *src = in; uint8 *dst = out; if ((src == NULL) || (dst == NULL)) { TIFFError("extractContigSamplesBytes","Invalid input or output buffer"); return (1); } if ((start > end) || (start > cols)) { TIFFError ("extractContigSamplesBytes", "Invalid start column value %d ignored", start); start = 0; } if ((end == 0) || (end > cols)) { TIFFError ("extractContigSamplesBytes", "Invalid end column value %d ignored", end); end = cols; } dst_rowsize = (bps * (end - start) * count) / 8; bytes_per_sample = (bps + 7) / 8; /* Optimize case for copying all samples */ if (count == spp) { src = in + (start * spp * bytes_per_sample); _TIFFmemcpy (dst, src, dst_rowsize); } else { for (col = start; col < end; col++) { for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++) { bit_offset = col * bps * spp; if (sindex == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sindex * bps)) / 8; src_bit = (bit_offset + (sindex * bps)) % 8; } src = in + src_byte; for (i = 0; i < bytes_per_sample; i++) *dst++ = *src++; } } } return (0); } /* end extractContigSamplesBytes */ static int extractContigSamples8bits (uint8 *in, uint8 *out, uint32 cols, tsample_t sample, uint16 spp, uint16 bps, tsample_t count, uint32 start, uint32 end) { int ready_bits = 0, sindex = 0; uint32 col, src_byte, src_bit, bit_offset; uint8 maskbits = 0, matchbits = 0; uint8 buff1 = 0, buff2 = 0; uint8 *src = in; uint8 *dst = out; if ((src == NULL) || (dst == NULL)) { TIFFError("extractContigSamples8bits","Invalid input or output buffer"); return (1); } if ((start > end) || (start > cols)) { TIFFError ("extractContigSamples8bits", "Invalid start column value %d ignored", start); start = 0; } if ((end == 0) || (end > cols)) { TIFFError ("extractContigSamples8bits", "Invalid end column value %d ignored", end); end = cols; } ready_bits = 0; maskbits = (uint8)-1 >> ( 8 - bps); buff1 = buff2 = 0; for (col = start; col < end; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps * spp; for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++) { if (sindex == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sindex * bps)) / 8; src_bit = (bit_offset + (sindex * bps)) % 8; } src = in + src_byte; matchbits = maskbits << (8 - src_bit - bps); buff1 = ((*src) & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 8) { *dst++ = buff2; buff2 = buff1; ready_bits -= 8; } else buff2 = (buff2 | (buff1 >> ready_bits)); ready_bits += bps; } } while (ready_bits > 0) { buff1 = (buff2 & ((unsigned int)255 << (8 - ready_bits))); *dst++ = buff1; ready_bits -= 8; } return (0); } /* end extractContigSamples8bits */ static int extractContigSamples16bits (uint8 *in, uint8 *out, uint32 cols, tsample_t sample, uint16 spp, uint16 bps, tsample_t count, uint32 start, uint32 end) { int ready_bits = 0, sindex = 0; uint32 col, src_byte, src_bit, bit_offset; uint16 maskbits = 0, matchbits = 0; uint16 buff1 = 0, buff2 = 0; uint8 bytebuff = 0; uint8 *src = in; uint8 *dst = out; if ((src == NULL) || (dst == NULL)) { TIFFError("extractContigSamples16bits","Invalid input or output buffer"); return (1); } if ((start > end) || (start > cols)) { TIFFError ("extractContigSamples16bits", "Invalid start column value %d ignored", start); start = 0; } if ((end == 0) || (end > cols)) { TIFFError ("extractContigSamples16bits", "Invalid end column value %d ignored", end); end = cols; } ready_bits = 0; maskbits = (uint16)-1 >> (16 - bps); for (col = start; col < end; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps * spp; for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++) { if (sindex == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sindex * bps)) / 8; src_bit = (bit_offset + (sindex * bps)) % 8; } src = in + src_byte; matchbits = maskbits << (16 - src_bit - bps); if (little_endian) buff1 = (src[0] << 8) | src[1]; else buff1 = (src[1] << 8) | src[0]; buff1 = (buff1 & matchbits) << (src_bit); if (ready_bits < 8) /* add another bps bits to the buffer */ { bytebuff = 0; buff2 = (buff2 | (buff1 >> ready_bits)); } else /* If we have a full buffer's worth, write it out */ { bytebuff = (buff2 >> 8); *dst++ = bytebuff; ready_bits -= 8; /* shift in new bits */ buff2 = ((buff2 << 8) | (buff1 >> ready_bits)); } ready_bits += bps; } } /* catch any trailing bits at the end of the line */ while (ready_bits > 0) { bytebuff = (buff2 >> 8); *dst++ = bytebuff; ready_bits -= 8; } return (0); } /* end extractContigSamples16bits */ static int extractContigSamples24bits (uint8 *in, uint8 *out, uint32 cols, tsample_t sample, uint16 spp, uint16 bps, tsample_t count, uint32 start, uint32 end) { int ready_bits = 0, sindex = 0; uint32 col, src_byte, src_bit, bit_offset; uint32 maskbits = 0, matchbits = 0; uint32 buff1 = 0, buff2 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0; uint8 *src = in; uint8 *dst = out; if ((in == NULL) || (out == NULL)) { TIFFError("extractContigSamples24bits","Invalid input or output buffer"); return (1); } if ((start > end) || (start > cols)) { TIFFError ("extractContigSamples24bits", "Invalid start column value %d ignored", start); start = 0; } if ((end == 0) || (end > cols)) { TIFFError ("extractContigSamples24bits", "Invalid end column value %d ignored", end); end = cols; } ready_bits = 0; maskbits = (uint32)-1 >> ( 32 - bps); for (col = start; col < end; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps * spp; for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++) { if (sindex == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sindex * bps)) / 8; src_bit = (bit_offset + (sindex * bps)) % 8; } src = in + src_byte; matchbits = maskbits << (32 - src_bit - bps); if (little_endian) buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; else buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; buff1 = (buff1 & matchbits) << (src_bit); if (ready_bits < 16) /* add another bps bits to the buffer */ { bytebuff1 = bytebuff2 = 0; buff2 = (buff2 | (buff1 >> ready_bits)); } else /* If we have a full buffer's worth, write it out */ { bytebuff1 = (buff2 >> 24); *dst++ = bytebuff1; bytebuff2 = (buff2 >> 16); *dst++ = bytebuff2; ready_bits -= 16; /* shift in new bits */ buff2 = ((buff2 << 16) | (buff1 >> ready_bits)); } ready_bits += bps; } } /* catch any trailing bits at the end of the line */ while (ready_bits > 0) { bytebuff1 = (buff2 >> 24); *dst++ = bytebuff1; buff2 = (buff2 << 8); bytebuff2 = bytebuff1; ready_bits -= 8; } return (0); } /* end extractContigSamples24bits */ static int extractContigSamples32bits (uint8 *in, uint8 *out, uint32 cols, tsample_t sample, uint16 spp, uint16 bps, tsample_t count, uint32 start, uint32 end) { int ready_bits = 0, sindex = 0, shift_width = 0; uint32 col, src_byte, src_bit, bit_offset; uint32 longbuff1 = 0, longbuff2 = 0; uint64 maskbits = 0, matchbits = 0; uint64 buff1 = 0, buff2 = 0, buff3 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0; uint8 *src = in; uint8 *dst = out; if ((in == NULL) || (out == NULL)) { TIFFError("extractContigSamples32bits","Invalid input or output buffer"); return (1); } if ((start > end) || (start > cols)) { TIFFError ("extractContigSamples32bits", "Invalid start column value %d ignored", start); start = 0; } if ((end == 0) || (end > cols)) { TIFFError ("extractContigSamples32bits", "Invalid end column value %d ignored", end); end = cols; } shift_width = ((bps + 7) / 8) + 1; ready_bits = 0; maskbits = (uint64)-1 >> ( 64 - bps); for (col = start; col < end; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps * spp; for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++) { if (sindex == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sindex * bps)) / 8; src_bit = (bit_offset + (sindex * bps)) % 8; } src = in + src_byte; matchbits = maskbits << (64 - src_bit - bps); if (little_endian) { longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; longbuff2 = longbuff1; } else { longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; longbuff2 = longbuff1; } buff3 = ((uint64)longbuff1 << 32) | longbuff2; buff1 = (buff3 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 32) { bytebuff1 = (buff2 >> 56); *dst++ = bytebuff1; bytebuff2 = (buff2 >> 48); *dst++ = bytebuff2; bytebuff3 = (buff2 >> 40); *dst++ = bytebuff3; bytebuff4 = (buff2 >> 32); *dst++ = bytebuff4; ready_bits -= 32; /* shift in new bits */ buff2 = ((buff2 << 32) | (buff1 >> ready_bits)); } else { /* add another bps bits to the buffer */ bytebuff1 = bytebuff2 = bytebuff3 = bytebuff4 = 0; buff2 = (buff2 | (buff1 >> ready_bits)); } ready_bits += bps; } } while (ready_bits > 0) { bytebuff1 = (buff2 >> 56); *dst++ = bytebuff1; buff2 = (buff2 << 8); ready_bits -= 8; } return (0); } /* end extractContigSamples32bits */ static int extractContigSamplesShifted8bits (uint8 *in, uint8 *out, uint32 cols, tsample_t sample, uint16 spp, uint16 bps, tsample_t count, uint32 start, uint32 end, int shift) { int ready_bits = 0, sindex = 0; uint32 col, src_byte, src_bit, bit_offset; uint8 maskbits = 0, matchbits = 0; uint8 buff1 = 0, buff2 = 0; uint8 *src = in; uint8 *dst = out; if ((src == NULL) || (dst == NULL)) { TIFFError("extractContigSamplesShifted8bits","Invalid input or output buffer"); return (1); } if ((start > end) || (start > cols)) { TIFFError ("extractContigSamplesShifted8bits", "Invalid start column value %d ignored", start); start = 0; } if ((end == 0) || (end > cols)) { TIFFError ("extractContigSamplesShifted8bits", "Invalid end column value %d ignored", end); end = cols; } ready_bits = shift; maskbits = (uint8)-1 >> ( 8 - bps); buff1 = buff2 = 0; for (col = start; col < end; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps * spp; for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++) { if (sindex == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sindex * bps)) / 8; src_bit = (bit_offset + (sindex * bps)) % 8; } src = in + src_byte; matchbits = maskbits << (8 - src_bit - bps); buff1 = ((*src) & matchbits) << (src_bit); if ((col == start) && (sindex == sample)) buff2 = *src & ((uint8)-1) << (shift); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 8) { *dst++ |= buff2; buff2 = buff1; ready_bits -= 8; } else buff2 = buff2 | (buff1 >> ready_bits); ready_bits += bps; } } while (ready_bits > 0) { buff1 = (buff2 & ((unsigned int)255 << (8 - ready_bits))); *dst++ = buff1; ready_bits -= 8; } return (0); } /* end extractContigSamplesShifted8bits */ static int extractContigSamplesShifted16bits (uint8 *in, uint8 *out, uint32 cols, tsample_t sample, uint16 spp, uint16 bps, tsample_t count, uint32 start, uint32 end, int shift) { int ready_bits = 0, sindex = 0; uint32 col, src_byte, src_bit, bit_offset; uint16 maskbits = 0, matchbits = 0; uint16 buff1 = 0, buff2 = 0; uint8 bytebuff = 0; uint8 *src = in; uint8 *dst = out; if ((src == NULL) || (dst == NULL)) { TIFFError("extractContigSamplesShifted16bits","Invalid input or output buffer"); return (1); } if ((start > end) || (start > cols)) { TIFFError ("extractContigSamplesShifted16bits", "Invalid start column value %d ignored", start); start = 0; } if ((end == 0) || (end > cols)) { TIFFError ("extractContigSamplesShifted16bits", "Invalid end column value %d ignored", end); end = cols; } ready_bits = shift; maskbits = (uint16)-1 >> (16 - bps); for (col = start; col < end; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps * spp; for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++) { if (sindex == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sindex * bps)) / 8; src_bit = (bit_offset + (sindex * bps)) % 8; } src = in + src_byte; matchbits = maskbits << (16 - src_bit - bps); if (little_endian) buff1 = (src[0] << 8) | src[1]; else buff1 = (src[1] << 8) | src[0]; if ((col == start) && (sindex == sample)) buff2 = buff1 & ((uint16)-1) << (8 - shift); buff1 = (buff1 & matchbits) << (src_bit); if (ready_bits < 8) /* add another bps bits to the buffer */ buff2 = buff2 | (buff1 >> ready_bits); else /* If we have a full buffer's worth, write it out */ { bytebuff = (buff2 >> 8); *dst++ = bytebuff; ready_bits -= 8; /* shift in new bits */ buff2 = ((buff2 << 8) | (buff1 >> ready_bits)); } ready_bits += bps; } } /* catch any trailing bits at the end of the line */ while (ready_bits > 0) { bytebuff = (buff2 >> 8); *dst++ = bytebuff; ready_bits -= 8; } return (0); } /* end extractContigSamplesShifted16bits */ static int extractContigSamplesShifted24bits (uint8 *in, uint8 *out, uint32 cols, tsample_t sample, uint16 spp, uint16 bps, tsample_t count, uint32 start, uint32 end, int shift) { int ready_bits = 0, sindex = 0; uint32 col, src_byte, src_bit, bit_offset; uint32 maskbits = 0, matchbits = 0; uint32 buff1 = 0, buff2 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0; uint8 *src = in; uint8 *dst = out; if ((in == NULL) || (out == NULL)) { TIFFError("extractContigSamplesShifted24bits","Invalid input or output buffer"); return (1); } if ((start > end) || (start > cols)) { TIFFError ("extractContigSamplesShifted24bits", "Invalid start column value %d ignored", start); start = 0; } if ((end == 0) || (end > cols)) { TIFFError ("extractContigSamplesShifted24bits", "Invalid end column value %d ignored", end); end = cols; } ready_bits = shift; maskbits = (uint32)-1 >> ( 32 - bps); for (col = start; col < end; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps * spp; for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++) { if (sindex == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sindex * bps)) / 8; src_bit = (bit_offset + (sindex * bps)) % 8; } src = in + src_byte; matchbits = maskbits << (32 - src_bit - bps); if (little_endian) buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; else buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; if ((col == start) && (sindex == sample)) buff2 = buff1 & ((uint32)-1) << (16 - shift); buff1 = (buff1 & matchbits) << (src_bit); if (ready_bits < 16) /* add another bps bits to the buffer */ { bytebuff1 = bytebuff2 = 0; buff2 = (buff2 | (buff1 >> ready_bits)); } else /* If we have a full buffer's worth, write it out */ { bytebuff1 = (buff2 >> 24); *dst++ = bytebuff1; bytebuff2 = (buff2 >> 16); *dst++ = bytebuff2; ready_bits -= 16; /* shift in new bits */ buff2 = ((buff2 << 16) | (buff1 >> ready_bits)); } ready_bits += bps; } } /* catch any trailing bits at the end of the line */ while (ready_bits > 0) { bytebuff1 = (buff2 >> 24); *dst++ = bytebuff1; buff2 = (buff2 << 8); bytebuff2 = bytebuff1; ready_bits -= 8; } return (0); } /* end extractContigSamplesShifted24bits */ static int extractContigSamplesShifted32bits (uint8 *in, uint8 *out, uint32 cols, tsample_t sample, uint16 spp, uint16 bps, tsample_t count, uint32 start, uint32 end, int shift) { int ready_bits = 0, sindex = 0, shift_width = 0; uint32 col, src_byte, src_bit, bit_offset; uint32 longbuff1 = 0, longbuff2 = 0; uint64 maskbits = 0, matchbits = 0; uint64 buff1 = 0, buff2 = 0, buff3 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0; uint8 *src = in; uint8 *dst = out; if ((in == NULL) || (out == NULL)) { TIFFError("extractContigSamplesShifted32bits","Invalid input or output buffer"); return (1); } if ((start > end) || (start > cols)) { TIFFError ("extractContigSamplesShifted32bits", "Invalid start column value %d ignored", start); start = 0; } if ((end == 0) || (end > cols)) { TIFFError ("extractContigSamplesShifted32bits", "Invalid end column value %d ignored", end); end = cols; } shift_width = ((bps + 7) / 8) + 1; ready_bits = shift; maskbits = (uint64)-1 >> ( 64 - bps); for (col = start; col < end; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps * spp; for (sindex = sample; (sindex < spp) && (sindex < (sample + count)); sindex++) { if (sindex == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sindex * bps)) / 8; src_bit = (bit_offset + (sindex * bps)) % 8; } src = in + src_byte; matchbits = maskbits << (64 - src_bit - bps); if (little_endian) { longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; longbuff2 = longbuff1; } else { longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; longbuff2 = longbuff1; } buff3 = ((uint64)longbuff1 << 32) | longbuff2; if ((col == start) && (sindex == sample)) buff2 = buff3 & ((uint64)-1) << (32 - shift); buff1 = (buff3 & matchbits) << (src_bit); if (ready_bits < 32) { /* add another bps bits to the buffer */ bytebuff1 = bytebuff2 = bytebuff3 = bytebuff4 = 0; buff2 = (buff2 | (buff1 >> ready_bits)); } else /* If we have a full buffer's worth, write it out */ { bytebuff1 = (buff2 >> 56); *dst++ = bytebuff1; bytebuff2 = (buff2 >> 48); *dst++ = bytebuff2; bytebuff3 = (buff2 >> 40); *dst++ = bytebuff3; bytebuff4 = (buff2 >> 32); *dst++ = bytebuff4; ready_bits -= 32; /* shift in new bits */ buff2 = ((buff2 << 32) | (buff1 >> ready_bits)); } ready_bits += bps; } } while (ready_bits > 0) { bytebuff1 = (buff2 >> 56); *dst++ = bytebuff1; buff2 = (buff2 << 8); ready_bits -= 8; } return (0); } /* end extractContigSamplesShifted32bits */ static int extractContigSamplesToBuffer(uint8 *out, uint8 *in, uint32 rows, uint32 cols, tsample_t sample, uint16 spp, uint16 bps, struct dump_opts *dump) { int shift_width, bytes_per_sample, bytes_per_pixel; uint32 src_rowsize, src_offset, row, first_col = 0; uint32 dst_rowsize, dst_offset; tsample_t count = 1; uint8 *src, *dst; bytes_per_sample = (bps + 7) / 8; bytes_per_pixel = ((bps * spp) + 7) / 8; if ((bps % 8) == 0) shift_width = 0; else { if (bytes_per_pixel < (bytes_per_sample + 1)) shift_width = bytes_per_pixel; else shift_width = bytes_per_sample + 1; } src_rowsize = ((bps * spp * cols) + 7) / 8; dst_rowsize = ((bps * cols) + 7) / 8; if ((dump->outfile != NULL) && (dump->level == 4)) { dump_info (dump->outfile, dump->format, "extractContigSamplesToBuffer", "Sample %d, %d rows", sample + 1, rows + 1); } for (row = 0; row < rows; row++) { src_offset = row * src_rowsize; dst_offset = row * dst_rowsize; src = in + src_offset; dst = out + dst_offset; /* pack the data into the scanline */ switch (shift_width) { case 0: if (extractContigSamplesBytes (src, dst, cols, sample, spp, bps, count, first_col, cols)) return (1); break; case 1: if (bps == 1) { if (extractContigSamples8bits (src, dst, cols, sample, spp, bps, count, first_col, cols)) return (1); break; } else if (extractContigSamples16bits (src, dst, cols, sample, spp, bps, count, first_col, cols)) return (1); break; case 2: if (extractContigSamples24bits (src, dst, cols, sample, spp, bps, count, first_col, cols)) return (1); break; case 3: case 4: case 5: if (extractContigSamples32bits (src, dst, cols, sample, spp, bps, count, first_col, cols)) return (1); break; default: TIFFError ("extractContigSamplesToBuffer", "Unsupported bit depth: %d", bps); return (1); } if ((dump->outfile != NULL) && (dump->level == 4)) dump_buffer(dump->outfile, dump->format, 1, dst_rowsize, row, dst); } return (0); } /* end extractContigSamplesToBuffer */ static int extractContigSamplesToTileBuffer(uint8 *out, uint8 *in, uint32 rows, uint32 cols, uint32 imagewidth, uint32 tilewidth, tsample_t sample, uint16 count, uint16 spp, uint16 bps, struct dump_opts *dump) { int shift_width, bytes_per_sample, bytes_per_pixel; uint32 src_rowsize, src_offset, row; uint32 dst_rowsize, dst_offset; uint8 *src, *dst; bytes_per_sample = (bps + 7) / 8; bytes_per_pixel = ((bps * spp) + 7) / 8; if ((bps % 8) == 0) shift_width = 0; else { if (bytes_per_pixel < (bytes_per_sample + 1)) shift_width = bytes_per_pixel; else shift_width = bytes_per_sample + 1; } if ((dump->outfile != NULL) && (dump->level == 4)) { dump_info (dump->outfile, dump->format, "extractContigSamplesToTileBuffer", "Sample %d, %d rows", sample + 1, rows + 1); } src_rowsize = ((bps * spp * imagewidth) + 7) / 8; dst_rowsize = ((bps * tilewidth * count) + 7) / 8; for (row = 0; row < rows; row++) { src_offset = row * src_rowsize; dst_offset = row * dst_rowsize; src = in + src_offset; dst = out + dst_offset; /* pack the data into the scanline */ switch (shift_width) { case 0: if (extractContigSamplesBytes (src, dst, cols, sample, spp, bps, count, 0, cols)) return (1); break; case 1: if (bps == 1) { if (extractContigSamples8bits (src, dst, cols, sample, spp, bps, count, 0, cols)) return (1); break; } else if (extractContigSamples16bits (src, dst, cols, sample, spp, bps, count, 0, cols)) return (1); break; case 2: if (extractContigSamples24bits (src, dst, cols, sample, spp, bps, count, 0, cols)) return (1); break; case 3: case 4: case 5: if (extractContigSamples32bits (src, dst, cols, sample, spp, bps, count, 0, cols)) return (1); break; default: TIFFError ("extractContigSamplesToTileBuffer", "Unsupported bit depth: %d", bps); return (1); } if ((dump->outfile != NULL) && (dump->level == 4)) dump_buffer(dump->outfile, dump->format, 1, dst_rowsize, row, dst); } return (0); } /* end extractContigSamplesToTileBuffer */ static int readContigStripsIntoBuffer (TIFF* in, uint8* buf) { uint8* bufp = buf; int32 bytes_read = 0; uint16 strip, nstrips = TIFFNumberOfStrips(in); uint32 stripsize = TIFFStripSize(in); uint32 rows = 0; uint32 rps = TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &rps); tsize_t scanline_size = TIFFScanlineSize(in); for (strip = 0; strip < nstrips; strip++) { bytes_read = TIFFReadEncodedStrip (in, strip, bufp, -1); rows = bytes_read / scanline_size; if ((strip < (nstrips - 1)) && (bytes_read != (int32)stripsize)) TIFFError("", "Strip %d: read %lu bytes, strip size %lu", (int)strip + 1, (unsigned long) bytes_read, (unsigned long)stripsize); if (bytes_read < 0 && !ignore) { TIFFError("", "Error reading strip %lu after %lu rows", (unsigned long) strip, (unsigned long)rows); return 0; } bufp += bytes_read; } return 1; } /* end readContigStripsIntoBuffer */ static int combineSeparateSamplesBytes (unsigned char *srcbuffs[], unsigned char *out, uint32 cols, uint32 rows, uint16 spp, uint16 bps, FILE *dumpfile, int format, int level) { int i, bytes_per_sample; uint32 row, col, col_offset, src_rowsize, dst_rowsize, row_offset; unsigned char *src; unsigned char *dst; tsample_t s; src = srcbuffs[0]; dst = out; if ((src == NULL) || (dst == NULL)) { TIFFError("combineSeparateSamplesBytes","Invalid buffer address"); return (1); } bytes_per_sample = (bps + 7) / 8; src_rowsize = ((bps * cols) + 7) / 8; dst_rowsize = ((bps * spp * cols) + 7) / 8; for (row = 0; row < rows; row++) { if ((dumpfile != NULL) && (level == 2)) { for (s = 0; s < spp; s++) { dump_info (dumpfile, format, "combineSeparateSamplesBytes","Input data, Sample %d", s); dump_buffer(dumpfile, format, 1, cols, row, srcbuffs[s] + (row * src_rowsize)); } } dst = out + (row * dst_rowsize); row_offset = row * src_rowsize; for (col = 0; col < cols; col++) { col_offset = row_offset + (col * (bps / 8)); for (s = 0; (s < spp) && (s < MAX_SAMPLES); s++) { src = srcbuffs[s] + col_offset; for (i = 0; i < bytes_per_sample; i++) *(dst + i) = *(src + i); src += bytes_per_sample; dst += bytes_per_sample; } } if ((dumpfile != NULL) && (level == 2)) { dump_info (dumpfile, format, "combineSeparateSamplesBytes","Output data, combined samples"); dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize)); } } return (0); } /* end combineSeparateSamplesBytes */ static int combineSeparateSamples8bits (uint8 *in[], uint8 *out, uint32 cols, uint32 rows, uint16 spp, uint16 bps, FILE *dumpfile, int format, int level) { int ready_bits = 0; int bytes_per_sample = 0; uint32 src_rowsize, dst_rowsize, src_offset; uint32 bit_offset; uint32 row, col, src_byte = 0, src_bit = 0; uint8 maskbits = 0, matchbits = 0; uint8 buff1 = 0, buff2 = 0; tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; char action[32]; if ((src == NULL) || (dst == NULL)) { TIFFError("combineSeparateSamples8bits","Invalid input or output buffer"); return (1); } bytes_per_sample = (bps + 7) / 8; src_rowsize = ((bps * cols) + 7) / 8; dst_rowsize = ((bps * cols * spp) + 7) / 8; maskbits = (uint8)-1 >> ( 8 - bps); for (row = 0; row < rows; row++) { ready_bits = 0; buff1 = buff2 = 0; dst = out + (row * dst_rowsize); src_offset = row * src_rowsize; for (col = 0; col < cols; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps; src_byte = bit_offset / 8; src_bit = bit_offset % 8; matchbits = maskbits << (8 - src_bit - bps); /* load up next sample from each plane */ for (s = 0; s < spp; s++) { src = in[s] + src_offset + src_byte; buff1 = ((*src) & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 8) { *dst++ = buff2; buff2 = buff1; ready_bits -= 8; strcpy (action, "Flush"); } else { buff2 = (buff2 | (buff1 >> ready_bits)); strcpy (action, "Update"); } ready_bits += bps; if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Samples %d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, s, src_byte, src_bit, dst - out); dump_byte (dumpfile, format, "Match bits", matchbits); dump_byte (dumpfile, format, "Src bits", *src); dump_byte (dumpfile, format, "Buff1 bits", buff1); dump_byte (dumpfile, format, "Buff2 bits", buff2); dump_info (dumpfile, format, "","%s", action); } } } if (ready_bits > 0) { buff1 = (buff2 & ((unsigned int)255 << (8 - ready_bits))); *dst++ = buff1; if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, src_byte, src_bit, dst - out); dump_byte (dumpfile, format, "Final bits", buff1); } } if ((dumpfile != NULL) && (level >= 2)) { dump_info (dumpfile, format, "combineSeparateSamples8bits","Output data"); dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize)); } } return (0); } /* end combineSeparateSamples8bits */ static int combineSeparateSamples16bits (uint8 *in[], uint8 *out, uint32 cols, uint32 rows, uint16 spp, uint16 bps, FILE *dumpfile, int format, int level) { int ready_bits = 0, bytes_per_sample = 0; uint32 src_rowsize, dst_rowsize; uint32 bit_offset, src_offset; uint32 row, col, src_byte = 0, src_bit = 0; uint16 maskbits = 0, matchbits = 0; uint16 buff1 = 0, buff2 = 0; uint8 bytebuff = 0; tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; char action[8]; if ((src == NULL) || (dst == NULL)) { TIFFError("combineSeparateSamples16bits","Invalid input or output buffer"); return (1); } bytes_per_sample = (bps + 7) / 8; src_rowsize = ((bps * cols) + 7) / 8; dst_rowsize = ((bps * cols * spp) + 7) / 8; maskbits = (uint16)-1 >> (16 - bps); for (row = 0; row < rows; row++) { ready_bits = 0; buff1 = buff2 = 0; dst = out + (row * dst_rowsize); src_offset = row * src_rowsize; for (col = 0; col < cols; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps; src_byte = bit_offset / 8; src_bit = bit_offset % 8; matchbits = maskbits << (16 - src_bit - bps); for (s = 0; s < spp; s++) { src = in[s] + src_offset + src_byte; if (little_endian) buff1 = (src[0] << 8) | src[1]; else buff1 = (src[1] << 8) | src[0]; buff1 = (buff1 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 8) { bytebuff = (buff2 >> 8); *dst++ = bytebuff; ready_bits -= 8; /* shift in new bits */ buff2 = ((buff2 << 8) | (buff1 >> ready_bits)); strcpy (action, "Flush"); } else { /* add another bps bits to the buffer */ bytebuff = 0; buff2 = (buff2 | (buff1 >> ready_bits)); strcpy (action, "Update"); } ready_bits += bps; if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Samples %d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, s, src_byte, src_bit, dst - out); dump_short (dumpfile, format, "Match bits", matchbits); dump_data (dumpfile, format, "Src bits", src, 2); dump_short (dumpfile, format, "Buff1 bits", buff1); dump_short (dumpfile, format, "Buff2 bits", buff2); dump_byte (dumpfile, format, "Write byte", bytebuff); dump_info (dumpfile, format, "","Ready bits: %d, %s", ready_bits, action); } } } /* catch any trailing bits at the end of the line */ if (ready_bits > 0) { bytebuff = (buff2 >> 8); *dst++ = bytebuff; if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, src_byte, src_bit, dst - out); dump_byte (dumpfile, format, "Final bits", bytebuff); } } if ((dumpfile != NULL) && (level == 2)) { dump_info (dumpfile, format, "combineSeparateSamples16bits","Output data"); dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize)); } } return (0); } /* end combineSeparateSamples16bits */ static int combineSeparateSamples24bits (uint8 *in[], uint8 *out, uint32 cols, uint32 rows, uint16 spp, uint16 bps, FILE *dumpfile, int format, int level) { int ready_bits = 0, bytes_per_sample = 0; uint32 src_rowsize, dst_rowsize; uint32 bit_offset, src_offset; uint32 row, col, src_byte = 0, src_bit = 0; uint32 maskbits = 0, matchbits = 0; uint32 buff1 = 0, buff2 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0; tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; char action[8]; if ((src == NULL) || (dst == NULL)) { TIFFError("combineSeparateSamples24bits","Invalid input or output buffer"); return (1); } bytes_per_sample = (bps + 7) / 8; src_rowsize = ((bps * cols) + 7) / 8; dst_rowsize = ((bps * cols * spp) + 7) / 8; maskbits = (uint32)-1 >> ( 32 - bps); for (row = 0; row < rows; row++) { ready_bits = 0; buff1 = buff2 = 0; dst = out + (row * dst_rowsize); src_offset = row * src_rowsize; for (col = 0; col < cols; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps; src_byte = bit_offset / 8; src_bit = bit_offset % 8; matchbits = maskbits << (32 - src_bit - bps); for (s = 0; s < spp; s++) { src = in[s] + src_offset + src_byte; if (little_endian) buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; else buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; buff1 = (buff1 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 16) { bytebuff1 = (buff2 >> 24); *dst++ = bytebuff1; bytebuff2 = (buff2 >> 16); *dst++ = bytebuff2; ready_bits -= 16; /* shift in new bits */ buff2 = ((buff2 << 16) | (buff1 >> ready_bits)); strcpy (action, "Flush"); } else { /* add another bps bits to the buffer */ bytebuff1 = bytebuff2 = 0; buff2 = (buff2 | (buff1 >> ready_bits)); strcpy (action, "Update"); } ready_bits += bps; if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Samples %d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, s, src_byte, src_bit, dst - out); dump_long (dumpfile, format, "Match bits ", matchbits); dump_data (dumpfile, format, "Src bits ", src, 4); dump_long (dumpfile, format, "Buff1 bits ", buff1); dump_long (dumpfile, format, "Buff2 bits ", buff2); dump_byte (dumpfile, format, "Write bits1", bytebuff1); dump_byte (dumpfile, format, "Write bits2", bytebuff2); dump_info (dumpfile, format, "","Ready bits: %d, %s", ready_bits, action); } } } /* catch any trailing bits at the end of the line */ while (ready_bits > 0) { bytebuff1 = (buff2 >> 24); *dst++ = bytebuff1; buff2 = (buff2 << 8); bytebuff2 = bytebuff1; ready_bits -= 8; } if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, src_byte, src_bit, dst - out); dump_long (dumpfile, format, "Match bits ", matchbits); dump_data (dumpfile, format, "Src bits ", src, 4); dump_long (dumpfile, format, "Buff1 bits ", buff1); dump_long (dumpfile, format, "Buff2 bits ", buff2); dump_byte (dumpfile, format, "Write bits1", bytebuff1); dump_byte (dumpfile, format, "Write bits2", bytebuff2); dump_info (dumpfile, format, "", "Ready bits: %2d", ready_bits); } if ((dumpfile != NULL) && (level == 2)) { dump_info (dumpfile, format, "combineSeparateSamples24bits","Output data"); dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize)); } } return (0); } /* end combineSeparateSamples24bits */ static int combineSeparateSamples32bits (uint8 *in[], uint8 *out, uint32 cols, uint32 rows, uint16 spp, uint16 bps, FILE *dumpfile, int format, int level) { int ready_bits = 0, bytes_per_sample = 0, shift_width = 0; uint32 src_rowsize, dst_rowsize, bit_offset, src_offset; uint32 src_byte = 0, src_bit = 0; uint32 row, col; uint32 longbuff1 = 0, longbuff2 = 0; uint64 maskbits = 0, matchbits = 0; uint64 buff1 = 0, buff2 = 0, buff3 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0; tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; char action[8]; if ((src == NULL) || (dst == NULL)) { TIFFError("combineSeparateSamples32bits","Invalid input or output buffer"); return (1); } bytes_per_sample = (bps + 7) / 8; src_rowsize = ((bps * cols) + 7) / 8; dst_rowsize = ((bps * cols * spp) + 7) / 8; maskbits = (uint64)-1 >> ( 64 - bps); shift_width = ((bps + 7) / 8) + 1; for (row = 0; row < rows; row++) { ready_bits = 0; buff1 = buff2 = 0; dst = out + (row * dst_rowsize); src_offset = row * src_rowsize; for (col = 0; col < cols; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps; src_byte = bit_offset / 8; src_bit = bit_offset % 8; matchbits = maskbits << (64 - src_bit - bps); for (s = 0; s < spp; s++) { src = in[s] + src_offset + src_byte; if (little_endian) { longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; longbuff2 = longbuff1; } else { longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; longbuff2 = longbuff1; } buff3 = ((uint64)longbuff1 << 32) | longbuff2; buff1 = (buff3 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 32) { bytebuff1 = (buff2 >> 56); *dst++ = bytebuff1; bytebuff2 = (buff2 >> 48); *dst++ = bytebuff2; bytebuff3 = (buff2 >> 40); *dst++ = bytebuff3; bytebuff4 = (buff2 >> 32); *dst++ = bytebuff4; ready_bits -= 32; /* shift in new bits */ buff2 = ((buff2 << 32) | (buff1 >> ready_bits)); strcpy (action, "Flush"); } else { /* add another bps bits to the buffer */ bytebuff1 = bytebuff2 = bytebuff3 = bytebuff4 = 0; buff2 = (buff2 | (buff1 >> ready_bits)); strcpy (action, "Update"); } ready_bits += bps; if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Sample %d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, s, src_byte, src_bit, dst - out); dump_wide (dumpfile, format, "Match bits ", matchbits); dump_data (dumpfile, format, "Src bits ", src, 8); dump_wide (dumpfile, format, "Buff1 bits ", buff1); dump_wide (dumpfile, format, "Buff2 bits ", buff2); dump_info (dumpfile, format, "", "Ready bits: %d, %s", ready_bits, action); } } } while (ready_bits > 0) { bytebuff1 = (buff2 >> 56); *dst++ = bytebuff1; buff2 = (buff2 << 8); ready_bits -= 8; } if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, src_byte, src_bit, dst - out); dump_long (dumpfile, format, "Match bits ", matchbits); dump_data (dumpfile, format, "Src bits ", src, 4); dump_long (dumpfile, format, "Buff1 bits ", buff1); dump_long (dumpfile, format, "Buff2 bits ", buff2); dump_byte (dumpfile, format, "Write bits1", bytebuff1); dump_byte (dumpfile, format, "Write bits2", bytebuff2); dump_info (dumpfile, format, "", "Ready bits: %2d", ready_bits); } if ((dumpfile != NULL) && (level == 2)) { dump_info (dumpfile, format, "combineSeparateSamples32bits","Output data"); dump_buffer(dumpfile, format, 1, dst_rowsize, row, out); } } return (0); } /* end combineSeparateSamples32bits */ static int combineSeparateTileSamplesBytes (unsigned char *srcbuffs[], unsigned char *out, uint32 cols, uint32 rows, uint32 imagewidth, uint32 tw, uint16 spp, uint16 bps, FILE *dumpfile, int format, int level) { int i, bytes_per_sample; uint32 row, col, col_offset, src_rowsize, dst_rowsize, src_offset; unsigned char *src; unsigned char *dst; tsample_t s; src = srcbuffs[0]; dst = out; if ((src == NULL) || (dst == NULL)) { TIFFError("combineSeparateTileSamplesBytes","Invalid buffer address"); return (1); } bytes_per_sample = (bps + 7) / 8; src_rowsize = ((bps * tw) + 7) / 8; dst_rowsize = imagewidth * bytes_per_sample * spp; for (row = 0; row < rows; row++) { if ((dumpfile != NULL) && (level == 2)) { for (s = 0; s < spp; s++) { dump_info (dumpfile, format, "combineSeparateTileSamplesBytes","Input data, Sample %d", s); dump_buffer(dumpfile, format, 1, cols, row, srcbuffs[s] + (row * src_rowsize)); } } dst = out + (row * dst_rowsize); src_offset = row * src_rowsize; #ifdef DEVELMODE TIFFError("","Tile row %4d, Src offset %6d Dst offset %6d", row, src_offset, dst - out); #endif for (col = 0; col < cols; col++) { col_offset = src_offset + (col * (bps / 8)); for (s = 0; (s < spp) && (s < MAX_SAMPLES); s++) { src = srcbuffs[s] + col_offset; for (i = 0; i < bytes_per_sample; i++) *(dst + i) = *(src + i); dst += bytes_per_sample; } } if ((dumpfile != NULL) && (level == 2)) { dump_info (dumpfile, format, "combineSeparateTileSamplesBytes","Output data, combined samples"); dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize)); } } return (0); } /* end combineSeparateTileSamplesBytes */ static int combineSeparateTileSamples8bits (uint8 *in[], uint8 *out, uint32 cols, uint32 rows, uint32 imagewidth, uint32 tw, uint16 spp, uint16 bps, FILE *dumpfile, int format, int level) { int ready_bits = 0; uint32 src_rowsize, dst_rowsize, src_offset; uint32 bit_offset; uint32 row, col, src_byte = 0, src_bit = 0; uint8 maskbits = 0, matchbits = 0; uint8 buff1 = 0, buff2 = 0; tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; char action[32]; if ((src == NULL) || (dst == NULL)) { TIFFError("combineSeparateTileSamples8bits","Invalid input or output buffer"); return (1); } src_rowsize = ((bps * tw) + 7) / 8; dst_rowsize = ((imagewidth * bps * spp) + 7) / 8; maskbits = (uint8)-1 >> ( 8 - bps); for (row = 0; row < rows; row++) { ready_bits = 0; buff1 = buff2 = 0; dst = out + (row * dst_rowsize); src_offset = row * src_rowsize; for (col = 0; col < cols; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps; src_byte = bit_offset / 8; src_bit = bit_offset % 8; matchbits = maskbits << (8 - src_bit - bps); /* load up next sample from each plane */ for (s = 0; s < spp; s++) { src = in[s] + src_offset + src_byte; buff1 = ((*src) & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 8) { *dst++ = buff2; buff2 = buff1; ready_bits -= 8; strcpy (action, "Flush"); } else { buff2 = (buff2 | (buff1 >> ready_bits)); strcpy (action, "Update"); } ready_bits += bps; if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Samples %d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, s, src_byte, src_bit, dst - out); dump_byte (dumpfile, format, "Match bits", matchbits); dump_byte (dumpfile, format, "Src bits", *src); dump_byte (dumpfile, format, "Buff1 bits", buff1); dump_byte (dumpfile, format, "Buff2 bits", buff2); dump_info (dumpfile, format, "","%s", action); } } } if (ready_bits > 0) { buff1 = (buff2 & ((unsigned int)255 << (8 - ready_bits))); *dst++ = buff1; if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, src_byte, src_bit, dst - out); dump_byte (dumpfile, format, "Final bits", buff1); } } if ((dumpfile != NULL) && (level >= 2)) { dump_info (dumpfile, format, "combineSeparateTileSamples8bits","Output data"); dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize)); } } return (0); } /* end combineSeparateTileSamples8bits */ static int combineSeparateTileSamples16bits (uint8 *in[], uint8 *out, uint32 cols, uint32 rows, uint32 imagewidth, uint32 tw, uint16 spp, uint16 bps, FILE *dumpfile, int format, int level) { int ready_bits = 0; uint32 src_rowsize, dst_rowsize; uint32 bit_offset, src_offset; uint32 row, col, src_byte = 0, src_bit = 0; uint16 maskbits = 0, matchbits = 0; uint16 buff1 = 0, buff2 = 0; uint8 bytebuff = 0; tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; char action[8]; if ((src == NULL) || (dst == NULL)) { TIFFError("combineSeparateTileSamples16bits","Invalid input or output buffer"); return (1); } src_rowsize = ((bps * tw) + 7) / 8; dst_rowsize = ((imagewidth * bps * spp) + 7) / 8; maskbits = (uint16)-1 >> (16 - bps); for (row = 0; row < rows; row++) { ready_bits = 0; buff1 = buff2 = 0; dst = out + (row * dst_rowsize); src_offset = row * src_rowsize; for (col = 0; col < cols; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps; src_byte = bit_offset / 8; src_bit = bit_offset % 8; matchbits = maskbits << (16 - src_bit - bps); for (s = 0; s < spp; s++) { src = in[s] + src_offset + src_byte; if (little_endian) buff1 = (src[0] << 8) | src[1]; else buff1 = (src[1] << 8) | src[0]; buff1 = (buff1 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 8) { bytebuff = (buff2 >> 8); *dst++ = bytebuff; ready_bits -= 8; /* shift in new bits */ buff2 = ((buff2 << 8) | (buff1 >> ready_bits)); strcpy (action, "Flush"); } else { /* add another bps bits to the buffer */ bytebuff = 0; buff2 = (buff2 | (buff1 >> ready_bits)); strcpy (action, "Update"); } ready_bits += bps; if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Samples %d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, s, src_byte, src_bit, dst - out); dump_short (dumpfile, format, "Match bits", matchbits); dump_data (dumpfile, format, "Src bits", src, 2); dump_short (dumpfile, format, "Buff1 bits", buff1); dump_short (dumpfile, format, "Buff2 bits", buff2); dump_byte (dumpfile, format, "Write byte", bytebuff); dump_info (dumpfile, format, "","Ready bits: %d, %s", ready_bits, action); } } } /* catch any trailing bits at the end of the line */ if (ready_bits > 0) { bytebuff = (buff2 >> 8); *dst++ = bytebuff; if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, src_byte, src_bit, dst - out); dump_byte (dumpfile, format, "Final bits", bytebuff); } } if ((dumpfile != NULL) && (level == 2)) { dump_info (dumpfile, format, "combineSeparateTileSamples16bits","Output data"); dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize)); } } return (0); } /* end combineSeparateTileSamples16bits */ static int combineSeparateTileSamples24bits (uint8 *in[], uint8 *out, uint32 cols, uint32 rows, uint32 imagewidth, uint32 tw, uint16 spp, uint16 bps, FILE *dumpfile, int format, int level) { int ready_bits = 0; uint32 src_rowsize, dst_rowsize; uint32 bit_offset, src_offset; uint32 row, col, src_byte = 0, src_bit = 0; uint32 maskbits = 0, matchbits = 0; uint32 buff1 = 0, buff2 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0; tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; char action[8]; if ((src == NULL) || (dst == NULL)) { TIFFError("combineSeparateTileSamples24bits","Invalid input or output buffer"); return (1); } src_rowsize = ((bps * tw) + 7) / 8; dst_rowsize = ((imagewidth * bps * spp) + 7) / 8; maskbits = (uint32)-1 >> ( 32 - bps); for (row = 0; row < rows; row++) { ready_bits = 0; buff1 = buff2 = 0; dst = out + (row * dst_rowsize); src_offset = row * src_rowsize; for (col = 0; col < cols; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps; src_byte = bit_offset / 8; src_bit = bit_offset % 8; matchbits = maskbits << (32 - src_bit - bps); for (s = 0; s < spp; s++) { src = in[s] + src_offset + src_byte; if (little_endian) buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; else buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; buff1 = (buff1 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 16) { bytebuff1 = (buff2 >> 24); *dst++ = bytebuff1; bytebuff2 = (buff2 >> 16); *dst++ = bytebuff2; ready_bits -= 16; /* shift in new bits */ buff2 = ((buff2 << 16) | (buff1 >> ready_bits)); strcpy (action, "Flush"); } else { /* add another bps bits to the buffer */ bytebuff1 = bytebuff2 = 0; buff2 = (buff2 | (buff1 >> ready_bits)); strcpy (action, "Update"); } ready_bits += bps; if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Samples %d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, s, src_byte, src_bit, dst - out); dump_long (dumpfile, format, "Match bits ", matchbits); dump_data (dumpfile, format, "Src bits ", src, 4); dump_long (dumpfile, format, "Buff1 bits ", buff1); dump_long (dumpfile, format, "Buff2 bits ", buff2); dump_byte (dumpfile, format, "Write bits1", bytebuff1); dump_byte (dumpfile, format, "Write bits2", bytebuff2); dump_info (dumpfile, format, "","Ready bits: %d, %s", ready_bits, action); } } } /* catch any trailing bits at the end of the line */ while (ready_bits > 0) { bytebuff1 = (buff2 >> 24); *dst++ = bytebuff1; buff2 = (buff2 << 8); bytebuff2 = bytebuff1; ready_bits -= 8; } if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, src_byte, src_bit, dst - out); dump_long (dumpfile, format, "Match bits ", matchbits); dump_data (dumpfile, format, "Src bits ", src, 4); dump_long (dumpfile, format, "Buff1 bits ", buff1); dump_long (dumpfile, format, "Buff2 bits ", buff2); dump_byte (dumpfile, format, "Write bits1", bytebuff1); dump_byte (dumpfile, format, "Write bits2", bytebuff2); dump_info (dumpfile, format, "", "Ready bits: %2d", ready_bits); } if ((dumpfile != NULL) && (level == 2)) { dump_info (dumpfile, format, "combineSeparateTileSamples24bits","Output data"); dump_buffer(dumpfile, format, 1, dst_rowsize, row, out + (row * dst_rowsize)); } } return (0); } /* end combineSeparateTileSamples24bits */ static int combineSeparateTileSamples32bits (uint8 *in[], uint8 *out, uint32 cols, uint32 rows, uint32 imagewidth, uint32 tw, uint16 spp, uint16 bps, FILE *dumpfile, int format, int level) { int ready_bits = 0, shift_width = 0; uint32 src_rowsize, dst_rowsize, bit_offset, src_offset; uint32 src_byte = 0, src_bit = 0; uint32 row, col; uint32 longbuff1 = 0, longbuff2 = 0; uint64 maskbits = 0, matchbits = 0; uint64 buff1 = 0, buff2 = 0, buff3 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0; tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; char action[8]; if ((src == NULL) || (dst == NULL)) { TIFFError("combineSeparateTileSamples32bits","Invalid input or output buffer"); return (1); } src_rowsize = ((bps * tw) + 7) / 8; dst_rowsize = ((imagewidth * bps * spp) + 7) / 8; maskbits = (uint64)-1 >> ( 64 - bps); shift_width = ((bps + 7) / 8) + 1; for (row = 0; row < rows; row++) { ready_bits = 0; buff1 = buff2 = 0; dst = out + (row * dst_rowsize); src_offset = row * src_rowsize; for (col = 0; col < cols; col++) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = col * bps; src_byte = bit_offset / 8; src_bit = bit_offset % 8; matchbits = maskbits << (64 - src_bit - bps); for (s = 0; s < spp; s++) { src = in[s] + src_offset + src_byte; if (little_endian) { longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; longbuff2 = longbuff1; } else { longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; longbuff2 = longbuff1; } buff3 = ((uint64)longbuff1 << 32) | longbuff2; buff1 = (buff3 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 32) { bytebuff1 = (buff2 >> 56); *dst++ = bytebuff1; bytebuff2 = (buff2 >> 48); *dst++ = bytebuff2; bytebuff3 = (buff2 >> 40); *dst++ = bytebuff3; bytebuff4 = (buff2 >> 32); *dst++ = bytebuff4; ready_bits -= 32; /* shift in new bits */ buff2 = ((buff2 << 32) | (buff1 >> ready_bits)); strcpy (action, "Flush"); } else { /* add another bps bits to the buffer */ bytebuff1 = bytebuff2 = bytebuff3 = bytebuff4 = 0; buff2 = (buff2 | (buff1 >> ready_bits)); strcpy (action, "Update"); } ready_bits += bps; if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Sample %d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, s, src_byte, src_bit, dst - out); dump_wide (dumpfile, format, "Match bits ", matchbits); dump_data (dumpfile, format, "Src bits ", src, 8); dump_wide (dumpfile, format, "Buff1 bits ", buff1); dump_wide (dumpfile, format, "Buff2 bits ", buff2); dump_info (dumpfile, format, "", "Ready bits: %d, %s", ready_bits, action); } } } while (ready_bits > 0) { bytebuff1 = (buff2 >> 56); *dst++ = bytebuff1; buff2 = (buff2 << 8); ready_bits -= 8; } if ((dumpfile != NULL) && (level == 3)) { dump_info (dumpfile, format, "", "Row %3d, Col %3d, Src byte offset %3d bit offset %2d Dst offset %3d", row + 1, col + 1, src_byte, src_bit, dst - out); dump_long (dumpfile, format, "Match bits ", matchbits); dump_data (dumpfile, format, "Src bits ", src, 4); dump_long (dumpfile, format, "Buff1 bits ", buff1); dump_long (dumpfile, format, "Buff2 bits ", buff2); dump_byte (dumpfile, format, "Write bits1", bytebuff1); dump_byte (dumpfile, format, "Write bits2", bytebuff2); dump_info (dumpfile, format, "", "Ready bits: %2d", ready_bits); } if ((dumpfile != NULL) && (level == 2)) { dump_info (dumpfile, format, "combineSeparateTileSamples32bits","Output data"); dump_buffer(dumpfile, format, 1, dst_rowsize, row, out); } } return (0); } /* end combineSeparateTileSamples32bits */ static int readSeparateStripsIntoBuffer (TIFF *in, uint8 *obuf, uint32 length, uint32 width, uint16 spp, struct dump_opts *dump) { int i, j, bytes_per_sample, bytes_per_pixel, shift_width, result = 1; int32 bytes_read = 0; uint16 bps, nstrips, planar, strips_per_sample; uint32 src_rowsize, dst_rowsize, rows_processed, rps; uint32 rows_this_strip = 0; tsample_t s; tstrip_t strip; tsize_t scanlinesize = TIFFScanlineSize(in); tsize_t stripsize = TIFFStripSize(in); unsigned char *srcbuffs[MAX_SAMPLES]; unsigned char *buff = NULL; unsigned char *dst = NULL; if (obuf == NULL) { TIFFError("readSeparateStripsIntoBuffer","Invalid buffer argument"); return (0); } memset (srcbuffs, '\0', sizeof(srcbuffs)); TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bps); TIFFGetFieldDefaulted(in, TIFFTAG_PLANARCONFIG, &planar); TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &rps); if (rps > length) rps = length; bytes_per_sample = (bps + 7) / 8; bytes_per_pixel = ((bps * spp) + 7) / 8; if (bytes_per_pixel < (bytes_per_sample + 1)) shift_width = bytes_per_pixel; else shift_width = bytes_per_sample + 1; src_rowsize = ((bps * width) + 7) / 8; dst_rowsize = ((bps * width * spp) + 7) / 8; dst = obuf; if ((dump->infile != NULL) && (dump->level == 3)) { dump_info (dump->infile, dump->format, "", "Image width %d, length %d, Scanline size, %4d bytes", width, length, scanlinesize); dump_info (dump->infile, dump->format, "", "Bits per sample %d, Samples per pixel %d, Shift width %d", bps, spp, shift_width); } /* Libtiff seems to assume/require that data for separate planes are * written one complete plane after another and not interleaved in any way. * Multiple scanlines and possibly strips of the same plane must be * written before data for any other plane. */ nstrips = TIFFNumberOfStrips(in); strips_per_sample = nstrips /spp; for (s = 0; (s < spp) && (s < MAX_SAMPLES); s++) { srcbuffs[s] = NULL; buff = _TIFFmalloc(stripsize); if (!buff) { TIFFError ("readSeparateStripsIntoBuffer", "Unable to allocate strip read buffer for sample %d", s); for (i = 0; i < s; i++) _TIFFfree (srcbuffs[i]); return 0; } srcbuffs[s] = buff; } rows_processed = 0; for (j = 0; (j < strips_per_sample) && (result == 1); j++) { for (s = 0; (s < spp) && (s < MAX_SAMPLES); s++) { buff = srcbuffs[s]; strip = (s * strips_per_sample) + j; bytes_read = TIFFReadEncodedStrip (in, strip, buff, stripsize); rows_this_strip = bytes_read / src_rowsize; if (bytes_read < 0 && !ignore) { TIFFError(TIFFFileName(in), "Error, can't read strip %lu for sample %d", (unsigned long) strip, s + 1); result = 0; break; } #ifdef DEVELMODE TIFFError("", "Strip %2d, read %5d bytes for %4d scanlines, shift width %d", strip, bytes_read, rows_this_strip, shift_width); #endif } if (rps > rows_this_strip) rps = rows_this_strip; dst = obuf + (dst_rowsize * rows_processed); if ((bps % 8) == 0) { if (combineSeparateSamplesBytes (srcbuffs, dst, width, rps, spp, bps, dump->infile, dump->format, dump->level)) { result = 0; break; } } else { switch (shift_width) { case 1: if (combineSeparateSamples8bits (srcbuffs, dst, width, rps, spp, bps, dump->infile, dump->format, dump->level)) { result = 0; break; } break; case 2: if (combineSeparateSamples16bits (srcbuffs, dst, width, rps, spp, bps, dump->infile, dump->format, dump->level)) { result = 0; break; } break; case 3: if (combineSeparateSamples24bits (srcbuffs, dst, width, rps, spp, bps, dump->infile, dump->format, dump->level)) { result = 0; break; } break; case 4: case 5: case 6: case 7: case 8: if (combineSeparateSamples32bits (srcbuffs, dst, width, rps, spp, bps, dump->infile, dump->format, dump->level)) { result = 0; break; } break; default: TIFFError ("readSeparateStripsIntoBuffer", "Unsupported bit depth: %d", bps); result = 0; break; } } if ((rows_processed + rps) > length) { rows_processed = length; rps = length - rows_processed; } else rows_processed += rps; } /* free any buffers allocated for each plane or scanline and * any temporary buffers */ for (s = 0; (s < spp) && (s < MAX_SAMPLES); s++) { buff = srcbuffs[s]; if (buff != NULL) _TIFFfree(buff); } return (result); } /* end readSeparateStripsIntoBuffer */ static int get_page_geometry (char *name, struct pagedef *page) { char *ptr; int n; for (ptr = name; *ptr; ptr++) *ptr = (char)tolower((int)*ptr); for (n = 0; n < MAX_PAPERNAMES; n++) { if (strcmp(name, PaperTable[n].name) == 0) { page->width = PaperTable[n].width; page->length = PaperTable[n].length; strncpy (page->name, PaperTable[n].name, 15); page->name[15] = '\0'; return (0); } } return (1); } static void initPageSetup (struct pagedef *page, struct pageseg *pagelist, struct buffinfo seg_buffs[]) { int i; strcpy (page->name, ""); page->mode = PAGE_MODE_NONE; page->res_unit = RESUNIT_NONE; page->hres = 0.0; page->vres = 0.0; page->width = 0.0; page->length = 0.0; page->hmargin = 0.0; page->vmargin = 0.0; page->rows = 0; page->cols = 0; page->orient = ORIENTATION_NONE; for (i = 0; i < MAX_SECTIONS; i++) { pagelist[i].x1 = (uint32)0; pagelist[i].x2 = (uint32)0; pagelist[i].y1 = (uint32)0; pagelist[i].y2 = (uint32)0; pagelist[i].buffsize = (uint32)0; pagelist[i].position = 0; pagelist[i].total = 0; } for (i = 0; i < MAX_OUTBUFFS; i++) { seg_buffs[i].size = 0; seg_buffs[i].buffer = NULL; } } static void initImageData (struct image_data *image) { image->xres = 0.0; image->yres = 0.0; image->width = 0; image->length = 0; image->res_unit = RESUNIT_NONE; image->bps = 0; image->spp = 0; image->planar = 0; image->photometric = 0; image->orientation = 0; image->compression = COMPRESSION_NONE; image->adjustments = 0; } static void initCropMasks (struct crop_mask *cps) { int i; cps->crop_mode = CROP_NONE; cps->res_unit = RESUNIT_NONE; cps->edge_ref = EDGE_TOP; cps->width = 0; cps->length = 0; for (i = 0; i < 4; i++) cps->margins[i] = 0.0; cps->bufftotal = (uint32)0; cps->combined_width = (uint32)0; cps->combined_length = (uint32)0; cps->rotation = (uint16)0; cps->photometric = INVERT_DATA_AND_TAG; cps->mirror = (uint16)0; cps->invert = (uint16)0; cps->zones = (uint32)0; cps->regions = (uint32)0; for (i = 0; i < MAX_REGIONS; i++) { cps->corners[i].X1 = 0.0; cps->corners[i].X2 = 0.0; cps->corners[i].Y1 = 0.0; cps->corners[i].Y2 = 0.0; cps->regionlist[i].x1 = 0; cps->regionlist[i].x2 = 0; cps->regionlist[i].y1 = 0; cps->regionlist[i].y2 = 0; cps->regionlist[i].width = 0; cps->regionlist[i].length = 0; cps->regionlist[i].buffsize = 0; cps->regionlist[i].buffptr = NULL; cps->zonelist[i].position = 0; cps->zonelist[i].total = 0; } cps->exp_mode = ONE_FILE_COMPOSITE; cps->img_mode = COMPOSITE_IMAGES; } static void initDumpOptions(struct dump_opts *dump) { dump->debug = 0; dump->format = DUMP_NONE; dump->level = 1; sprintf (dump->mode, "w"); memset (dump->infilename, '\0', PATH_MAX + 1); memset (dump->outfilename, '\0',PATH_MAX + 1); dump->infile = NULL; dump->outfile = NULL; } /* Compute pixel offsets into the image for margins and fixed regions */ static int computeInputPixelOffsets(struct crop_mask *crop, struct image_data *image, struct offset *off) { double scale; float xres, yres; /* Values for these offsets are in pixels from start of image, not bytes, * and are indexed from zero to width - 1 or length - 1 */ uint32 tmargin, bmargin, lmargin, rmargin; uint32 startx, endx; /* offsets of first and last columns to extract */ uint32 starty, endy; /* offsets of first and last row to extract */ uint32 width, length, crop_width, crop_length; uint32 i, max_width, max_length, zwidth, zlength, buffsize; uint32 x1, x2, y1, y2; if (image->res_unit != RESUNIT_INCH && image->res_unit != RESUNIT_CENTIMETER) { xres = 1.0; yres = 1.0; } else { if (((image->xres == 0) || (image->yres == 0)) && (crop->res_unit != RESUNIT_NONE) && ((crop->crop_mode & CROP_REGIONS) || (crop->crop_mode & CROP_MARGINS) || (crop->crop_mode & CROP_LENGTH) || (crop->crop_mode & CROP_WIDTH))) { TIFFError("computeInputPixelOffsets", "Cannot compute margins or fixed size sections without image resolution"); TIFFError("computeInputPixelOffsets", "Specify units in pixels and try again"); return (-1); } xres = image->xres; yres = image->yres; } /* Translate user units to image units */ scale = 1.0; switch (crop->res_unit) { case RESUNIT_CENTIMETER: if (image->res_unit == RESUNIT_INCH) scale = 1.0/2.54; break; case RESUNIT_INCH: if (image->res_unit == RESUNIT_CENTIMETER) scale = 2.54; break; case RESUNIT_NONE: /* Dimensions in pixels */ default: break; } if (crop->crop_mode & CROP_REGIONS) { max_width = max_length = 0; for (i = 0; i < crop->regions; i++) { if ((crop->res_unit == RESUNIT_INCH) || (crop->res_unit == RESUNIT_CENTIMETER)) { x1 = (uint32) (crop->corners[i].X1 * scale * xres); x2 = (uint32) (crop->corners[i].X2 * scale * xres); y1 = (uint32) (crop->corners[i].Y1 * scale * yres); y2 = (uint32) (crop->corners[i].Y2 * scale * yres); } else { x1 = (uint32) (crop->corners[i].X1); x2 = (uint32) (crop->corners[i].X2); y1 = (uint32) (crop->corners[i].Y1); y2 = (uint32) (crop->corners[i].Y2); } if (x1 < 1) crop->regionlist[i].x1 = 0; else crop->regionlist[i].x1 = (uint32) (x1 - 1); if (x2 > image->width - 1) crop->regionlist[i].x2 = image->width - 1; else crop->regionlist[i].x2 = (uint32) (x2 - 1); zwidth = crop->regionlist[i].x2 - crop->regionlist[i].x1 + 1; if (y1 < 1) crop->regionlist[i].y1 = 0; else crop->regionlist[i].y1 = (uint32) (y1 - 1); if (y2 > image->length - 1) crop->regionlist[i].y2 = image->length - 1; else crop->regionlist[i].y2 = (uint32) (y2 - 1); zlength = crop->regionlist[i].y2 - crop->regionlist[i].y1 + 1; if (zwidth > max_width) max_width = zwidth; if (zlength > max_length) max_length = zlength; buffsize = (uint32) (((zwidth * image->bps * image->spp + 7 ) / 8) * (zlength + 1)); crop->regionlist[i].buffsize = buffsize; crop->bufftotal += buffsize; if (crop->img_mode == COMPOSITE_IMAGES) { switch (crop->edge_ref) { case EDGE_LEFT: case EDGE_RIGHT: crop->combined_length = zlength; crop->combined_width += zwidth; break; case EDGE_BOTTOM: case EDGE_TOP: /* width from left, length from top */ default: crop->combined_width = zwidth; crop->combined_length += zlength; break; } } } return (0); } /* Convert crop margins into offsets into image * Margins are expressed as pixel rows and columns, not bytes */ if (crop->crop_mode & CROP_MARGINS) { if (crop->res_unit != RESUNIT_INCH && crop->res_unit != RESUNIT_CENTIMETER) { /* User has specified pixels as reference unit */ tmargin = (uint32)(crop->margins[0]); lmargin = (uint32)(crop->margins[1]); bmargin = (uint32)(crop->margins[2]); rmargin = (uint32)(crop->margins[3]); } else { /* inches or centimeters specified */ tmargin = (uint32)(crop->margins[0] * scale * yres); lmargin = (uint32)(crop->margins[1] * scale * xres); bmargin = (uint32)(crop->margins[2] * scale * yres); rmargin = (uint32)(crop->margins[3] * scale * xres); } if ((lmargin + rmargin) > image->width) { TIFFError("computeInputPixelOffsets", "Combined left and right margins exceed image width"); lmargin = (uint32) 0; rmargin = (uint32) 0; return (-1); } if ((tmargin + bmargin) > image->length) { TIFFError("computeInputPixelOffsets", "Combined top and bottom margins exceed image length"); tmargin = (uint32) 0; bmargin = (uint32) 0; return (-1); } } else { /* no margins requested */ tmargin = (uint32) 0; lmargin = (uint32) 0; bmargin = (uint32) 0; rmargin = (uint32) 0; } /* Width, height, and margins are expressed as pixel offsets into image */ if (crop->res_unit != RESUNIT_INCH && crop->res_unit != RESUNIT_CENTIMETER) { if (crop->crop_mode & CROP_WIDTH) width = (uint32)crop->width; else width = image->width - lmargin - rmargin; if (crop->crop_mode & CROP_LENGTH) length = (uint32)crop->length; else length = image->length - tmargin - bmargin; } else { if (crop->crop_mode & CROP_WIDTH) width = (uint32)(crop->width * scale * image->xres); else width = image->width - lmargin - rmargin; if (crop->crop_mode & CROP_LENGTH) length = (uint32)(crop->length * scale * image->yres); else length = image->length - tmargin - bmargin; } off->tmargin = tmargin; off->bmargin = bmargin; off->lmargin = lmargin; off->rmargin = rmargin; /* Calculate regions defined by margins, width, and length. * Coordinates expressed as 0 to imagewidth - 1, imagelength - 1, * since they are used to compute offsets into buffers */ switch (crop->edge_ref) { case EDGE_BOTTOM: startx = lmargin; if ((startx + width) >= (image->width - rmargin)) endx = image->width - rmargin - 1; else endx = startx + width - 1; endy = image->length - bmargin - 1; if ((endy - length) <= tmargin) starty = tmargin; else starty = endy - length + 1; break; case EDGE_RIGHT: endx = image->width - rmargin - 1; if ((endx - width) <= lmargin) startx = lmargin; else startx = endx - width + 1; starty = tmargin; if ((starty + length) >= (image->length - bmargin)) endy = image->length - bmargin - 1; else endy = starty + length - 1; break; case EDGE_TOP: /* width from left, length from top */ case EDGE_LEFT: default: startx = lmargin; if ((startx + width) >= (image->width - rmargin)) endx = image->width - rmargin - 1; else endx = startx + width - 1; starty = tmargin; if ((starty + length) >= (image->length - bmargin)) endy = image->length - bmargin - 1; else endy = starty + length - 1; break; } off->startx = startx; off->starty = starty; off->endx = endx; off->endy = endy; crop_width = endx - startx + 1; crop_length = endy - starty + 1; if (crop_width <= 0) { TIFFError("computeInputPixelOffsets", "Invalid left/right margins and /or image crop width requested"); return (-1); } if (crop_width > image->width) crop_width = image->width; if (crop_length <= 0) { TIFFError("computeInputPixelOffsets", "Invalid top/bottom margins and /or image crop length requested"); return (-1); } if (crop_length > image->length) crop_length = image->length; off->crop_width = crop_width; off->crop_length = crop_length; return (0); } /* end computeInputPixelOffsets */ /* * Translate crop options into pixel offsets for one or more regions of the image. * Options are applied in this order: margins, specific width and length, zones, * but all are optional. Margins are relative to each edge. Width, length and * zones are relative to the specified reference edge. Zones are expressed as * X:Y where X is the ordinal value in a set of Y equal sized portions. eg. * 2:3 would indicate the middle third of the region qualified by margins and * any explicit width and length specified. Regions are specified by coordinates * of the top left and lower right corners with range 1 to width or height. */ static int getCropOffsets(struct image_data *image, struct crop_mask *crop, struct dump_opts *dump) { struct offset offsets; int i; int32 test; uint32 seg, total, need_buff = 0; uint32 buffsize; uint32 zwidth, zlength; memset(&offsets, '\0', sizeof(struct offset)); crop->bufftotal = 0; crop->combined_width = (uint32)0; crop->combined_length = (uint32)0; crop->selections = 0; /* Compute pixel offsets if margins or fixed width or length specified */ if ((crop->crop_mode & CROP_MARGINS) || (crop->crop_mode & CROP_REGIONS) || (crop->crop_mode & CROP_LENGTH) || (crop->crop_mode & CROP_WIDTH)) { if (computeInputPixelOffsets(crop, image, &offsets)) { TIFFError ("getCropOffsets", "Unable to compute crop margins"); return (-1); } need_buff = TRUE; crop->selections = crop->regions; /* Regions are only calculated from top and left edges with no margins */ if (crop->crop_mode & CROP_REGIONS) return (0); } else { /* cropped area is the full image */ offsets.tmargin = 0; offsets.lmargin = 0; offsets.bmargin = 0; offsets.rmargin = 0; offsets.crop_width = image->width; offsets.crop_length = image->length; offsets.startx = 0; offsets.endx = image->width - 1; offsets.starty = 0; offsets.endy = image->length - 1; need_buff = FALSE; } if (dump->outfile != NULL) { dump_info (dump->outfile, dump->format, "", "Margins: Top: %d Left: %d Bottom: %d Right: %d", offsets.tmargin, offsets.lmargin, offsets.bmargin, offsets.rmargin); dump_info (dump->outfile, dump->format, "", "Crop region within margins: Adjusted Width: %6d Length: %6d", offsets.crop_width, offsets.crop_length); } if (!(crop->crop_mode & CROP_ZONES)) /* no crop zones requested */ { if (need_buff == FALSE) /* No margins or fixed width or length areas */ { crop->selections = 0; crop->combined_width = image->width; crop->combined_length = image->length; return (0); } else { /* Use one region for margins and fixed width or length areas * even though it was not formally declared as a region. */ crop->selections = 1; crop->zones = 1; crop->zonelist[0].total = 1; crop->zonelist[0].position = 1; } } else crop->selections = crop->zones; for (i = 0; i < crop->zones; i++) { seg = crop->zonelist[i].position; total = crop->zonelist[i].total; switch (crop->edge_ref) { case EDGE_LEFT: /* zones from left to right, length from top */ zlength = offsets.crop_length; crop->regionlist[i].y1 = offsets.starty; crop->regionlist[i].y2 = offsets.endy; crop->regionlist[i].x1 = offsets.startx + (uint32)(offsets.crop_width * 1.0 * (seg - 1) / total); test = (int32)offsets.startx + (int32)(offsets.crop_width * 1.0 * seg / total); if (test < 1 ) crop->regionlist[i].x2 = 0; else { if (test > (int32)(image->width - 1)) crop->regionlist[i].x2 = image->width - 1; else crop->regionlist[i].x2 = test - 1; } zwidth = crop->regionlist[i].x2 - crop->regionlist[i].x1 + 1; /* This is passed to extractCropZone or extractCompositeZones */ crop->combined_length = (uint32)zlength; if (crop->exp_mode == COMPOSITE_IMAGES) crop->combined_width += (uint32)zwidth; else crop->combined_width = (uint32)zwidth; break; case EDGE_BOTTOM: /* width from left, zones from bottom to top */ zwidth = offsets.crop_width; crop->regionlist[i].x1 = offsets.startx; crop->regionlist[i].x2 = offsets.endx; test = offsets.endy - (uint32)(offsets.crop_length * 1.0 * seg / total); if (test < 1 ) crop->regionlist[i].y1 = 0; else crop->regionlist[i].y1 = test + 1; test = offsets.endy - (offsets.crop_length * 1.0 * (seg - 1) / total); if (test < 1 ) crop->regionlist[i].y2 = 0; else { if (test > (int32)(image->length - 1)) crop->regionlist[i].y2 = image->length - 1; else crop->regionlist[i].y2 = test; } zlength = crop->regionlist[i].y2 - crop->regionlist[i].y1 + 1; /* This is passed to extractCropZone or extractCompositeZones */ if (crop->exp_mode == COMPOSITE_IMAGES) crop->combined_length += (uint32)zlength; else crop->combined_length = (uint32)zlength; crop->combined_width = (uint32)zwidth; break; case EDGE_RIGHT: /* zones from right to left, length from top */ zlength = offsets.crop_length; crop->regionlist[i].y1 = offsets.starty; crop->regionlist[i].y2 = offsets.endy; crop->regionlist[i].x1 = offsets.startx + (uint32)(offsets.crop_width * (total - seg) * 1.0 / total); test = offsets.startx + (offsets.crop_width * (total - seg + 1) * 1.0 / total); if (test < 1 ) crop->regionlist[i].x2 = 0; else { if (test > (int32)(image->width - 1)) crop->regionlist[i].x2 = image->width - 1; else crop->regionlist[i].x2 = test - 1; } zwidth = crop->regionlist[i].x2 - crop->regionlist[i].x1 + 1; /* This is passed to extractCropZone or extractCompositeZones */ crop->combined_length = (uint32)zlength; if (crop->exp_mode == COMPOSITE_IMAGES) crop->combined_width += (uint32)zwidth; else crop->combined_width = (uint32)zwidth; break; case EDGE_TOP: /* width from left, zones from top to bottom */ default: zwidth = offsets.crop_width; crop->regionlist[i].x1 = offsets.startx; crop->regionlist[i].x2 = offsets.endx; crop->regionlist[i].y1 = offsets.starty + (uint32)(offsets.crop_length * 1.0 * (seg - 1) / total); test = offsets.starty + (uint32)(offsets.crop_length * 1.0 * seg / total); if (test < 1 ) crop->regionlist[i].y2 = 0; else { if (test > (int32)(image->length - 1)) crop->regionlist[i].y2 = image->length - 1; else crop->regionlist[i].y2 = test - 1; } zlength = crop->regionlist[i].y2 - crop->regionlist[i].y1 + 1; /* This is passed to extractCropZone or extractCompositeZones */ if (crop->exp_mode == COMPOSITE_IMAGES) crop->combined_length += (uint32)zlength; else crop->combined_length = (uint32)zlength; crop->combined_width = (uint32)zwidth; break; } /* end switch statement */ buffsize = (uint32) ((((zwidth * image->bps * image->spp) + 7 ) / 8) * (zlength + 1)); crop->regionlist[i].width = (uint32) zwidth; crop->regionlist[i].length = (uint32) zlength; crop->regionlist[i].buffsize = buffsize; crop->bufftotal += buffsize; if (dump->outfile != NULL) dump_info (dump->outfile, dump->format, "", "Zone %d, width: %4d, length: %4d, x1: %4d x2: %4d y1: %4d y2: %4d", i + 1, (uint32)zwidth, (uint32)zlength, crop->regionlist[i].x1, crop->regionlist[i].x2, crop->regionlist[i].y1, crop->regionlist[i].y2); } return (0); } /* end getCropOffsets */ static int computeOutputPixelOffsets (struct crop_mask *crop, struct image_data *image, struct pagedef *page, struct pageseg *sections, struct dump_opts* dump) { double scale; double pwidth, plength; /* Output page width and length in user units*/ uint32 iwidth, ilength; /* Input image width and length in pixels*/ uint32 owidth, olength; /* Output image width and length in pixels*/ uint32 orows, ocols; /* rows and cols for output */ uint32 hmargin, vmargin; /* Horizontal and vertical margins */ uint32 x1, x2, y1, y2, line_bytes; unsigned int orientation; uint32 i, j, k; scale = 1.0; if (page->res_unit == RESUNIT_NONE) page->res_unit = image->res_unit; switch (image->res_unit) { case RESUNIT_CENTIMETER: if (page->res_unit == RESUNIT_INCH) scale = 1.0/2.54; break; case RESUNIT_INCH: if (page->res_unit == RESUNIT_CENTIMETER) scale = 2.54; break; case RESUNIT_NONE: /* Dimensions in pixels */ default: break; } /* get width, height, resolutions of input image selection */ if (crop->combined_width > 0) iwidth = crop->combined_width; else iwidth = image->width; if (crop->combined_length > 0) ilength = crop->combined_length; else ilength = image->length; if (page->hres <= 1.0) page->hres = image->xres; if (page->vres <= 1.0) page->vres = image->yres; if ((page->hres < 1.0) || (page->vres < 1.0)) { TIFFError("computeOutputPixelOffsets", "Invalid horizontal or vertical resolution specified or read from input image"); return (1); } /* If no page sizes are being specified, we just use the input image size to * calculate maximum margins that can be taken from image. */ if (page->width <= 0) pwidth = iwidth; else pwidth = page->width; if (page->length <= 0) plength = ilength; else plength = page->length; if (dump->debug) { TIFFError("", "Page size: %s, Vres: %3.2f, Hres: %3.2f, " "Hmargin: %3.2f, Vmargin: %3.2f", page->name, page->vres, page->hres, page->hmargin, page->vmargin); TIFFError("", "Res_unit: %d, Scale: %3.2f, Page width: %3.2f, length: %3.2f", page->res_unit, scale, pwidth, plength); } /* compute margins at specified unit and resolution */ if (page->mode & PAGE_MODE_MARGINS) { if (page->res_unit == RESUNIT_INCH || page->res_unit == RESUNIT_CENTIMETER) { /* inches or centimeters specified */ hmargin = (uint32)(page->hmargin * scale * page->hres * ((image->bps + 7)/ 8)); vmargin = (uint32)(page->vmargin * scale * page->vres * ((image->bps + 7)/ 8)); } else { /* Otherwise user has specified pixels as reference unit */ hmargin = (uint32)(page->hmargin * scale * ((image->bps + 7)/ 8)); vmargin = (uint32)(page->vmargin * scale * ((image->bps + 7)/ 8)); } if ((hmargin * 2.0) > (pwidth * page->hres)) { TIFFError("computeOutputPixelOffsets", "Combined left and right margins exceed page width"); hmargin = (uint32) 0; return (-1); } if ((vmargin * 2.0) > (plength * page->vres)) { TIFFError("computeOutputPixelOffsets", "Combined top and bottom margins exceed page length"); vmargin = (uint32) 0; return (-1); } } else { hmargin = 0; vmargin = 0; } if (page->mode & PAGE_MODE_ROWSCOLS ) { /* Maybe someday but not for now */ if (page->mode & PAGE_MODE_MARGINS) TIFFError("computeOutputPixelOffsets", "Output margins cannot be specified with rows and columns"); owidth = TIFFhowmany(iwidth, page->cols); olength = TIFFhowmany(ilength, page->rows); } else { if (page->mode & PAGE_MODE_PAPERSIZE ) { owidth = (uint32)((pwidth * page->hres) - (hmargin * 2)); olength = (uint32)((plength * page->vres) - (vmargin * 2)); } else { owidth = (uint32)(iwidth - (hmargin * 2 * page->hres)); olength = (uint32)(ilength - (vmargin * 2 * page->vres)); } } if (owidth > iwidth) owidth = iwidth; if (olength > ilength) olength = ilength; /* Compute the number of pages required for Portrait or Landscape */ switch (page->orient) { case ORIENTATION_NONE: case ORIENTATION_PORTRAIT: ocols = TIFFhowmany(iwidth, owidth); orows = TIFFhowmany(ilength, olength); orientation = ORIENTATION_PORTRAIT; break; case ORIENTATION_LANDSCAPE: ocols = TIFFhowmany(iwidth, olength); orows = TIFFhowmany(ilength, owidth); x1 = olength; olength = owidth; owidth = x1; orientation = ORIENTATION_LANDSCAPE; break; case ORIENTATION_AUTO: default: x1 = TIFFhowmany(iwidth, owidth); x2 = TIFFhowmany(ilength, olength); y1 = TIFFhowmany(iwidth, olength); y2 = TIFFhowmany(ilength, owidth); if ( (x1 * x2) < (y1 * y2)) { /* Portrait */ ocols = x1; orows = x2; orientation = ORIENTATION_PORTRAIT; } else { /* Landscape */ ocols = y1; orows = y2; x1 = olength; olength = owidth; owidth = x1; orientation = ORIENTATION_LANDSCAPE; } } if (ocols < 1) ocols = 1; if (orows < 1) orows = 1; /* If user did not specify rows and cols, set them from calcuation */ if (page->rows < 1) page->rows = orows; if (page->cols < 1) page->cols = ocols; line_bytes = TIFFhowmany8(owidth * image->bps) * image->spp; if ((page->rows * page->cols) > MAX_SECTIONS) { TIFFError("computeOutputPixelOffsets", "Rows and Columns exceed maximum sections\nIncrease resolution or reduce sections"); return (-1); } /* build the list of offsets for each output section */ for (k = 0, i = 0 && k <= MAX_SECTIONS; i < orows; i++) { y1 = (uint32)(olength * i); y2 = (uint32)(olength * (i + 1) - 1); if (y2 >= ilength) y2 = ilength - 1; for (j = 0; j < ocols; j++, k++) { x1 = (uint32)(owidth * j); x2 = (uint32)(owidth * (j + 1) - 1); if (x2 >= iwidth) x2 = iwidth - 1; sections[k].x1 = x1; sections[k].x2 = x2; sections[k].y1 = y1; sections[k].y2 = y2; sections[k].buffsize = line_bytes * olength; sections[k].position = k + 1; sections[k].total = orows * ocols; } } return (0); } /* end computeOutputPixelOffsets */ static int loadImage(TIFF* in, struct image_data *image, struct dump_opts *dump, unsigned char **read_ptr) { uint32 i; float xres = 0.0, yres = 0.0; uint16 nstrips = 0, ntiles = 0, planar = 0; uint16 bps = 0, spp = 0, res_unit = 0; uint16 orientation = 0; uint16 input_compression = 0, input_photometric = 0; uint16 subsampling_horiz, subsampling_vert; uint32 width = 0, length = 0; uint32 stsize = 0, tlsize = 0, buffsize = 0, scanlinesize = 0; uint32 tw = 0, tl = 0; /* Tile width and length */ uint32 tile_rowsize = 0; unsigned char *read_buff = NULL; unsigned char *new_buff = NULL; int readunit = 0; static uint32 prev_readsize = 0; TIFFGetFieldDefaulted(in, TIFFTAG_BITSPERSAMPLE, &bps); TIFFGetFieldDefaulted(in, TIFFTAG_SAMPLESPERPIXEL, &spp); TIFFGetFieldDefaulted(in, TIFFTAG_PLANARCONFIG, &planar); TIFFGetFieldDefaulted(in, TIFFTAG_ORIENTATION, &orientation); if (! TIFFGetFieldDefaulted(in, TIFFTAG_PHOTOMETRIC, &input_photometric)) TIFFError("loadImage","Image lacks Photometric interpreation tag"); if (! TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width)) TIFFError("loadimage","Image lacks image width tag"); if(! TIFFGetField(in, TIFFTAG_IMAGELENGTH, &length)) TIFFError("loadimage","Image lacks image length tag"); TIFFGetFieldDefaulted(in, TIFFTAG_XRESOLUTION, &xres); TIFFGetFieldDefaulted(in, TIFFTAG_YRESOLUTION, &yres); if (!TIFFGetFieldDefaulted(in, TIFFTAG_RESOLUTIONUNIT, &res_unit)) res_unit = RESUNIT_INCH; if (!TIFFGetField(in, TIFFTAG_COMPRESSION, &input_compression)) input_compression = COMPRESSION_NONE; #ifdef DEBUG2 char compressionid[16]; switch (input_compression) { case COMPRESSION_NONE: /* 1 dump mode */ strcpy (compressionid, "None/dump"); break; case COMPRESSION_CCITTRLE: /* 2 CCITT modified Huffman RLE */ strcpy (compressionid, "Huffman RLE"); break; case COMPRESSION_CCITTFAX3: /* 3 CCITT Group 3 fax encoding */ strcpy (compressionid, "Group3 Fax"); break; case COMPRESSION_CCITTFAX4: /* 4 CCITT Group 4 fax encoding */ strcpy (compressionid, "Group4 Fax"); break; case COMPRESSION_LZW: /* 5 Lempel-Ziv & Welch */ strcpy (compressionid, "LZW"); break; case COMPRESSION_OJPEG: /* 6 !6.0 JPEG */ strcpy (compressionid, "Old Jpeg"); break; case COMPRESSION_JPEG: /* 7 %JPEG DCT compression */ strcpy (compressionid, "New Jpeg"); break; case COMPRESSION_NEXT: /* 32766 NeXT 2-bit RLE */ strcpy (compressionid, "Next RLE"); break; case COMPRESSION_CCITTRLEW: /* 32771 #1 w/ word alignment */ strcpy (compressionid, "CITTRLEW"); break; case COMPRESSION_PACKBITS: /* 32773 Macintosh RLE */ strcpy (compressionid, "Mac Packbits"); break; case COMPRESSION_THUNDERSCAN: /* 32809 ThunderScan RLE */ strcpy (compressionid, "Thunderscan"); break; case COMPRESSION_IT8CTPAD: /* 32895 IT8 CT w/padding */ strcpy (compressionid, "IT8 padded"); break; case COMPRESSION_IT8LW: /* 32896 IT8 Linework RLE */ strcpy (compressionid, "IT8 RLE"); break; case COMPRESSION_IT8MP: /* 32897 IT8 Monochrome picture */ strcpy (compressionid, "IT8 mono"); break; case COMPRESSION_IT8BL: /* 32898 IT8 Binary line art */ strcpy (compressionid, "IT8 lineart"); break; case COMPRESSION_PIXARFILM: /* 32908 Pixar companded 10bit LZW */ strcpy (compressionid, "Pixar 10 bit"); break; case COMPRESSION_PIXARLOG: /* 32909 Pixar companded 11bit ZIP */ strcpy (compressionid, "Pixar 11bit"); break; case COMPRESSION_DEFLATE: /* 32946 Deflate compression */ strcpy (compressionid, "Deflate"); break; case COMPRESSION_ADOBE_DEFLATE: /* 8 Deflate compression */ strcpy (compressionid, "Adobe deflate"); break; default: strcpy (compressionid, "None/unknown"); break; } TIFFError("loadImage", "Input compression %s", compressionid); #endif scanlinesize = TIFFScanlineSize(in); image->bps = bps; image->spp = spp; image->planar = planar; image->width = width; image->length = length; image->xres = xres; image->yres = yres; image->res_unit = res_unit; image->compression = input_compression; image->photometric = input_photometric; #ifdef DEBUG2 char photometricid[12]; switch (input_photometric) { case PHOTOMETRIC_MINISWHITE: strcpy (photometricid, "MinIsWhite"); break; case PHOTOMETRIC_MINISBLACK: strcpy (photometricid, "MinIsBlack"); break; case PHOTOMETRIC_RGB: strcpy (photometricid, "RGB"); break; case PHOTOMETRIC_PALETTE: strcpy (photometricid, "Palette"); break; case PHOTOMETRIC_MASK: strcpy (photometricid, "Mask"); break; case PHOTOMETRIC_SEPARATED: strcpy (photometricid, "Separated"); break; case PHOTOMETRIC_YCBCR: strcpy (photometricid, "YCBCR"); break; case PHOTOMETRIC_CIELAB: strcpy (photometricid, "CIELab"); break; case PHOTOMETRIC_ICCLAB: strcpy (photometricid, "ICCLab"); break; case PHOTOMETRIC_ITULAB: strcpy (photometricid, "ITULab"); break; case PHOTOMETRIC_LOGL: strcpy (photometricid, "LogL"); break; case PHOTOMETRIC_LOGLUV: strcpy (photometricid, "LOGLuv"); break; default: strcpy (photometricid, "Unknown"); break; } TIFFError("loadImage", "Input photometric interpretation %s", photometricid); #endif image->orientation = orientation; switch (orientation) { case 0: case ORIENTATION_TOPLEFT: image->adjustments = 0; break; case ORIENTATION_TOPRIGHT: image->adjustments = MIRROR_HORIZ; break; case ORIENTATION_BOTRIGHT: image->adjustments = ROTATECW_180; break; case ORIENTATION_BOTLEFT: image->adjustments = MIRROR_VERT; break; case ORIENTATION_LEFTTOP: image->adjustments = MIRROR_VERT | ROTATECW_90; break; case ORIENTATION_RIGHTTOP: image->adjustments = ROTATECW_90; break; case ORIENTATION_RIGHTBOT: image->adjustments = MIRROR_VERT | ROTATECW_270; break; case ORIENTATION_LEFTBOT: image->adjustments = ROTATECW_270; break; default: image->adjustments = 0; image->orientation = ORIENTATION_TOPLEFT; } if ((bps == 0) || (spp == 0)) { TIFFError("loadImage", "Invalid samples per pixel (%d) or bits per sample (%d)", spp, bps); return (-1); } if (TIFFIsTiled(in)) { readunit = TILE; tlsize = TIFFTileSize(in); ntiles = TIFFNumberOfTiles(in); TIFFGetField(in, TIFFTAG_TILEWIDTH, &tw); TIFFGetField(in, TIFFTAG_TILELENGTH, &tl); tile_rowsize = TIFFTileRowSize(in); buffsize = tlsize * ntiles; if (buffsize < (uint32)(ntiles * tl * tile_rowsize)) { buffsize = ntiles * tl * tile_rowsize; #ifdef DEBUG2 TIFFError("loadImage", "Tilesize %u is too small, using ntiles * tilelength * tilerowsize %lu", tlsize, (unsigned long)buffsize); #endif } if (dump->infile != NULL) dump_info (dump->infile, dump->format, "", "Tilesize: %u, Number of Tiles: %u, Tile row size: %u", tlsize, ntiles, tile_rowsize); } else { readunit = STRIP; TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); stsize = TIFFStripSize(in); nstrips = TIFFNumberOfStrips(in); buffsize = stsize * nstrips; if (buffsize < (uint32) (((length * width * spp * bps) + 7) / 8)) { buffsize = ((length * width * spp * bps) + 7) / 8; #ifdef DEBUG2 TIFFError("loadImage", "Stripsize %u is too small, using imagelength * width * spp * bps / 8 = %lu", stsize, (unsigned long)buffsize); #endif } if (dump->infile != NULL) dump_info (dump->infile, dump->format, "", "Stripsize: %u, Number of Strips: %u, Rows per Strip: %u, Scanline size: %u", stsize, nstrips, rowsperstrip, scanlinesize); } if (input_compression == COMPRESSION_JPEG) { /* Force conversion to RGB */ jpegcolormode = JPEGCOLORMODE_RGB; TIFFSetField(in, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); } /* The clause up to the read statement is taken from Tom Lane's tiffcp patch */ else { /* Otherwise, can't handle subsampled input */ if (input_photometric == PHOTOMETRIC_YCBCR) { TIFFGetFieldDefaulted(in, TIFFTAG_YCBCRSUBSAMPLING, &subsampling_horiz, &subsampling_vert); if (subsampling_horiz != 1 || subsampling_vert != 1) { TIFFError("loadImage", "Can't copy/convert subsampled image with subsampling %d horiz %d vert", subsampling_horiz, subsampling_vert); return (-1); } } } read_buff = *read_ptr; if (!read_buff) read_buff = (unsigned char *)_TIFFmalloc(buffsize); else { if (prev_readsize < buffsize) { new_buff = _TIFFrealloc(read_buff, buffsize); if (!new_buff) { free (read_buff); read_buff = (unsigned char *)_TIFFmalloc(buffsize); } else read_buff = new_buff; } } if (!read_buff) { TIFFError("loadImage", "Unable to allocate/reallocate read buffer"); return (-1); } prev_readsize = buffsize; *read_ptr = read_buff; /* N.B. The read functions used copy separate plane data into a buffer as interleaved * samples rather than separate planes so the same logic works to extract regions * regardless of the way the data are organized in the input file. */ switch (readunit) { case STRIP: if (planar == PLANARCONFIG_CONTIG) { if (!(readContigStripsIntoBuffer(in, read_buff))) { TIFFError("loadImage", "Unable to read contiguous strips into buffer"); return (-1); } } else { if (!(readSeparateStripsIntoBuffer(in, read_buff, length, width, spp, dump))) { TIFFError("loadImage", "Unable to read separate strips into buffer"); return (-1); } } break; case TILE: if (planar == PLANARCONFIG_CONTIG) { if (!(readContigTilesIntoBuffer(in, read_buff, length, width, tw, tl, spp, bps))) { TIFFError("loadImage", "Unable to read contiguous tiles into buffer"); return (-1); } } else { if (!(readSeparateTilesIntoBuffer(in, read_buff, length, width, tw, tl, spp, bps))) { TIFFError("loadImage", "Unable to read separate tiles into buffer"); return (-1); } } break; default: TIFFError("loadImage", "Unsupported image file format"); return (-1); break; } if ((dump->infile != NULL) && (dump->level == 2)) { dump_info (dump->infile, dump->format, "loadImage", "Image width %d, length %d, Raw image data, %4d bytes", width, length, buffsize); dump_info (dump->infile, dump->format, "", "Bits per sample %d, Samples per pixel %d", bps, spp); for (i = 0; i < length; i++) dump_buffer(dump->infile, dump->format, 1, scanlinesize, i, read_buff + (i * scanlinesize)); } return (0); } /* end loadImage */ static int correct_orientation(struct image_data *image, unsigned char **work_buff_ptr) { uint16 mirror, rotation; unsigned char *work_buff; work_buff = *work_buff_ptr; if ((image == NULL) || (work_buff == NULL)) { TIFFError ("correct_orientatin", "Invalid image or buffer pointer"); return (-1); } if ((image->adjustments & MIRROR_HORIZ) || (image->adjustments & MIRROR_VERT)) { mirror = (uint16)(image->adjustments & MIRROR_BOTH); if (mirrorImage(image->spp, image->bps, mirror, image->width, image->length, work_buff)) { TIFFError ("correct_orientation", "Unable to mirror image"); return (-1); } } if (image->adjustments & ROTATE_ANY) { if (image->adjustments & ROTATECW_90) rotation = (uint16) 90; else if (image->adjustments & ROTATECW_180) rotation = (uint16) 180; else if (image->adjustments & ROTATECW_270) rotation = (uint16) 270; else { TIFFError ("correct_orientation", "Invalid rotation value: %d", image->adjustments & ROTATE_ANY); return (-1); } if (rotateImage(rotation, image, &image->width, &image->length, work_buff_ptr)) { TIFFError ("correct_orientation", "Unable to rotate image"); return (-1); } image->orientation = ORIENTATION_TOPLEFT; } return (0); } /* end correct_orientation */ /* Extract multiple zones from an image and combine into a single composite image */ static int extractCompositeRegions(struct image_data *image, struct crop_mask *crop, unsigned char *read_buff, unsigned char *crop_buff) { int shift_width, bytes_per_sample, bytes_per_pixel; uint32 i, trailing_bits, prev_trailing_bits; uint32 row, first_row, last_row, first_col, last_col; uint32 src_rowsize, dst_rowsize, src_offset, dst_offset; uint32 crop_width, crop_length, img_width, img_length; uint32 prev_length, prev_width, composite_width; uint16 bps, spp; uint8 *src, *dst; tsample_t count, sample = 0; /* Update to extract one or more samples */ img_width = image->width; img_length = image->length; bps = image->bps; spp = image->spp; count = spp; bytes_per_sample = (bps + 7) / 8; bytes_per_pixel = ((bps * spp) + 7) / 8; if ((bps % 8) == 0) shift_width = 0; else { if (bytes_per_pixel < (bytes_per_sample + 1)) shift_width = bytes_per_pixel; else shift_width = bytes_per_sample + 1; } src = read_buff; dst = crop_buff; /* These are setup for adding additional sections */ prev_width = prev_length = 0; prev_trailing_bits = trailing_bits = 0; composite_width = crop->combined_width; crop->combined_width = 0; crop->combined_length = 0; for (i = 0; i < crop->selections; i++) { /* rows, columns, width, length are expressed in pixels */ first_row = crop->regionlist[i].y1; last_row = crop->regionlist[i].y2; first_col = crop->regionlist[i].x1; last_col = crop->regionlist[i].x2; crop_width = last_col - first_col + 1; crop_length = last_row - first_row + 1; /* These should not be needed for composite images */ crop->regionlist[i].width = crop_width; crop->regionlist[i].length = crop_length; crop->regionlist[i].buffptr = crop_buff; src_rowsize = ((img_width * bps * spp) + 7) / 8; dst_rowsize = (((crop_width * bps * count) + 7) / 8); switch (crop->edge_ref) { default: case EDGE_TOP: case EDGE_BOTTOM: if ((i > 0) && (crop_width != crop->regionlist[i - 1].width)) { TIFFError ("extractCompositeRegions", "Only equal width regions can be combined for -E top or bottom"); return (1); } crop->combined_width = crop_width; crop->combined_length += crop_length; for (row = first_row; row <= last_row; row++) { src_offset = row * src_rowsize; dst_offset = (row - first_row) * dst_rowsize; src = read_buff + src_offset; dst = crop_buff + dst_offset + (prev_length * dst_rowsize); switch (shift_width) { case 0: if (extractContigSamplesBytes (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1)) { TIFFError("extractCompositeRegions", "Unable to extract row %d", row); return (1); } break; case 1: if (bps == 1) { if (extractContigSamplesShifted8bits (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1, prev_trailing_bits)) { TIFFError("extractCompositeRegions", "Unable to extract row %d", row); return (1); } break; } else if (extractContigSamplesShifted16bits (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1, prev_trailing_bits)) { TIFFError("extractCompositeRegions", "Unable to extract row %d", row); return (1); } break; case 2: if (extractContigSamplesShifted24bits (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1, prev_trailing_bits)) { TIFFError("extractCompositeRegions", "Unable to extract row %d", row); return (1); } break; case 3: case 4: case 5: if (extractContigSamplesShifted32bits (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1, prev_trailing_bits)) { TIFFError("extractCompositeRegions", "Unable to extract row %d", row); return (1); } break; default: TIFFError("extractCompositeRegions", "Unsupported bit depth %d", bps); return (1); } } prev_length += crop_length; break; case EDGE_LEFT: /* splice the pieces of each row together, side by side */ case EDGE_RIGHT: if ((i > 0) && (crop_length != crop->regionlist[i - 1].length)) { TIFFError ("extractCompositeRegions", "Only equal length regions can be combined for -E left or right"); return (1); } crop->combined_width += crop_width; crop->combined_length = crop_length; dst_rowsize = (((composite_width * bps * count) + 7) / 8); trailing_bits = (crop_width * bps * count) % 8; for (row = first_row; row <= last_row; row++) { src_offset = row * src_rowsize; dst_offset = (row - first_row) * dst_rowsize; src = read_buff + src_offset; dst = crop_buff + dst_offset + prev_width; switch (shift_width) { case 0: if (extractContigSamplesBytes (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1)) { TIFFError("extractCompositeRegions", "Unable to extract row %d", row); return (1); } break; case 1: if (bps == 1) { if (extractContigSamplesShifted8bits (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1, prev_trailing_bits)) { TIFFError("extractCompositeRegions", "Unable to extract row %d", row); return (1); } break; } else if (extractContigSamplesShifted16bits (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1, prev_trailing_bits)) { TIFFError("extractCompositeRegions", "Unable to extract row %d", row); return (1); } break; case 2: if (extractContigSamplesShifted24bits (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1, prev_trailing_bits)) { TIFFError("extractCompositeRegions", "Unable to extract row %d", row); return (1); } break; case 3: case 4: case 5: if (extractContigSamplesShifted32bits (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1, prev_trailing_bits)) { TIFFError("extractCompositeRegions", "Unable to extract row %d", row); return (1); } break; default: TIFFError("extractCompositeRegions", "Unsupported bit depth %d", bps); return (1); } } prev_width += (crop_width * bps * count) / 8; prev_trailing_bits += trailing_bits; if (prev_trailing_bits > 7) prev_trailing_bits-= 8; break; } } if (crop->combined_width != composite_width) TIFFError("combineSeparateRegions","Combined width does not match composite width"); return (0); } /* end extractCompositeRegions */ /* Copy a single region of input buffer to an output buffer. * The read functions used copy separate plane data into a buffer * as interleaved samples rather than separate planes so the same * logic works to extract regions regardless of the way the data * are organized in the input file. This function can be used to * extract one or more samples from the input image by updating the * parameters for starting sample and number of samples to copy in the * fifth and eighth arguments of the call to extractContigSamples. * They would be passed as new elements of the crop_mask struct. */ static int extractSeparateRegion(struct image_data *image, struct crop_mask *crop, unsigned char *read_buff, unsigned char *crop_buff, int region) { int shift_width, prev_trailing_bits = 0; uint32 bytes_per_sample, bytes_per_pixel; uint32 src_rowsize, dst_rowsize; uint32 row, first_row, last_row, first_col, last_col; uint32 src_offset, dst_offset; uint32 crop_width, crop_length, img_width, img_length; uint16 bps, spp; uint8 *src, *dst; tsample_t count, sample = 0; /* Update to extract more or more samples */ img_width = image->width; img_length = image->length; bps = image->bps; spp = image->spp; count = spp; bytes_per_sample = (bps + 7) / 8; bytes_per_pixel = ((bps * spp) + 7) / 8; if ((bps % 8) == 0) shift_width = 0; /* Byte aligned data only */ else { if (bytes_per_pixel < (bytes_per_sample + 1)) shift_width = bytes_per_pixel; else shift_width = bytes_per_sample + 1; } /* rows, columns, width, length are expressed in pixels */ first_row = crop->regionlist[region].y1; last_row = crop->regionlist[region].y2; first_col = crop->regionlist[region].x1; last_col = crop->regionlist[region].x2; crop_width = last_col - first_col + 1; crop_length = last_row - first_row + 1; crop->regionlist[region].width = crop_width; crop->regionlist[region].length = crop_length; crop->regionlist[region].buffptr = crop_buff; src = read_buff; dst = crop_buff; src_rowsize = ((img_width * bps * spp) + 7) / 8; dst_rowsize = (((crop_width * bps * spp) + 7) / 8); for (row = first_row; row <= last_row; row++) { src_offset = row * src_rowsize; dst_offset = (row - first_row) * dst_rowsize; src = read_buff + src_offset; dst = crop_buff + dst_offset; switch (shift_width) { case 0: if (extractContigSamplesBytes (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1)) { TIFFError("extractSeparateRegion", "Unable to extract row %d", row); return (1); } break; case 1: if (bps == 1) { if (extractContigSamplesShifted8bits (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1, prev_trailing_bits)) { TIFFError("extractSeparateRegion", "Unable to extract row %d", row); return (1); } break; } else if (extractContigSamplesShifted16bits (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1, prev_trailing_bits)) { TIFFError("extractSeparateRegion", "Unable to extract row %d", row); return (1); } break; case 2: if (extractContigSamplesShifted24bits (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1, prev_trailing_bits)) { TIFFError("extractSeparateRegion", "Unable to extract row %d", row); return (1); } break; case 3: case 4: case 5: if (extractContigSamplesShifted32bits (src, dst, img_width, sample, spp, bps, count, first_col, last_col + 1, prev_trailing_bits)) { TIFFError("extractSeparateRegion", "Unable to extract row %d", row); return (1); } break; default: TIFFError("extractSeparateRegion", "Unsupported bit depth %d", bps); return (1); } } return (0); } /* end extractSeparateRegion */ static int extractImageSection(struct image_data *image, struct pageseg *section, unsigned char *src_buff, unsigned char *sect_buff) { unsigned char bytebuff1, bytebuff2; unsigned char *src, *dst; uint32 img_width, img_length, img_rowsize; uint32 j, shift1, shift2, trailing_bits; uint32 row, first_row, last_row, first_col, last_col; uint32 src_offset, dst_offset, row_offset, col_offset; uint32 offset1, offset2, full_bytes; uint32 sect_width, sect_length; uint16 bps, spp; #ifdef DEVELMODE int k; unsigned char bitset; static char *bitarray = NULL; #endif img_width = image->width; img_length = image->length; bps = image->bps; spp = image->spp; src = src_buff; dst = sect_buff; src_offset = 0; dst_offset = 0; #ifdef DEVELMODE if (bitarray == NULL) { if ((bitarray = (char *)malloc(img_width)) == NULL) { TIFFError ("", "DEBUG: Unable to allocate debugging bitarray"); return (-1); } } #endif /* rows, columns, width, length are expressed in pixels */ first_row = section->y1; last_row = section->y2; first_col = section->x1; last_col = section->x2; sect_width = last_col - first_col + 1; sect_length = last_row - first_row + 1; img_rowsize = ((img_width * bps + 7) / 8) * spp; full_bytes = (sect_width * spp * bps) / 8; /* number of COMPLETE bytes per row in section */ trailing_bits = (sect_width * bps) % 8; #ifdef DEVELMODE TIFFError ("", "First row: %d, last row: %d, First col: %d, last col: %d\n", first_row, last_row, first_col, last_col); TIFFError ("", "Image width: %d, Image length: %d, bps: %d, spp: %d\n", img_width, img_length, bps, spp); TIFFError ("", "Sect width: %d, Sect length: %d, full bytes: %d trailing bits %d\n", sect_width, sect_length, full_bytes, trailing_bits); #endif if ((bps % 8) == 0) { col_offset = first_col * spp * bps / 8; for (row = first_row; row <= last_row; row++) { /* row_offset = row * img_width * spp * bps / 8; */ row_offset = row * img_rowsize; src_offset = row_offset + col_offset; #ifdef DEVELMODE TIFFError ("", "Src offset: %8d, Dst offset: %8d", src_offset, dst_offset); #endif _TIFFmemcpy (sect_buff + dst_offset, src_buff + src_offset, full_bytes); dst_offset += full_bytes; } } else { /* bps != 8 */ shift1 = spp * ((first_col * bps) % 8); shift2 = spp * ((last_col * bps) % 8); for (row = first_row; row <= last_row; row++) { /* pull out the first byte */ row_offset = row * img_rowsize; offset1 = row_offset + (first_col * bps / 8); offset2 = row_offset + (last_col * bps / 8); #ifdef DEVELMODE for (j = 0, k = 7; j < 8; j++, k--) { bitset = *(src_buff + offset1) & (((unsigned char)1 << k)) ? 1 : 0; sprintf(&bitarray[j], (bitset) ? "1" : "0"); } sprintf(&bitarray[8], " "); sprintf(&bitarray[9], " "); for (j = 10, k = 7; j < 18; j++, k--) { bitset = *(src_buff + offset2) & (((unsigned char)1 << k)) ? 1 : 0; sprintf(&bitarray[j], (bitset) ? "1" : "0"); } bitarray[18] = '\0'; TIFFError ("", "Row: %3d Offset1: %d, Shift1: %d, Offset2: %d, Shift2: %d\n", row, offset1, shift1, offset2, shift2); #endif bytebuff1 = bytebuff2 = 0; if (shift1 == 0) /* the region is byte and sample alligned */ { _TIFFmemcpy (sect_buff + dst_offset, src_buff + offset1, full_bytes); #ifdef DEVELMODE TIFFError ("", " Alligned data src offset1: %8d, Dst offset: %8d\n", offset1, dst_offset); sprintf(&bitarray[18], "\n"); sprintf(&bitarray[19], "\t"); for (j = 20, k = 7; j < 28; j++, k--) { bitset = *(sect_buff + dst_offset) & (((unsigned char)1 << k)) ? 1 : 0; sprintf(&bitarray[j], (bitset) ? "1" : "0"); } bitarray[28] = ' '; bitarray[29] = ' '; #endif dst_offset += full_bytes; if (trailing_bits != 0) { bytebuff2 = src_buff[offset2] & ((unsigned char)255 << (7 - shift2)); sect_buff[dst_offset] = bytebuff2; #ifdef DEVELMODE TIFFError ("", " Trailing bits src offset: %8d, Dst offset: %8d\n", offset2, dst_offset); for (j = 30, k = 7; j < 38; j++, k--) { bitset = *(sect_buff + dst_offset) & (((unsigned char)1 << k)) ? 1 : 0; sprintf(&bitarray[j], (bitset) ? "1" : "0"); } bitarray[38] = '\0'; TIFFError ("", "\tFirst and last bytes before and after masking:\n\t%s\n\n", bitarray); #endif dst_offset++; } } else /* each destination byte will have to be built from two source bytes*/ { #ifdef DEVELMODE TIFFError ("", " Unalligned data src offset: %8d, Dst offset: %8d\n", offset1 , dst_offset); #endif for (j = 0; j <= full_bytes; j++) { bytebuff1 = src_buff[offset1 + j] & ((unsigned char)255 >> shift1); bytebuff2 = src_buff[offset1 + j + 1] & ((unsigned char)255 << (7 - shift1)); sect_buff[dst_offset + j] = (bytebuff1 << shift1) | (bytebuff2 >> (8 - shift1)); } #ifdef DEVELMODE sprintf(&bitarray[18], "\n"); sprintf(&bitarray[19], "\t"); for (j = 20, k = 7; j < 28; j++, k--) { bitset = *(sect_buff + dst_offset) & (((unsigned char)1 << k)) ? 1 : 0; sprintf(&bitarray[j], (bitset) ? "1" : "0"); } bitarray[28] = ' '; bitarray[29] = ' '; #endif dst_offset += full_bytes; if (trailing_bits != 0) { #ifdef DEVELMODE TIFFError ("", " Trailing bits src offset: %8d, Dst offset: %8d\n", offset1 + full_bytes, dst_offset); #endif if (shift2 > shift1) { bytebuff1 = src_buff[offset1 + full_bytes] & ((unsigned char)255 << (7 - shift2)); bytebuff2 = bytebuff1 & ((unsigned char)255 << shift1); sect_buff[dst_offset] = bytebuff2; #ifdef DEVELMODE TIFFError ("", " Shift2 > Shift1\n"); #endif } else { if (shift2 < shift1) { bytebuff2 = ((unsigned char)255 << (shift1 - shift2 - 1)); sect_buff[dst_offset] &= bytebuff2; #ifdef DEVELMODE TIFFError ("", " Shift2 < Shift1\n"); #endif } #ifdef DEVELMODE else TIFFError ("", " Shift2 == Shift1\n"); #endif } } #ifdef DEVELMODE sprintf(&bitarray[28], " "); sprintf(&bitarray[29], " "); for (j = 30, k = 7; j < 38; j++, k--) { bitset = *(sect_buff + dst_offset) & (((unsigned char)1 << k)) ? 1 : 0; sprintf(&bitarray[j], (bitset) ? "1" : "0"); } bitarray[38] = '\0'; TIFFError ("", "\tFirst and last bytes before and after masking:\n\t%s\n\n", bitarray); #endif dst_offset++; } } } return (0); } /* end extractImageSection */ static int writeSelections(TIFF *in, TIFF **out, struct crop_mask *crop, struct image_data *image, struct dump_opts *dump, struct buffinfo seg_buffs[], char *mp, char *filename, unsigned int *page, unsigned int total_pages) { int i, page_count; int autoindex = 0; unsigned char *crop_buff = NULL; /* Where we open a new file depends on the export mode */ switch (crop->exp_mode) { case ONE_FILE_COMPOSITE: /* Regions combined into single image */ autoindex = 0; crop_buff = seg_buffs[0].buffer; if (update_output_file (out, mp, autoindex, filename, page)) return (1); page_count = total_pages; if (writeCroppedImage(in, *out, image, dump, crop->combined_width, crop->combined_length, crop_buff, *page, total_pages)) { TIFFError("writeRegions", "Unable to write new image"); return (-1); } break; case ONE_FILE_SEPARATED: /* Regions as separated images */ autoindex = 0; if (update_output_file (out, mp, autoindex, filename, page)) return (1); page_count = crop->selections * total_pages; for (i = 0; i < crop->selections; i++) { crop_buff = seg_buffs[i].buffer; if (writeCroppedImage(in, *out, image, dump, crop->regionlist[i].width, crop->regionlist[i].length, crop_buff, *page, page_count)) { TIFFError("writeRegions", "Unable to write new image"); return (-1); } } break; case FILE_PER_IMAGE_COMPOSITE: /* Regions as composite image */ autoindex = 1; if (update_output_file (out, mp, autoindex, filename, page)) return (1); crop_buff = seg_buffs[0].buffer; if (writeCroppedImage(in, *out, image, dump, crop->combined_width, crop->combined_length, crop_buff, *page, total_pages)) { TIFFError("writeRegions", "Unable to write new image"); return (-1); } break; case FILE_PER_IMAGE_SEPARATED: /* Regions as separated images */ autoindex = 1; page_count = crop->selections; if (update_output_file (out, mp, autoindex, filename, page)) return (1); for (i = 0; i < crop->selections; i++) { crop_buff = seg_buffs[i].buffer; /* Write the current region to the current file */ if (writeCroppedImage(in, *out, image, dump, crop->regionlist[i].width, crop->regionlist[i].length, crop_buff, *page, page_count)) { TIFFError("writeRegions", "Unable to write new image"); return (-1); } } break; case FILE_PER_SELECTION: autoindex = 1; page_count = 1; for (i = 0; i < crop->selections; i++) { if (update_output_file (out, mp, autoindex, filename, page)) return (1); crop_buff = seg_buffs[i].buffer; /* Write the current region to the current file */ if (writeCroppedImage(in, *out, image, dump, crop->regionlist[i].width, crop->regionlist[i].length, crop_buff, *page, page_count)) { TIFFError("writeRegions", "Unable to write new image"); return (-1); } } break; default: return (1); } return (0); } /* end writeRegions */ static int writeImageSections(TIFF *in, TIFF *out, struct image_data *image, struct pagedef *page, struct pageseg *sections, struct dump_opts * dump, unsigned char *src_buff, unsigned char **sect_buff_ptr) { double hres, vres; uint32 i, k, width, length, sectsize; unsigned char *sect_buff = *sect_buff_ptr; hres = page->hres; vres = page->vres; k = page->cols * page->rows; if ((k < 1) || (k > MAX_SECTIONS)) { TIFFError("writeImageSections", "%d Rows and Columns exceed maximum sections\nIncrease resolution or reduce sections", k); return (-1); } for (i = 0; i < k; i++) { width = sections[i].x2 - sections[i].x1 + 1; length = sections[i].y2 - sections[i].y1 + 1; sectsize = (uint32) ceil((width * image->bps + 7) / (double)8) * image->spp * length; /* allocate a buffer if we don't have one already */ if (createImageSection(sectsize, sect_buff_ptr)) { TIFFError("writeImageSections", "Unable to allocate section buffer"); exit (-1); } sect_buff = *sect_buff_ptr; if (extractImageSection (image, §ions[i], src_buff, sect_buff)) { TIFFError("writeImageSections", "Unable to extract image sections"); exit (-1); } /* call the write routine here instead of outside the loop */ if (writeSingleSection(in, out, image, dump, width, length, hres, vres, sect_buff)) { TIFFError("writeImageSections", "Unable to write image section"); exit (-1); } } return (0); } /* end writeImageSections */ /* Code in this function is heavily indebted to code in tiffcp * with modifications by Richard Nolde to handle orientation correctly. * It will have to be updated significantly if support is added to * extract one or more samples from original image since the * original code assumes we are always copying all samples. */ static int writeSingleSection(TIFF *in, TIFF *out, struct image_data *image, struct dump_opts *dump, uint32 width, uint32 length, double hres, double vres, unsigned char *sect_buff) { uint16 bps, spp; uint16 input_compression, input_photometric; uint16 input_planar; struct cpTag* p; /* Calling this seems to reset the compression mode on the TIFF *in file. TIFFGetField(in, TIFFTAG_JPEGCOLORMODE, &input_jpeg_colormode); */ input_compression = image->compression; input_photometric = image->photometric; spp = image->spp; bps = image->bps; TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width); TIFFSetField(out, TIFFTAG_IMAGELENGTH, length); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, bps); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, spp); #ifdef DEBUG2 TIFFError("writeSingleSection", "Input compression: %s", (input_compression == COMPRESSION_OJPEG) ? "Old Jpeg" : ((input_compression == COMPRESSION_JPEG) ? "New Jpeg" : "Non Jpeg")); #endif /* This is the global variable compression which is set * if the user has specified a command line option for * a compression option. Should be passed around in one * of the parameters instead of as a global. If no user * option specified it will still be (uint16) -1. */ if (compression != (uint16)-1) TIFFSetField(out, TIFFTAG_COMPRESSION, compression); else { /* OJPEG is no longer supported for writing so upgrade to JPEG */ if (input_compression == COMPRESSION_OJPEG) { compression = COMPRESSION_JPEG; jpegcolormode = JPEGCOLORMODE_RAW; TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_JPEG); } else /* Use the compression from the input file */ TIFFSetField(out, TIFFTAG_COMPRESSION, compression); } if (compression == COMPRESSION_JPEG) { if ((input_photometric == PHOTOMETRIC_PALETTE) || /* color map indexed */ (input_photometric == PHOTOMETRIC_MASK)) /* holdout mask */ { TIFFError ("writeSingleSection", "JPEG compression cannot be used with %s image data", (input_photometric == PHOTOMETRIC_PALETTE) ? "palette" : "mask"); return (-1); } if ((input_photometric == PHOTOMETRIC_RGB) && (jpegcolormode == JPEGCOLORMODE_RGB)) TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR); else TIFFSetField(out, TIFFTAG_PHOTOMETRIC, input_photometric); } else { if (compression == COMPRESSION_SGILOG || compression == COMPRESSION_SGILOG24) TIFFSetField(out, TIFFTAG_PHOTOMETRIC, spp == 1 ? PHOTOMETRIC_LOGL : PHOTOMETRIC_LOGLUV); else TIFFSetField(out, TIFFTAG_PHOTOMETRIC, image->photometric); } #ifdef DEBUG2 TIFFError("writeSingleSection", "Input photometric: %s", (input_photometric == PHOTOMETRIC_RGB) ? "RGB" : ((input_photometric == PHOTOMETRIC_YCBCR) ? "YCbCr" : "Not RGB or YCbCr")); #endif if (((input_photometric == PHOTOMETRIC_LOGL) || (input_photometric == PHOTOMETRIC_LOGLUV)) && ((compression != COMPRESSION_SGILOG) && (compression != COMPRESSION_SGILOG24))) { TIFFError("writeSingleSection", "LogL and LogLuv source data require SGI_LOG or SGI_LOG24 compression"); return (-1); } if (fillorder != 0) TIFFSetField(out, TIFFTAG_FILLORDER, fillorder); else CopyTag(TIFFTAG_FILLORDER, 1, TIFF_SHORT); /* The loadimage function reads input orientation and sets * image->orientation. The correct_image_orientation function * applies the required rotation and mirror operations to * present the data in TOPLEFT orientation and updates * image->orientation if any transforms are performed, * as per EXIF standard. */ TIFFSetField(out, TIFFTAG_ORIENTATION, image->orientation); /* * Choose tiles/strip for the output image according to * the command line arguments (-tiles, -strips) and the * structure of the input image. */ if (outtiled == -1) outtiled = TIFFIsTiled(in); if (outtiled) { /* * Setup output file's tile width&height. If either * is not specified, use either the value from the * input image or, if nothing is defined, use the * library default. */ if (tilewidth == (uint32) 0) TIFFGetField(in, TIFFTAG_TILEWIDTH, &tilewidth); if (tilelength == (uint32) 0) TIFFGetField(in, TIFFTAG_TILELENGTH, &tilelength); if (tilewidth == 0 || tilelength == 0) TIFFDefaultTileSize(out, &tilewidth, &tilelength); TIFFDefaultTileSize(out, &tilewidth, &tilelength); TIFFSetField(out, TIFFTAG_TILEWIDTH, tilewidth); TIFFSetField(out, TIFFTAG_TILELENGTH, tilelength); } else { /* * RowsPerStrip is left unspecified: use either the * value from the input image or, if nothing is defined, * use the library default. */ if (rowsperstrip == (uint32) 0) { if (!TIFFGetField(in, TIFFTAG_ROWSPERSTRIP, &rowsperstrip)) rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip); if (compression != COMPRESSION_JPEG) { if (rowsperstrip > length) rowsperstrip = length; } } else if (rowsperstrip == (uint32) -1) rowsperstrip = length; TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip); } TIFFGetFieldDefaulted(in, TIFFTAG_PLANARCONFIG, &input_planar); if (config != (uint16) -1) TIFFSetField(out, TIFFTAG_PLANARCONFIG, config); else CopyField(TIFFTAG_PLANARCONFIG, config); if (spp <= 4) CopyTag(TIFFTAG_TRANSFERFUNCTION, 4, TIFF_SHORT); CopyTag(TIFFTAG_COLORMAP, 4, TIFF_SHORT); /* SMinSampleValue & SMaxSampleValue */ switch (compression) { /* These are references to GLOBAL variables set by defaults * and /or the compression flag */ case COMPRESSION_JPEG: if (((bps % 8) == 0) || ((bps % 12) == 0)) { TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality); TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); } else { TIFFError("writeSingleSection", "JPEG compression requires 8 or 12 bits per sample"); return (-1); } break; case COMPRESSION_LZW: case COMPRESSION_ADOBE_DEFLATE: case COMPRESSION_DEFLATE: if (predictor != (uint16)-1) TIFFSetField(out, TIFFTAG_PREDICTOR, predictor); else CopyField(TIFFTAG_PREDICTOR, predictor); break; case COMPRESSION_CCITTFAX3: case COMPRESSION_CCITTFAX4: if (compression == COMPRESSION_CCITTFAX3) { if (g3opts != (uint32) -1) TIFFSetField(out, TIFFTAG_GROUP3OPTIONS, g3opts); else CopyField(TIFFTAG_GROUP3OPTIONS, g3opts); } else CopyTag(TIFFTAG_GROUP4OPTIONS, 1, TIFF_LONG); CopyTag(TIFFTAG_BADFAXLINES, 1, TIFF_LONG); CopyTag(TIFFTAG_CLEANFAXDATA, 1, TIFF_LONG); CopyTag(TIFFTAG_CONSECUTIVEBADFAXLINES, 1, TIFF_LONG); CopyTag(TIFFTAG_FAXRECVPARAMS, 1, TIFF_LONG); CopyTag(TIFFTAG_FAXRECVTIME, 1, TIFF_LONG); CopyTag(TIFFTAG_FAXSUBADDRESS, 1, TIFF_ASCII); break; } { uint32 len32; void** data; if (TIFFGetField(in, TIFFTAG_ICCPROFILE, &len32, &data)) TIFFSetField(out, TIFFTAG_ICCPROFILE, len32, data); } { uint16 ninks; const char* inknames; if (TIFFGetField(in, TIFFTAG_NUMBEROFINKS, &ninks)) { TIFFSetField(out, TIFFTAG_NUMBEROFINKS, ninks); if (TIFFGetField(in, TIFFTAG_INKNAMES, &inknames)) { int inknameslen = strlen(inknames) + 1; const char* cp = inknames; while (ninks > 1) { cp = strchr(cp, '\0'); if (cp) { cp++; inknameslen += (strlen(cp) + 1); } ninks--; } TIFFSetField(out, TIFFTAG_INKNAMES, inknameslen, inknames); } } } { unsigned short pg0, pg1; if (TIFFGetField(in, TIFFTAG_PAGENUMBER, &pg0, &pg1)) { if (pageNum < 0) /* only one input file */ TIFFSetField(out, TIFFTAG_PAGENUMBER, pg0, pg1); else TIFFSetField(out, TIFFTAG_PAGENUMBER, pageNum++, 0); } } for (p = tags; p < &tags[NTAGS]; p++) CopyTag(p->tag, p->count, p->type); /* Update these since they are overwritten from input res by loop above */ TIFFSetField(out, TIFFTAG_XRESOLUTION, (float)hres); TIFFSetField(out, TIFFTAG_YRESOLUTION, (float)vres); /* Compute the tile or strip dimensions and write to disk */ if (outtiled) { if (config == PLANARCONFIG_CONTIG) writeBufferToContigTiles (out, sect_buff, length, width, spp, dump); else writeBufferToSeparateTiles (out, sect_buff, length, width, spp, dump); } else { if (config == PLANARCONFIG_CONTIG) writeBufferToContigStrips (out, sect_buff, length); else writeBufferToSeparateStrips(out, sect_buff, length, width, spp, dump); } if (!TIFFWriteDirectory(out)) { TIFFClose(out); return (-1); } return (0); } /* end writeSingleSection */ /* Create a buffer to write one section at a time */ static int createImageSection(uint32 sectsize, unsigned char **sect_buff_ptr) { unsigned char *sect_buff = NULL; unsigned char *new_buff = NULL; static uint32 prev_sectsize = 0; sect_buff = *sect_buff_ptr; if (!sect_buff) { sect_buff = (unsigned char *)_TIFFmalloc(sectsize); *sect_buff_ptr = sect_buff; _TIFFmemset(sect_buff, 0, sectsize); } else { if (prev_sectsize < sectsize) { new_buff = _TIFFrealloc(sect_buff, sectsize); if (!new_buff) { free (sect_buff); sect_buff = (unsigned char *)_TIFFmalloc(sectsize); } else sect_buff = new_buff; _TIFFmemset(sect_buff, 0, sectsize); } } if (!sect_buff) { TIFFError("createImageSection", "Unable to allocate/reallocate section buffer"); return (-1); } prev_sectsize = sectsize; *sect_buff_ptr = sect_buff; return (0); } /* end createImageSection */ /* Process selections defined by regions, zones, margins, or fixed sized areas */ static int processCropSelections(struct image_data *image, struct crop_mask *crop, unsigned char **read_buff_ptr, struct buffinfo seg_buffs[]) { int i; uint32 width, length, total_width, total_length; tsize_t cropsize; unsigned char *crop_buff = NULL; unsigned char *read_buff = NULL; unsigned char *next_buff = NULL; tsize_t prev_cropsize = 0; read_buff = *read_buff_ptr; if (crop->img_mode == COMPOSITE_IMAGES) { cropsize = crop->bufftotal; crop_buff = seg_buffs[0].buffer; if (!crop_buff) crop_buff = (unsigned char *)_TIFFmalloc(cropsize); else { prev_cropsize = seg_buffs[0].size; if (prev_cropsize < cropsize) { next_buff = _TIFFrealloc(crop_buff, cropsize); if (! next_buff) { _TIFFfree (crop_buff); crop_buff = (unsigned char *)_TIFFmalloc(cropsize); } else crop_buff = next_buff; } } if (!crop_buff) { TIFFError("processCropSelections", "Unable to allocate/reallocate crop buffer"); return (-1); } _TIFFmemset(crop_buff, 0, cropsize); seg_buffs[0].buffer = crop_buff; seg_buffs[0].size = cropsize; /* Checks for matching width or length as required */ if (extractCompositeRegions(image, crop, read_buff, crop_buff) != 0) return (1); if (crop->crop_mode & CROP_INVERT) { switch (crop->photometric) { /* Just change the interpretation */ case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: image->photometric = crop->photometric; break; case INVERT_DATA_ONLY: case INVERT_DATA_AND_TAG: if (invertImage(image->photometric, image->spp, image->bps, crop->combined_width, crop->combined_length, crop_buff)) { TIFFError("processCropSelections", "Failed to invert colorspace for composite regions"); return (-1); } if (crop->photometric == INVERT_DATA_AND_TAG) { switch (image->photometric) { case PHOTOMETRIC_MINISWHITE: image->photometric = PHOTOMETRIC_MINISBLACK; break; case PHOTOMETRIC_MINISBLACK: image->photometric = PHOTOMETRIC_MINISWHITE; break; default: break; } } break; default: break; } } /* Mirror and Rotate will not work with multiple regions unless they are the same width */ if (crop->crop_mode & CROP_MIRROR) { if (mirrorImage(image->spp, image->bps, crop->mirror, crop->combined_width, crop->combined_length, crop_buff)) { TIFFError("processCropSelections", "Failed to mirror composite regions %s", (crop->rotation == MIRROR_HORIZ) ? "horizontally" : "vertically"); return (-1); } } if (crop->crop_mode & CROP_ROTATE) /* rotate should be last as it can reallocate the buffer */ { if (rotateImage(crop->rotation, image, &crop->combined_width, &crop->combined_length, &crop_buff)) { TIFFError("processCropSelections", "Failed to rotate composite regions by %d degrees", crop->rotation); return (-1); } seg_buffs[0].buffer = crop_buff; seg_buffs[0].size = (((crop->combined_width * image->bps + 7 ) / 8) * image->spp) * crop->combined_length; } } else /* Separated Images */ { total_width = total_length = 0; for (i = 0; i < crop->selections; i++) { cropsize = crop->bufftotal; crop_buff = seg_buffs[i].buffer; if (!crop_buff) crop_buff = (unsigned char *)_TIFFmalloc(cropsize); else { prev_cropsize = seg_buffs[0].size; if (prev_cropsize < cropsize) { next_buff = _TIFFrealloc(crop_buff, cropsize); if (! next_buff) { _TIFFfree (crop_buff); crop_buff = (unsigned char *)_TIFFmalloc(cropsize); } else crop_buff = next_buff; } } if (!crop_buff) { TIFFError("processCropSelections", "Unable to allocate/reallocate crop buffer"); return (-1); } _TIFFmemset(crop_buff, 0, cropsize); seg_buffs[i].buffer = crop_buff; seg_buffs[i].size = cropsize; if (extractSeparateRegion(image, crop, read_buff, crop_buff, i)) { TIFFError("processCropSelections", "Unable to extract cropped region %d from image", i); return (-1); } width = crop->regionlist[i].width; length = crop->regionlist[i].length; if (crop->crop_mode & CROP_INVERT) { switch (crop->photometric) { /* Just change the interpretation */ case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: image->photometric = crop->photometric; break; case INVERT_DATA_ONLY: case INVERT_DATA_AND_TAG: if (invertImage(image->photometric, image->spp, image->bps, width, length, crop_buff)) { TIFFError("processCropSelections", "Failed to invert colorspace for region"); return (-1); } if (crop->photometric == INVERT_DATA_AND_TAG) { switch (image->photometric) { case PHOTOMETRIC_MINISWHITE: image->photometric = PHOTOMETRIC_MINISBLACK; break; case PHOTOMETRIC_MINISBLACK: image->photometric = PHOTOMETRIC_MINISWHITE; break; default: break; } } break; default: break; } } if (crop->crop_mode & CROP_MIRROR) { if (mirrorImage(image->spp, image->bps, crop->mirror, width, length, crop_buff)) { TIFFError("processCropSelections", "Failed to mirror crop region %s", (crop->rotation == MIRROR_HORIZ) ? "horizontally" : "vertically"); return (-1); } } if (crop->crop_mode & CROP_ROTATE) /* rotate should be last as it can reallocate the buffer */ { if (rotateImage(crop->rotation, image, &crop->regionlist[i].width, &crop->regionlist[i].length, &crop_buff)) { TIFFError("processCropSelections", "Failed to rotate crop region by %d degrees", crop->rotation); return (-1); } total_width += crop->regionlist[i].width; total_length += crop->regionlist[i].length; crop->combined_width = total_width; crop->combined_length = total_length; seg_buffs[i].buffer = crop_buff; seg_buffs[i].size = (((crop->regionlist[i].width * image->bps + 7 ) / 8) * image->spp) * crop->regionlist[i].length; } } } return (0); } /* end processCropSelections */ /* Copy the crop section of the data from the current image into a buffer * and adjust the IFD values to reflect the new size. If no cropping is * required, use the origial read buffer as the crop buffer. * * There is quite a bit of redundancy between this routine and the more * specialized processCropSelections, but this provides * the most optimized path when no Zones or Regions are required. */ static int createCroppedImage(struct image_data *image, struct crop_mask *crop, unsigned char **read_buff_ptr, unsigned char **crop_buff_ptr) { tsize_t cropsize; unsigned char *read_buff = NULL; unsigned char *crop_buff = NULL; unsigned char *new_buff = NULL; static tsize_t prev_cropsize = 0; read_buff = *read_buff_ptr; /* process full image, no crop buffer needed */ crop_buff = read_buff; *crop_buff_ptr = read_buff; crop->combined_width = image->width; crop->combined_length = image->length; cropsize = crop->bufftotal; crop_buff = *crop_buff_ptr; if (!crop_buff) { crop_buff = (unsigned char *)_TIFFmalloc(cropsize); *crop_buff_ptr = crop_buff; _TIFFmemset(crop_buff, 0, cropsize); prev_cropsize = cropsize; } else { if (prev_cropsize < cropsize) { new_buff = _TIFFrealloc(crop_buff, cropsize); if (!new_buff) { free (crop_buff); crop_buff = (unsigned char *)_TIFFmalloc(cropsize); } else crop_buff = new_buff; _TIFFmemset(crop_buff, 0, cropsize); } } if (!crop_buff) { TIFFError("createCroppedImage", "Unable to allocate/reallocate crop buffer"); return (-1); } *crop_buff_ptr = crop_buff; if (crop->crop_mode & CROP_INVERT) { switch (crop->photometric) { /* Just change the interpretation */ case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: image->photometric = crop->photometric; break; case INVERT_DATA_ONLY: case INVERT_DATA_AND_TAG: if (invertImage(image->photometric, image->spp, image->bps, crop->combined_width, crop->combined_length, crop_buff)) { TIFFError("createCroppedImage", "Failed to invert colorspace for image or cropped selection"); return (-1); } if (crop->photometric == INVERT_DATA_AND_TAG) { switch (image->photometric) { case PHOTOMETRIC_MINISWHITE: image->photometric = PHOTOMETRIC_MINISBLACK; break; case PHOTOMETRIC_MINISBLACK: image->photometric = PHOTOMETRIC_MINISWHITE; break; default: break; } } break; default: break; } } if (crop->crop_mode & CROP_MIRROR) { if (mirrorImage(image->spp, image->bps, crop->mirror, crop->combined_width, crop->combined_length, crop_buff)) { TIFFError("createCroppedImage", "Failed to mirror image or cropped selection %s", (crop->rotation == MIRROR_HORIZ) ? "horizontally" : "vertically"); return (-1); } } if (crop->crop_mode & CROP_ROTATE) /* rotate should be last as it can reallocate the buffer */ { if (rotateImage(crop->rotation, image, &crop->combined_width, &crop->combined_length, crop_buff_ptr)) { TIFFError("createCroppedImage", "Failed to rotate image or cropped selection by %d degrees", crop->rotation); return (-1); } } if (crop_buff == read_buff) /* we used the read buffer for the crop buffer */ *read_buff_ptr = NULL; /* so we don't try to free it later */ return (0); } /* end createCroppedImage */ /* Code in this function is heavily indebted to code in tiffcp * with modifications by Richard Nolde to handle orientation correctly. * It will have to be updated significantly if support is added to * extract one or more samples from original image since the * original code assumes we are always copying all samples. * Use of global variables for config, compression and others * should be replaced by addition to the crop_mask struct (which * will be renamed to proc_opts indicating that is controlls * user supplied processing options, not just cropping) and * then passed in as an argument. */ static int writeCroppedImage(TIFF *in, TIFF *out, struct image_data *image, struct dump_opts *dump, uint32 width, uint32 length, unsigned char *crop_buff, int pagenum, int total_pages) { uint16 bps, spp; uint16 input_compression, input_photometric; uint16 input_planar; struct cpTag* p; input_compression = image->compression; input_photometric = image->photometric; spp = image->spp; bps = image->bps; TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width); TIFFSetField(out, TIFFTAG_IMAGELENGTH, length); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, bps); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, spp); #ifdef DEBUG2 TIFFError("writeCroppedImage", "Input compression: %s", (input_compression == COMPRESSION_OJPEG) ? "Old Jpeg" : ((input_compression == COMPRESSION_JPEG) ? "New Jpeg" : "Non Jpeg")); #endif if (compression != (uint16)-1) TIFFSetField(out, TIFFTAG_COMPRESSION, compression); else { if (input_compression == COMPRESSION_OJPEG) { compression = COMPRESSION_JPEG; jpegcolormode = JPEGCOLORMODE_RAW; TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_JPEG); } else CopyField(TIFFTAG_COMPRESSION, compression); } if (compression == COMPRESSION_JPEG) { if ((input_photometric == PHOTOMETRIC_PALETTE) || /* color map indexed */ (input_photometric == PHOTOMETRIC_MASK)) /* $holdout mask */ { TIFFError ("writeCroppedImage", "JPEG compression cannot be used with %s image data", (input_photometric == PHOTOMETRIC_PALETTE) ? "palette" : "mask"); return (-1); } if ((input_photometric == PHOTOMETRIC_RGB) && (jpegcolormode == JPEGCOLORMODE_RGB)) TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR); else TIFFSetField(out, TIFFTAG_PHOTOMETRIC, input_photometric); } else { if (compression == COMPRESSION_SGILOG || compression == COMPRESSION_SGILOG24) { TIFFSetField(out, TIFFTAG_PHOTOMETRIC, spp == 1 ? PHOTOMETRIC_LOGL : PHOTOMETRIC_LOGLUV); } else { if (input_compression == COMPRESSION_SGILOG || input_compression == COMPRESSION_SGILOG24) { TIFFSetField(out, TIFFTAG_PHOTOMETRIC, spp == 1 ? PHOTOMETRIC_LOGL : PHOTOMETRIC_LOGLUV); } else TIFFSetField(out, TIFFTAG_PHOTOMETRIC, image->photometric); } } if (((input_photometric == PHOTOMETRIC_LOGL) || (input_photometric == PHOTOMETRIC_LOGLUV)) && ((compression != COMPRESSION_SGILOG) && (compression != COMPRESSION_SGILOG24))) { TIFFError("writeCroppedImage", "LogL and LogLuv source data require SGI_LOG or SGI_LOG24 compression"); return (-1); } if (fillorder != 0) TIFFSetField(out, TIFFTAG_FILLORDER, fillorder); else CopyTag(TIFFTAG_FILLORDER, 1, TIFF_SHORT); /* The loadimage function reads input orientation and sets * image->orientation. The correct_image_orientation function * applies the required rotation and mirror operations to * present the data in TOPLEFT orientation and updates * image->orientation if any transforms are performed, * as per EXIF standard. */ TIFFSetField(out, TIFFTAG_ORIENTATION, image->orientation); /* * Choose tiles/strip for the output image according to * the command line arguments (-tiles, -strips) and the * structure of the input image. */ if (outtiled == -1) outtiled = TIFFIsTiled(in); if (outtiled) { /* * Setup output file's tile width&height. If either * is not specified, use either the value from the * input image or, if nothing is defined, use the * library default. */ if (tilewidth == (uint32) 0) TIFFGetField(in, TIFFTAG_TILEWIDTH, &tilewidth); if (tilelength == (uint32) 0) TIFFGetField(in, TIFFTAG_TILELENGTH, &tilelength); if (tilewidth == 0 || tilelength == 0) TIFFDefaultTileSize(out, &tilewidth, &tilelength); TIFFSetField(out, TIFFTAG_TILEWIDTH, tilewidth); TIFFSetField(out, TIFFTAG_TILELENGTH, tilelength); } else { /* * RowsPerStrip is left unspecified: use either the * value from the input image or, if nothing is defined, * use the library default. */ if (rowsperstrip == (uint32) 0) { if (!TIFFGetField(in, TIFFTAG_ROWSPERSTRIP, &rowsperstrip)) rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip); if (compression != COMPRESSION_JPEG) { if (rowsperstrip > length) rowsperstrip = length; } } else if (rowsperstrip == (uint32) -1) rowsperstrip = length; TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip); } TIFFGetFieldDefaulted(in, TIFFTAG_PLANARCONFIG, &input_planar); if (config != (uint16) -1) TIFFSetField(out, TIFFTAG_PLANARCONFIG, config); else CopyField(TIFFTAG_PLANARCONFIG, config); if (spp <= 4) CopyTag(TIFFTAG_TRANSFERFUNCTION, 4, TIFF_SHORT); CopyTag(TIFFTAG_COLORMAP, 4, TIFF_SHORT); /* SMinSampleValue & SMaxSampleValue */ switch (compression) { case COMPRESSION_JPEG: if (((bps % 8) == 0) || ((bps % 12) == 0)) { TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality); TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); } else { TIFFError("writeCroppedImage", "JPEG compression requires 8 or 12 bits per sample"); return (-1); } break; case COMPRESSION_LZW: case COMPRESSION_ADOBE_DEFLATE: case COMPRESSION_DEFLATE: if (predictor != (uint16)-1) TIFFSetField(out, TIFFTAG_PREDICTOR, predictor); else CopyField(TIFFTAG_PREDICTOR, predictor); break; case COMPRESSION_CCITTFAX3: case COMPRESSION_CCITTFAX4: if (bps != 1) { TIFFError("writeCroppedImage", "Group 3/4 compression is not usable with bps > 1"); return (-1); } if (compression == COMPRESSION_CCITTFAX3) { if (g3opts != (uint32) -1) TIFFSetField(out, TIFFTAG_GROUP3OPTIONS, g3opts); else CopyField(TIFFTAG_GROUP3OPTIONS, g3opts); } else CopyTag(TIFFTAG_GROUP4OPTIONS, 1, TIFF_LONG); CopyTag(TIFFTAG_BADFAXLINES, 1, TIFF_LONG); CopyTag(TIFFTAG_CLEANFAXDATA, 1, TIFF_LONG); CopyTag(TIFFTAG_CONSECUTIVEBADFAXLINES, 1, TIFF_LONG); CopyTag(TIFFTAG_FAXRECVPARAMS, 1, TIFF_LONG); CopyTag(TIFFTAG_FAXRECVTIME, 1, TIFF_LONG); CopyTag(TIFFTAG_FAXSUBADDRESS, 1, TIFF_ASCII); break; case COMPRESSION_NONE: break; default: break; } { uint32 len32; void** data; if (TIFFGetField(in, TIFFTAG_ICCPROFILE, &len32, &data)) TIFFSetField(out, TIFFTAG_ICCPROFILE, len32, data); } { uint16 ninks; const char* inknames; if (TIFFGetField(in, TIFFTAG_NUMBEROFINKS, &ninks)) { TIFFSetField(out, TIFFTAG_NUMBEROFINKS, ninks); if (TIFFGetField(in, TIFFTAG_INKNAMES, &inknames)) { int inknameslen = strlen(inknames) + 1; const char* cp = inknames; while (ninks > 1) { cp = strchr(cp, '\0'); if (cp) { cp++; inknameslen += (strlen(cp) + 1); } ninks--; } TIFFSetField(out, TIFFTAG_INKNAMES, inknameslen, inknames); } } } { unsigned short pg0, pg1; if (TIFFGetField(in, TIFFTAG_PAGENUMBER, &pg0, &pg1)) { TIFFSetField(out, TIFFTAG_PAGENUMBER, pagenum, total_pages); } } for (p = tags; p < &tags[NTAGS]; p++) CopyTag(p->tag, p->count, p->type); /* Compute the tile or strip dimensions and write to disk */ if (outtiled) { if (config == PLANARCONFIG_CONTIG) { if (writeBufferToContigTiles (out, crop_buff, length, width, spp, dump)) TIFFError("","Unable to write contiguous tile data for page %d", pagenum); } else { if (writeBufferToSeparateTiles (out, crop_buff, length, width, spp, dump)) TIFFError("","Unable to write separate tile data for page %d", pagenum); } } else { if (config == PLANARCONFIG_CONTIG) { if (writeBufferToContigStrips (out, crop_buff, length)) TIFFError("","Unable to write contiguous strip data for page %d", pagenum); } else { if (writeBufferToSeparateStrips(out, crop_buff, length, width, spp, dump)) TIFFError("","Unable to write separate strip data for page %d", pagenum); } } if (!TIFFWriteDirectory(out)) { TIFFError("","Failed to write IFD for page number %d", pagenum); TIFFClose(out); return (-1); } return (0); } /* end writeCroppedImage */ static int rotateContigSamples8bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width, uint32 length, uint32 col, uint8 *src, uint8 *dst) { int ready_bits = 0; uint32 src_byte = 0, src_bit = 0; uint32 row, rowsize = 0, bit_offset = 0; uint8 matchbits = 0, maskbits = 0; uint8 buff1 = 0, buff2 = 0; uint8 *next; tsample_t sample; if ((src == NULL) || (dst == NULL)) { TIFFError("rotateContigSamples8bits","Invalid src or destination buffer"); return (1); } rowsize = ((bps * spp * width) + 7) / 8; ready_bits = 0; maskbits = (uint8)-1 >> ( 8 - bps); buff1 = buff2 = 0; for (row = 0; row < length ; row++) { bit_offset = col * bps * spp; for (sample = 0; sample < spp; sample++) { if (sample == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sample * bps)) / 8; src_bit = (bit_offset + (sample * bps)) % 8; } switch (rotation) { case 90: next = src + src_byte - (row * rowsize); break; case 270: next = src + src_byte + (row * rowsize); break; default: TIFFError("rotateContigSamples8bits", "Invalid rotation %d", rotation); return (1); } matchbits = maskbits << (8 - src_bit - bps); buff1 = ((*next) & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 8) { *dst++ = buff2; buff2 = buff1; ready_bits -= 8; } else { buff2 = (buff2 | (buff1 >> ready_bits)); } ready_bits += bps; } } if (ready_bits > 0) { buff1 = (buff2 & ((unsigned int)255 << (8 - ready_bits))); *dst++ = buff1; } return (0); } /* end rotateContigSamples8bits */ static int rotateContigSamples16bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width, uint32 length, uint32 col, uint8 *src, uint8 *dst) { int ready_bits = 0; uint32 row, rowsize, bit_offset; uint32 src_byte = 0, src_bit = 0; uint16 matchbits = 0, maskbits = 0; uint16 buff1 = 0, buff2 = 0; uint8 bytebuff = 0; uint8 *next; tsample_t sample; if ((src == NULL) || (dst == NULL)) { TIFFError("rotateContigSamples16bits","Invalid src or destination buffer"); return (1); } rowsize = ((bps * spp * width) + 7) / 8; ready_bits = 0; maskbits = (uint16)-1 >> (16 - bps); buff1 = buff2 = 0; for (row = 0; row < length; row++) { bit_offset = col * bps * spp; for (sample = 0; sample < spp; sample++) { if (sample == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sample * bps)) / 8; src_bit = (bit_offset + (sample * bps)) % 8; } switch (rotation) { case 90: next = src + src_byte - (row * rowsize); break; case 270: next = src + src_byte + (row * rowsize); break; default: TIFFError("rotateContigSamples8bits", "Invalid rotation %d", rotation); return (1); } matchbits = maskbits << (16 - src_bit - bps); if (little_endian) buff1 = (next[0] << 8) | next[1]; else buff1 = (next[1] << 8) | next[0]; buff1 = (buff1 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 8) { bytebuff = (buff2 >> 8); *dst++ = bytebuff; ready_bits -= 8; /* shift in new bits */ buff2 = ((buff2 << 8) | (buff1 >> ready_bits)); } else { /* add another bps bits to the buffer */ bytebuff = 0; buff2 = (buff2 | (buff1 >> ready_bits)); } ready_bits += bps; } } if (ready_bits > 0) { bytebuff = (buff2 >> 8); *dst++ = bytebuff; } return (0); } /* end rotateContigSamples16bits */ static int rotateContigSamples24bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width, uint32 length, uint32 col, uint8 *src, uint8 *dst) { int ready_bits = 0; uint32 row, rowsize, bit_offset; uint32 src_byte = 0, src_bit = 0; uint32 matchbits = 0, maskbits = 0; uint32 buff1 = 0, buff2 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0; uint8 *next; tsample_t sample; if ((src == NULL) || (dst == NULL)) { TIFFError("rotateContigSamples24bits","Invalid src or destination buffer"); return (1); } rowsize = ((bps * spp * width) + 7) / 8; ready_bits = 0; maskbits = (uint32)-1 >> (32 - bps); buff1 = buff2 = 0; for (row = 0; row < length; row++) { bit_offset = col * bps * spp; for (sample = 0; sample < spp; sample++) { if (sample == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sample * bps)) / 8; src_bit = (bit_offset + (sample * bps)) % 8; } switch (rotation) { case 90: next = src + src_byte - (row * rowsize); break; case 270: next = src + src_byte + (row * rowsize); break; default: TIFFError("rotateContigSamples8bits", "Invalid rotation %d", rotation); return (1); } matchbits = maskbits << (32 - src_bit - bps); if (little_endian) buff1 = (next[0] << 24) | (next[1] << 16) | (next[2] << 8) | next[3]; else buff1 = (next[3] << 24) | (next[2] << 16) | (next[1] << 8) | next[0]; buff1 = (buff1 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ if (ready_bits >= 16) { bytebuff1 = (buff2 >> 24); *dst++ = bytebuff1; bytebuff2 = (buff2 >> 16); *dst++ = bytebuff2; ready_bits -= 16; /* shift in new bits */ buff2 = ((buff2 << 16) | (buff1 >> ready_bits)); } else { /* add another bps bits to the buffer */ bytebuff1 = bytebuff2 = 0; buff2 = (buff2 | (buff1 >> ready_bits)); } ready_bits += bps; } } /* catch any trailing bits at the end of the line */ while (ready_bits > 0) { bytebuff1 = (buff2 >> 24); *dst++ = bytebuff1; buff2 = (buff2 << 8); bytebuff2 = bytebuff1; ready_bits -= 8; } return (0); } /* end rotateContigSamples24bits */ static int rotateContigSamples32bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width, uint32 length, uint32 col, uint8 *src, uint8 *dst) { int ready_bits = 0, shift_width = 0; int bytes_per_sample, bytes_per_pixel; uint32 row, rowsize, bit_offset; uint32 src_byte, src_bit; uint32 longbuff1 = 0, longbuff2 = 0; uint64 maskbits = 0, matchbits = 0; uint64 buff1 = 0, buff2 = 0, buff3 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0; uint8 *next; tsample_t sample; if ((src == NULL) || (dst == NULL)) { TIFFError("rotateContigSamples24bits","Invalid src or destination buffer"); return (1); } bytes_per_sample = (bps + 7) / 8; bytes_per_pixel = ((bps * spp) + 7) / 8; if (bytes_per_pixel < (bytes_per_sample + 1)) shift_width = bytes_per_pixel; else shift_width = bytes_per_sample + 1; rowsize = ((bps * spp * width) + 7) / 8; ready_bits = 0; maskbits = (uint64)-1 >> (64 - bps); buff1 = buff2 = 0; for (row = 0; row < length; row++) { bit_offset = col * bps * spp; for (sample = 0; sample < spp; sample++) { if (sample == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sample * bps)) / 8; src_bit = (bit_offset + (sample * bps)) % 8; } switch (rotation) { case 90: next = src + src_byte - (row * rowsize); break; case 270: next = src + src_byte + (row * rowsize); break; default: TIFFError("rotateContigSamples8bits", "Invalid rotation %d", rotation); return (1); } matchbits = maskbits << (64 - src_bit - bps); if (little_endian) { longbuff1 = (next[0] << 24) | (next[1] << 16) | (next[2] << 8) | next[3]; longbuff2 = longbuff1; } else { longbuff1 = (next[3] << 24) | (next[2] << 16) | (next[1] << 8) | next[0]; longbuff2 = longbuff1; } buff3 = ((uint64)longbuff1 << 32) | longbuff2; buff1 = (buff3 & matchbits) << (src_bit); if (ready_bits < 32) { /* add another bps bits to the buffer */ bytebuff1 = bytebuff2 = bytebuff3 = bytebuff4 = 0; buff2 = (buff2 | (buff1 >> ready_bits)); } else /* If we have a full buffer's worth, write it out */ { bytebuff1 = (buff2 >> 56); *dst++ = bytebuff1; bytebuff2 = (buff2 >> 48); *dst++ = bytebuff2; bytebuff3 = (buff2 >> 40); *dst++ = bytebuff3; bytebuff4 = (buff2 >> 32); *dst++ = bytebuff4; ready_bits -= 32; /* shift in new bits */ buff2 = ((buff2 << 32) | (buff1 >> ready_bits)); } ready_bits += bps; } } while (ready_bits > 0) { bytebuff1 = (buff2 >> 56); *dst++ = bytebuff1; buff2 = (buff2 << 8); ready_bits -= 8; } return (0); } /* end rotateContigSamples32bits */ /* Rotate an image by a multiple of 90 degrees clockwise */ static int rotateImage(uint16 rotation, struct image_data *image, uint32 *img_width, uint32 *img_length, unsigned char **ibuff_ptr) { int shift_width; uint32 bytes_per_pixel, bytes_per_sample; uint32 row, rowsize, src_offset, dst_offset; uint32 i, col, width, length; uint32 colsize, buffsize, col_offset, pix_offset; unsigned char *ibuff; unsigned char *src; unsigned char *dst; uint16 spp, bps; float res_temp; unsigned char *rbuff = NULL; width = *img_width; length = *img_length; spp = image->spp; bps = image->bps; rowsize = ((bps * spp * width) + 7) / 8; colsize = ((bps * spp * length) + 7) / 8; if ((colsize * width) > (rowsize * length)) buffsize = (colsize + 1) * width; else buffsize = (rowsize + 1) * length; bytes_per_sample = (bps + 7) / 8; bytes_per_pixel = ((bps * spp) + 7) / 8; if (bytes_per_pixel < (bytes_per_sample + 1)) shift_width = bytes_per_pixel; else shift_width = bytes_per_sample + 1; switch (rotation) { case 0: case 360: return (0); case 90: case 180: case 270: break; default: TIFFError("rotateImage", "Invalid rotation angle %d", rotation); return (-1); } if (!(rbuff = (unsigned char *)_TIFFmalloc(buffsize))) { TIFFError("rotateImage", "Unable to allocate rotation buffer of %1u bytes", buffsize); return (-1); } _TIFFmemset(rbuff, '\0', buffsize); ibuff = *ibuff_ptr; switch (rotation) { case 180: if ((bps % 8) == 0) /* byte alligned data */ { src = ibuff; pix_offset = (spp * bps) / 8; for (row = 0; row < length; row++) { dst_offset = (length - row - 1) * rowsize; for (col = 0; col < width; col++) { col_offset = (width - col - 1) * pix_offset; dst = rbuff + dst_offset + col_offset; for (i = 0; i < bytes_per_pixel; i++) *dst++ = *src++; } } } else { /* non 8 bit per sample data */ for (row = 0; row < length; row++) { src_offset = row * rowsize; dst_offset = (length - row - 1) * rowsize; src = ibuff + src_offset; dst = rbuff + dst_offset; switch (shift_width) { case 1: if (bps == 1) { if (reverseSamples8bits(spp, bps, width, src, dst)) { _TIFFfree(rbuff); return (-1); } break; } if (reverseSamples16bits(spp, bps, width, src, dst)) { _TIFFfree(rbuff); return (-1); } break; case 2: if (reverseSamples24bits(spp, bps, width, src, dst)) { _TIFFfree(rbuff); return (-1); } break; case 3: case 4: case 5: if (reverseSamples32bits(spp, bps, width, src, dst)) { _TIFFfree(rbuff); return (-1); } break; default: TIFFError("rotateImage","Unsupported bit depth %d", bps); _TIFFfree(rbuff); return (-1); } } } _TIFFfree(ibuff); *(ibuff_ptr) = rbuff; break; case 90: if ((bps % 8) == 0) /* byte aligned data */ { for (col = 0; col < width; col++) { src_offset = ((length - 1) * rowsize) + (col * bytes_per_pixel); dst_offset = col * colsize; src = ibuff + src_offset; dst = rbuff + dst_offset; for (row = length; row > 0; row--) { for (i = 0; i < bytes_per_pixel; i++) *dst++ = *(src + i); src -= rowsize; } } } else { /* non 8 bit per sample data */ for (col = 0; col < width; col++) { src_offset = (length - 1) * rowsize; dst_offset = col * colsize; src = ibuff + src_offset; dst = rbuff + dst_offset; switch (shift_width) { case 1: if (bps == 1) { if (rotateContigSamples8bits(rotation, spp, bps, width, length, col, src, dst)) { _TIFFfree(rbuff); return (-1); } break; } if (rotateContigSamples16bits(rotation, spp, bps, width, length, col, src, dst)) { _TIFFfree(rbuff); return (-1); } break; case 2: if (rotateContigSamples24bits(rotation, spp, bps, width, length, col, src, dst)) { _TIFFfree(rbuff); return (-1); } break; case 3: case 4: case 5: if (rotateContigSamples32bits(rotation, spp, bps, width, length, col, src, dst)) { _TIFFfree(rbuff); return (-1); } break; default: TIFFError("rotateImage","Unsupported bit depth %d", bps); _TIFFfree(rbuff); return (-1); } } } _TIFFfree(ibuff); *(ibuff_ptr) = rbuff; *img_width = length; *img_length = width; image->width = length; image->length = width; res_temp = image->xres; image->xres = image->yres; image->yres = res_temp; break; case 270: if ((bps % 8) == 0) /* byte aligned data */ { for (col = 0; col < width; col++) { src_offset = col * bytes_per_pixel; dst_offset = (width - col - 1) * colsize; src = ibuff + src_offset; dst = rbuff + dst_offset; for (row = length; row > 0; row--) { for (i = 0; i < bytes_per_pixel; i++) *dst++ = *(src + i); src += rowsize; } } } else { /* non 8 bit per sample data */ for (col = 0; col < width; col++) { src_offset = 0; dst_offset = (width - col - 1) * colsize; src = ibuff + src_offset; dst = rbuff + dst_offset; switch (shift_width) { case 1: if (bps == 1) { if (rotateContigSamples8bits(rotation, spp, bps, width, length, col, src, dst)) { _TIFFfree(rbuff); return (-1); } break; } if (rotateContigSamples16bits(rotation, spp, bps, width, length, col, src, dst)) { _TIFFfree(rbuff); return (-1); } break; case 2: if (rotateContigSamples24bits(rotation, spp, bps, width, length, col, src, dst)) { _TIFFfree(rbuff); return (-1); } break; case 3: case 4: case 5: if (rotateContigSamples32bits(rotation, spp, bps, width, length, col, src, dst)) { _TIFFfree(rbuff); return (-1); } break; default: TIFFError("rotateImage","Unsupported bit depth %d", bps); _TIFFfree(rbuff); return (-1); } } } _TIFFfree(ibuff); *(ibuff_ptr) = rbuff; *img_width = length; *img_length = width; image->width = length; image->length = width; res_temp = image->xres; image->xres = image->yres; image->yres = res_temp; break; default: break; } return (0); } /* end rotateImage */ static int reverseSamples8bits (uint16 spp, uint16 bps, uint32 width, uint8 *ibuff, uint8 *obuff) { int ready_bits = 0; uint32 col; uint32 src_byte, src_bit; uint32 bit_offset = 0; uint8 match_bits = 0, mask_bits = 0; uint8 buff1 = 0, buff2 = 0; unsigned char *src; unsigned char *dst; tsample_t sample; if ((ibuff == NULL) || (obuff == NULL)) { TIFFError("reverseSamples8bits","Invalid image or work buffer"); return (1); } ready_bits = 0; mask_bits = (uint8)-1 >> ( 8 - bps); dst = obuff; for (col = width; col > 0; col--) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = (col - 1) * bps * spp; for (sample = 0; sample < spp; sample++) { if (sample == 0) { src_byte = bit_offset / 8; src_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sample * bps)) / 8; src_bit = (bit_offset + (sample * bps)) % 8; } src = ibuff + src_byte; match_bits = mask_bits << (8 - src_bit - bps); buff1 = ((*src) & match_bits) << (src_bit); if (ready_bits < 8) buff2 = (buff2 | (buff1 >> ready_bits)); else /* If we have a full buffer's worth, write it out */ { *dst++ = buff2; buff2 = buff1; ready_bits -= 8; } ready_bits += bps; } } if (ready_bits > 0) { buff1 = (buff2 & ((unsigned int)255 << (8 - ready_bits))); *dst++ = buff1; } return (0); } /* end reverseSamples8bits */ static int reverseSamples16bits (uint16 spp, uint16 bps, uint32 width, uint8 *ibuff, uint8 *obuff) { int ready_bits = 0; uint32 col; uint32 src_byte = 0, high_bit = 0; uint32 bit_offset = 0; uint16 match_bits = 0, mask_bits = 0; uint16 buff1 = 0, buff2 = 0; uint8 bytebuff = 0; unsigned char *src; unsigned char *dst; tsample_t sample; if ((ibuff == NULL) || (obuff == NULL)) { TIFFError("reverseSample16bits","Invalid image or work buffer"); return (1); } ready_bits = 0; mask_bits = (uint16)-1 >> (16 - bps); dst = obuff; for (col = width; col > 0; col--) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = (col - 1) * bps * spp; for (sample = 0; sample < spp; sample++) { if (sample == 0) { src_byte = bit_offset / 8; high_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sample * bps)) / 8; high_bit = (bit_offset + (sample * bps)) % 8; } src = ibuff + src_byte; match_bits = mask_bits << (16 - high_bit - bps); if (little_endian) buff1 = (src[0] << 8) | src[1]; else buff1 = (src[1] << 8) | src[0]; buff1 = (buff1 & match_bits) << (high_bit); if (ready_bits < 8) { /* add another bps bits to the buffer */ bytebuff = 0; buff2 = (buff2 | (buff1 >> ready_bits)); } else /* If we have a full buffer's worth, write it out */ { bytebuff = (buff2 >> 8); *dst++ = bytebuff; ready_bits -= 8; /* shift in new bits */ buff2 = ((buff2 << 8) | (buff1 >> ready_bits)); } ready_bits += bps; } } if (ready_bits > 0) { bytebuff = (buff2 >> 8); *dst++ = bytebuff; } return (0); } /* end reverseSamples16bits */ static int reverseSamples24bits (uint16 spp, uint16 bps, uint32 width, uint8 *ibuff, uint8 *obuff) { int ready_bits = 0; uint32 col; uint32 src_byte = 0, high_bit = 0; uint32 bit_offset = 0; uint32 match_bits = 0, mask_bits = 0; uint32 buff1 = 0, buff2 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0; unsigned char *src; unsigned char *dst; tsample_t sample; if ((ibuff == NULL) || (obuff == NULL)) { TIFFError("reverseSamples24bits","Invalid image or work buffer"); return (1); } ready_bits = 0; mask_bits = (uint32)-1 >> (32 - bps); dst = obuff; for (col = width; col > 0; col--) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = (col - 1) * bps * spp; for (sample = 0; sample < spp; sample++) { if (sample == 0) { src_byte = bit_offset / 8; high_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sample * bps)) / 8; high_bit = (bit_offset + (sample * bps)) % 8; } src = ibuff + src_byte; match_bits = mask_bits << (32 - high_bit - bps); if (little_endian) buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; else buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; buff1 = (buff1 & match_bits) << (high_bit); if (ready_bits < 16) { /* add another bps bits to the buffer */ bytebuff1 = bytebuff2 = 0; buff2 = (buff2 | (buff1 >> ready_bits)); } else /* If we have a full buffer's worth, write it out */ { bytebuff1 = (buff2 >> 24); *dst++ = bytebuff1; bytebuff2 = (buff2 >> 16); *dst++ = bytebuff2; ready_bits -= 16; /* shift in new bits */ buff2 = ((buff2 << 16) | (buff1 >> ready_bits)); } ready_bits += bps; } } /* catch any trailing bits at the end of the line */ while (ready_bits > 0) { bytebuff1 = (buff2 >> 24); *dst++ = bytebuff1; buff2 = (buff2 << 8); bytebuff2 = bytebuff1; ready_bits -= 8; } return (0); } /* end reverseSamples24bits */ static int reverseSamples32bits (uint16 spp, uint16 bps, uint32 width, uint8 *ibuff, uint8 *obuff) { int ready_bits = 0, shift_width = 0; int bytes_per_sample, bytes_per_pixel; uint32 bit_offset; uint32 src_byte = 0, high_bit = 0; uint32 col; uint32 longbuff1 = 0, longbuff2 = 0; uint64 mask_bits = 0, match_bits = 0; uint64 buff1 = 0, buff2 = 0, buff3 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0; unsigned char *src; unsigned char *dst; tsample_t sample; if ((ibuff == NULL) || (obuff == NULL)) { TIFFError("reverseSamples32bits","Invalid image or work buffer"); return (1); } ready_bits = 0; mask_bits = (uint64)-1 >> (64 - bps); dst = obuff; bytes_per_sample = (bps + 7) / 8; bytes_per_pixel = ((bps * spp) + 7) / 8; if (bytes_per_pixel < (bytes_per_sample + 1)) shift_width = bytes_per_pixel; else shift_width = bytes_per_sample + 1; for (col = width; col > 0; col--) { /* Compute src byte(s) and bits within byte(s) */ bit_offset = (col - 1) * bps * spp; for (sample = 0; sample < spp; sample++) { if (sample == 0) { src_byte = bit_offset / 8; high_bit = bit_offset % 8; } else { src_byte = (bit_offset + (sample * bps)) / 8; high_bit = (bit_offset + (sample * bps)) % 8; } src = ibuff + src_byte; match_bits = mask_bits << (64 - high_bit - bps); if (little_endian) { longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; longbuff2 = longbuff1; } else { longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; longbuff2 = longbuff1; } buff3 = ((uint64)longbuff1 << 32) | longbuff2; buff1 = (buff3 & match_bits) << (high_bit); if (ready_bits < 32) { /* add another bps bits to the buffer */ bytebuff1 = bytebuff2 = bytebuff3 = bytebuff4 = 0; buff2 = (buff2 | (buff1 >> ready_bits)); } else /* If we have a full buffer's worth, write it out */ { bytebuff1 = (buff2 >> 56); *dst++ = bytebuff1; bytebuff2 = (buff2 >> 48); *dst++ = bytebuff2; bytebuff3 = (buff2 >> 40); *dst++ = bytebuff3; bytebuff4 = (buff2 >> 32); *dst++ = bytebuff4; ready_bits -= 32; /* shift in new bits */ buff2 = ((buff2 << 32) | (buff1 >> ready_bits)); } ready_bits += bps; } } while (ready_bits > 0) { bytebuff1 = (buff2 >> 56); *dst++ = bytebuff1; buff2 = (buff2 << 8); ready_bits -= 8; } return (0); } /* end reverseSamples32bits */ static int reverseSamplesBytes (uint16 spp, uint16 bps, uint32 width, uint8 *src, uint8 *dst) { int i; uint32 col, bytes_per_pixel, col_offset; uint8 bytebuff1; unsigned char swapbuff[32]; if ((src == NULL) || (dst == NULL)) { TIFFError("reverseSamplesBytes","Invalid input or output buffer"); return (1); } bytes_per_pixel = ((bps * spp) + 7) / 8; switch (bps / 8) { case 8: /* Use memcpy for multiple bytes per sample data */ case 4: case 3: case 2: for (col = 0; col < (width / 2); col++) { col_offset = col * bytes_per_pixel; _TIFFmemcpy (swapbuff, src + col_offset, bytes_per_pixel); _TIFFmemcpy (src + col_offset, dst - col_offset - bytes_per_pixel, bytes_per_pixel); _TIFFmemcpy (dst - col_offset - bytes_per_pixel, swapbuff, bytes_per_pixel); } break; case 1: /* Use byte copy only for single byte per sample data */ for (col = 0; col < (width / 2); col++) { for (i = 0; i < spp; i++) { bytebuff1 = *src; *src++ = *(dst - spp + i); *(dst - spp + i) = bytebuff1; } dst -= spp; } break; default: TIFFError("reverseSamplesBytes","Unsupported bit depth %d", bps); return (1); } return (0); } /* end reverseSamplesBytes */ /* Mirror an image horizontally or vertically */ static int mirrorImage(uint16 spp, uint16 bps, uint16 mirror, uint32 width, uint32 length, unsigned char *ibuff) { int shift_width; uint32 bytes_per_pixel, bytes_per_sample; uint32 row, rowsize, row_offset; unsigned char *line_buff = NULL; unsigned char *src; unsigned char *dst; src = ibuff; rowsize = ((width * bps * spp) + 7) / 8; switch (mirror) { case MIRROR_BOTH: case MIRROR_VERT: line_buff = (unsigned char *)_TIFFmalloc(rowsize); if (line_buff == NULL) { TIFFError ("mirrorImage", "Unable to allocate mirror line buffer of %1u bytes", rowsize); return (-1); } dst = ibuff + (rowsize * (length - 1)); for (row = 0; row < length / 2; row++) { _TIFFmemcpy(line_buff, src, rowsize); _TIFFmemcpy(src, dst, rowsize); _TIFFmemcpy(dst, line_buff, rowsize); src += (rowsize); dst -= (rowsize); } if (line_buff) _TIFFfree(line_buff); if (mirror == MIRROR_VERT) break; case MIRROR_HORIZ : if ((bps % 8) == 0) /* byte alligned data */ { for (row = 0; row < length; row++) { row_offset = row * rowsize; src = ibuff + row_offset; dst = ibuff + row_offset + rowsize; if (reverseSamplesBytes(spp, bps, width, src, dst)) { return (-1); } } } else { /* non 8 bit per sample data */ if (!(line_buff = (unsigned char *)_TIFFmalloc(rowsize + 1))) { TIFFError("mirrorImage", "Unable to allocate mirror line buffer"); return (-1); } bytes_per_sample = (bps + 7) / 8; bytes_per_pixel = ((bps * spp) + 7) / 8; if (bytes_per_pixel < (bytes_per_sample + 1)) shift_width = bytes_per_pixel; else shift_width = bytes_per_sample + 1; for (row = 0; row < length; row++) { row_offset = row * rowsize; src = ibuff + row_offset; _TIFFmemset (line_buff, '\0', rowsize); switch (shift_width) { case 1: if (reverseSamples16bits(spp, bps, width, src, line_buff)) { _TIFFfree(line_buff); return (-1); } _TIFFmemcpy (src, line_buff, rowsize); break; case 2: if (reverseSamples24bits(spp, bps, width, src, line_buff)) { _TIFFfree(line_buff); return (-1); } _TIFFmemcpy (src, line_buff, rowsize); break; case 3: case 4: case 5: if (reverseSamples32bits(spp, bps, width, src, line_buff)) { _TIFFfree(line_buff); return (-1); } _TIFFmemcpy (src, line_buff, rowsize); break; default: TIFFError("mirrorImage","Unsupported bit depth %d", bps); _TIFFfree(line_buff); return (-1); } } if (line_buff) _TIFFfree(line_buff); } break; default: TIFFError ("mirrorImage", "Invalid mirror axis %d", mirror); return (-1); break; } return (0); } /* Invert the light and dark values for a bilevel or grayscale image */ static int invertImage(uint16 photometric, uint16 spp, uint16 bps, uint32 width, uint32 length, unsigned char *work_buff) { uint32 row, col; unsigned char bytebuff1, bytebuff2, bytebuff3, bytebuff4; unsigned char *src; uint16 *src_uint16; uint32 *src_uint32; if (spp != 1) { TIFFError("invertImage", "Image inversion not supported for more than one sample per pixel"); return (-1); } if (photometric != PHOTOMETRIC_MINISWHITE && photometric != PHOTOMETRIC_MINISBLACK) { TIFFError("invertImage", "Only black and white and grayscale images can be inverted"); return (-1); } src = work_buff; if (src == NULL) { TIFFError ("invertImage", "Invalid crop buffer passed to invertImage"); return (-1); } switch (bps) { case 32: src_uint32 = (uint32 *)src; for (row = 0; row < length; row++) for (col = 0; col < width; col++) { *src_uint32 = (uint32)0xFFFFFFFF - *src_uint32; src_uint32++; } break; case 16: src_uint16 = (uint16 *)src; for (row = 0; row < length; row++) for (col = 0; col < width; col++) { *src_uint16 = (uint16)0xFFFF - *src_uint16; src_uint16++; } break; case 8: for (row = 0; row < length; row++) for (col = 0; col < width; col++) { *src = (uint8)255 - *src; src++; } break; case 4: for (row = 0; row < length; row++) for (col = 0; col < width; col++) { bytebuff1 = 16 - (uint8)(*src & 240 >> 4); bytebuff2 = 16 - (*src & 15); *src = bytebuff1 << 4 & bytebuff2; src++; } break; case 2: for (row = 0; row < length; row++) for (col = 0; col < width; col++) { bytebuff1 = 4 - (uint8)(*src & 192 >> 6); bytebuff2 = 4 - (uint8)(*src & 48 >> 4); bytebuff3 = 4 - (uint8)(*src & 12 >> 2); bytebuff4 = 4 - (uint8)(*src & 3); *src = (bytebuff1 << 6) || (bytebuff2 << 4) || (bytebuff3 << 2) || bytebuff4; src++; } break; case 1: for (row = 0; row < length; row++) for (col = 0; col < width; col += 8 /(spp * bps)) { *src = ~(*src); src++; } break; default: TIFFError("invertImage", "Unsupported bit depth %d", bps); return (-1); } return (0); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/tiffinfo.c0000644000212300117540000002636111763656234012524 00000000000000/* $Id: tiffinfo.c,v 1.21 2012-06-06 06:05:29 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_UNISTD_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffiop.h" static TIFFErrorHandler old_error_handler = 0; static int status = 0; /* exit status */ static int showdata = 0; /* show data */ static int rawdata = 0; /* show raw/decoded data */ static int showwords = 0; /* show data as bytes/words */ static int readdata = 0; /* read data in file */ static int stoponerr = 1; /* stop on first read error */ static void usage(void); static void tiffinfo(TIFF*, uint16, long, int); static void PrivateErrorHandler(const char* module, const char* fmt, va_list ap) { if (old_error_handler) (*old_error_handler)(module,fmt,ap); status = 1; } int main(int argc, char* argv[]) { int dirnum = -1, multiplefiles, c; uint16 order = 0; TIFF* tif; extern int optind; extern char* optarg; long flags = 0; uint64 diroff = 0; int chopstrips = 0; /* disable strip chopping */ while ((c = getopt(argc, argv, "f:o:cdDSjilmrsvwz0123456789")) != -1) switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': dirnum = atoi(&argv[optind-1][1]); break; case 'd': showdata++; /* fall thru... */ case 'D': readdata++; break; case 'c': flags |= TIFFPRINT_COLORMAP | TIFFPRINT_CURVES; break; case 'f': /* fill order */ if (streq(optarg, "lsb2msb")) order = FILLORDER_LSB2MSB; else if (streq(optarg, "msb2lsb")) order = FILLORDER_MSB2LSB; else usage(); break; case 'i': stoponerr = 0; break; case 'o': diroff = strtoul(optarg, NULL, 0); break; case 'j': flags |= TIFFPRINT_JPEGQTABLES | TIFFPRINT_JPEGACTABLES | TIFFPRINT_JPEGDCTABLES; break; case 'r': rawdata = 1; break; case 's': flags |= TIFFPRINT_STRIPS; break; case 'w': showwords = 1; break; case 'z': chopstrips = 1; break; case '?': usage(); /*NOTREACHED*/ } if (optind >= argc) usage(); old_error_handler = TIFFSetErrorHandler(PrivateErrorHandler); multiplefiles = (argc - optind > 1); for (; optind < argc; optind++) { if (multiplefiles) printf("%s:\n", argv[optind]); tif = TIFFOpen(argv[optind], chopstrips ? "rC" : "rc"); if (tif != NULL) { if (dirnum != -1) { if (TIFFSetDirectory(tif, (tdir_t) dirnum)) tiffinfo(tif, order, flags, 1); } else if (diroff != 0) { if (TIFFSetSubDirectory(tif, diroff)) tiffinfo(tif, order, flags, 1); } else { do { toff_t offset; tiffinfo(tif, order, flags, 1); if (TIFFGetField(tif, TIFFTAG_EXIFIFD, &offset)) { if (TIFFReadEXIFDirectory(tif, offset)) { tiffinfo(tif, order, flags, 0); } } } while (TIFFReadDirectory(tif)); } TIFFClose(tif); } } return (status); } char* stuff[] = { "usage: tiffinfo [options] input...", "where options are:", " -D read data", " -i ignore read errors", " -c display data for grey/color response curve or colormap", " -d display raw/decoded image data", " -f lsb2msb force lsb-to-msb FillOrder for input", " -f msb2lsb force msb-to-lsb FillOrder for input", " -j show JPEG tables", " -o offset set initial directory offset", " -r read/display raw image data instead of decoded data", " -s display strip offsets and byte counts", " -w display raw data in words rather than bytes", " -z enable strip chopping", " -# set initial directory (first directory is # 0)", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } static void ShowStrip(tstrip_t strip, unsigned char* pp, uint32 nrow, tsize_t scanline) { register tsize_t cc; printf("Strip %lu:\n", (unsigned long) strip); while (nrow-- > 0) { for (cc = 0; cc < scanline; cc++) { printf(" %02x", *pp++); if (((cc+1) % 24) == 0) putchar('\n'); } putchar('\n'); } } void TIFFReadContigStripData(TIFF* tif) { unsigned char *buf; tsize_t scanline = TIFFScanlineSize(tif); buf = (unsigned char *)_TIFFmalloc(TIFFStripSize(tif)); if (buf) { uint32 row, h=0; uint32 rowsperstrip = (uint32)-1; TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h); TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); for (row = 0; row < h; row += rowsperstrip) { uint32 nrow = (row+rowsperstrip > h ? h-row : rowsperstrip); tstrip_t strip = TIFFComputeStrip(tif, row, 0); if (TIFFReadEncodedStrip(tif, strip, buf, nrow*scanline) < 0) { if (stoponerr) break; } else if (showdata) ShowStrip(strip, buf, nrow, scanline); } _TIFFfree(buf); } } void TIFFReadSeparateStripData(TIFF* tif) { unsigned char *buf; tsize_t scanline = TIFFScanlineSize(tif); buf = (unsigned char *)_TIFFmalloc(TIFFStripSize(tif)); if (buf) { uint32 row, h; uint32 rowsperstrip = (uint32)-1; tsample_t s, samplesperpixel; TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h); TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel); for (row = 0; row < h; row += rowsperstrip) { for (s = 0; s < samplesperpixel; s++) { uint32 nrow = (row+rowsperstrip > h ? h-row : rowsperstrip); tstrip_t strip = TIFFComputeStrip(tif, row, s); if (TIFFReadEncodedStrip(tif, strip, buf, nrow*scanline) < 0) { if (stoponerr) break; } else if (showdata) ShowStrip(strip, buf, nrow, scanline); } } _TIFFfree(buf); } } static void ShowTile(uint32 row, uint32 col, tsample_t sample, unsigned char* pp, uint32 nrow, tsize_t rowsize) { uint32 cc; printf("Tile (%lu,%lu", (unsigned long) row, (unsigned long) col); if (sample != (tsample_t) -1) printf(",%u", sample); printf("):\n"); while (nrow-- > 0) { for (cc = 0; cc < (uint32) rowsize; cc++) { printf(" %02x", *pp++); if (((cc+1) % 24) == 0) putchar('\n'); } putchar('\n'); } } void TIFFReadContigTileData(TIFF* tif) { unsigned char *buf; tsize_t rowsize = TIFFTileRowSize(tif); buf = (unsigned char *)_TIFFmalloc(TIFFTileSize(tif)); if (buf) { uint32 tw, th, w, h; uint32 row, col; TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w); TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h); TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw); TIFFGetField(tif, TIFFTAG_TILELENGTH, &th); for (row = 0; row < h; row += th) { for (col = 0; col < w; col += tw) { if (TIFFReadTile(tif, buf, col, row, 0, 0) < 0) { if (stoponerr) break; } else if (showdata) ShowTile(row, col, (tsample_t) -1, buf, th, rowsize); } } _TIFFfree(buf); } } void TIFFReadSeparateTileData(TIFF* tif) { unsigned char *buf; tsize_t rowsize = TIFFTileRowSize(tif); buf = (unsigned char *)_TIFFmalloc(TIFFTileSize(tif)); if (buf) { uint32 tw, th, w, h; uint32 row, col; tsample_t s, samplesperpixel; TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w); TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h); TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw); TIFFGetField(tif, TIFFTAG_TILELENGTH, &th); TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel); for (row = 0; row < h; row += th) { for (col = 0; col < w; col += tw) { for (s = 0; s < samplesperpixel; s++) { if (TIFFReadTile(tif, buf, col, row, 0, s) < 0) { if (stoponerr) break; } else if (showdata) ShowTile(row, col, s, buf, th, rowsize); } } } _TIFFfree(buf); } } void TIFFReadData(TIFF* tif) { uint16 config = PLANARCONFIG_CONTIG; TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &config); if (TIFFIsTiled(tif)) { if (config == PLANARCONFIG_CONTIG) TIFFReadContigTileData(tif); else TIFFReadSeparateTileData(tif); } else { if (config == PLANARCONFIG_CONTIG) TIFFReadContigStripData(tif); else TIFFReadSeparateStripData(tif); } } static void ShowRawBytes(unsigned char* pp, uint32 n) { uint32 i; for (i = 0; i < n; i++) { printf(" %02x", *pp++); if (((i+1) % 24) == 0) printf("\n "); } putchar('\n'); } static void ShowRawWords(uint16* pp, uint32 n) { uint32 i; for (i = 0; i < n; i++) { printf(" %04x", *pp++); if (((i+1) % 15) == 0) printf("\n "); } putchar('\n'); } void TIFFReadRawData(TIFF* tif, int bitrev) { tstrip_t nstrips = TIFFNumberOfStrips(tif); const char* what = TIFFIsTiled(tif) ? "Tile" : "Strip"; uint64* stripbc; TIFFGetField(tif, TIFFTAG_STRIPBYTECOUNTS, &stripbc); if (nstrips > 0) { uint32 bufsize = (uint32) stripbc[0]; tdata_t buf = _TIFFmalloc(bufsize); tstrip_t s; for (s = 0; s < nstrips; s++) { if (stripbc[s] > bufsize) { buf = _TIFFrealloc(buf, (tmsize_t)stripbc[s]); bufsize = (uint32) stripbc[s]; } if (buf == NULL) { fprintf(stderr, "Cannot allocate buffer to read strip %lu\n", (unsigned long) s); break; } if (TIFFReadRawStrip(tif, s, buf, (tmsize_t) stripbc[s]) < 0) { fprintf(stderr, "Error reading strip %lu\n", (unsigned long) s); if (stoponerr) break; } else if (showdata) { if (bitrev) { TIFFReverseBits(buf, (tmsize_t)stripbc[s]); printf("%s %lu: (bit reversed)\n ", what, (unsigned long) s); } else printf("%s %lu:\n ", what, (unsigned long) s); if (showwords) ShowRawWords((uint16*) buf, (uint32) stripbc[s]>>1); else ShowRawBytes((unsigned char*) buf, (uint32) stripbc[s]); } } if (buf != NULL) _TIFFfree(buf); } } static void tiffinfo(TIFF* tif, uint16 order, long flags, int is_image) { TIFFPrintDirectory(tif, stdout, flags); if (!readdata || !is_image) return; if (rawdata) { if (order) { uint16 o; TIFFGetFieldDefaulted(tif, TIFFTAG_FILLORDER, &o); TIFFReadRawData(tif, o != order); } else TIFFReadRawData(tif, 0); } else { if (order) TIFFSetField(tif, TIFFTAG_FILLORDER, order); TIFFReadData(tif); } } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/bmp2tiff.c0000644000212300117540000006014311345765561012425 00000000000000/* $Id: bmp2tiff.c,v 1.23 2010-03-10 18:56:49 bfriesen Exp $ * * Project: libtiff tools * Purpose: Convert Windows BMP files in TIFF. * Author: Andrey Kiselev, dron@ak4719.spb.edu * ****************************************************************************** * Copyright (c) 2004, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #if HAVE_FCNTL_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_IO_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" #ifndef O_BINARY # define O_BINARY 0 #endif enum BMPType { BMPT_WIN4, /* BMP used in Windows 3.0/NT 3.51/95 */ BMPT_WIN5, /* BMP used in Windows NT 4.0/98/Me/2000/XP */ BMPT_OS21, /* BMP used in OS/2 PM 1.x */ BMPT_OS22 /* BMP used in OS/2 PM 2.x */ }; /* * Bitmap file consists of a BMPFileHeader structure followed by a * BMPInfoHeader structure. An array of BMPColorEntry structures (also called * a colour table) follows the bitmap information header structure. The colour * table is followed by a second array of indexes into the colour table (the * actual bitmap data). Data may be comressed, for 4-bpp and 8-bpp used RLE * compression. * * +---------------------+ * | BMPFileHeader | * +---------------------+ * | BMPInfoHeader | * +---------------------+ * | BMPColorEntry array | * +---------------------+ * | Colour-index array | * +---------------------+ * * All numbers stored in Intel order with least significant byte first. */ enum BMPComprMethod { BMPC_RGB = 0L, /* Uncompressed */ BMPC_RLE8 = 1L, /* RLE for 8 bpp images */ BMPC_RLE4 = 2L, /* RLE for 4 bpp images */ BMPC_BITFIELDS = 3L, /* Bitmap is not compressed and the colour table * consists of three DWORD color masks that specify * the red, green, and blue components of each * pixel. This is valid when used with * 16- and 32-bpp bitmaps. */ BMPC_JPEG = 4L, /* Indicates that the image is a JPEG image. */ BMPC_PNG = 5L /* Indicates that the image is a PNG image. */ }; enum BMPLCSType /* Type of logical color space. */ { BMPLT_CALIBRATED_RGB = 0, /* This value indicates that endpoints and * gamma values are given in the appropriate * fields. */ BMPLT_DEVICE_RGB = 1, BMPLT_DEVICE_CMYK = 2 }; typedef struct { int32 iCIEX; int32 iCIEY; int32 iCIEZ; } BMPCIEXYZ; typedef struct /* This structure contains the x, y, and z */ { /* coordinates of the three colors that */ /* correspond */ BMPCIEXYZ iCIERed; /* to the red, green, and blue endpoints for */ BMPCIEXYZ iCIEGreen; /* a specified logical color space. */ BMPCIEXYZ iCIEBlue; } BMPCIEXYZTriple; typedef struct { char bType[2]; /* Signature "BM" */ uint32 iSize; /* Size in bytes of the bitmap file. Should * always be ignored while reading because * of error in Windows 3.0 SDK's description * of this field */ uint16 iReserved1; /* Reserved, set as 0 */ uint16 iReserved2; /* Reserved, set as 0 */ uint32 iOffBits; /* Offset of the image from file start in bytes */ } BMPFileHeader; /* File header size in bytes: */ const int BFH_SIZE = 14; typedef struct { uint32 iSize; /* Size of BMPInfoHeader structure in bytes. * Should be used to determine start of the * colour table */ int32 iWidth; /* Image width */ int32 iHeight; /* Image height. If positive, image has bottom * left origin, if negative --- top left. */ int16 iPlanes; /* Number of image planes (must be set to 1) */ int16 iBitCount; /* Number of bits per pixel (1, 4, 8, 16, 24 * or 32). If 0 then the number of bits per * pixel is specified or is implied by the * JPEG or PNG format. */ uint32 iCompression; /* Compression method */ uint32 iSizeImage; /* Size of uncomressed image in bytes. May * be 0 for BMPC_RGB bitmaps. If iCompression * is BI_JPEG or BI_PNG, iSizeImage indicates * the size of the JPEG or PNG image buffer. */ int32 iXPelsPerMeter; /* X resolution, pixels per meter (0 if not used) */ int32 iYPelsPerMeter; /* Y resolution, pixels per meter (0 if not used) */ uint32 iClrUsed; /* Size of colour table. If 0, iBitCount should * be used to calculate this value * (1< 0) ? info_hdr.iHeight : -info_hdr.iHeight; switch (info_hdr.iBitCount) { case 1: case 4: case 8: nbands = 1; depth = info_hdr.iBitCount; photometric = PHOTOMETRIC_PALETTE; /* Allocate memory for colour table and read it. */ if (info_hdr.iClrUsed) clr_tbl_size = ((uint32)(1< 0) offset = file_hdr.iOffBits+(length-row-1)*size; else offset = file_hdr.iOffBits + row * size; if (lseek(fd, offset, SEEK_SET) == (off_t)-1) { TIFFError(infilename, "scanline %lu: Seek error", (unsigned long) row); break; } if (read(fd, scanbuf, size) < 0) { TIFFError(infilename, "scanline %lu: Read error", (unsigned long) row); break; } rearrangePixels(scanbuf, width, info_hdr.iBitCount); if (TIFFWriteScanline(out, scanbuf, row, 0)<0) { TIFFError(infilename, "scanline %lu: Write error", (unsigned long) row); break; } } _TIFFfree(scanbuf); /* -------------------------------------------------------------------- */ /* Read compressed image data. */ /* -------------------------------------------------------------------- */ } else if ( info_hdr.iCompression == BMPC_RLE8 || info_hdr.iCompression == BMPC_RLE4 ) { uint32 i, j, k, runlength; uint32 compr_size, uncompr_size; unsigned char *comprbuf; unsigned char *uncomprbuf; compr_size = file_hdr.iSize - file_hdr.iOffBits; uncompr_size = width * length; comprbuf = (unsigned char *) _TIFFmalloc( compr_size ); if (!comprbuf) { TIFFError(infilename, "Can't allocate space for compressed scanline buffer"); goto bad3; } uncomprbuf = (unsigned char *)_TIFFmalloc(uncompr_size); if (!uncomprbuf) { TIFFError(infilename, "Can't allocate space for uncompressed scanline buffer"); goto bad3; } lseek(fd, file_hdr.iOffBits, SEEK_SET); read(fd, comprbuf, compr_size); i = 0; j = 0; if (info_hdr.iBitCount == 8) { /* RLE8 */ while(j < uncompr_size && i < compr_size) { if ( comprbuf[i] ) { runlength = comprbuf[i++]; while( runlength > 0 && j < uncompr_size && i < compr_size ) { uncomprbuf[j++] = comprbuf[i]; runlength--; } i++; } else { i++; if (comprbuf[i] == 0) /* Next scanline */ i++; else if (comprbuf[i] == 1) /* End of image */ break; else if (comprbuf[i] == 2) { /* Move to... */ i++; if (i < compr_size - 1) { j+=comprbuf[i]+comprbuf[i+1]*width; i += 2; } else break; } else { /* Absolute mode */ runlength = comprbuf[i++]; for (k = 0; k < runlength && j < uncompr_size && i < compr_size; k++) uncomprbuf[j++] = comprbuf[i++]; if ( k & 0x01 ) i++; } } } } else { /* RLE4 */ while( j < uncompr_size && i < compr_size ) { if ( comprbuf[i] ) { runlength = comprbuf[i++]; while( runlength > 0 && j < uncompr_size && i < compr_size ) { if ( runlength & 0x01 ) uncomprbuf[j++] = (comprbuf[i] & 0xF0) >> 4; else uncomprbuf[j++] = comprbuf[i] & 0x0F; runlength--; } i++; } else { i++; if (comprbuf[i] == 0) /* Next scanline */ i++; else if (comprbuf[i] == 1) /* End of image */ break; else if (comprbuf[i] == 2) { /* Move to... */ i++; if (i < compr_size - 1) { j+=comprbuf[i]+comprbuf[i+1]*width; i += 2; } else break; } else { /* Absolute mode */ runlength = comprbuf[i++]; for (k = 0; k < runlength && j < uncompr_size && i < compr_size; k++) { if (k & 0x01) uncomprbuf[j++] = comprbuf[i++] & 0x0F; else uncomprbuf[j++] = (comprbuf[i] & 0xF0) >> 4; } if (k & 0x01) i++; } } } } _TIFFfree(comprbuf); for (row = 0; row < length; row++) { if (TIFFWriteScanline(out, uncomprbuf + (length - row - 1) * width, row, 0) < 0) { TIFFError(infilename, "scanline %lu: Write error.\n", (unsigned long) row); } } _TIFFfree(uncomprbuf); } TIFFWriteDirectory(out); if (blue_tbl) { _TIFFfree(blue_tbl); blue_tbl=NULL; } if (green_tbl) { _TIFFfree(green_tbl); green_tbl=NULL; } if (red_tbl) { _TIFFfree(red_tbl); red_tbl=NULL; } } bad3: if (blue_tbl) _TIFFfree(blue_tbl); bad2: if (green_tbl) _TIFFfree(green_tbl); bad1: if (red_tbl) _TIFFfree(red_tbl); bad: close(fd); if (out) TIFFClose(out); return 0; } /* * Image data in BMP file stored in BGR (or ABGR) format. We should rearrange * pixels to RGB (RGBA) format. */ static void rearrangePixels(char *buf, uint32 width, uint32 bit_count) { char tmp; uint32 i; switch(bit_count) { case 16: /* FIXME: need a sample file */ break; case 24: for (i = 0; i < width; i++, buf += 3) { tmp = *buf; *buf = *(buf + 2); *(buf + 2) = tmp; } break; case 32: { char *buf1 = buf; for (i = 0; i < width; i++, buf += 4) { tmp = *buf; *buf1++ = *(buf + 2); *buf1++ = *(buf + 1); *buf1++ = tmp; } } break; default: break; } } static int processCompressOptions(char* opt) { if (strcmp(opt, "none") == 0) compression = COMPRESSION_NONE; else if (strcmp(opt, "packbits") == 0) compression = COMPRESSION_PACKBITS; else if (strncmp(opt, "jpeg", 4) == 0) { char* cp = strchr(opt, ':'); compression = COMPRESSION_JPEG; while( cp ) { if (isdigit((int)cp[1])) quality = atoi(cp+1); else if (cp[1] == 'r' ) jpegcolormode = JPEGCOLORMODE_RAW; else usage(); cp = strchr(cp+1,':'); } } else if (strncmp(opt, "lzw", 3) == 0) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_LZW; } else if (strncmp(opt, "zip", 3) == 0) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_DEFLATE; } else return (0); return (1); } static char* stuff[] = { "bmp2tiff --- convert Windows BMP files to TIFF", "usage: bmp2tiff [options] input.bmp [input2.bmp ...] output.tif", "where options are:", " -r # make each strip have no more than # rows", "", " -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", " -c zip[:opts] compress output with deflate encoding", " -c jpeg[:opts]compress output with JPEG encoding", " -c packbits compress output with packbits encoding", " -c none use no compression algorithm on output", "", "JPEG options:", " # set compression quality level (0-100, default 75)", " r output color image as RGB rather than YCbCr", "For example, -c jpeg:r:50 to get JPEG-encoded RGB data with 50% comp. quality", "", "LZW and deflate options:", " # set predictor value", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", " -o out.tif write output to out.tif", " -h this help message", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/tiff2bw.c0000644000212300117540000003155611415374160012252 00000000000000/* $Id: tiff2bw.c,v 1.15 2010-07-02 12:02:56 dron Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" #define streq(a,b) (strcmp((a),(b)) == 0) #define strneq(a,b,n) (strncmp(a,b,n) == 0) /* x% weighting -> fraction of full color */ #define PCT(x) (((x)*255+127)/100) int RED = PCT(30); /* 30% */ int GREEN = PCT(59); /* 59% */ int BLUE = PCT(11); /* 11% */ static void usage(void); static int processCompressOptions(char*); static void compresscontig(unsigned char* out, unsigned char* rgb, uint32 n) { register int v, red = RED, green = GREEN, blue = BLUE; while (n-- > 0) { v = red*(*rgb++); v += green*(*rgb++); v += blue*(*rgb++); *out++ = v>>8; } } static void compresssep(unsigned char* out, unsigned char* r, unsigned char* g, unsigned char* b, uint32 n) { register uint32 red = RED, green = GREEN, blue = BLUE; while (n-- > 0) *out++ = (unsigned char) ((red*(*r++) + green*(*g++) + blue*(*b++)) >> 8); } static int checkcmap(TIFF* tif, int n, uint16* r, uint16* g, uint16* b) { while (n-- > 0) if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256) return (16); TIFFWarning(TIFFFileName(tif), "Assuming 8-bit colormap"); return (8); } static void compresspalette(unsigned char* out, unsigned char* data, uint32 n, uint16* rmap, uint16* gmap, uint16* bmap) { register int v, red = RED, green = GREEN, blue = BLUE; while (n-- > 0) { unsigned int ix = *data++; v = red*rmap[ix]; v += green*gmap[ix]; v += blue*bmap[ix]; *out++ = v>>8; } } static uint16 compression = (uint16) -1; static uint16 predictor = 0; static int jpegcolormode = JPEGCOLORMODE_RGB; static int quality = 75; /* JPEG quality */ static void cpTags(TIFF* in, TIFF* out); int main(int argc, char* argv[]) { uint32 rowsperstrip = (uint32) -1; TIFF *in, *out; uint32 w, h; uint16 samplesperpixel; uint16 bitspersample; uint16 config; uint16 photometric; uint16* red; uint16* green; uint16* blue; tsize_t rowsize; register uint32 row; register tsample_t s; unsigned char *inbuf, *outbuf; char thing[1024]; int c; extern int optind; extern char *optarg; while ((c = getopt(argc, argv, "c:r:R:G:B:")) != -1) switch (c) { case 'c': /* compression scheme */ if (!processCompressOptions(optarg)) usage(); break; case 'r': /* rows/strip */ rowsperstrip = atoi(optarg); break; case 'R': RED = PCT(atoi(optarg)); break; case 'G': GREEN = PCT(atoi(optarg)); break; case 'B': BLUE = PCT(atoi(optarg)); break; case '?': usage(); /*NOTREACHED*/ } if (argc - optind < 2) usage(); in = TIFFOpen(argv[optind], "r"); if (in == NULL) return (-1); photometric = 0; TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &photometric); if (photometric != PHOTOMETRIC_RGB && photometric != PHOTOMETRIC_PALETTE ) { fprintf(stderr, "%s: Bad photometric; can only handle RGB and Palette images.\n", argv[optind]); return (-1); } TIFFGetField(in, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel); if (samplesperpixel != 1 && samplesperpixel != 3) { fprintf(stderr, "%s: Bad samples/pixel %u.\n", argv[optind], samplesperpixel); return (-1); } TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bitspersample); if (bitspersample != 8) { fprintf(stderr, " %s: Sorry, only handle 8-bit samples.\n", argv[optind]); return (-1); } TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &w); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &h); TIFFGetField(in, TIFFTAG_PLANARCONFIG, &config); out = TIFFOpen(argv[optind+1], "w"); if (out == NULL) return (-1); TIFFSetField(out, TIFFTAG_IMAGEWIDTH, w); TIFFSetField(out, TIFFTAG_IMAGELENGTH, h); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); cpTags(in, out); if (compression != (uint16) -1) { TIFFSetField(out, TIFFTAG_COMPRESSION, compression); switch (compression) { case COMPRESSION_JPEG: TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality); TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode); break; case COMPRESSION_LZW: case COMPRESSION_DEFLATE: if (predictor != 0) TIFFSetField(out, TIFFTAG_PREDICTOR, predictor); break; } } TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); sprintf(thing, "B&W version of %s", argv[optind]); TIFFSetField(out, TIFFTAG_IMAGEDESCRIPTION, thing); TIFFSetField(out, TIFFTAG_SOFTWARE, "tiff2bw"); outbuf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(out)); TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(out, rowsperstrip)); #define pack(a,b) ((a)<<8 | (b)) switch (pack(photometric, config)) { case pack(PHOTOMETRIC_PALETTE, PLANARCONFIG_CONTIG): case pack(PHOTOMETRIC_PALETTE, PLANARCONFIG_SEPARATE): TIFFGetField(in, TIFFTAG_COLORMAP, &red, &green, &blue); /* * Convert 16-bit colormap to 8-bit (unless it looks * like an old-style 8-bit colormap). */ if (checkcmap(in, 1<= 0; i--) { red[i] = CVT(red[i]); green[i] = CVT(green[i]); blue[i] = CVT(blue[i]); } #undef CVT } inbuf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(in)); for (row = 0; row < h; row++) { if (TIFFReadScanline(in, inbuf, row, 0) < 0) break; compresspalette(outbuf, inbuf, w, red, green, blue); if (TIFFWriteScanline(out, outbuf, row, 0) < 0) break; } break; case pack(PHOTOMETRIC_RGB, PLANARCONFIG_CONTIG): inbuf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(in)); for (row = 0; row < h; row++) { if (TIFFReadScanline(in, inbuf, row, 0) < 0) break; compresscontig(outbuf, inbuf, w); if (TIFFWriteScanline(out, outbuf, row, 0) < 0) break; } break; case pack(PHOTOMETRIC_RGB, PLANARCONFIG_SEPARATE): rowsize = TIFFScanlineSize(in); inbuf = (unsigned char *)_TIFFmalloc(3*rowsize); for (row = 0; row < h; row++) { for (s = 0; s < 3; s++) if (TIFFReadScanline(in, inbuf+s*rowsize, row, s) < 0) return (-1); compresssep(outbuf, inbuf, inbuf+rowsize, inbuf+2*rowsize, w); if (TIFFWriteScanline(out, outbuf, row, 0) < 0) break; } break; } #undef pack TIFFClose(out); return (0); } static int processCompressOptions(char* opt) { if (streq(opt, "none")) compression = COMPRESSION_NONE; else if (streq(opt, "packbits")) compression = COMPRESSION_PACKBITS; else if (strneq(opt, "jpeg", 4)) { char* cp = strchr(opt, ':'); compression = COMPRESSION_JPEG; while( cp ) { if (isdigit((int)cp[1])) quality = atoi(cp+1); else if (cp[1] == 'r' ) jpegcolormode = JPEGCOLORMODE_RAW; else usage(); cp = strchr(cp+1,':'); } } else if (strneq(opt, "lzw", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_LZW; } else if (strneq(opt, "zip", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_DEFLATE; } else return (0); return (1); } #define CopyField(tag, v) \ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) #define CopyField2(tag, v1, v2) \ if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2) #define CopyField3(tag, v1, v2, v3) \ if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3) #define CopyField4(tag, v1, v2, v3, v4) \ if (TIFFGetField(in, tag, &v1, &v2, &v3, &v4)) TIFFSetField(out, tag, v1, v2, v3, v4) static void cpTag(TIFF* in, TIFF* out, uint16 tag, uint16 count, TIFFDataType type) { switch (type) { case TIFF_SHORT: if (count == 1) { uint16 shortv; CopyField(tag, shortv); } else if (count == 2) { uint16 shortv1, shortv2; CopyField2(tag, shortv1, shortv2); } else if (count == 4) { uint16 *tr, *tg, *tb, *ta; CopyField4(tag, tr, tg, tb, ta); } else if (count == (uint16) -1) { uint16 shortv1; uint16* shortav; CopyField2(tag, shortv1, shortav); } break; case TIFF_LONG: { uint32 longv; CopyField(tag, longv); } break; case TIFF_RATIONAL: if (count == 1) { float floatv; CopyField(tag, floatv); } else if (count == (uint16) -1) { float* floatav; CopyField(tag, floatav); } break; case TIFF_ASCII: { char* stringv; CopyField(tag, stringv); } break; case TIFF_DOUBLE: if (count == 1) { double doublev; CopyField(tag, doublev); } else if (count == (uint16) -1) { double* doubleav; CopyField(tag, doubleav); } break; default: TIFFError(TIFFFileName(in), "Data type %d is not supported, tag %d skipped.", tag, type); } } #undef CopyField4 #undef CopyField3 #undef CopyField2 #undef CopyField static struct cpTag { uint16 tag; uint16 count; TIFFDataType type; } tags[] = { { TIFFTAG_SUBFILETYPE, 1, TIFF_LONG }, { TIFFTAG_THRESHHOLDING, 1, TIFF_SHORT }, { TIFFTAG_DOCUMENTNAME, 1, TIFF_ASCII }, { TIFFTAG_IMAGEDESCRIPTION, 1, TIFF_ASCII }, { TIFFTAG_MAKE, 1, TIFF_ASCII }, { TIFFTAG_MODEL, 1, TIFF_ASCII }, { TIFFTAG_MINSAMPLEVALUE, 1, TIFF_SHORT }, { TIFFTAG_MAXSAMPLEVALUE, 1, TIFF_SHORT }, { TIFFTAG_XRESOLUTION, 1, TIFF_RATIONAL }, { TIFFTAG_YRESOLUTION, 1, TIFF_RATIONAL }, { TIFFTAG_PAGENAME, 1, TIFF_ASCII }, { TIFFTAG_XPOSITION, 1, TIFF_RATIONAL }, { TIFFTAG_YPOSITION, 1, TIFF_RATIONAL }, { TIFFTAG_RESOLUTIONUNIT, 1, TIFF_SHORT }, { TIFFTAG_SOFTWARE, 1, TIFF_ASCII }, { TIFFTAG_DATETIME, 1, TIFF_ASCII }, { TIFFTAG_ARTIST, 1, TIFF_ASCII }, { TIFFTAG_HOSTCOMPUTER, 1, TIFF_ASCII }, { TIFFTAG_WHITEPOINT, 2, TIFF_RATIONAL }, { TIFFTAG_PRIMARYCHROMATICITIES,(uint16) -1,TIFF_RATIONAL }, { TIFFTAG_HALFTONEHINTS, 2, TIFF_SHORT }, { TIFFTAG_INKSET, 1, TIFF_SHORT }, { TIFFTAG_DOTRANGE, 2, TIFF_SHORT }, { TIFFTAG_TARGETPRINTER, 1, TIFF_ASCII }, { TIFFTAG_SAMPLEFORMAT, 1, TIFF_SHORT }, { TIFFTAG_YCBCRCOEFFICIENTS, (uint16) -1,TIFF_RATIONAL }, { TIFFTAG_YCBCRSUBSAMPLING, 2, TIFF_SHORT }, { TIFFTAG_YCBCRPOSITIONING, 1, TIFF_SHORT }, { TIFFTAG_REFERENCEBLACKWHITE, (uint16) -1,TIFF_RATIONAL }, { TIFFTAG_EXTRASAMPLES, (uint16) -1, TIFF_SHORT }, { TIFFTAG_SMINSAMPLEVALUE, 1, TIFF_DOUBLE }, { TIFFTAG_SMAXSAMPLEVALUE, 1, TIFF_DOUBLE }, { TIFFTAG_STONITS, 1, TIFF_DOUBLE }, }; #define NTAGS (sizeof (tags) / sizeof (tags[0])) static void cpTags(TIFF* in, TIFF* out) { struct cpTag *p; for (p = tags; p < &tags[NTAGS]; p++) cpTag(in, out, p->tag, p->count, p->type); } #undef NTAGS char* stuff[] = { "usage: tiff2bw [options] input.tif output.tif", "where options are:", " -R % use #% from red channel", " -G % use #% from green channel", " -B % use #% from blue channel", "", " -r # make each strip have no more than # rows", "", " -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", " -c zip[:opts] compress output with deflate encoding", " -c packbits compress output with packbits encoding", " -c g3[:opts] compress output with CCITT Group 3 encoding", " -c g4 compress output with CCITT Group 4 encoding", " -c none use no compression algorithm on output", "", "LZW and deflate options:", " # set predictor value", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/sgi2tiff.c0000644000212300117540000002147411345765561012435 00000000000000/* $Id: sgi2tiff.c,v 1.6 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include #include #include #include #include #include "tiffio.h" #define streq(a,b) (strcmp(a,b) == 0) #define strneq(a,b,n) (strncmp(a,b,n) == 0) static short config = PLANARCONFIG_CONTIG; static uint16 compression = COMPRESSION_PACKBITS; static uint16 predictor = 0; static uint16 fillorder = 0; static uint32 rowsperstrip = (uint32) -1; static int jpegcolormode = JPEGCOLORMODE_RGB; static int quality = 75; /* JPEG quality */ static uint16 photometric; static void usage(void); static int cpContig(IMAGE*, TIFF*); static int cpSeparate(IMAGE*, TIFF*); static int processCompressOptions(char*); /* XXX image library has no prototypes */ extern IMAGE* iopen(const char*, const char*); extern void iclose(IMAGE*); extern void getrow(IMAGE*, short*, int, int); int main(int argc, char* argv[]) { IMAGE *in; TIFF *out; int c; extern int optind; extern char* optarg; while ((c = getopt(argc, argv, "c:p:r:")) != -1) switch (c) { case 'c': /* compression scheme */ if (!processCompressOptions(optarg)) usage(); break; case 'f': /* fill order */ if (streq(optarg, "lsb2msb")) fillorder = FILLORDER_LSB2MSB; else if (streq(optarg, "msb2lsb")) fillorder = FILLORDER_MSB2LSB; else usage(); break; case 'p': /* planar configuration */ if (streq(optarg, "separate")) config = PLANARCONFIG_SEPARATE; else if (streq(optarg, "contig")) config = PLANARCONFIG_CONTIG; else usage(); break; case 'r': /* rows/strip */ rowsperstrip = atoi(optarg); break; case '?': usage(); /*NOTREACHED*/ } if (argc - optind != 2) usage(); in = iopen(argv[optind], "r"); if (in == NULL) return (-1); out = TIFFOpen(argv[optind+1], "w"); if (out == NULL) return (-2); TIFFSetField(out, TIFFTAG_IMAGEWIDTH, (uint32) in->xsize); TIFFSetField(out, TIFFTAG_IMAGELENGTH, (uint32) in->ysize); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(out, TIFFTAG_COMPRESSION, compression); if (in->zsize == 1) photometric = PHOTOMETRIC_MINISBLACK; else photometric = PHOTOMETRIC_RGB; switch (compression) { case COMPRESSION_JPEG: if (photometric == PHOTOMETRIC_RGB && jpegcolormode == JPEGCOLORMODE_RGB) photometric = PHOTOMETRIC_YCBCR; TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality); TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode); break; case COMPRESSION_LZW: case COMPRESSION_DEFLATE: if (predictor != 0) TIFFSetField(out, TIFFTAG_PREDICTOR, predictor); break; } TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric); if (fillorder != 0) TIFFSetField(out, TIFFTAG_FILLORDER, fillorder); TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, in->zsize); if (in->zsize > 3) { uint16 v[1]; v[0] = EXTRASAMPLE_UNASSALPHA; TIFFSetField(out, TIFFTAG_EXTRASAMPLES, 1, v); } TIFFSetField(out, TIFFTAG_MINSAMPLEVALUE, (uint16) in->min); TIFFSetField(out, TIFFTAG_MAXSAMPLEVALUE, (uint16) in->max); TIFFSetField(out, TIFFTAG_PLANARCONFIG, config); if (config != PLANARCONFIG_SEPARATE) TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(out, rowsperstrip)); else /* force 1 row/strip for library limitation */ TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, 1L); if (in->name[0] != '\0') TIFFSetField(out, TIFFTAG_IMAGEDESCRIPTION, in->name); if (config == PLANARCONFIG_CONTIG) cpContig(in, out); else cpSeparate(in, out); (void) iclose(in); (void) TIFFClose(out); return (0); } static int processCompressOptions(char* opt) { if (streq(opt, "none")) compression = COMPRESSION_NONE; else if (streq(opt, "packbits")) compression = COMPRESSION_PACKBITS; else if (strneq(opt, "jpeg", 4)) { char* cp = strchr(opt, ':'); defcompression = COMPRESSION_JPEG; while( cp ) { if (isdigit((int)cp[1])) quality = atoi(cp+1); else if (cp[1] == 'r' ) jpegcolormode = JPEGCOLORMODE_RAW; else usage(); cp = strchr(cp+1,':'); } } else if (strneq(opt, "lzw", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_LZW; } else if (strneq(opt, "zip", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_DEFLATE; } else return (0); return (1); } static int cpContig(IMAGE* in, TIFF* out) { tdata_t buf = _TIFFmalloc(TIFFScanlineSize(out)); short *r = NULL; int x, y; if (in->zsize == 3) { short *g, *b; r = (short *)_TIFFmalloc(3 * in->xsize * sizeof (short)); g = r + in->xsize; b = g + in->xsize; for (y = in->ysize-1; y >= 0; y--) { uint8* pp = (uint8*) buf; getrow(in, r, y, 0); getrow(in, g, y, 1); getrow(in, b, y, 2); for (x = 0; x < in->xsize; x++) { pp[0] = r[x]; pp[1] = g[x]; pp[2] = b[x]; pp += 3; } if (TIFFWriteScanline(out, buf, in->ysize-y-1, 0) < 0) goto bad; } } else if (in->zsize == 4) { short *g, *b, *a; r = (short *)_TIFFmalloc(4 * in->xsize * sizeof (short)); g = r + in->xsize; b = g + in->xsize; a = b + in->xsize; for (y = in->ysize-1; y >= 0; y--) { uint8* pp = (uint8*) buf; getrow(in, r, y, 0); getrow(in, g, y, 1); getrow(in, b, y, 2); getrow(in, a, y, 3); for (x = 0; x < in->xsize; x++) { pp[0] = r[x]; pp[1] = g[x]; pp[2] = b[x]; pp[3] = a[x]; pp += 4; } if (TIFFWriteScanline(out, buf, in->ysize-y-1, 0) < 0) goto bad; } } else { uint8* pp = (uint8*) buf; r = (short *)_TIFFmalloc(in->xsize * sizeof (short)); for (y = in->ysize-1; y >= 0; y--) { getrow(in, r, y, 0); for (x = in->xsize-1; x >= 0; x--) pp[x] = r[x]; if (TIFFWriteScanline(out, buf, in->ysize-y-1, 0) < 0) goto bad; } } if (r) _TIFFfree(r); _TIFFfree(buf); return (1); bad: if (r) _TIFFfree(r); _TIFFfree(buf); return (0); } static int cpSeparate(IMAGE* in, TIFF* out) { tdata_t buf = _TIFFmalloc(TIFFScanlineSize(out)); short *r = (short *)_TIFFmalloc(in->xsize * sizeof (short)); uint8* pp = (uint8*) buf; int x, y, z; for (z = 0; z < in->zsize; z++) { for (y = in->ysize-1; y >= 0; y--) { getrow(in, r, y, z); for (x = 0; x < in->xsize; x++) pp[x] = r[x]; if (TIFFWriteScanline(out, buf, in->ysize-y-1, z) < 0) goto bad; } } _TIFFfree(r); _TIFFfree(buf); return (1); bad: _TIFFfree(r); _TIFFfree(buf); return (0); } char* stuff[] = { "usage: sgi2tiff [options] input.rgb output.tif", "where options are:", " -r # make each strip have no more than # rows", "", " -p contig pack samples contiguously (e.g. RGBRGB...)", " -p separate store samples separately (e.g. RRR...GGG...BBB...)", "", " -f lsb2msb force lsb-to-msb FillOrder for output", " -f msb2lsb force msb-to-lsb FillOrder for output", "", " -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", " -c zip[:opts] compress output with deflate encoding", " -c jpeg[:opts]compress output with JPEG encoding", " -c packbits compress output with packbits encoding", " -c none use no compression algorithm on output", "", "JPEG options:", " # set compression quality level (0-100, default 75)", " r output color image as RGB rather than YCbCr", "", "LZW and deflate options:", " # set predictor value", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/sgisv.c0000644000212300117540000002074011345765561012046 00000000000000/* $Id: sgisv.c,v 1.6 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1990-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include #include #include #include #include #include "tiffio.h" typedef unsigned char unsigned char; typedef unsigned long uint32; #define streq(a,b) (strcmp(a,b) == 0) #define strneq(a,b,n) (strncmp(a,b,n) == 0) uint32 rowsperstrip = (uint32) -1; uint16 compression = COMPRESSION_PACKBITS; uint16 config = PLANARCONFIG_CONTIG; uint16 predictor = 0; int xmaxscreen; int ymaxscreen; uint16 photometric = PHOTOMETRIC_RGB; int jpegcolormode = JPEGCOLORMODE_RGB; int quality = 75; /* JPEG quality */ static void usage(void); static void tiffsv(char*, int, int, int, int); int main(int argc, char* argv[]) { int c; extern int optind; extern char* optarg; while ((c = getopt(argc, argv, "c:p:r:")) != -1) switch (c) { case 'b': /* save as b&w */ photometric = PHOTOMETRIC_MINISBLACK; break; case 'c': /* compression scheme */ if (streq(optarg, "none")) compression = COMPRESSION_NONE; else if (streq(optarg, "packbits")) compression = COMPRESSION_PACKBITS; else if (strneq(optarg, "jpeg", 4)) { char* cp = strchr(optarg, ':'); if (cp && isdigit(cp[1])) quality = atoi(cp+1); if (cp && strchr(cp, 'r')) jpegcolormode = JPEGCOLORMODE_RAW; compression = COMPRESSION_JPEG; } else if (strneq(optarg, "lzw", 3)) { char* cp = strchr(optarg, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_LZW; } else usage(); break; case 'p': /* planar configuration */ if (streq(optarg, "separate")) config = PLANARCONFIG_SEPARATE; else if (streq(optarg, "contig")) config = PLANARCONFIG_CONTIG; else usage(); break; case 'r': /* rows/strip */ rowsperstrip = atoi(optarg); break; case '?': usage(); /*NOTREACHED*/ } if (argc - optind != 1 && argc - optind != 5) usage(); xmaxscreen = getgdesc(GD_XPMAX)-1; ymaxscreen = getgdesc(GD_YPMAX)-1; foreground(); noport(); winopen("tiffsv"); if (argc - optind == 5) tiffsv(argv[optind], atoi(argv[optind+1]), atoi(argv[optind+2]), atoi(argv[optind+3]), atoi(argv[optind+4])); else tiffsv(argv[optind], 0, xmaxscreen, 0, ymaxscreen); return (0); } char* stuff[] = { "usage: tiffsv [options] outimage.tif [x1 x2 y1 y2] [-b]", "where options are:", " -p contig pack samples contiguously (e.g. RGBRGB...)", " -p separate store samples separately (e.g. RRR...GGG...BBB...)", "", " -r # make each strip have no more than # rows", "", " -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", " -c jpeg[:opts]compress output with JPEG encoding", " -c packbits compress output with packbits encoding", " -c none use no compression algorithm on output", "", "JPEG options:", " # set compression quality level (0-100, default 75)", " r output color image as RGB rather than YCbCr", "", "LZW options:", " # set predictor value for Lempel-Ziv & Welch encoding", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } static void svRGBSeparate(TIFF* tif, uint32* ss, int xsize, int ysize) { tsize_t stripsize = TIFFStripSize(tif); unsigned char *rbuf = (unsigned char *)_TIFFmalloc(3*stripsize); unsigned char *gbuf = rbuf + stripsize; unsigned char *bbuf = gbuf + stripsize; register int y; for (y = 0; y <= ysize; y += rowsperstrip) { unsigned char *rp, *gp, *bp; register int x; register uint32 n; n = rowsperstrip; if (n > ysize-y+1) n = ysize-y+1; rp = rbuf; gp = gbuf; bp = bbuf; do { for (x = 0; x <= xsize; x++) { uint32 v = ss[x]; rp[x] = v; gp[x] = v >> 8; bp[x] = v >> 16; } rp += xsize+1, gp += xsize+1, bp += xsize+1; ss += xsize+1; } while (--n); if (TIFFWriteEncodedStrip(tif, TIFFComputeStrip(tif,y,0), rbuf, stripsize) < 0) break; if (TIFFWriteEncodedStrip(tif, TIFFComputeStrip(tif,y,1), gbuf, stripsize) < 0) break; if (TIFFWriteEncodedStrip(tif, TIFFComputeStrip(tif,y,2), bbuf, stripsize) < 0) break; } _TIFFfree(rbuf); } static void svRGBContig(TIFF* tif, uint32* ss, int xsize, int ysize) { register int x, y; tsize_t stripsize = TIFFStripSize(tif); unsigned char *strip = (unsigned char *)_TIFFmalloc(stripsize); for (y = 0; y <= ysize; y += rowsperstrip) { register unsigned char *pp = strip; register uint32 n; n = rowsperstrip; if (n > ysize-y+1) n = ysize-y+1; do { for (x = 0; x <= xsize; x++) { uint32 v = ss[x]; pp[0] = v; pp[1] = v >> 8; pp[2] = v >> 16; pp += 3; } ss += xsize+1; } while (--n); if (TIFFWriteEncodedStrip(tif, TIFFComputeStrip(tif,y,0), strip, stripsize) < 0) break; } _TIFFfree(strip); } #undef RED #undef GREEN #undef BLUE #define CVT(x) (((x)*255)/100) #define RED CVT(28) /* 28% */ #define GREEN CVT(59) /* 59% */ #define BLUE CVT(11) /* 11% */ static void svGrey(TIFF* tif, uint32* ss, int xsize, int ysize) { register int x, y; unsigned char *buf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(tif)); for (y = 0; y <= ysize; y++) { for (x = 0; x <= xsize; x++) { unsigned char *cp = (unsigned char *)&ss[x]; buf[x] = (RED*cp[3] + GREEN*cp[2] + BLUE*cp[1]) >> 8; } if (TIFFWriteScanline(tif, buf, (uint32) y, 0) < 0) break; ss += xsize+1; } _TIFFfree(buf); } #define MIN(a,b) ((a)<(b)?(a):(b)) #define ABS(x) ((x)<0?-(x):(x)) static void tiffsv(char* name, int x1, int x2, int y1, int y2) { TIFF *tif; int xsize, ysize; int xorg, yorg; uint32 *scrbuf; xorg = MIN(x1,x2); yorg = MIN(y1,y2); if (xorg<0) xorg = 0; if (yorg<0) yorg = 0; xsize = ABS(x2-x1); ysize = ABS(y2-y1); if (xorg+xsize > xmaxscreen) xsize = xmaxscreen-xorg; if (yorg+ysize > ymaxscreen) ysize = ymaxscreen-yorg; tif = TIFFOpen(name, "w"); TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, (uint32) (xsize+1)); TIFFSetField(tif, TIFFTAG_IMAGELENGTH, (uint32) (ysize+1)); TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, photometric == PHOTOMETRIC_RGB ? 3 : 1); TIFFSetField(tif, TIFFTAG_PLANARCONFIG, config); TIFFSetField(tif, TIFFTAG_COMPRESSION, compression); switch (compression) { case COMPRESSION_JPEG: if (photometric == PHOTOMETRIC_RGB && jpegcolormode == JPEGCOLORMODE_RGB) photometric = PHOTOMETRIC_YCBCR; TIFFSetField(tif, TIFFTAG_JPEGQUALITY, quality); TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE, jpegcolormode); break; case COMPRESSION_LZW: if (predictor != 0) TIFFSetField(tif, TIFFTAG_PREDICTOR, predictor); break; } TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photometric); TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_BOTLEFT); rowsperstrip = TIFFDefaultStripSize(tif, rowsperstrip); TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip); scrbuf = (uint32 *)_TIFFmalloc((xsize+1)*(ysize+1)*sizeof (uint32)); readdisplay(xorg, yorg, xorg+xsize, yorg+ysize, scrbuf, RD_FREEZE); if (photometric == PHOTOMETRIC_RGB) { if (config == PLANARCONFIG_SEPARATE) svRGBSeparate(tif, scrbuf, xsize, ysize); else svRGBContig(tif, scrbuf, xsize, ysize); } else svGrey(tif, scrbuf, xsize, ysize); (void) TIFFClose(tif); _TIFFfree((char *)scrbuf); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/ppm2tiff.c0000644000212300117540000002243611360147772012441 00000000000000/* $Id: ppm2tiff.c,v 1.16 2010-04-10 19:22:34 bfriesen Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_IO_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" #ifndef HAVE_GETOPT extern int getopt(int, char**, char*); #endif #define streq(a,b) (strcmp(a,b) == 0) #define strneq(a,b,n) (strncmp(a,b,n) == 0) static uint16 compression = COMPRESSION_PACKBITS; static uint16 predictor = 0; static int quality = 75; /* JPEG quality */ static int jpegcolormode = JPEGCOLORMODE_RGB; static uint32 g3opts; static void usage(void); static int processCompressOptions(char*); static void BadPPM(char* file) { fprintf(stderr, "%s: Not a PPM file.\n", file); exit(-2); } int main(int argc, char* argv[]) { uint16 photometric = 0; uint32 rowsperstrip = (uint32) -1; double resolution = -1; unsigned char *buf = NULL; tsize_t linebytes = 0; uint16 spp = 1; uint16 bpp = 8; TIFF *out; FILE *in; unsigned int w, h, prec, row; char *infile; int c; extern int optind; extern char* optarg; if (argc < 2) { fprintf(stderr, "%s: Too few arguments\n", argv[0]); usage(); } while ((c = getopt(argc, argv, "c:r:R:")) != -1) switch (c) { case 'c': /* compression scheme */ if (!processCompressOptions(optarg)) usage(); break; case 'r': /* rows/strip */ rowsperstrip = atoi(optarg); break; case 'R': /* resolution */ resolution = atof(optarg); break; case '?': usage(); /*NOTREACHED*/ } if (optind + 2 < argc) { fprintf(stderr, "%s: Too many arguments\n", argv[0]); usage(); } /* * If only one file is specified, read input from * stdin; otherwise usage is: ppm2tiff input output. */ if (argc - optind > 1) { infile = argv[optind++]; in = fopen(infile, "rb"); if (in == NULL) { fprintf(stderr, "%s: Can not open.\n", infile); return (-1); } } else { infile = ""; in = stdin; #if defined(HAVE_SETMODE) && defined(O_BINARY) setmode(fileno(stdin), O_BINARY); #endif } if (fgetc(in) != 'P') BadPPM(infile); switch (fgetc(in)) { case '4': /* it's a PBM file */ bpp = 1; spp = 1; photometric = PHOTOMETRIC_MINISWHITE; break; case '5': /* it's a PGM file */ bpp = 8; spp = 1; photometric = PHOTOMETRIC_MINISBLACK; break; case '6': /* it's a PPM file */ bpp = 8; spp = 3; photometric = PHOTOMETRIC_RGB; if (compression == COMPRESSION_JPEG && jpegcolormode == JPEGCOLORMODE_RGB) photometric = PHOTOMETRIC_YCBCR; break; default: BadPPM(infile); } /* Parse header */ while(1) { if (feof(in)) BadPPM(infile); c = fgetc(in); /* Skip whitespaces (blanks, TABs, CRs, LFs) */ if (strchr(" \t\r\n", c)) continue; /* Check for comment line */ if (c == '#') { do { c = fgetc(in); } while(!(strchr("\r\n", c) || feof(in))); continue; } ungetc(c, in); break; } switch (bpp) { case 1: if (fscanf(in, " %u %u", &w, &h) != 2) BadPPM(infile); if (fgetc(in) != '\n') BadPPM(infile); break; case 8: if (fscanf(in, " %u %u %u", &w, &h, &prec) != 3) BadPPM(infile); if (fgetc(in) != '\n' || prec != 255) BadPPM(infile); break; } out = TIFFOpen(argv[optind], "w"); if (out == NULL) return (-4); TIFFSetField(out, TIFFTAG_IMAGEWIDTH, (uint32) w); TIFFSetField(out, TIFFTAG_IMAGELENGTH, (uint32) h); TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, spp); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, bpp); TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric); TIFFSetField(out, TIFFTAG_COMPRESSION, compression); switch (compression) { case COMPRESSION_JPEG: TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality); TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode); break; case COMPRESSION_LZW: case COMPRESSION_DEFLATE: if (predictor != 0) TIFFSetField(out, TIFFTAG_PREDICTOR, predictor); break; case COMPRESSION_CCITTFAX3: TIFFSetField(out, TIFFTAG_GROUP3OPTIONS, g3opts); break; } switch (bpp) { case 1: linebytes = (spp * w + (8 - 1)) / 8; if (rowsperstrip == (uint32) -1) { TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, h); } else { TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(out, rowsperstrip)); } break; case 8: linebytes = spp * w; TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(out, rowsperstrip)); break; } if (TIFFScanlineSize(out) > linebytes) buf = (unsigned char *)_TIFFmalloc(linebytes); else buf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(out)); if (resolution > 0) { TIFFSetField(out, TIFFTAG_XRESOLUTION, resolution); TIFFSetField(out, TIFFTAG_YRESOLUTION, resolution); TIFFSetField(out, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); } for (row = 0; row < h; row++) { if (fread(buf, linebytes, 1, in) != 1) { fprintf(stderr, "%s: scanline %lu: Read error.\n", infile, (unsigned long) row); break; } if (TIFFWriteScanline(out, buf, row, 0) < 0) break; } (void) TIFFClose(out); if (buf) _TIFFfree(buf); return (0); } static void processG3Options(char* cp) { g3opts = 0; if( (cp = strchr(cp, ':')) ) { do { cp++; if (strneq(cp, "1d", 2)) g3opts &= ~GROUP3OPT_2DENCODING; else if (strneq(cp, "2d", 2)) g3opts |= GROUP3OPT_2DENCODING; else if (strneq(cp, "fill", 4)) g3opts |= GROUP3OPT_FILLBITS; else usage(); } while( (cp = strchr(cp, ':')) ); } } static int processCompressOptions(char* opt) { if (streq(opt, "none")) compression = COMPRESSION_NONE; else if (streq(opt, "packbits")) compression = COMPRESSION_PACKBITS; else if (strneq(opt, "jpeg", 4)) { char* cp = strchr(opt, ':'); compression = COMPRESSION_JPEG; while (cp) { if (isdigit((int)cp[1])) quality = atoi(cp+1); else if (cp[1] == 'r' ) jpegcolormode = JPEGCOLORMODE_RAW; else usage(); cp = strchr(cp+1,':'); } } else if (strneq(opt, "g3", 2)) { processG3Options(opt); compression = COMPRESSION_CCITTFAX3; } else if (streq(opt, "g4")) { compression = COMPRESSION_CCITTFAX4; } else if (strneq(opt, "lzw", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_LZW; } else if (strneq(opt, "zip", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_DEFLATE; } else return (0); return (1); } char* stuff[] = { "usage: ppm2tiff [options] input.ppm output.tif", "where options are:", " -r # make each strip have no more than # rows", " -R # set x&y resolution (dpi)", "", " -c jpeg[:opts] compress output with JPEG encoding", " -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", " -c zip[:opts] compress output with deflate encoding", " -c packbits compress output with packbits encoding (the default)", " -c g3[:opts] compress output with CCITT Group 3 encoding", " -c g4 compress output with CCITT Group 4 encoding", " -c none use no compression algorithm on output", "", "JPEG options:", " # set compression quality level (0-100, default 75)", " r output color image as RGB rather than YCbCr", "LZW and deflate options:", " # set predictor value", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/Makefile.in0000644000212300117540000010601512027361163012600 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = bmp2tiff$(EXEEXT) fax2ps$(EXEEXT) fax2tiff$(EXEEXT) \ gif2tiff$(EXEEXT) pal2rgb$(EXEEXT) ppm2tiff$(EXEEXT) \ ras2tiff$(EXEEXT) raw2tiff$(EXEEXT) rgb2ycbcr$(EXEEXT) \ thumbnail$(EXEEXT) tiff2bw$(EXEEXT) tiff2pdf$(EXEEXT) \ tiff2ps$(EXEEXT) tiff2rgba$(EXEEXT) tiffcmp$(EXEEXT) \ tiffcp$(EXEEXT) tiffcrop$(EXEEXT) tiffdither$(EXEEXT) \ tiffdump$(EXEEXT) tiffinfo$(EXEEXT) tiffmedian$(EXEEXT) \ tiffset$(EXEEXT) tiffsplit$(EXEEXT) $(am__EXEEXT_1) @HAVE_OPENGL_TRUE@am__append_1 = tiffgt EXTRA_PROGRAMS = sgi2tiff$(EXEEXT) sgisv$(EXEEXT) ycbcr$(EXEEXT) subdir = tools DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_OPENGL_TRUE@am__EXEEXT_1 = tiffgt$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_bmp2tiff_OBJECTS = bmp2tiff.$(OBJEXT) bmp2tiff_OBJECTS = $(am_bmp2tiff_OBJECTS) bmp2tiff_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_fax2ps_OBJECTS = fax2ps.$(OBJEXT) fax2ps_OBJECTS = $(am_fax2ps_OBJECTS) fax2ps_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_fax2tiff_OBJECTS = fax2tiff.$(OBJEXT) fax2tiff_OBJECTS = $(am_fax2tiff_OBJECTS) fax2tiff_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_gif2tiff_OBJECTS = gif2tiff.$(OBJEXT) gif2tiff_OBJECTS = $(am_gif2tiff_OBJECTS) gif2tiff_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_pal2rgb_OBJECTS = pal2rgb.$(OBJEXT) pal2rgb_OBJECTS = $(am_pal2rgb_OBJECTS) pal2rgb_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_ppm2tiff_OBJECTS = ppm2tiff.$(OBJEXT) ppm2tiff_OBJECTS = $(am_ppm2tiff_OBJECTS) ppm2tiff_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_ras2tiff_OBJECTS = ras2tiff.$(OBJEXT) ras2tiff_OBJECTS = $(am_ras2tiff_OBJECTS) ras2tiff_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_raw2tiff_OBJECTS = raw2tiff.$(OBJEXT) raw2tiff_OBJECTS = $(am_raw2tiff_OBJECTS) raw2tiff_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_rgb2ycbcr_OBJECTS = rgb2ycbcr.$(OBJEXT) rgb2ycbcr_OBJECTS = $(am_rgb2ycbcr_OBJECTS) rgb2ycbcr_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) sgi2tiff_SOURCES = sgi2tiff.c sgi2tiff_OBJECTS = sgi2tiff.$(OBJEXT) sgi2tiff_LDADD = $(LDADD) sgisv_SOURCES = sgisv.c sgisv_OBJECTS = sgisv.$(OBJEXT) sgisv_LDADD = $(LDADD) am_thumbnail_OBJECTS = thumbnail.$(OBJEXT) thumbnail_OBJECTS = $(am_thumbnail_OBJECTS) thumbnail_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiff2bw_OBJECTS = tiff2bw.$(OBJEXT) tiff2bw_OBJECTS = $(am_tiff2bw_OBJECTS) tiff2bw_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiff2pdf_OBJECTS = tiff2pdf.$(OBJEXT) tiff2pdf_OBJECTS = $(am_tiff2pdf_OBJECTS) tiff2pdf_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiff2ps_OBJECTS = tiff2ps.$(OBJEXT) tiff2ps_OBJECTS = $(am_tiff2ps_OBJECTS) tiff2ps_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiff2rgba_OBJECTS = tiff2rgba.$(OBJEXT) tiff2rgba_OBJECTS = $(am_tiff2rgba_OBJECTS) tiff2rgba_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiffcmp_OBJECTS = tiffcmp.$(OBJEXT) tiffcmp_OBJECTS = $(am_tiffcmp_OBJECTS) tiffcmp_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiffcp_OBJECTS = tiffcp.$(OBJEXT) tiffcp_OBJECTS = $(am_tiffcp_OBJECTS) tiffcp_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiffcrop_OBJECTS = tiffcrop.$(OBJEXT) tiffcrop_OBJECTS = $(am_tiffcrop_OBJECTS) tiffcrop_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiffdither_OBJECTS = tiffdither.$(OBJEXT) tiffdither_OBJECTS = $(am_tiffdither_OBJECTS) tiffdither_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiffdump_OBJECTS = tiffdump.$(OBJEXT) tiffdump_OBJECTS = $(am_tiffdump_OBJECTS) tiffdump_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiffgt_OBJECTS = tiffgt-tiffgt.$(OBJEXT) tiffgt_OBJECTS = $(am_tiffgt_OBJECTS) am__DEPENDENCIES_1 = tiffgt_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) tiffgt_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(tiffgt_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_tiffinfo_OBJECTS = tiffinfo.$(OBJEXT) tiffinfo_OBJECTS = $(am_tiffinfo_OBJECTS) tiffinfo_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiffmedian_OBJECTS = tiffmedian.$(OBJEXT) tiffmedian_OBJECTS = $(am_tiffmedian_OBJECTS) tiffmedian_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiffset_OBJECTS = tiffset.$(OBJEXT) tiffset_OBJECTS = $(am_tiffset_OBJECTS) tiffset_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) am_tiffsplit_OBJECTS = tiffsplit.$(OBJEXT) tiffsplit_OBJECTS = $(am_tiffsplit_OBJECTS) tiffsplit_DEPENDENCIES = $(LIBTIFF) $(LIBPORT) ycbcr_SOURCES = ycbcr.c ycbcr_OBJECTS = ycbcr.$(OBJEXT) ycbcr_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/libtiff depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(bmp2tiff_SOURCES) $(fax2ps_SOURCES) $(fax2tiff_SOURCES) \ $(gif2tiff_SOURCES) $(pal2rgb_SOURCES) $(ppm2tiff_SOURCES) \ $(ras2tiff_SOURCES) $(raw2tiff_SOURCES) $(rgb2ycbcr_SOURCES) \ sgi2tiff.c sgisv.c $(thumbnail_SOURCES) $(tiff2bw_SOURCES) \ $(tiff2pdf_SOURCES) $(tiff2ps_SOURCES) $(tiff2rgba_SOURCES) \ $(tiffcmp_SOURCES) $(tiffcp_SOURCES) $(tiffcrop_SOURCES) \ $(tiffdither_SOURCES) $(tiffdump_SOURCES) $(tiffgt_SOURCES) \ $(tiffinfo_SOURCES) $(tiffmedian_SOURCES) $(tiffset_SOURCES) \ $(tiffsplit_SOURCES) ycbcr.c DIST_SOURCES = $(bmp2tiff_SOURCES) $(fax2ps_SOURCES) \ $(fax2tiff_SOURCES) $(gif2tiff_SOURCES) $(pal2rgb_SOURCES) \ $(ppm2tiff_SOURCES) $(ras2tiff_SOURCES) $(raw2tiff_SOURCES) \ $(rgb2ycbcr_SOURCES) sgi2tiff.c sgisv.c $(thumbnail_SOURCES) \ $(tiff2bw_SOURCES) $(tiff2pdf_SOURCES) $(tiff2ps_SOURCES) \ $(tiff2rgba_SOURCES) $(tiffcmp_SOURCES) $(tiffcp_SOURCES) \ $(tiffcrop_SOURCES) $(tiffdither_SOURCES) $(tiffdump_SOURCES) \ $(tiffgt_SOURCES) $(tiffinfo_SOURCES) $(tiffmedian_SOURCES) \ $(tiffset_SOURCES) $(tiffsplit_SOURCES) ycbcr.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ LIBPORT = $(top_builddir)/port/libport.la LIBTIFF = $(top_builddir)/libtiff/libtiff.la EXTRA_DIST = Makefile.vc @HAVE_RPATH_TRUE@AM_LDFLAGS = $(LIBDIR) bmp2tiff_SOURCES = bmp2tiff.c bmp2tiff_LDADD = $(LIBTIFF) $(LIBPORT) fax2ps_SOURCES = fax2ps.c fax2ps_LDADD = $(LIBTIFF) $(LIBPORT) fax2tiff_SOURCES = fax2tiff.c fax2tiff_LDADD = $(LIBTIFF) $(LIBPORT) gif2tiff_SOURCES = gif2tiff.c gif2tiff_LDADD = $(LIBTIFF) $(LIBPORT) pal2rgb_SOURCES = pal2rgb.c pal2rgb_LDADD = $(LIBTIFF) $(LIBPORT) ppm2tiff_SOURCES = ppm2tiff.c ppm2tiff_LDADD = $(LIBTIFF) $(LIBPORT) ras2tiff_SOURCES = ras2tiff.c rasterfile.h ras2tiff_LDADD = $(LIBTIFF) $(LIBPORT) raw2tiff_SOURCES = raw2tiff.c raw2tiff_LDADD = $(LIBTIFF) $(LIBPORT) rgb2ycbcr_SOURCES = rgb2ycbcr.c rgb2ycbcr_LDADD = $(LIBTIFF) $(LIBPORT) thumbnail_SOURCES = thumbnail.c thumbnail_LDADD = $(LIBTIFF) $(LIBPORT) tiff2bw_SOURCES = tiff2bw.c tiff2bw_LDADD = $(LIBTIFF) $(LIBPORT) tiff2pdf_SOURCES = tiff2pdf.c tiff2pdf_LDADD = $(LIBTIFF) $(LIBPORT) tiff2ps_SOURCES = tiff2ps.c tiff2ps_LDADD = $(LIBTIFF) $(LIBPORT) tiff2rgba_SOURCES = tiff2rgba.c tiff2rgba_LDADD = $(LIBTIFF) $(LIBPORT) tiffcmp_SOURCES = tiffcmp.c tiffcmp_LDADD = $(LIBTIFF) $(LIBPORT) tiffcp_SOURCES = tiffcp.c tiffcp_LDADD = $(LIBTIFF) $(LIBPORT) tiffcrop_SOURCES = tiffcrop.c tiffcrop_LDADD = $(LIBTIFF) $(LIBPORT) tiffdither_SOURCES = tiffdither.c tiffdither_LDADD = $(LIBTIFF) $(LIBPORT) tiffdump_SOURCES = tiffdump.c tiffdump_LDADD = $(LIBTIFF) $(LIBPORT) tiffinfo_SOURCES = tiffinfo.c tiffinfo_LDADD = $(LIBTIFF) $(LIBPORT) tiffmedian_SOURCES = tiffmedian.c tiffmedian_LDADD = $(LIBTIFF) $(LIBPORT) tiffset_SOURCES = tiffset.c tiffset_LDADD = $(LIBTIFF) $(LIBPORT) tiffsplit_SOURCES = tiffsplit.c tiffsplit_LDADD = $(LIBTIFF) $(LIBPORT) tiffgt_SOURCES = tiffgt.c tiffgt_CFLAGS = $(CFLAGS) $(GLUT_CFLAGS) $(AM_CFLAGS) tiffgt_LDADD = $(LIBTIFF) $(LIBPORT) $(X_LIBS) $(GLUT_LIBS) AM_CPPFLAGS = -I$(top_srcdir)/libtiff all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tools/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list bmp2tiff$(EXEEXT): $(bmp2tiff_OBJECTS) $(bmp2tiff_DEPENDENCIES) $(EXTRA_bmp2tiff_DEPENDENCIES) @rm -f bmp2tiff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(bmp2tiff_OBJECTS) $(bmp2tiff_LDADD) $(LIBS) fax2ps$(EXEEXT): $(fax2ps_OBJECTS) $(fax2ps_DEPENDENCIES) $(EXTRA_fax2ps_DEPENDENCIES) @rm -f fax2ps$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fax2ps_OBJECTS) $(fax2ps_LDADD) $(LIBS) fax2tiff$(EXEEXT): $(fax2tiff_OBJECTS) $(fax2tiff_DEPENDENCIES) $(EXTRA_fax2tiff_DEPENDENCIES) @rm -f fax2tiff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fax2tiff_OBJECTS) $(fax2tiff_LDADD) $(LIBS) gif2tiff$(EXEEXT): $(gif2tiff_OBJECTS) $(gif2tiff_DEPENDENCIES) $(EXTRA_gif2tiff_DEPENDENCIES) @rm -f gif2tiff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gif2tiff_OBJECTS) $(gif2tiff_LDADD) $(LIBS) pal2rgb$(EXEEXT): $(pal2rgb_OBJECTS) $(pal2rgb_DEPENDENCIES) $(EXTRA_pal2rgb_DEPENDENCIES) @rm -f pal2rgb$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pal2rgb_OBJECTS) $(pal2rgb_LDADD) $(LIBS) ppm2tiff$(EXEEXT): $(ppm2tiff_OBJECTS) $(ppm2tiff_DEPENDENCIES) $(EXTRA_ppm2tiff_DEPENDENCIES) @rm -f ppm2tiff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ppm2tiff_OBJECTS) $(ppm2tiff_LDADD) $(LIBS) ras2tiff$(EXEEXT): $(ras2tiff_OBJECTS) $(ras2tiff_DEPENDENCIES) $(EXTRA_ras2tiff_DEPENDENCIES) @rm -f ras2tiff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ras2tiff_OBJECTS) $(ras2tiff_LDADD) $(LIBS) raw2tiff$(EXEEXT): $(raw2tiff_OBJECTS) $(raw2tiff_DEPENDENCIES) $(EXTRA_raw2tiff_DEPENDENCIES) @rm -f raw2tiff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(raw2tiff_OBJECTS) $(raw2tiff_LDADD) $(LIBS) rgb2ycbcr$(EXEEXT): $(rgb2ycbcr_OBJECTS) $(rgb2ycbcr_DEPENDENCIES) $(EXTRA_rgb2ycbcr_DEPENDENCIES) @rm -f rgb2ycbcr$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rgb2ycbcr_OBJECTS) $(rgb2ycbcr_LDADD) $(LIBS) sgi2tiff$(EXEEXT): $(sgi2tiff_OBJECTS) $(sgi2tiff_DEPENDENCIES) $(EXTRA_sgi2tiff_DEPENDENCIES) @rm -f sgi2tiff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sgi2tiff_OBJECTS) $(sgi2tiff_LDADD) $(LIBS) sgisv$(EXEEXT): $(sgisv_OBJECTS) $(sgisv_DEPENDENCIES) $(EXTRA_sgisv_DEPENDENCIES) @rm -f sgisv$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sgisv_OBJECTS) $(sgisv_LDADD) $(LIBS) thumbnail$(EXEEXT): $(thumbnail_OBJECTS) $(thumbnail_DEPENDENCIES) $(EXTRA_thumbnail_DEPENDENCIES) @rm -f thumbnail$(EXEEXT) $(AM_V_CCLD)$(LINK) $(thumbnail_OBJECTS) $(thumbnail_LDADD) $(LIBS) tiff2bw$(EXEEXT): $(tiff2bw_OBJECTS) $(tiff2bw_DEPENDENCIES) $(EXTRA_tiff2bw_DEPENDENCIES) @rm -f tiff2bw$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiff2bw_OBJECTS) $(tiff2bw_LDADD) $(LIBS) tiff2pdf$(EXEEXT): $(tiff2pdf_OBJECTS) $(tiff2pdf_DEPENDENCIES) $(EXTRA_tiff2pdf_DEPENDENCIES) @rm -f tiff2pdf$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiff2pdf_OBJECTS) $(tiff2pdf_LDADD) $(LIBS) tiff2ps$(EXEEXT): $(tiff2ps_OBJECTS) $(tiff2ps_DEPENDENCIES) $(EXTRA_tiff2ps_DEPENDENCIES) @rm -f tiff2ps$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiff2ps_OBJECTS) $(tiff2ps_LDADD) $(LIBS) tiff2rgba$(EXEEXT): $(tiff2rgba_OBJECTS) $(tiff2rgba_DEPENDENCIES) $(EXTRA_tiff2rgba_DEPENDENCIES) @rm -f tiff2rgba$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiff2rgba_OBJECTS) $(tiff2rgba_LDADD) $(LIBS) tiffcmp$(EXEEXT): $(tiffcmp_OBJECTS) $(tiffcmp_DEPENDENCIES) $(EXTRA_tiffcmp_DEPENDENCIES) @rm -f tiffcmp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiffcmp_OBJECTS) $(tiffcmp_LDADD) $(LIBS) tiffcp$(EXEEXT): $(tiffcp_OBJECTS) $(tiffcp_DEPENDENCIES) $(EXTRA_tiffcp_DEPENDENCIES) @rm -f tiffcp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiffcp_OBJECTS) $(tiffcp_LDADD) $(LIBS) tiffcrop$(EXEEXT): $(tiffcrop_OBJECTS) $(tiffcrop_DEPENDENCIES) $(EXTRA_tiffcrop_DEPENDENCIES) @rm -f tiffcrop$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiffcrop_OBJECTS) $(tiffcrop_LDADD) $(LIBS) tiffdither$(EXEEXT): $(tiffdither_OBJECTS) $(tiffdither_DEPENDENCIES) $(EXTRA_tiffdither_DEPENDENCIES) @rm -f tiffdither$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiffdither_OBJECTS) $(tiffdither_LDADD) $(LIBS) tiffdump$(EXEEXT): $(tiffdump_OBJECTS) $(tiffdump_DEPENDENCIES) $(EXTRA_tiffdump_DEPENDENCIES) @rm -f tiffdump$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiffdump_OBJECTS) $(tiffdump_LDADD) $(LIBS) tiffgt$(EXEEXT): $(tiffgt_OBJECTS) $(tiffgt_DEPENDENCIES) $(EXTRA_tiffgt_DEPENDENCIES) @rm -f tiffgt$(EXEEXT) $(AM_V_CCLD)$(tiffgt_LINK) $(tiffgt_OBJECTS) $(tiffgt_LDADD) $(LIBS) tiffinfo$(EXEEXT): $(tiffinfo_OBJECTS) $(tiffinfo_DEPENDENCIES) $(EXTRA_tiffinfo_DEPENDENCIES) @rm -f tiffinfo$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiffinfo_OBJECTS) $(tiffinfo_LDADD) $(LIBS) tiffmedian$(EXEEXT): $(tiffmedian_OBJECTS) $(tiffmedian_DEPENDENCIES) $(EXTRA_tiffmedian_DEPENDENCIES) @rm -f tiffmedian$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiffmedian_OBJECTS) $(tiffmedian_LDADD) $(LIBS) tiffset$(EXEEXT): $(tiffset_OBJECTS) $(tiffset_DEPENDENCIES) $(EXTRA_tiffset_DEPENDENCIES) @rm -f tiffset$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiffset_OBJECTS) $(tiffset_LDADD) $(LIBS) tiffsplit$(EXEEXT): $(tiffsplit_OBJECTS) $(tiffsplit_DEPENDENCIES) $(EXTRA_tiffsplit_DEPENDENCIES) @rm -f tiffsplit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(tiffsplit_OBJECTS) $(tiffsplit_LDADD) $(LIBS) ycbcr$(EXEEXT): $(ycbcr_OBJECTS) $(ycbcr_DEPENDENCIES) $(EXTRA_ycbcr_DEPENDENCIES) @rm -f ycbcr$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ycbcr_OBJECTS) $(ycbcr_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bmp2tiff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fax2ps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fax2tiff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gif2tiff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pal2rgb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppm2tiff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ras2tiff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/raw2tiff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rgb2ycbcr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgi2tiff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgisv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thumbnail.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiff2bw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiff2pdf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiff2ps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiff2rgba.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffcmp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffcp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffcrop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffdither.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffdump.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffgt-tiffgt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffmedian.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffsplit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ycbcr.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< tiffgt-tiffgt.o: tiffgt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tiffgt_CFLAGS) $(CFLAGS) -MT tiffgt-tiffgt.o -MD -MP -MF $(DEPDIR)/tiffgt-tiffgt.Tpo -c -o tiffgt-tiffgt.o `test -f 'tiffgt.c' || echo '$(srcdir)/'`tiffgt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tiffgt-tiffgt.Tpo $(DEPDIR)/tiffgt-tiffgt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tiffgt.c' object='tiffgt-tiffgt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tiffgt_CFLAGS) $(CFLAGS) -c -o tiffgt-tiffgt.o `test -f 'tiffgt.c' || echo '$(srcdir)/'`tiffgt.c tiffgt-tiffgt.obj: tiffgt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tiffgt_CFLAGS) $(CFLAGS) -MT tiffgt-tiffgt.obj -MD -MP -MF $(DEPDIR)/tiffgt-tiffgt.Tpo -c -o tiffgt-tiffgt.obj `if test -f 'tiffgt.c'; then $(CYGPATH_W) 'tiffgt.c'; else $(CYGPATH_W) '$(srcdir)/tiffgt.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tiffgt-tiffgt.Tpo $(DEPDIR)/tiffgt-tiffgt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tiffgt.c' object='tiffgt-tiffgt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tiffgt_CFLAGS) $(CFLAGS) -c -o tiffgt-tiffgt.obj `if test -f 'tiffgt.c'; then $(CYGPATH_W) 'tiffgt.c'; else $(CYGPATH_W) '$(srcdir)/tiffgt.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool cscopelist ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-binPROGRAMS echo: (echo $(CFLAGS)) (echo $(tiffgt_CFLAGS)) (echo $(GL_CFLAGS)) (echo $(GLU_CFLAGS)) (echo $(GLUT_CFLAGS)) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/tools/tiff2rgba.c0000644000212300117540000003412111531621452012542 00000000000000/* $Id: tiff2rgba.c,v 1.19 2011-02-23 21:46:09 fwarmerdam Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffiop.h" #include "tiffio.h" #define streq(a,b) (strcmp(a,b) == 0) #define CopyField(tag, v) \ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) #ifndef howmany #define howmany(x, y) (((x)+((y)-1))/(y)) #endif #define roundup(x, y) (howmany(x,y)*((uint32)(y))) uint16 compression = COMPRESSION_PACKBITS; uint32 rowsperstrip = (uint32) -1; int process_by_block = 0; /* default is whole image at once */ int no_alpha = 0; int bigtiff_output = 0; static int tiffcvt(TIFF* in, TIFF* out); static void usage(int code); int main(int argc, char* argv[]) { TIFF *in, *out; int c; extern int optind; extern char *optarg; while ((c = getopt(argc, argv, "c:r:t:bn8")) != -1) switch (c) { case 'b': process_by_block = 1; break; case 'c': if (streq(optarg, "none")) compression = COMPRESSION_NONE; else if (streq(optarg, "packbits")) compression = COMPRESSION_PACKBITS; else if (streq(optarg, "lzw")) compression = COMPRESSION_LZW; else if (streq(optarg, "jpeg")) compression = COMPRESSION_JPEG; else if (streq(optarg, "zip")) compression = COMPRESSION_DEFLATE; else usage(-1); break; case 'r': rowsperstrip = atoi(optarg); break; case 't': rowsperstrip = atoi(optarg); break; case 'n': no_alpha = 1; break; case '8': bigtiff_output = 1; break; case '?': usage(0); /*NOTREACHED*/ } if (argc - optind < 2) usage(-1); out = TIFFOpen(argv[argc-1], bigtiff_output?"w8":"w"); if (out == NULL) return (-2); for (; optind < argc-1; optind++) { in = TIFFOpen(argv[optind], "r"); if (in != NULL) { do { if (!tiffcvt(in, out) || !TIFFWriteDirectory(out)) { (void) TIFFClose(out); (void) TIFFClose(in); return (1); } } while (TIFFReadDirectory(in)); (void) TIFFClose(in); } } (void) TIFFClose(out); return (0); } static int cvt_by_tile( TIFF *in, TIFF *out ) { uint32* raster; /* retrieve RGBA image */ uint32 width, height; /* image width & height */ uint32 tile_width, tile_height; uint32 row, col; uint32 *wrk_line; int ok = 1; TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height); if( !TIFFGetField(in, TIFFTAG_TILEWIDTH, &tile_width) || !TIFFGetField(in, TIFFTAG_TILELENGTH, &tile_height) ) { TIFFError(TIFFFileName(in), "Source image not tiled"); return (0); } TIFFSetField(out, TIFFTAG_TILEWIDTH, tile_width ); TIFFSetField(out, TIFFTAG_TILELENGTH, tile_height ); /* * Allocate tile buffer */ raster = (uint32*)_TIFFmalloc(tile_width * tile_height * sizeof (uint32)); if (raster == 0) { TIFFError(TIFFFileName(in), "No space for raster buffer"); return (0); } /* * Allocate a scanline buffer for swapping during the vertical * mirroring pass. */ wrk_line = (uint32*)_TIFFmalloc(tile_width * sizeof (uint32)); if (!wrk_line) { TIFFError(TIFFFileName(in), "No space for raster scanline buffer"); ok = 0; } /* * Loop over the tiles. */ for( row = 0; ok && row < height; row += tile_height ) { for( col = 0; ok && col < width; col += tile_width ) { uint32 i_row; /* Read the tile into an RGBA array */ if (!TIFFReadRGBATile(in, col, row, raster)) { ok = 0; break; } /* * XXX: raster array has 4-byte unsigned integer type, that is why * we should rearrange it here. */ #if HOST_BIGENDIAN TIFFSwabArrayOfLong(raster, tile_width * tile_height); #endif /* * For some reason the TIFFReadRGBATile() function chooses the * lower left corner as the origin. Vertically mirror scanlines. */ for( i_row = 0; i_row < tile_height / 2; i_row++ ) { uint32 *top_line, *bottom_line; top_line = raster + tile_width * i_row; bottom_line = raster + tile_width * (tile_height-i_row-1); _TIFFmemcpy(wrk_line, top_line, 4*tile_width); _TIFFmemcpy(top_line, bottom_line, 4*tile_width); _TIFFmemcpy(bottom_line, wrk_line, 4*tile_width); } /* * Write out the result in a tile. */ if( TIFFWriteEncodedTile( out, TIFFComputeTile( out, col, row, 0, 0), raster, 4 * tile_width * tile_height ) == -1 ) { ok = 0; break; } } } _TIFFfree( raster ); _TIFFfree( wrk_line ); return ok; } static int cvt_by_strip( TIFF *in, TIFF *out ) { uint32* raster; /* retrieve RGBA image */ uint32 width, height; /* image width & height */ uint32 row; uint32 *wrk_line; int ok = 1; TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height); if( !TIFFGetField(in, TIFFTAG_ROWSPERSTRIP, &rowsperstrip) ) { TIFFError(TIFFFileName(in), "Source image not in strips"); return (0); } TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip); /* * Allocate strip buffer */ raster = (uint32*)_TIFFmalloc(width * rowsperstrip * sizeof (uint32)); if (raster == 0) { TIFFError(TIFFFileName(in), "No space for raster buffer"); return (0); } /* * Allocate a scanline buffer for swapping during the vertical * mirroring pass. */ wrk_line = (uint32*)_TIFFmalloc(width * sizeof (uint32)); if (!wrk_line) { TIFFError(TIFFFileName(in), "No space for raster scanline buffer"); ok = 0; } /* * Loop over the strips. */ for( row = 0; ok && row < height; row += rowsperstrip ) { int rows_to_write, i_row; /* Read the strip into an RGBA array */ if (!TIFFReadRGBAStrip(in, row, raster)) { ok = 0; break; } /* * XXX: raster array has 4-byte unsigned integer type, that is why * we should rearrange it here. */ #if HOST_BIGENDIAN TIFFSwabArrayOfLong(raster, width * rowsperstrip); #endif /* * Figure out the number of scanlines actually in this strip. */ if( row + rowsperstrip > height ) rows_to_write = height - row; else rows_to_write = rowsperstrip; /* * For some reason the TIFFReadRGBAStrip() function chooses the * lower left corner as the origin. Vertically mirror scanlines. */ for( i_row = 0; i_row < rows_to_write / 2; i_row++ ) { uint32 *top_line, *bottom_line; top_line = raster + width * i_row; bottom_line = raster + width * (rows_to_write-i_row-1); _TIFFmemcpy(wrk_line, top_line, 4*width); _TIFFmemcpy(top_line, bottom_line, 4*width); _TIFFmemcpy(bottom_line, wrk_line, 4*width); } /* * Write out the result in a strip */ if( TIFFWriteEncodedStrip( out, row / rowsperstrip, raster, 4 * rows_to_write * width ) == -1 ) { ok = 0; break; } } _TIFFfree( raster ); _TIFFfree( wrk_line ); return ok; } /* * cvt_whole_image() * * read the whole image into one big RGBA buffer and then write out * strips from that. This is using the traditional TIFFReadRGBAImage() * API that we trust. */ static int cvt_whole_image( TIFF *in, TIFF *out ) { uint32* raster; /* retrieve RGBA image */ uint32 width, height; /* image width & height */ uint32 row; size_t pixel_count; TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height); pixel_count = width * height; /* XXX: Check the integer overflow. */ if (!width || !height || pixel_count / width != height) { TIFFError(TIFFFileName(in), "Malformed input file; can't allocate buffer for raster of %lux%lu size", (unsigned long)width, (unsigned long)height); return 0; } rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip); TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip); raster = (uint32*)_TIFFCheckMalloc(in, pixel_count, sizeof(uint32), "raster buffer"); if (raster == 0) { TIFFError(TIFFFileName(in), "Failed to allocate buffer (%lu elements of %lu each)", (unsigned long)pixel_count, (unsigned long)sizeof(uint32)); return (0); } /* Read the image in one chunk into an RGBA array */ if (!TIFFReadRGBAImageOriented(in, width, height, raster, ORIENTATION_TOPLEFT, 0)) { _TIFFfree(raster); return (0); } /* * XXX: raster array has 4-byte unsigned integer type, that is why * we should rearrange it here. */ #if HOST_BIGENDIAN TIFFSwabArrayOfLong(raster, width * height); #endif /* * Do we want to strip away alpha components? */ if (no_alpha) { size_t count = pixel_count; unsigned char *src, *dst; src = dst = (unsigned char *) raster; while (count > 0) { *(dst++) = *(src++); *(dst++) = *(src++); *(dst++) = *(src++); src++; count--; } } /* * Write out the result in strips */ for (row = 0; row < height; row += rowsperstrip) { unsigned char * raster_strip; int rows_to_write; int bytes_per_pixel; if (no_alpha) { raster_strip = ((unsigned char *) raster) + 3 * row * width; bytes_per_pixel = 3; } else { raster_strip = (unsigned char *) (raster + row * width); bytes_per_pixel = 4; } if( row + rowsperstrip > height ) rows_to_write = height - row; else rows_to_write = rowsperstrip; if( TIFFWriteEncodedStrip( out, row / rowsperstrip, raster_strip, bytes_per_pixel * rows_to_write * width ) == -1 ) { _TIFFfree( raster ); return 0; } } _TIFFfree( raster ); return 1; } static int tiffcvt(TIFF* in, TIFF* out) { uint32 width, height; /* image width & height */ uint16 shortv; float floatv; char *stringv; uint32 longv; uint16 v[1]; TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height); CopyField(TIFFTAG_SUBFILETYPE, longv); TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width); TIFFSetField(out, TIFFTAG_IMAGELENGTH, height); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(out, TIFFTAG_COMPRESSION, compression); TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); CopyField(TIFFTAG_FILLORDER, shortv); TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); if( no_alpha ) TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 3); else TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 4); if( !no_alpha ) { v[0] = EXTRASAMPLE_ASSOCALPHA; TIFFSetField(out, TIFFTAG_EXTRASAMPLES, 1, v); } CopyField(TIFFTAG_XRESOLUTION, floatv); CopyField(TIFFTAG_YRESOLUTION, floatv); CopyField(TIFFTAG_RESOLUTIONUNIT, shortv); TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(out, TIFFTAG_SOFTWARE, TIFFGetVersion()); CopyField(TIFFTAG_DOCUMENTNAME, stringv); if( process_by_block && TIFFIsTiled( in ) ) return( cvt_by_tile( in, out ) ); else if( process_by_block ) return( cvt_by_strip( in, out ) ); else return( cvt_whole_image( in, out ) ); } static char* stuff[] = { "usage: tiff2rgba [-c comp] [-r rows] [-b] [-n] [-8] input... output", "where comp is one of the following compression algorithms:", " jpeg\t\tJPEG encoding", " zip\t\tLempel-Ziv & Welch encoding", " lzw\t\tLempel-Ziv & Welch encoding", " packbits\tPackBits encoding", " none\t\tno compression", "and the other options are:", " -r\trows/strip", " -b (progress by block rather than as a whole image)", " -n don't emit alpha component.", " -8 write BigTIFF file instead of ClassicTIFF", NULL }; static void usage(int code) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(code); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/raw2tiff.c0000644000212300117540000004345111345765561012443 00000000000000/* $Id: raw2tiff.c,v 1.25 2010-03-10 18:56:49 bfriesen Exp $ * * Project: libtiff tools * Purpose: Convert raw byte sequences in TIFF images * Author: Andrey Kiselev, dron@ak4719.spb.edu * ****************************************************************************** * Copyright (c) 2002, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #if HAVE_FCNTL_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_IO_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" #ifndef HAVE_GETOPT extern int getopt(int, char**, char*); #endif #ifndef O_BINARY # define O_BINARY 0 #endif typedef enum { PIXEL, BAND } InterleavingType; static uint16 compression = (uint16) -1; static int jpegcolormode = JPEGCOLORMODE_RGB; static int quality = 75; /* JPEG quality */ static uint16 predictor = 0; static void swapBytesInScanline(void *, uint32, TIFFDataType); static int guessSize(int, TIFFDataType, off_t, uint32, int, uint32 *, uint32 *); static double correlation(void *, void *, uint32, TIFFDataType); static void usage(void); static int processCompressOptions(char*); int main(int argc, char* argv[]) { uint32 width = 0, length = 0, linebytes, bufsize; uint32 nbands = 1; /* number of bands in input image*/ off_t hdr_size = 0; /* size of the header to skip */ TIFFDataType dtype = TIFF_BYTE; int16 depth = 1; /* bytes per pixel in input image */ int swab = 0; /* byte swapping flag */ InterleavingType interleaving = 0; /* interleaving type flag */ uint32 rowsperstrip = (uint32) -1; uint16 photometric = PHOTOMETRIC_MINISBLACK; uint16 config = PLANARCONFIG_CONTIG; uint16 fillorder = FILLORDER_LSB2MSB; int fd; char *outfilename = NULL; TIFF *out; uint32 row, col, band; int c; unsigned char *buf = NULL, *buf1 = NULL; extern int optind; extern char* optarg; while ((c = getopt(argc, argv, "c:r:H:w:l:b:d:LMp:si:o:h")) != -1) { switch (c) { case 'c': /* compression scheme */ if (!processCompressOptions(optarg)) usage(); break; case 'r': /* rows/strip */ rowsperstrip = atoi(optarg); break; case 'H': /* size of input image file header */ hdr_size = atoi(optarg); break; case 'w': /* input image width */ width = atoi(optarg); break; case 'l': /* input image length */ length = atoi(optarg); break; case 'b': /* number of bands in input image */ nbands = atoi(optarg); break; case 'd': /* type of samples in input image */ if (strncmp(optarg, "byte", 4) == 0) dtype = TIFF_BYTE; else if (strncmp(optarg, "short", 5) == 0) dtype = TIFF_SHORT; else if (strncmp(optarg, "long", 4) == 0) dtype = TIFF_LONG; else if (strncmp(optarg, "sbyte", 5) == 0) dtype = TIFF_SBYTE; else if (strncmp(optarg, "sshort", 6) == 0) dtype = TIFF_SSHORT; else if (strncmp(optarg, "slong", 5) == 0) dtype = TIFF_SLONG; else if (strncmp(optarg, "float", 5) == 0) dtype = TIFF_FLOAT; else if (strncmp(optarg, "double", 6) == 0) dtype = TIFF_DOUBLE; else dtype = TIFF_BYTE; depth = TIFFDataWidth(dtype); break; case 'L': /* input has lsb-to-msb fillorder */ fillorder = FILLORDER_LSB2MSB; break; case 'M': /* input has msb-to-lsb fillorder */ fillorder = FILLORDER_MSB2LSB; break; case 'p': /* photometric interpretation */ if (strncmp(optarg, "miniswhite", 10) == 0) photometric = PHOTOMETRIC_MINISWHITE; else if (strncmp(optarg, "minisblack", 10) == 0) photometric = PHOTOMETRIC_MINISBLACK; else if (strncmp(optarg, "rgb", 3) == 0) photometric = PHOTOMETRIC_RGB; else if (strncmp(optarg, "cmyk", 4) == 0) photometric = PHOTOMETRIC_SEPARATED; else if (strncmp(optarg, "ycbcr", 5) == 0) photometric = PHOTOMETRIC_YCBCR; else if (strncmp(optarg, "cielab", 6) == 0) photometric = PHOTOMETRIC_CIELAB; else if (strncmp(optarg, "icclab", 6) == 0) photometric = PHOTOMETRIC_ICCLAB; else if (strncmp(optarg, "itulab", 6) == 0) photometric = PHOTOMETRIC_ITULAB; else photometric = PHOTOMETRIC_MINISBLACK; break; case 's': /* do we need to swap bytes? */ swab = 1; break; case 'i': /* type of interleaving */ if (strncmp(optarg, "pixel", 4) == 0) interleaving = PIXEL; else if (strncmp(optarg, "band", 6) == 0) interleaving = BAND; else interleaving = 0; break; case 'o': outfilename = optarg; break; case 'h': usage(); default: break; } } if (argc - optind < 2) usage(); fd = open(argv[optind], O_RDONLY|O_BINARY, 0); if (fd < 0) { fprintf(stderr, "%s: %s: Cannot open input file.\n", argv[0], argv[optind]); return (-1); } if (guessSize(fd, dtype, hdr_size, nbands, swab, &width, &length) < 0) return 1; if (outfilename == NULL) outfilename = argv[optind+1]; out = TIFFOpen(outfilename, "w"); if (out == NULL) { fprintf(stderr, "%s: %s: Cannot open file for output.\n", argv[0], outfilename); return (-1); } TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width); TIFFSetField(out, TIFFTAG_IMAGELENGTH, length); TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, nbands); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, depth * 8); TIFFSetField(out, TIFFTAG_FILLORDER, fillorder); TIFFSetField(out, TIFFTAG_PLANARCONFIG, config); TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric); switch (dtype) { case TIFF_BYTE: case TIFF_SHORT: case TIFF_LONG: TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); break; case TIFF_SBYTE: case TIFF_SSHORT: case TIFF_SLONG: TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT); break; case TIFF_FLOAT: case TIFF_DOUBLE: TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); break; default: TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_VOID); break; } if (compression == (uint16) -1) compression = COMPRESSION_PACKBITS; TIFFSetField(out, TIFFTAG_COMPRESSION, compression); switch (compression) { case COMPRESSION_JPEG: if (photometric == PHOTOMETRIC_RGB && jpegcolormode == JPEGCOLORMODE_RGB) photometric = PHOTOMETRIC_YCBCR; TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality); TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode); break; case COMPRESSION_LZW: case COMPRESSION_DEFLATE: if (predictor != 0) TIFFSetField(out, TIFFTAG_PREDICTOR, predictor); break; } switch(interleaving) { case BAND: /* band interleaved data */ linebytes = width * depth; buf = (unsigned char *)_TIFFmalloc(linebytes); break; case PIXEL: /* pixel interleaved data */ default: linebytes = width * nbands * depth; break; } bufsize = width * nbands * depth; buf1 = (unsigned char *)_TIFFmalloc(bufsize); rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip); if (rowsperstrip > length) { rowsperstrip = length; } TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip ); lseek(fd, hdr_size, SEEK_SET); /* Skip the file header */ for (row = 0; row < length; row++) { switch(interleaving) { case BAND: /* band interleaved data */ for (band = 0; band < nbands; band++) { lseek(fd, hdr_size + (length*band+row)*linebytes, SEEK_SET); if (read(fd, buf, linebytes) < 0) { fprintf(stderr, "%s: %s: scanline %lu: Read error.\n", argv[0], argv[optind], (unsigned long) row); break; } if (swab) /* Swap bytes if needed */ swapBytesInScanline(buf, width, dtype); for (col = 0; col < width; col++) memcpy(buf1 + (col*nbands+band)*depth, buf + col * depth, depth); } break; case PIXEL: /* pixel interleaved data */ default: if (read(fd, buf1, bufsize) < 0) { fprintf(stderr, "%s: %s: scanline %lu: Read error.\n", argv[0], argv[optind], (unsigned long) row); break; } if (swab) /* Swap bytes if needed */ swapBytesInScanline(buf1, width, dtype); break; } if (TIFFWriteScanline(out, buf1, row, 0) < 0) { fprintf(stderr, "%s: %s: scanline %lu: Write error.\n", argv[0], outfilename, (unsigned long) row); break; } } if (buf) _TIFFfree(buf); if (buf1) _TIFFfree(buf1); TIFFClose(out); return (0); } static void swapBytesInScanline(void *buf, uint32 width, TIFFDataType dtype) { switch (dtype) { case TIFF_SHORT: case TIFF_SSHORT: TIFFSwabArrayOfShort((uint16*)buf, (unsigned long)width); break; case TIFF_LONG: case TIFF_SLONG: TIFFSwabArrayOfLong((uint32*)buf, (unsigned long)width); break; /* case TIFF_FLOAT: */ /* FIXME */ case TIFF_DOUBLE: TIFFSwabArrayOfDouble((double*)buf, (unsigned long)width); break; default: break; } } static int guessSize(int fd, TIFFDataType dtype, off_t hdr_size, uint32 nbands, int swab, uint32 *width, uint32 *length) { const float longt = 40.0; /* maximum possible height/width ratio */ char *buf1, *buf2; struct stat filestat; uint32 w, h, scanlinesize, imagesize; uint32 depth = TIFFDataWidth(dtype); float cor_coef = 0, tmp; fstat(fd, &filestat); if (filestat.st_size < hdr_size) { fprintf(stderr, "Too large header size specified.\n"); return -1; } imagesize = (filestat.st_size - hdr_size) / nbands / depth; if (*width != 0 && *length == 0) { fprintf(stderr, "Image height is not specified.\n"); *length = imagesize / *width; fprintf(stderr, "Height is guessed as %lu.\n", (unsigned long)*length); return 1; } else if (*width == 0 && *length != 0) { fprintf(stderr, "Image width is not specified.\n"); *width = imagesize / *length; fprintf(stderr, "Width is guessed as %lu.\n", (unsigned long)*width); return 1; } else if (*width == 0 && *length == 0) { fprintf(stderr, "Image width and height are not specified.\n"); for (w = (uint32) sqrt(imagesize / longt); w < sqrt(imagesize * longt); w++) { if (imagesize % w == 0) { scanlinesize = w * depth; buf1 = _TIFFmalloc(scanlinesize); buf2 = _TIFFmalloc(scanlinesize); h = imagesize / w; lseek(fd, hdr_size + (int)(h/2)*scanlinesize, SEEK_SET); read(fd, buf1, scanlinesize); read(fd, buf2, scanlinesize); if (swab) { swapBytesInScanline(buf1, w, dtype); swapBytesInScanline(buf2, w, dtype); } tmp = (float) fabs(correlation(buf1, buf2, w, dtype)); if (tmp > cor_coef) { cor_coef = tmp; *width = w, *length = h; } _TIFFfree(buf1); _TIFFfree(buf2); } } fprintf(stderr, "Width is guessed as %lu, height is guessed as %lu.\n", (unsigned long)*width, (unsigned long)*length); return 1; } else { if (filestat.st_size<(off_t)(hdr_size+(*width)*(*length)*nbands*depth)) { fprintf(stderr, "Input file too small.\n"); return -1; } } return 1; } /* Calculate correlation coefficient between two numeric vectors */ static double correlation(void *buf1, void *buf2, uint32 n_elem, TIFFDataType dtype) { double X, Y, M1 = 0.0, M2 = 0.0, D1 = 0.0, D2 = 0.0, K = 0.0; uint32 i; switch (dtype) { case TIFF_BYTE: default: for (i = 0; i < n_elem; i++) { X = ((unsigned char *)buf1)[i]; Y = ((unsigned char *)buf2)[i]; M1 += X, M2 += Y; D1 += X * X, D2 += Y * Y; K += X * Y; } break; case TIFF_SBYTE: for (i = 0; i < n_elem; i++) { X = ((signed char *)buf1)[i]; Y = ((signed char *)buf2)[i]; M1 += X, M2 += Y; D1 += X * X, D2 += Y * Y; K += X * Y; } break; case TIFF_SHORT: for (i = 0; i < n_elem; i++) { X = ((uint16 *)buf1)[i]; Y = ((uint16 *)buf2)[i]; M1 += X, M2 += Y; D1 += X * X, D2 += Y * Y; K += X * Y; } break; case TIFF_SSHORT: for (i = 0; i < n_elem; i++) { X = ((int16 *)buf1)[i]; Y = ((int16 *)buf2)[i]; M1 += X, M2 += Y; D1 += X * X, D2 += Y * Y; K += X * Y; } break; case TIFF_LONG: for (i = 0; i < n_elem; i++) { X = ((uint32 *)buf1)[i]; Y = ((uint32 *)buf2)[i]; M1 += X, M2 += Y; D1 += X * X, D2 += Y * Y; K += X * Y; } break; case TIFF_SLONG: for (i = 0; i < n_elem; i++) { X = ((int32 *)buf1)[i]; Y = ((int32 *)buf2)[i]; M1 += X, M2 += Y; D1 += X * X, D2 += Y * Y; K += X * Y; } break; case TIFF_FLOAT: for (i = 0; i < n_elem; i++) { X = ((float *)buf1)[i]; Y = ((float *)buf2)[i]; M1 += X, M2 += Y; D1 += X * X, D2 += Y * Y; K += X * Y; } break; case TIFF_DOUBLE: for (i = 0; i < n_elem; i++) { X = ((double *)buf1)[i]; Y = ((double *)buf2)[i]; M1 += X, M2 += Y; D1 += X * X, D2 += Y * Y; K += X * Y; } break; } M1 /= n_elem; M2 /= n_elem; D1 -= M1 * M1 * n_elem; D2 -= M2 * M2 * n_elem; K = (K - M1 * M2 * n_elem) / sqrt(D1 * D2); return K; } static int processCompressOptions(char* opt) { if (strcmp(opt, "none") == 0) compression = COMPRESSION_NONE; else if (strcmp(opt, "packbits") == 0) compression = COMPRESSION_PACKBITS; else if (strncmp(opt, "jpeg", 4) == 0) { char* cp = strchr(opt, ':'); compression = COMPRESSION_JPEG; while( cp ) { if (isdigit((int)cp[1])) quality = atoi(cp+1); else if (cp[1] == 'r' ) jpegcolormode = JPEGCOLORMODE_RAW; else usage(); cp = strchr(cp+1,':'); } } else if (strncmp(opt, "lzw", 3) == 0) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_LZW; } else if (strncmp(opt, "zip", 3) == 0) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_DEFLATE; } else return (0); return (1); } static char* stuff[] = { "raw2tiff --- tool for converting raw byte sequences in TIFF images", "usage: raw2tiff [options] input.raw output.tif", "where options are:", " -L input data has LSB2MSB bit order (default)", " -M input data has MSB2LSB bit order", " -r # make each strip have no more than # rows", " -H # size of input image file header in bytes (0 by default)", " -w # width of input image in pixels", " -l # length of input image in lines", " -b # number of bands in input image (1 by default)", "", " -d data_type type of samples in input image", "where data_type may be:", " byte 8-bit unsigned integer (default)", " short 16-bit unsigned integer", " long 32-bit unsigned integer", " sbyte 8-bit signed integer", " sshort 16-bit signed integer", " slong 32-bit signed integer", " float 32-bit IEEE floating point", " double 64-bit IEEE floating point", "", " -p photo photometric interpretation (color space) of the input image", "where photo may be:", " miniswhite white color represented with 0 value", " minisblack black color represented with 0 value (default)", " rgb image has RGB color model", " cmyk image has CMYK (separated) color model", " ycbcr image has YCbCr color model", " cielab image has CIE L*a*b color model", " icclab image has ICC L*a*b color model", " itulab image has ITU L*a*b color model", "", " -s swap bytes fetched from input file", "", " -i config type of samples interleaving in input image", "where config may be:", " pixel pixel interleaved data (default)", " band band interleaved data", "", " -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", " -c zip[:opts] compress output with deflate encoding", " -c jpeg[:opts] compress output with JPEG encoding", " -c packbits compress output with packbits encoding", " -c none use no compression algorithm on output", "", "JPEG options:", " # set compression quality level (0-100, default 75)", " r output color image as RGB rather than YCbCr", "For example, -c jpeg:r:50 to get JPEG-encoded RGB data with 50% comp. quality", "", "LZW and deflate options:", " # set predictor value", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", " -o out.tif write output to out.tif", " -h this help message", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/ycbcr.c0000644000212300117540000001017711345765115012013 00000000000000float ycbcrCoeffs[3] = { .299, .587, .114 }; /* default coding range is CCIR Rec 601-1 with no headroom/footroom */ unsigned long refBlackWhite[6] = { 0, 255, 128, 255, 128, 255 }; #define LumaRed ycbcrCoeffs[0] #define LumaGreen ycbcrCoeffs[1] #define LumaBlue ycbcrCoeffs[2] long eRtotal = 0; long eGtotal = 0; long eBtotal = 0; long preveRtotal = 0; long preveGtotal = 0; long preveBtotal = 0; unsigned long AbseRtotal = 0; unsigned long AbseGtotal = 0; unsigned long AbseBtotal = 0; unsigned long eCodes = 0; unsigned long preveCodes = 0; unsigned long eBits = 0; unsigned long preveBits = 0; static void setupLumaTables(); static int abs(int v) { return (v < 0 ? -v : v); } static double pct(int v,double range) { return (v*100. / range); } static void check(int R, int G, int B); float D1, D2; float D3, D4; float D5, D6; int main(int argc, char** argv) { int R, G, B; if (argc > 1) { refBlackWhite[0] = 16; refBlackWhite[1] = 235; refBlackWhite[2] = 128; refBlackWhite[3] = 240; refBlackWhite[4] = 128; refBlackWhite[5] = 240; } D3 = 2 - 2*LumaRed; D4 = 2 - 2*LumaBlue; D1 = 1. / D3; D2 = 1. / D4; D5 = D3*LumaRed / LumaGreen; D6 = D4*LumaBlue / LumaGreen; setupLumaTables(); for (R = 0; R < 256; R++) { for (G = 0; G < 256; G++) for (B = 0; B < 256; B++) check(R, G, B); printf("[%3u] c %u/%u b %u/%u (R %u/%d/%u G %u/%d/%u B %u/%d/%u)\n" , R , eCodes - preveCodes, eCodes , eBits - preveBits, eBits , abs(AbseRtotal - preveRtotal), eRtotal , AbseRtotal , abs(AbseGtotal - preveGtotal), eGtotal , AbseGtotal , abs(AbseBtotal - preveBtotal), eBtotal , AbseBtotal ); preveRtotal = AbseRtotal; preveGtotal = AbseGtotal; preveBtotal = AbseBtotal; preveCodes = eCodes; preveBits = eBits; } printf("%u total codes\n", 256*256*256); printf("total error: %u codes %u bits (R %d/%u G %d/%u B %d/%u)\n" , eCodes , eBits , eRtotal , AbseRtotal , eGtotal , AbseGtotal , eBtotal , AbseBtotal ); return (0); } float *lumaRed; float *lumaGreen; float *lumaBlue; static float* setupLuma(float c) { float *v = (float *)_TIFFmalloc(256 * sizeof (float)); int i; for (i = 0; i < 256; i++) v[i] = c * i; return (v); } static void setupLumaTables(void) { lumaRed = setupLuma(LumaRed); lumaGreen = setupLuma(LumaGreen); lumaBlue = setupLuma(LumaBlue); } static unsigned V2Code(float f, unsigned long RB, unsigned long RW, int CR) { unsigned int c = (unsigned int)((((f)*(RW-RB)/CR)+RB)+.5); return (c > 255 ? 255 : c); } #define Code2V(c, RB, RW, CR) ((((c)-(int)RB)*(float)CR)/(float)(RW-RB)) #define CLAMP(f,min,max) \ (int)((f)+.5 < (min) ? (min) : (f)+.5 > (max) ? (max) : (f)+.5) static void check(int R, int G, int B) { float Y, Cb, Cr; int iY, iCb, iCr; float rY, rCb, rCr; float rR, rG, rB; int eR, eG, eB; Y = lumaRed[R] + lumaGreen[G] + lumaBlue[B]; Cb = (B - Y)*D2; Cr = (R - Y)*D1; iY = V2Code(Y, refBlackWhite[0], refBlackWhite[1], 255); iCb = V2Code(Cb, refBlackWhite[2], refBlackWhite[3], 127); iCr = V2Code(Cr, refBlackWhite[4], refBlackWhite[5], 127); rCb = Code2V(iCb, refBlackWhite[2], refBlackWhite[3], 127); rCr = Code2V(iCr, refBlackWhite[4], refBlackWhite[5], 127); rY = Code2V(iY, refBlackWhite[0], refBlackWhite[1], 255); rR = rY + rCr*D3; rB = rY + rCb*D4; rG = rY - rCb*D6 - rCr*D5; eR = R - CLAMP(rR,0,255); eG = G - CLAMP(rG,0,255); eB = B - CLAMP(rB,0,255); if (abs(eR) > 1 || abs(eG) > 1 || abs(eB) > 1) { printf("R %u G %u B %u", R, G, B); printf(" Y %g Cb %g Cr %g", Y, Cb, Cr); printf(" iY %u iCb %u iCr %u", iY, iCb, iCr); printf("\n -> Y %g Cb %g Cr %g", rY, rCb, rCr); printf(" R %g (%u) G %g (%u) B %g (%u) E=[%d %d %d])\n" , rR, CLAMP(rR,0,255) , rG, CLAMP(rG,0,255) , rB, CLAMP(rB,0,255) , eR, eG, eB ); } eRtotal += eR; eGtotal += eG; eBtotal += eB; AbseRtotal += abs(eR); AbseGtotal += abs(eG); AbseBtotal += abs(eB); if (eR | eG | eB) eCodes++; eBits += abs(eR) + abs(eG) + abs(eB); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/tiffmedian.c0000644000212300117540000005565511345765562013037 00000000000000/* $Id: tiffmedian.c,v 1.10 2010-03-10 18:56:50 bfriesen Exp $ */ /* * Apply median cut on an image. * * tiffmedian [-c n] [-f] input output * -C n - set colortable size. Default is 256. * -f - use Floyd-Steinberg dithering. * -c lzw - compress output with LZW * -c none - use no compression on output * -c packbits - use packbits compression on output * -r n - create output with n rows/strip of data * (by default the compression scheme and rows/strip are taken * from the input file) * * Notes: * * [1] Floyd-Steinberg dither: * I should point out that the actual fractions we used were, assuming * you are at X, moving left to right: * * X 7/16 * 3/16 5/16 1/16 * * Note that the error goes to four neighbors, not three. I think this * will probably do better (at least for black and white) than the * 3/8-3/8-1/4 distribution, at the cost of greater processing. I have * seen the 3/8-3/8-1/4 distribution described as "our" algorithm before, * but I have no idea who the credit really belongs to. * Also, I should add that if you do zig-zag scanning (see my immediately * previous message), it is sufficient (but not quite as good) to send * half the error one pixel ahead (e.g. to the right on lines you scan * left to right), and half one pixel straight down. Again, this is for * black and white; I've not tried it with color. * -- * Lou Steinberg * * [2] Color Image Quantization for Frame Buffer Display, Paul Heckbert, * Siggraph '82 proceedings, pp. 297-307 */ #include "tif_config.h" #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" #define MAX_CMAP_SIZE 256 #define streq(a,b) (strcmp(a,b) == 0) #define strneq(a,b,n) (strncmp(a,b,n) == 0) #define COLOR_DEPTH 8 #define MAX_COLOR 256 #define B_DEPTH 5 /* # bits/pixel to use */ #define B_LEN (1L< MAX_CMAP_SIZE) { fprintf(stderr, "-c: colormap too big, max %d\n", MAX_CMAP_SIZE); usage(); } break; case 'f': /* dither */ dither = 1; break; case 'r': /* rows/strip */ rowsperstrip = atoi(optarg); break; case '?': usage(); /*NOTREACHED*/ } if (argc - optind != 2) usage(); in = TIFFOpen(argv[optind], "r"); if (in == NULL) return (-1); TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &imagewidth); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &imagelength); TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bitspersample); TIFFGetField(in, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel); if (bitspersample != 8 && bitspersample != 16) { fprintf(stderr, "%s: Image must have at least 8-bits/sample\n", argv[optind]); return (-3); } if (!TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &photometric) || photometric != PHOTOMETRIC_RGB || samplesperpixel < 3) { fprintf(stderr, "%s: Image must have RGB data\n", argv[optind]); return (-4); } TIFFGetField(in, TIFFTAG_PLANARCONFIG, &config); if (config != PLANARCONFIG_CONTIG) { fprintf(stderr, "%s: Can only handle contiguous data packing\n", argv[optind]); return (-5); } /* * STEP 1: create empty boxes */ usedboxes = NULL; box_list = freeboxes = (Colorbox *)_TIFFmalloc(num_colors*sizeof (Colorbox)); freeboxes[0].next = &freeboxes[1]; freeboxes[0].prev = NULL; for (i = 1; i < num_colors-1; ++i) { freeboxes[i].next = &freeboxes[i+1]; freeboxes[i].prev = &freeboxes[i-1]; } freeboxes[num_colors-1].next = NULL; freeboxes[num_colors-1].prev = &freeboxes[num_colors-2]; /* * STEP 2: get histogram, initialize first box */ ptr = freeboxes; freeboxes = ptr->next; if (freeboxes) freeboxes->prev = NULL; ptr->next = usedboxes; usedboxes = ptr; if (ptr->next) ptr->next->prev = ptr; get_histogram(in, ptr); /* * STEP 3: continually subdivide boxes until no more free * boxes remain or until all colors assigned. */ while (freeboxes != NULL) { ptr = largest_box(); if (ptr != NULL) splitbox(ptr); else freeboxes = NULL; } /* * STEP 4: assign colors to all boxes */ for (i = 0, ptr = usedboxes; ptr != NULL; ++i, ptr = ptr->next) { rm[i] = ((ptr->rmin + ptr->rmax) << COLOR_SHIFT) / 2; gm[i] = ((ptr->gmin + ptr->gmax) << COLOR_SHIFT) / 2; bm[i] = ((ptr->bmin + ptr->bmax) << COLOR_SHIFT) / 2; } /* We're done with the boxes now */ _TIFFfree(box_list); freeboxes = usedboxes = NULL; /* * STEP 5: scan histogram and map all values to closest color */ /* 5a: create cell list as described in Heckbert[2] */ ColorCells = (C_cell **)_TIFFmalloc(C_LEN*C_LEN*C_LEN*sizeof (C_cell*)); _TIFFmemset(ColorCells, 0, C_LEN*C_LEN*C_LEN*sizeof (C_cell*)); /* 5b: create mapping from truncated pixel space to color table entries */ map_colortable(); /* * STEP 6: scan image, match input values to table entries */ out = TIFFOpen(argv[optind+1], "w"); if (out == NULL) return (-2); CopyField(TIFFTAG_SUBFILETYPE, longv); CopyField(TIFFTAG_IMAGEWIDTH, longv); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, (short)COLOR_DEPTH); if (compression != (uint16)-1) { TIFFSetField(out, TIFFTAG_COMPRESSION, compression); switch (compression) { case COMPRESSION_LZW: case COMPRESSION_DEFLATE: if (predictor != 0) TIFFSetField(out, TIFFTAG_PREDICTOR, predictor); break; } } else CopyField(TIFFTAG_COMPRESSION, compression); TIFFSetField(out, TIFFTAG_PHOTOMETRIC, (short)PHOTOMETRIC_PALETTE); CopyField(TIFFTAG_ORIENTATION, shortv); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, (short)1); CopyField(TIFFTAG_PLANARCONFIG, shortv); TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(out, rowsperstrip)); CopyField(TIFFTAG_MINSAMPLEVALUE, shortv); CopyField(TIFFTAG_MAXSAMPLEVALUE, shortv); CopyField(TIFFTAG_RESOLUTIONUNIT, shortv); CopyField(TIFFTAG_XRESOLUTION, floatv); CopyField(TIFFTAG_YRESOLUTION, floatv); CopyField(TIFFTAG_XPOSITION, floatv); CopyField(TIFFTAG_YPOSITION, floatv); if (dither) quant_fsdither(in, out); else quant(in, out); /* * Scale colormap to TIFF-required 16-bit values. */ #define SCALE(x) (((x)*((1L<<16)-1))/255) for (i = 0; i < MAX_CMAP_SIZE; ++i) { rm[i] = SCALE(rm[i]); gm[i] = SCALE(gm[i]); bm[i] = SCALE(bm[i]); } TIFFSetField(out, TIFFTAG_COLORMAP, rm, gm, bm); (void) TIFFClose(out); return (0); } static int processCompressOptions(char* opt) { if (streq(opt, "none")) compression = COMPRESSION_NONE; else if (streq(opt, "packbits")) compression = COMPRESSION_PACKBITS; else if (strneq(opt, "lzw", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_LZW; } else if (strneq(opt, "zip", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_DEFLATE; } else return (0); return (1); } char* stuff[] = { "usage: tiffmedian [options] input.tif output.tif", "where options are:", " -r # make each strip have no more than # rows", " -C # create a colormap with # entries", " -f use Floyd-Steinberg dithering", " -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", " -c zip[:opts] compress output with deflate encoding", " -c packbits compress output with packbits encoding", " -c none use no compression algorithm on output", "", "LZW and deflate options:", " # set predictor value", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } static void get_histogram(TIFF* in, Colorbox* box) { register unsigned char *inptr; register int red, green, blue; register uint32 j, i; unsigned char *inputline; inputline = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(in)); if (inputline == NULL) { fprintf(stderr, "No space for scanline buffer\n"); exit(-1); } box->rmin = box->gmin = box->bmin = 999; box->rmax = box->gmax = box->bmax = -1; box->total = imagewidth * imagelength; { register uint32 *ptr = &histogram[0][0][0]; for (i = B_LEN*B_LEN*B_LEN; i-- > 0;) *ptr++ = 0; } for (i = 0; i < imagelength; i++) { if (TIFFReadScanline(in, inputline, i, 0) <= 0) break; inptr = inputline; for (j = imagewidth; j-- > 0;) { red = *inptr++ >> COLOR_SHIFT; green = *inptr++ >> COLOR_SHIFT; blue = *inptr++ >> COLOR_SHIFT; if (red < box->rmin) box->rmin = red; if (red > box->rmax) box->rmax = red; if (green < box->gmin) box->gmin = green; if (green > box->gmax) box->gmax = green; if (blue < box->bmin) box->bmin = blue; if (blue > box->bmax) box->bmax = blue; histogram[red][green][blue]++; } } _TIFFfree(inputline); } static Colorbox * largest_box(void) { register Colorbox *p, *b; register uint32 size; b = NULL; size = 0; for (p = usedboxes; p != NULL; p = p->next) if ((p->rmax > p->rmin || p->gmax > p->gmin || p->bmax > p->bmin) && p->total > size) size = (b = p)->total; return (b); } static void splitbox(Colorbox* ptr) { uint32 hist2[B_LEN]; int first=0, last=0; register Colorbox *new; register uint32 *iptr, *histp; register int i, j; register int ir,ig,ib; register uint32 sum, sum1, sum2; enum { RED, GREEN, BLUE } axis; /* * See which axis is the largest, do a histogram along that * axis. Split at median point. Contract both new boxes to * fit points and return */ i = ptr->rmax - ptr->rmin; if (i >= ptr->gmax - ptr->gmin && i >= ptr->bmax - ptr->bmin) axis = RED; else if (ptr->gmax - ptr->gmin >= ptr->bmax - ptr->bmin) axis = GREEN; else axis = BLUE; /* get histogram along longest axis */ switch (axis) { case RED: histp = &hist2[ptr->rmin]; for (ir = ptr->rmin; ir <= ptr->rmax; ++ir) { *histp = 0; for (ig = ptr->gmin; ig <= ptr->gmax; ++ig) { iptr = &histogram[ir][ig][ptr->bmin]; for (ib = ptr->bmin; ib <= ptr->bmax; ++ib) *histp += *iptr++; } histp++; } first = ptr->rmin; last = ptr->rmax; break; case GREEN: histp = &hist2[ptr->gmin]; for (ig = ptr->gmin; ig <= ptr->gmax; ++ig) { *histp = 0; for (ir = ptr->rmin; ir <= ptr->rmax; ++ir) { iptr = &histogram[ir][ig][ptr->bmin]; for (ib = ptr->bmin; ib <= ptr->bmax; ++ib) *histp += *iptr++; } histp++; } first = ptr->gmin; last = ptr->gmax; break; case BLUE: histp = &hist2[ptr->bmin]; for (ib = ptr->bmin; ib <= ptr->bmax; ++ib) { *histp = 0; for (ir = ptr->rmin; ir <= ptr->rmax; ++ir) { iptr = &histogram[ir][ptr->gmin][ib]; for (ig = ptr->gmin; ig <= ptr->gmax; ++ig) { *histp += *iptr; iptr += B_LEN; } } histp++; } first = ptr->bmin; last = ptr->bmax; break; } /* find median point */ sum2 = ptr->total / 2; histp = &hist2[first]; sum = 0; for (i = first; i <= last && (sum += *histp++) < sum2; ++i) ; if (i == first) i++; /* Create new box, re-allocate points */ new = freeboxes; freeboxes = new->next; if (freeboxes) freeboxes->prev = NULL; if (usedboxes) usedboxes->prev = new; new->next = usedboxes; usedboxes = new; histp = &hist2[first]; for (sum1 = 0, j = first; j < i; j++) sum1 += *histp++; for (sum2 = 0, j = i; j <= last; j++) sum2 += *histp++; new->total = sum1; ptr->total = sum2; new->rmin = ptr->rmin; new->rmax = ptr->rmax; new->gmin = ptr->gmin; new->gmax = ptr->gmax; new->bmin = ptr->bmin; new->bmax = ptr->bmax; switch (axis) { case RED: new->rmax = i-1; ptr->rmin = i; break; case GREEN: new->gmax = i-1; ptr->gmin = i; break; case BLUE: new->bmax = i-1; ptr->bmin = i; break; } shrinkbox(new); shrinkbox(ptr); } static void shrinkbox(Colorbox* box) { register uint32 *histp; register int ir, ig, ib; if (box->rmax > box->rmin) { for (ir = box->rmin; ir <= box->rmax; ++ir) for (ig = box->gmin; ig <= box->gmax; ++ig) { histp = &histogram[ir][ig][box->bmin]; for (ib = box->bmin; ib <= box->bmax; ++ib) if (*histp++ != 0) { box->rmin = ir; goto have_rmin; } } have_rmin: if (box->rmax > box->rmin) for (ir = box->rmax; ir >= box->rmin; --ir) for (ig = box->gmin; ig <= box->gmax; ++ig) { histp = &histogram[ir][ig][box->bmin]; ib = box->bmin; for (; ib <= box->bmax; ++ib) if (*histp++ != 0) { box->rmax = ir; goto have_rmax; } } } have_rmax: if (box->gmax > box->gmin) { for (ig = box->gmin; ig <= box->gmax; ++ig) for (ir = box->rmin; ir <= box->rmax; ++ir) { histp = &histogram[ir][ig][box->bmin]; for (ib = box->bmin; ib <= box->bmax; ++ib) if (*histp++ != 0) { box->gmin = ig; goto have_gmin; } } have_gmin: if (box->gmax > box->gmin) for (ig = box->gmax; ig >= box->gmin; --ig) for (ir = box->rmin; ir <= box->rmax; ++ir) { histp = &histogram[ir][ig][box->bmin]; ib = box->bmin; for (; ib <= box->bmax; ++ib) if (*histp++ != 0) { box->gmax = ig; goto have_gmax; } } } have_gmax: if (box->bmax > box->bmin) { for (ib = box->bmin; ib <= box->bmax; ++ib) for (ir = box->rmin; ir <= box->rmax; ++ir) { histp = &histogram[ir][box->gmin][ib]; for (ig = box->gmin; ig <= box->gmax; ++ig) { if (*histp != 0) { box->bmin = ib; goto have_bmin; } histp += B_LEN; } } have_bmin: if (box->bmax > box->bmin) for (ib = box->bmax; ib >= box->bmin; --ib) for (ir = box->rmin; ir <= box->rmax; ++ir) { histp = &histogram[ir][box->gmin][ib]; ig = box->gmin; for (; ig <= box->gmax; ++ig) { if (*histp != 0) { box->bmax = ib; goto have_bmax; } histp += B_LEN; } } } have_bmax: ; } static C_cell * create_colorcell(int red, int green, int blue) { register int ir, ig, ib, i; register C_cell *ptr; int mindist, next_n; register int tmp, dist, n; ir = red >> (COLOR_DEPTH-C_DEPTH); ig = green >> (COLOR_DEPTH-C_DEPTH); ib = blue >> (COLOR_DEPTH-C_DEPTH); ptr = (C_cell *)_TIFFmalloc(sizeof (C_cell)); *(ColorCells + ir*C_LEN*C_LEN + ig*C_LEN + ib) = ptr; ptr->num_ents = 0; /* * Step 1: find all colors inside this cell, while we're at * it, find distance of centermost point to furthest corner */ mindist = 99999999; for (i = 0; i < num_colors; ++i) { if (rm[i]>>(COLOR_DEPTH-C_DEPTH) != ir || gm[i]>>(COLOR_DEPTH-C_DEPTH) != ig || bm[i]>>(COLOR_DEPTH-C_DEPTH) != ib) continue; ptr->entries[ptr->num_ents][0] = i; ptr->entries[ptr->num_ents][1] = 0; ++ptr->num_ents; tmp = rm[i] - red; if (tmp < (MAX_COLOR/C_LEN/2)) tmp = MAX_COLOR/C_LEN-1 - tmp; dist = tmp*tmp; tmp = gm[i] - green; if (tmp < (MAX_COLOR/C_LEN/2)) tmp = MAX_COLOR/C_LEN-1 - tmp; dist += tmp*tmp; tmp = bm[i] - blue; if (tmp < (MAX_COLOR/C_LEN/2)) tmp = MAX_COLOR/C_LEN-1 - tmp; dist += tmp*tmp; if (dist < mindist) mindist = dist; } /* * Step 3: find all points within that distance to cell. */ for (i = 0; i < num_colors; ++i) { if (rm[i] >> (COLOR_DEPTH-C_DEPTH) == ir && gm[i] >> (COLOR_DEPTH-C_DEPTH) == ig && bm[i] >> (COLOR_DEPTH-C_DEPTH) == ib) continue; dist = 0; if ((tmp = red - rm[i]) > 0 || (tmp = rm[i] - (red + MAX_COLOR/C_LEN-1)) > 0 ) dist += tmp*tmp; if ((tmp = green - gm[i]) > 0 || (tmp = gm[i] - (green + MAX_COLOR/C_LEN-1)) > 0 ) dist += tmp*tmp; if ((tmp = blue - bm[i]) > 0 || (tmp = bm[i] - (blue + MAX_COLOR/C_LEN-1)) > 0 ) dist += tmp*tmp; if (dist < mindist) { ptr->entries[ptr->num_ents][0] = i; ptr->entries[ptr->num_ents][1] = dist; ++ptr->num_ents; } } /* * Sort color cells by distance, use cheap exchange sort */ for (n = ptr->num_ents - 1; n > 0; n = next_n) { next_n = 0; for (i = 0; i < n; ++i) if (ptr->entries[i][1] > ptr->entries[i+1][1]) { tmp = ptr->entries[i][0]; ptr->entries[i][0] = ptr->entries[i+1][0]; ptr->entries[i+1][0] = tmp; tmp = ptr->entries[i][1]; ptr->entries[i][1] = ptr->entries[i+1][1]; ptr->entries[i+1][1] = tmp; next_n = i; } } return (ptr); } static void map_colortable(void) { register uint32 *histp = &histogram[0][0][0]; register C_cell *cell; register int j, tmp, d2, dist; int ir, ig, ib, i; for (ir = 0; ir < B_LEN; ++ir) for (ig = 0; ig < B_LEN; ++ig) for (ib = 0; ib < B_LEN; ++ib, histp++) { if (*histp == 0) { *histp = -1; continue; } cell = *(ColorCells + (((ir>>(B_DEPTH-C_DEPTH)) << C_DEPTH*2) + ((ig>>(B_DEPTH-C_DEPTH)) << C_DEPTH) + (ib>>(B_DEPTH-C_DEPTH)))); if (cell == NULL ) cell = create_colorcell( ir << COLOR_SHIFT, ig << COLOR_SHIFT, ib << COLOR_SHIFT); dist = 9999999; for (i = 0; i < cell->num_ents && dist > cell->entries[i][1]; ++i) { j = cell->entries[i][0]; d2 = rm[j] - (ir << COLOR_SHIFT); d2 *= d2; tmp = gm[j] - (ig << COLOR_SHIFT); d2 += tmp*tmp; tmp = bm[j] - (ib << COLOR_SHIFT); d2 += tmp*tmp; if (d2 < dist) { dist = d2; *histp = j; } } } } /* * straight quantization. Each pixel is mapped to the colors * closest to it. Color values are rounded to the nearest color * table entry. */ static void quant(TIFF* in, TIFF* out) { unsigned char *outline, *inputline; register unsigned char *outptr, *inptr; register uint32 i, j; register int red, green, blue; inputline = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(in)); outline = (unsigned char *)_TIFFmalloc(imagewidth); for (i = 0; i < imagelength; i++) { if (TIFFReadScanline(in, inputline, i, 0) <= 0) break; inptr = inputline; outptr = outline; for (j = 0; j < imagewidth; j++) { red = *inptr++ >> COLOR_SHIFT; green = *inptr++ >> COLOR_SHIFT; blue = *inptr++ >> COLOR_SHIFT; *outptr++ = (unsigned char)histogram[red][green][blue]; } if (TIFFWriteScanline(out, outline, i, 0) < 0) break; } _TIFFfree(inputline); _TIFFfree(outline); } #define SWAP(type,a,b) { type p; p = a; a = b; b = p; } #define GetInputLine(tif, row, bad) \ if (TIFFReadScanline(tif, inputline, row, 0) <= 0) \ bad; \ inptr = inputline; \ nextptr = nextline; \ for (j = 0; j < imagewidth; ++j) { \ *nextptr++ = *inptr++; \ *nextptr++ = *inptr++; \ *nextptr++ = *inptr++; \ } #define GetComponent(raw, cshift, c) \ cshift = raw; \ if (cshift < 0) \ cshift = 0; \ else if (cshift >= MAX_COLOR) \ cshift = MAX_COLOR-1; \ c = cshift; \ cshift >>= COLOR_SHIFT; static void quant_fsdither(TIFF* in, TIFF* out) { unsigned char *outline, *inputline, *inptr; short *thisline, *nextline; register unsigned char *outptr; register short *thisptr, *nextptr; register uint32 i, j; uint32 imax, jmax; int lastline, lastpixel; imax = imagelength - 1; jmax = imagewidth - 1; inputline = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(in)); thisline = (short *)_TIFFmalloc(imagewidth * 3 * sizeof (short)); nextline = (short *)_TIFFmalloc(imagewidth * 3 * sizeof (short)); outline = (unsigned char *) _TIFFmalloc(TIFFScanlineSize(out)); GetInputLine(in, 0, goto bad); /* get first line */ for (i = 1; i <= imagelength; ++i) { SWAP(short *, thisline, nextline); lastline = (i >= imax); if (i <= imax) GetInputLine(in, i, break); thisptr = thisline; nextptr = nextline; outptr = outline; for (j = 0; j < imagewidth; ++j) { int red, green, blue; register int oval, r2, g2, b2; lastpixel = (j == jmax); GetComponent(*thisptr++, r2, red); GetComponent(*thisptr++, g2, green); GetComponent(*thisptr++, b2, blue); oval = histogram[r2][g2][b2]; if (oval == -1) { int ci; register int cj, tmp, d2, dist; register C_cell *cell; cell = *(ColorCells + (((r2>>(B_DEPTH-C_DEPTH)) << C_DEPTH*2) + ((g2>>(B_DEPTH-C_DEPTH)) << C_DEPTH ) + (b2>>(B_DEPTH-C_DEPTH)))); if (cell == NULL) cell = create_colorcell(red, green, blue); dist = 9999999; for (ci = 0; ci < cell->num_ents && dist > cell->entries[ci][1]; ++ci) { cj = cell->entries[ci][0]; d2 = (rm[cj] >> COLOR_SHIFT) - r2; d2 *= d2; tmp = (gm[cj] >> COLOR_SHIFT) - g2; d2 += tmp*tmp; tmp = (bm[cj] >> COLOR_SHIFT) - b2; d2 += tmp*tmp; if (d2 < dist) { dist = d2; oval = cj; } } histogram[r2][g2][b2] = oval; } *outptr++ = oval; red -= rm[oval]; green -= gm[oval]; blue -= bm[oval]; if (!lastpixel) { thisptr[0] += blue * 7 / 16; thisptr[1] += green * 7 / 16; thisptr[2] += red * 7 / 16; } if (!lastline) { if (j != 0) { nextptr[-3] += blue * 3 / 16; nextptr[-2] += green * 3 / 16; nextptr[-1] += red * 3 / 16; } nextptr[0] += blue * 5 / 16; nextptr[1] += green * 5 / 16; nextptr[2] += red * 5 / 16; if (!lastpixel) { nextptr[3] += blue / 16; nextptr[4] += green / 16; nextptr[5] += red / 16; } nextptr += 3; } } if (TIFFWriteScanline(out, outline, i-1, 0) < 0) break; } bad: _TIFFfree(inputline); _TIFFfree(thisline); _TIFFfree(nextline); _TIFFfree(outline); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/tiffgt.c0000644000212300117540000003460611415374160012171 00000000000000/* $Id: tiffgt.c,v 1.10 2010-07-01 15:56:56 dron Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * Copyright (c) 2003, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include #if HAVE_APPLE_OPENGL_FRAMEWORK # include # include #else # include # include #endif #include "tiffio.h" #include "tiffiop.h" #ifndef HAVE_GETOPT extern int getopt(int, char**, char*); #endif static uint32 width = 0, height = 0; /* window width & height */ static uint32* raster = NULL; /* displayable image */ static TIFFRGBAImage img; static int order0 = 0, order; static uint16 photo0 = (uint16) -1, photo; static int stoponerr = 0; /* stop on read error */ static int verbose = 0; #define TITLE_LENGTH 1024 static char title[TITLE_LENGTH]; /* window title line */ static uint32 xmax, ymax; static char** filelist = NULL; static int fileindex; static int filenum; static TIFFErrorHandler oerror; static TIFFErrorHandler owarning; static void cleanup_and_exit(void); static int initImage(void); static int prevImage(void); static int nextImage(void); static void setWindowSize(void); static void usage(void); static uint16 photoArg(const char*); static void raster_draw(void); static void raster_reshape(int, int); static void raster_keys(unsigned char, int, int); static void raster_special(int, int, int); extern char* optarg; extern int optind; static TIFF* tif = NULL; int main(int argc, char* argv[]) { int c; int dirnum = -1; uint32 diroff = 0; oerror = TIFFSetErrorHandler(NULL); owarning = TIFFSetWarningHandler(NULL); while ((c = getopt(argc, argv, "d:o:p:eflmsvw?")) != -1) switch (c) { case 'd': dirnum = atoi(optarg); break; case 'e': oerror = TIFFSetErrorHandler(oerror); break; case 'l': order0 = FILLORDER_LSB2MSB; break; case 'm': order0 = FILLORDER_MSB2LSB; break; case 'o': diroff = strtoul(optarg, NULL, 0); break; case 'p': photo0 = photoArg(optarg); break; case 's': stoponerr = 1; break; case 'w': owarning = TIFFSetWarningHandler(owarning); break; case 'v': verbose = 1; break; case '?': usage(); /*NOTREACHED*/ } filenum = argc - optind; if ( filenum < 1) usage(); glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); /* * Get the screen size */ xmax = glutGet(GLUT_SCREEN_WIDTH); ymax = glutGet(GLUT_SCREEN_HEIGHT); /* * Use 90% of the screen size */ xmax = xmax - xmax / 10.0; ymax = ymax - ymax / 10.0; filelist = (char **) _TIFFmalloc(filenum * sizeof(char*)); if (!filelist) { TIFFError(argv[0], "Can not allocate space for the file list."); return 1; } _TIFFmemcpy(filelist, argv + optind, filenum * sizeof(char*)); fileindex = -1; if (nextImage() < 0) { _TIFFfree(filelist); return 2; } /* * Set initial directory if user-specified * file was opened successfully. */ if (dirnum != -1 && !TIFFSetDirectory(tif, dirnum)) TIFFError(argv[0], "Error, seeking to directory %d", dirnum); if (diroff != 0 && !TIFFSetSubDirectory(tif, diroff)) TIFFError(argv[0], "Error, setting subdirectory at %#x", diroff); order = order0; photo = photo0; if (initImage() < 0){ _TIFFfree(filelist); return 3; } /* * Create a new window or reconfigure an existing * one to suit the image to be displayed. */ glutInitWindowSize(width, height); snprintf(title, TITLE_LENGTH - 1, "%s [%u]", filelist[fileindex], (unsigned int) TIFFCurrentDirectory(tif)); glutCreateWindow(title); glutDisplayFunc(raster_draw); glutReshapeFunc(raster_reshape); glutKeyboardFunc(raster_keys); glutSpecialFunc(raster_special); glutMainLoop(); cleanup_and_exit(); return 0; } static void cleanup_and_exit(void) { TIFFRGBAImageEnd(&img); if (filelist != NULL) _TIFFfree(filelist); if (raster != NULL) _TIFFfree(raster); if (tif != NULL) TIFFClose(tif); exit(0); } static int initImage(void) { uint32 w, h; if (order) TIFFSetField(tif, TIFFTAG_FILLORDER, order); if (photo != (uint16) -1) TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photo); if (!TIFFRGBAImageBegin(&img, tif, stoponerr, title)) { TIFFError(filelist[fileindex], "%s", title); TIFFClose(tif); tif = NULL; return -1; } /* * Setup the image raster as required. */ h = img.height; w = img.width; if (h > ymax) { w = (int)(w * ((float)ymax / h)); h = ymax; } if (w > xmax) { h = (int)(h * ((float)xmax / w)); w = xmax; } if (w != width || h != height) { uint32 rastersize = _TIFFMultiply32(tif, img.width, img.height, "allocating raster buffer"); if (raster != NULL) _TIFFfree(raster), raster = NULL; raster = (uint32*) _TIFFCheckMalloc(tif, rastersize, sizeof (uint32), "allocating raster buffer"); if (raster == NULL) { width = height = 0; TIFFError(filelist[fileindex], "No space for raster buffer"); cleanup_and_exit(); } width = w; height = h; } TIFFRGBAImageGet(&img, raster, img.width, img.height); #if HOST_BIGENDIAN TIFFSwabArrayOfLong(raster,img.width*img.height); #endif return 0; } static int prevImage(void) { if (fileindex > 0) fileindex--; else if (tif) return fileindex; if (tif) TIFFClose(tif); tif = TIFFOpen(filelist[fileindex], "r"); if (tif == NULL) return -1; return fileindex; } static int nextImage(void) { if (fileindex < filenum - 1) fileindex++; else if (tif) return fileindex; if (tif) TIFFClose(tif); tif = TIFFOpen(filelist[fileindex], "r"); if (tif == NULL) return -1; return fileindex; } static void setWindowSize(void) { glutReshapeWindow(width, height); } static void raster_draw(void) { glDrawPixels(img.width, img.height, GL_RGBA, GL_UNSIGNED_BYTE, (const GLvoid *) raster); } static void raster_reshape(int win_w, int win_h) { GLfloat xratio = (GLfloat)win_w/img.width; GLfloat yratio = (GLfloat)win_h/img.height; int ratio = (int)(((xratio > yratio)?xratio:yratio) * 100); glPixelZoom(xratio, yratio); glViewport(0, 0, win_w, win_h); snprintf(title, 1024, "%s [%u] %d%%", filelist[fileindex], (unsigned int) TIFFCurrentDirectory(tif), ratio); glutSetWindowTitle(title); } static void raster_keys(unsigned char key, int x, int y) { switch (key) { case 'b': /* photometric MinIsBlack */ photo = PHOTOMETRIC_MINISBLACK; initImage(); break; case 'l': /* lsb-to-msb FillOrder */ order = FILLORDER_LSB2MSB; initImage(); break; case 'm': /* msb-to-lsb FillOrder */ order = FILLORDER_MSB2LSB; initImage(); break; case 'w': /* photometric MinIsWhite */ photo = PHOTOMETRIC_MINISWHITE; initImage(); break; case 'W': /* toggle warnings */ owarning = TIFFSetWarningHandler(owarning); initImage(); break; case 'E': /* toggle errors */ oerror = TIFFSetErrorHandler(oerror); initImage(); break; case 'z': /* reset to defaults */ case 'Z': order = order0; photo = photo0; if (owarning == NULL) owarning = TIFFSetWarningHandler(NULL); if (oerror == NULL) oerror = TIFFSetErrorHandler(NULL); initImage(); break; case 'q': /* exit */ case '\033': cleanup_and_exit(); } glutPostRedisplay(); } static void raster_special(int key, int x, int y) { switch (key) { case GLUT_KEY_PAGE_UP: /* previous logical image */ if (TIFFCurrentDirectory(tif) > 0) { if (TIFFSetDirectory(tif, TIFFCurrentDirectory(tif)-1)) { initImage(); setWindowSize(); } } else { TIFFRGBAImageEnd(&img); prevImage(); initImage(); setWindowSize(); } break; case GLUT_KEY_PAGE_DOWN: /* next logical image */ if (!TIFFLastDirectory(tif)) { if (TIFFReadDirectory(tif)) { initImage(); setWindowSize(); } } else { TIFFRGBAImageEnd(&img); nextImage(); initImage(); setWindowSize(); } break; case GLUT_KEY_HOME: /* 1st image in current file */ if (TIFFSetDirectory(tif, 0)) { TIFFRGBAImageEnd(&img); initImage(); setWindowSize(); } break; case GLUT_KEY_END: /* last image in current file */ TIFFRGBAImageEnd(&img); while (!TIFFLastDirectory(tif)) TIFFReadDirectory(tif); initImage(); setWindowSize(); break; } glutPostRedisplay(); } char* stuff[] = { "usage: tiffgt [options] file.tif", "where options are:", " -c use colormap visual", " -d dirnum set initial directory (default is 0)", " -e enable display of TIFF error messages", " -l force lsb-to-msb FillOrder", " -m force msb-to-lsb FillOrder", " -o offset set initial directory offset", " -p photo override photometric interpretation", " -r use fullcolor visual", " -s stop decoding on first error (default is ignore errors)", " -v enable verbose mode", " -w enable display of TIFF warning messages", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } static uint16 photoArg(const char* arg) { if (strcmp(arg, "miniswhite") == 0) return (PHOTOMETRIC_MINISWHITE); else if (strcmp(arg, "minisblack") == 0) return (PHOTOMETRIC_MINISBLACK); else if (strcmp(arg, "rgb") == 0) return (PHOTOMETRIC_RGB); else if (strcmp(arg, "palette") == 0) return (PHOTOMETRIC_PALETTE); else if (strcmp(arg, "mask") == 0) return (PHOTOMETRIC_MASK); else if (strcmp(arg, "separated") == 0) return (PHOTOMETRIC_SEPARATED); else if (strcmp(arg, "ycbcr") == 0) return (PHOTOMETRIC_YCBCR); else if (strcmp(arg, "cielab") == 0) return (PHOTOMETRIC_CIELAB); else if (strcmp(arg, "logl") == 0) return (PHOTOMETRIC_LOGL); else if (strcmp(arg, "logluv") == 0) return (PHOTOMETRIC_LOGLUV); else return ((uint16) -1); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/Makefile.vc0000644000212300117540000000367311140423202012574 00000000000000# $Id: Makefile.vc,v 1.15 2009-01-22 20:53:07 fwarmerdam Exp $ # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # # Makefile for MS Visual C and Watcom C compilers. # # To build: # C:\libtiff\tools> nmake /f makefile.vc !INCLUDE ..\nmake.opt TARGETS = bmp2tiff.exe tiffinfo.exe tiffdump.exe fax2tiff.exe \ fax2ps.exe gif2tiff.exe pal2rgb.exe ppm2tiff.exe \ rgb2ycbcr.exe thumbnail.exe ras2tiff.exe raw2tiff.exe \ tiff2bw.exe tiff2rgba.exe tiff2pdf.exe tiff2ps.exe \ tiffcmp.exe tiffcp.exe tiffcrop.exe tiffdither.exe \ tiffmedian.exe tiffset.exe tiffsplit.exe INCL = -I..\libtiff -I..\port -DNEED_LIBPORT LIBS = $(LIBS) ..\port\libport.lib ..\libtiff\libtiff.lib default: $(TARGETS) .c.exe: $(CC) $(CFLAGS) $*.c $(EXTRA_OBJ) $(LIBS) tiffgt.exe: $(CC) $(CFLAGS) tiffgt.c $(EXTRA_OBJ) $(LIBS) clean: -del *.exe -del *.exe.manifest -del *.obj tiff-4.0.3/tools/tiffcmp.c0000644000212300117540000004237511345765562012354 00000000000000/* $Id: tiffcmp.c,v 1.16 2010-03-10 18:56:50 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" #ifndef HAVE_GETOPT extern int getopt(int, char**, char*); #endif static int stopondiff = 1; static int stoponfirsttag = 1; static uint16 bitspersample = 1; static uint16 samplesperpixel = 1; static uint16 sampleformat = SAMPLEFORMAT_UINT; static uint32 imagewidth; static uint32 imagelength; static void usage(void); static int tiffcmp(TIFF*, TIFF*); static int cmptags(TIFF*, TIFF*); static int ContigCompare(int, uint32, unsigned char*, unsigned char*, tsize_t); static int SeparateCompare(int, int, uint32, unsigned char*, unsigned char*); static void PrintIntDiff(uint32, int, uint32, uint32, uint32); static void PrintFloatDiff(uint32, int, uint32, double, double); static void leof(const char*, uint32, int); int main(int argc, char* argv[]) { TIFF *tif1, *tif2; int c, dirnum; extern int optind; extern char* optarg; while ((c = getopt(argc, argv, "ltz:")) != -1) switch (c) { case 'l': stopondiff = 0; break; case 'z': stopondiff = atoi(optarg); break; case 't': stoponfirsttag = 0; break; case '?': usage(); /*NOTREACHED*/ } if (argc - optind < 2) usage(); tif1 = TIFFOpen(argv[optind], "r"); if (tif1 == NULL) return (-1); tif2 = TIFFOpen(argv[optind+1], "r"); if (tif2 == NULL) return (-2); dirnum = 0; while (tiffcmp(tif1, tif2)) { if (!TIFFReadDirectory(tif1)) { if (!TIFFReadDirectory(tif2)) break; printf("No more directories for %s\n", TIFFFileName(tif1)); return (1); } else if (!TIFFReadDirectory(tif2)) { printf("No more directories for %s\n", TIFFFileName(tif2)); return (1); } printf("Directory %d:\n", ++dirnum); } TIFFClose(tif1); TIFFClose(tif2); return (0); } char* stuff[] = { "usage: tiffcmp [options] file1 file2", "where options are:", " -l list each byte of image data that differs between the files", " -z # list specified number of bytes that differs between the files", " -t ignore any differences in directory tags", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } #define checkEOF(tif, row, sample) { \ leof(TIFFFileName(tif), row, sample); \ goto bad; \ } static int CheckShortTag(TIFF*, TIFF*, int, char*); static int CheckShort2Tag(TIFF*, TIFF*, int, char*); static int CheckShortArrayTag(TIFF*, TIFF*, int, char*); static int CheckLongTag(TIFF*, TIFF*, int, char*); static int CheckFloatTag(TIFF*, TIFF*, int, char*); static int CheckStringTag(TIFF*, TIFF*, int, char*); static int tiffcmp(TIFF* tif1, TIFF* tif2) { uint16 config1, config2; tsize_t size1; uint32 row; tsample_t s; unsigned char *buf1, *buf2; if (!CheckShortTag(tif1, tif2, TIFFTAG_BITSPERSAMPLE, "BitsPerSample")) return (0); if (!CheckShortTag(tif1, tif2, TIFFTAG_SAMPLESPERPIXEL, "SamplesPerPixel")) return (0); if (!CheckLongTag(tif1, tif2, TIFFTAG_IMAGEWIDTH, "ImageWidth")) return (0); if (!cmptags(tif1, tif2)) return (1); (void) TIFFGetField(tif1, TIFFTAG_BITSPERSAMPLE, &bitspersample); (void) TIFFGetField(tif1, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel); (void) TIFFGetField(tif1, TIFFTAG_SAMPLEFORMAT, &sampleformat); (void) TIFFGetField(tif1, TIFFTAG_IMAGEWIDTH, &imagewidth); (void) TIFFGetField(tif1, TIFFTAG_IMAGELENGTH, &imagelength); (void) TIFFGetField(tif1, TIFFTAG_PLANARCONFIG, &config1); (void) TIFFGetField(tif2, TIFFTAG_PLANARCONFIG, &config2); buf1 = (unsigned char *)_TIFFmalloc(size1 = TIFFScanlineSize(tif1)); buf2 = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(tif2)); if (buf1 == NULL || buf2 == NULL) { fprintf(stderr, "No space for scanline buffers\n"); exit(-1); } if (config1 != config2 && bitspersample != 8 && samplesperpixel > 1) { fprintf(stderr, "Can't handle different planar configuration w/ different bits/sample\n"); goto bad; } #define pack(a,b) ((a)<<8)|(b) switch (pack(config1, config2)) { case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_CONTIG): for (row = 0; row < imagelength; row++) { if (TIFFReadScanline(tif2, buf2, row, 0) < 0) checkEOF(tif2, row, -1) for (s = 0; s < samplesperpixel; s++) { if (TIFFReadScanline(tif1, buf1, row, s) < 0) checkEOF(tif1, row, s) if (SeparateCompare(1, s, row, buf2, buf1) < 0) goto bad1; } } break; case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_SEPARATE): for (row = 0; row < imagelength; row++) { if (TIFFReadScanline(tif1, buf1, row, 0) < 0) checkEOF(tif1, row, -1) for (s = 0; s < samplesperpixel; s++) { if (TIFFReadScanline(tif2, buf2, row, s) < 0) checkEOF(tif2, row, s) if (SeparateCompare(0, s, row, buf1, buf2) < 0) goto bad1; } } break; case pack(PLANARCONFIG_SEPARATE, PLANARCONFIG_SEPARATE): for (s = 0; s < samplesperpixel; s++) for (row = 0; row < imagelength; row++) { if (TIFFReadScanline(tif1, buf1, row, s) < 0) checkEOF(tif1, row, s) if (TIFFReadScanline(tif2, buf2, row, s) < 0) checkEOF(tif2, row, s) if (ContigCompare(s, row, buf1, buf2, size1) < 0) goto bad1; } break; case pack(PLANARCONFIG_CONTIG, PLANARCONFIG_CONTIG): for (row = 0; row < imagelength; row++) { if (TIFFReadScanline(tif1, buf1, row, 0) < 0) checkEOF(tif1, row, -1) if (TIFFReadScanline(tif2, buf2, row, 0) < 0) checkEOF(tif2, row, -1) if (ContigCompare(-1, row, buf1, buf2, size1) < 0) goto bad1; } break; } if (buf1) _TIFFfree(buf1); if (buf2) _TIFFfree(buf2); return (1); bad: if (stopondiff) exit(1); bad1: if (buf1) _TIFFfree(buf1); if (buf2) _TIFFfree(buf2); return (0); } #define CmpShortField(tag, name) \ if (!CheckShortTag(tif1, tif2, tag, name) && stoponfirsttag) return (0) #define CmpShortField2(tag, name) \ if (!CheckShort2Tag(tif1, tif2, tag, name) && stoponfirsttag) return (0) #define CmpLongField(tag, name) \ if (!CheckLongTag(tif1, tif2, tag, name) && stoponfirsttag) return (0) #define CmpFloatField(tag, name) \ if (!CheckFloatTag(tif1, tif2, tag, name) && stoponfirsttag) return (0) #define CmpStringField(tag, name) \ if (!CheckStringTag(tif1, tif2, tag, name) && stoponfirsttag) return (0) #define CmpShortArrayField(tag, name) \ if (!CheckShortArrayTag(tif1, tif2, tag, name) && stoponfirsttag) return (0) static int cmptags(TIFF* tif1, TIFF* tif2) { CmpLongField(TIFFTAG_SUBFILETYPE, "SubFileType"); CmpLongField(TIFFTAG_IMAGEWIDTH, "ImageWidth"); CmpLongField(TIFFTAG_IMAGELENGTH, "ImageLength"); CmpShortField(TIFFTAG_BITSPERSAMPLE, "BitsPerSample"); CmpShortField(TIFFTAG_COMPRESSION, "Compression"); CmpShortField(TIFFTAG_PREDICTOR, "Predictor"); CmpShortField(TIFFTAG_PHOTOMETRIC, "PhotometricInterpretation"); CmpShortField(TIFFTAG_THRESHHOLDING, "Thresholding"); CmpShortField(TIFFTAG_FILLORDER, "FillOrder"); CmpShortField(TIFFTAG_ORIENTATION, "Orientation"); CmpShortField(TIFFTAG_SAMPLESPERPIXEL, "SamplesPerPixel"); CmpShortField(TIFFTAG_MINSAMPLEVALUE, "MinSampleValue"); CmpShortField(TIFFTAG_MAXSAMPLEVALUE, "MaxSampleValue"); CmpShortField(TIFFTAG_SAMPLEFORMAT, "SampleFormat"); CmpFloatField(TIFFTAG_XRESOLUTION, "XResolution"); CmpFloatField(TIFFTAG_YRESOLUTION, "YResolution"); CmpLongField(TIFFTAG_GROUP3OPTIONS, "Group3Options"); CmpLongField(TIFFTAG_GROUP4OPTIONS, "Group4Options"); CmpShortField(TIFFTAG_RESOLUTIONUNIT, "ResolutionUnit"); CmpShortField(TIFFTAG_PLANARCONFIG, "PlanarConfiguration"); CmpLongField(TIFFTAG_ROWSPERSTRIP, "RowsPerStrip"); CmpFloatField(TIFFTAG_XPOSITION, "XPosition"); CmpFloatField(TIFFTAG_YPOSITION, "YPosition"); CmpShortField(TIFFTAG_GRAYRESPONSEUNIT, "GrayResponseUnit"); CmpShortField(TIFFTAG_COLORRESPONSEUNIT, "ColorResponseUnit"); #ifdef notdef { uint16 *graycurve; CmpField(TIFFTAG_GRAYRESPONSECURVE, graycurve); } { uint16 *red, *green, *blue; CmpField3(TIFFTAG_COLORRESPONSECURVE, red, green, blue); } { uint16 *red, *green, *blue; CmpField3(TIFFTAG_COLORMAP, red, green, blue); } #endif CmpShortField2(TIFFTAG_PAGENUMBER, "PageNumber"); CmpStringField(TIFFTAG_ARTIST, "Artist"); CmpStringField(TIFFTAG_IMAGEDESCRIPTION,"ImageDescription"); CmpStringField(TIFFTAG_MAKE, "Make"); CmpStringField(TIFFTAG_MODEL, "Model"); CmpStringField(TIFFTAG_SOFTWARE, "Software"); CmpStringField(TIFFTAG_DATETIME, "DateTime"); CmpStringField(TIFFTAG_HOSTCOMPUTER, "HostComputer"); CmpStringField(TIFFTAG_PAGENAME, "PageName"); CmpStringField(TIFFTAG_DOCUMENTNAME, "DocumentName"); CmpShortField(TIFFTAG_MATTEING, "Matteing"); CmpShortArrayField(TIFFTAG_EXTRASAMPLES,"ExtraSamples"); return (1); } static int ContigCompare(int sample, uint32 row, unsigned char* p1, unsigned char* p2, tsize_t size) { uint32 pix; int ppb = 8 / bitspersample; int samples_to_test; if (memcmp(p1, p2, size) == 0) return 0; samples_to_test = (sample == -1) ? samplesperpixel : 1; switch (bitspersample) { case 1: case 2: case 4: case 8: { unsigned char *pix1 = p1, *pix2 = p2; for (pix = 0; pix < imagewidth; pix += ppb) { int s; for(s = 0; s < samples_to_test; s++) { if (*pix1 != *pix2) { if( sample == -1 ) PrintIntDiff(row, s, pix, *pix1, *pix2); else PrintIntDiff(row, sample, pix, *pix1, *pix2); } pix1++; pix2++; } } break; } case 16: { uint16 *pix1 = (uint16 *)p1, *pix2 = (uint16 *)p2; for (pix = 0; pix < imagewidth; pix++) { int s; for(s = 0; s < samples_to_test; s++) { if (*pix1 != *pix2) PrintIntDiff(row, sample, pix, *pix1, *pix2); pix1++; pix2++; } } break; } case 32: if (sampleformat == SAMPLEFORMAT_UINT || sampleformat == SAMPLEFORMAT_INT) { uint32 *pix1 = (uint32 *)p1, *pix2 = (uint32 *)p2; for (pix = 0; pix < imagewidth; pix++) { int s; for(s = 0; s < samples_to_test; s++) { if (*pix1 != *pix2) { PrintIntDiff(row, sample, pix, *pix1, *pix2); } pix1++; pix2++; } } } else if (sampleformat == SAMPLEFORMAT_IEEEFP) { float *pix1 = (float *)p1, *pix2 = (float *)p2; for (pix = 0; pix < imagewidth; pix++) { int s; for(s = 0; s < samples_to_test; s++) { if (fabs(*pix1 - *pix2) < 0.000000000001) { PrintFloatDiff(row, sample, pix, *pix1, *pix2); } pix1++; pix2++; } } } else { fprintf(stderr, "Sample format %d is not supported.\n", sampleformat); return -1; } break; default: fprintf(stderr, "Bit depth %d is not supported.\n", bitspersample); return -1; } return 0; } static void PrintIntDiff(uint32 row, int sample, uint32 pix, uint32 w1, uint32 w2) { if (sample < 0) sample = 0; switch (bitspersample) { case 1: case 2: case 4: { int32 mask1, mask2, s; mask1 = ~((-1) << bitspersample); s = (8 - bitspersample); mask2 = mask1 << s; for (; mask2 && pix < imagewidth; mask2 >>= bitspersample, s -= bitspersample, pix++) { if ((w1 & mask2) ^ (w2 & mask2)) { printf( "Scanline %lu, pixel %lu, sample %d: %01x %01x\n", (unsigned long) row, (unsigned long) pix, sample, (unsigned int)((w1 >> s) & mask1), (unsigned int)((w2 >> s) & mask1)); if (--stopondiff == 0) exit(1); } } break; } case 8: printf("Scanline %lu, pixel %lu, sample %d: %02x %02x\n", (unsigned long) row, (unsigned long) pix, sample, (unsigned int) w1, (unsigned int) w2); if (--stopondiff == 0) exit(1); break; case 16: printf("Scanline %lu, pixel %lu, sample %d: %04x %04x\n", (unsigned long) row, (unsigned long) pix, sample, (unsigned int) w1, (unsigned int) w2); if (--stopondiff == 0) exit(1); break; case 32: printf("Scanline %lu, pixel %lu, sample %d: %08x %08x\n", (unsigned long) row, (unsigned long) pix, sample, (unsigned int) w1, (unsigned int) w2); if (--stopondiff == 0) exit(1); break; default: break; } } static void PrintFloatDiff(uint32 row, int sample, uint32 pix, double w1, double w2) { if (sample < 0) sample = 0; switch (bitspersample) { case 32: printf("Scanline %lu, pixel %lu, sample %d: %g %g\n", (long) row, (long) pix, sample, w1, w2); if (--stopondiff == 0) exit(1); break; default: break; } } static int SeparateCompare(int reversed, int sample, uint32 row, unsigned char* cp1, unsigned char* p2) { uint32 npixels = imagewidth; int pixel; cp1 += sample; for (pixel = 0; npixels-- > 0; pixel++, cp1 += samplesperpixel, p2++) { if (*cp1 != *p2) { printf("Scanline %lu, pixel %lu, sample %ld: ", (long) row, (long) pixel, (long) sample); if (reversed) printf("%02x %02x\n", *p2, *cp1); else printf("%02x %02x\n", *cp1, *p2); if (--stopondiff == 0) exit(1); } } return 0; } static int checkTag(TIFF* tif1, TIFF* tif2, int tag, char* name, void* p1, void* p2) { if (TIFFGetField(tif1, tag, p1)) { if (!TIFFGetField(tif2, tag, p2)) { printf("%s tag appears only in %s\n", name, TIFFFileName(tif1)); return (0); } return (1); } else if (TIFFGetField(tif2, tag, p2)) { printf("%s tag appears only in %s\n", name, TIFFFileName(tif2)); return (0); } return (-1); } #define CHECK(cmp, fmt) { \ switch (checkTag(tif1,tif2,tag,name,&v1,&v2)) { \ case 1: if (cmp) \ case -1: return (1); \ printf(fmt, name, v1, v2); \ } \ return (0); \ } static int CheckShortTag(TIFF* tif1, TIFF* tif2, int tag, char* name) { uint16 v1, v2; CHECK(v1 == v2, "%s: %u %u\n"); } static int CheckShort2Tag(TIFF* tif1, TIFF* tif2, int tag, char* name) { uint16 v11, v12, v21, v22; if (TIFFGetField(tif1, tag, &v11, &v12)) { if (!TIFFGetField(tif2, tag, &v21, &v22)) { printf("%s tag appears only in %s\n", name, TIFFFileName(tif1)); return (0); } if (v11 == v21 && v12 == v22) return (1); printf("%s: <%u,%u> <%u,%u>\n", name, v11, v12, v21, v22); } else if (TIFFGetField(tif2, tag, &v21, &v22)) printf("%s tag appears only in %s\n", name, TIFFFileName(tif2)); else return (1); return (0); } static int CheckShortArrayTag(TIFF* tif1, TIFF* tif2, int tag, char* name) { uint16 n1, *a1; uint16 n2, *a2; if (TIFFGetField(tif1, tag, &n1, &a1)) { if (!TIFFGetField(tif2, tag, &n2, &a2)) { printf("%s tag appears only in %s\n", name, TIFFFileName(tif1)); return (0); } if (n1 == n2) { char* sep; uint16 i; if (memcmp(a1, a2, n1 * sizeof(uint16)) == 0) return (1); printf("%s: value mismatch, <%u:", name, n1); sep = ""; for (i = 0; i < n1; i++) printf("%s%u", sep, a1[i]), sep = ","; printf("> and <%u: ", n2); sep = ""; for (i = 0; i < n2; i++) printf("%s%u", sep, a2[i]), sep = ","; printf(">\n"); } else printf("%s: %u items in %s, %u items in %s", name, n1, TIFFFileName(tif1), n2, TIFFFileName(tif2) ); } else if (TIFFGetField(tif2, tag, &n2, &a2)) printf("%s tag appears only in %s\n", name, TIFFFileName(tif2)); else return (1); return (0); } static int CheckLongTag(TIFF* tif1, TIFF* tif2, int tag, char* name) { uint32 v1, v2; CHECK(v1 == v2, "%s: %u %u\n"); } static int CheckFloatTag(TIFF* tif1, TIFF* tif2, int tag, char* name) { float v1, v2; CHECK(v1 == v2, "%s: %g %g\n"); } static int CheckStringTag(TIFF* tif1, TIFF* tif2, int tag, char* name) { char *v1, *v2; CHECK(strcmp(v1, v2) == 0, "%s: \"%s\" \"%s\"\n"); } static void leof(const char* name, uint32 row, int s) { printf("%s: EOF at scanline %lu", name, (unsigned long)row); if (s >= 0) printf(", sample %d", s); printf("\n"); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/tiffdump.c0000644000212300117540000005325211766757625012546 00000000000000/* $Id: tiffdump.c,v 1.26 2012-06-15 21:51:54 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_IO_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #ifndef HAVE_GETOPT extern int getopt(int, char**, char*); #endif #include "tiffio.h" #ifndef O_BINARY # define O_BINARY 0 #endif static union { TIFFHeaderClassic classic; TIFFHeaderBig big; TIFFHeaderCommon common; } hdr; char* appname; char* curfile; int swabflag; int bigendian; int bigtiff; uint32 maxitems = 24; /* maximum indirect data items to print */ const char* bytefmt = "%s%#02x"; /* BYTE */ const char* sbytefmt = "%s%d"; /* SBYTE */ const char* shortfmt = "%s%u"; /* SHORT */ const char* sshortfmt = "%s%d"; /* SSHORT */ const char* longfmt = "%s%lu"; /* LONG */ const char* slongfmt = "%s%ld"; /* SLONG */ const char* ifdfmt = "%s%#04lx"; /* IFD offset */ #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) const char* long8fmt = "%s%I64u"; /* LONG8 */ const char* slong8fmt = "%s%I64d"; /* SLONG8 */ const char* ifd8fmt = "%s%#08I64x"; /* IFD offset8*/ #else const char* long8fmt = "%s%llu"; /* LONG8 */ const char* slong8fmt = "%s%lld"; /* SLONG8 */ const char* ifd8fmt = "%s%#08llx"; /* IFD offset8*/ #endif const char* rationalfmt = "%s%g"; /* RATIONAL */ const char* srationalfmt = "%s%g"; /* SRATIONAL */ const char* floatfmt = "%s%g"; /* FLOAT */ const char* doublefmt = "%s%g"; /* DOUBLE */ static void dump(int, uint64); extern int optind; extern char* optarg; void usage() { fprintf(stderr, "usage: %s [-h] [-o offset] [-m maxitems] file.tif ...\n", appname); exit(-1); } int main(int argc, char* argv[]) { int one = 1, fd; int multiplefiles = (argc > 1); int c; uint64 diroff = 0; bigendian = (*(char *)&one == 0); appname = argv[0]; while ((c = getopt(argc, argv, "m:o:h")) != -1) { switch (c) { case 'h': /* print values in hex */ shortfmt = "%s%#x"; sshortfmt = "%s%#x"; longfmt = "%s%#lx"; slongfmt = "%s%#lx"; break; case 'o': diroff = (uint64) strtoul(optarg, NULL, 0); break; case 'm': maxitems = strtoul(optarg, NULL, 0); break; default: usage(); } } if (optind >= argc) usage(); for (; optind < argc; optind++) { fd = open(argv[optind], O_RDONLY|O_BINARY, 0); if (fd < 0) { perror(argv[0]); return (-1); } if (multiplefiles) printf("%s:\n", argv[optind]); curfile = argv[optind]; swabflag = 0; bigtiff = 0; dump(fd, diroff); close(fd); } return (0); } #define ord(e) ((int)e) static uint64 ReadDirectory(int, unsigned, uint64); static void ReadError(char*); static void Error(const char*, ...); static void Fatal(const char*, ...); static void dump(int fd, uint64 diroff) { unsigned i; lseek(fd, (off_t) 0, 0); if (read(fd, (char*) &hdr, sizeof (TIFFHeaderCommon)) != sizeof (TIFFHeaderCommon)) ReadError("TIFF header"); if (hdr.common.tiff_magic != TIFF_BIGENDIAN && hdr.common.tiff_magic != TIFF_LITTLEENDIAN && #if HOST_BIGENDIAN /* MDI is sensitive to the host byte order, unlike TIFF */ MDI_BIGENDIAN != hdr.common.tiff_magic #else MDI_LITTLEENDIAN != hdr.common.tiff_magic #endif ) { Fatal("Not a TIFF or MDI file, bad magic number %u (%#x)", hdr.common.tiff_magic, hdr.common.tiff_magic); } if (hdr.common.tiff_magic == TIFF_BIGENDIAN || hdr.common.tiff_magic == MDI_BIGENDIAN) swabflag = !bigendian; else swabflag = bigendian; if (swabflag) TIFFSwabShort(&hdr.common.tiff_version); if (hdr.common.tiff_version==42) { if (read(fd, (char*) &hdr.classic.tiff_diroff, 4) != 4) ReadError("TIFF header"); if (swabflag) TIFFSwabLong(&hdr.classic.tiff_diroff); printf("Magic: %#x <%s-endian> Version: %#x <%s>\n", hdr.classic.tiff_magic, hdr.classic.tiff_magic == TIFF_BIGENDIAN ? "big" : "little", 42,"ClassicTIFF"); if (diroff == 0) diroff = hdr.classic.tiff_diroff; } else if (hdr.common.tiff_version==43) { if (read(fd, (char*) &hdr.big.tiff_offsetsize, 12) != 12) ReadError("TIFF header"); if (swabflag) { TIFFSwabShort(&hdr.big.tiff_offsetsize); TIFFSwabShort(&hdr.big.tiff_unused); TIFFSwabLong8(&hdr.big.tiff_diroff); } printf("Magic: %#x <%s-endian> Version: %#x <%s>\n", hdr.big.tiff_magic, hdr.big.tiff_magic == TIFF_BIGENDIAN ? "big" : "little", 43,"BigTIFF"); printf("OffsetSize: %#x Unused: %#x\n", hdr.big.tiff_offsetsize,hdr.big.tiff_unused); if (diroff == 0) diroff = hdr.big.tiff_diroff; bigtiff = 1; } else Fatal("Not a TIFF file, bad version number %u (%#x)", hdr.common.tiff_version, hdr.common.tiff_version); for (i = 0; diroff != 0; i++) { if (i > 0) putchar('\n'); diroff = ReadDirectory(fd, i, diroff); } } static const int datawidth[] = { 0, /* 00 = undefined */ 1, /* 01 = TIFF_BYTE */ 1, /* 02 = TIFF_ASCII */ 2, /* 03 = TIFF_SHORT */ 4, /* 04 = TIFF_LONG */ 8, /* 05 = TIFF_RATIONAL */ 1, /* 06 = TIFF_SBYTE */ 1, /* 07 = TIFF_UNDEFINED */ 2, /* 08 = TIFF_SSHORT */ 4, /* 09 = TIFF_SLONG */ 8, /* 10 = TIFF_SRATIONAL */ 4, /* 11 = TIFF_FLOAT */ 8, /* 12 = TIFF_DOUBLE */ 4, /* 13 = TIFF_IFD */ 0, /* 14 = undefined */ 0, /* 15 = undefined */ 8, /* 16 = TIFF_LONG8 */ 8, /* 17 = TIFF_SLONG8 */ 8, /* 18 = TIFF_IFD8 */ }; #define NWIDTHS (sizeof (datawidth) / sizeof (datawidth[0])) static void PrintTag(FILE*, uint16); static void PrintType(FILE*, uint16); static void PrintData(FILE*, uint16, uint32, unsigned char*); /* * Read the next TIFF directory from a file * and convert it to the internal format. * We read directories sequentially. */ static uint64 ReadDirectory(int fd, unsigned int ix, uint64 off) { uint16 dircount; uint32 direntrysize; void* dirmem = NULL; uint64 nextdiroff = 0; uint32 n; uint8* dp; if (off == 0) /* no more directories */ goto done; #if defined(__WIN32__) && defined(_MSC_VER) if (_lseeki64(fd, (__int64)off, SEEK_SET) != (__int64)off) { #else if (lseek(fd, (off_t)off, SEEK_SET) != (off_t)off) { #endif Fatal("Seek error accessing TIFF directory"); goto done; } if (!bigtiff) { if (read(fd, (char*) &dircount, sizeof (uint16)) != sizeof (uint16)) { ReadError("directory count"); goto done; } if (swabflag) TIFFSwabShort(&dircount); direntrysize = 12; } else { uint64 dircount64 = 0; if (read(fd, (char*) &dircount64, sizeof (uint64)) != sizeof (uint64)) { ReadError("directory count"); goto done; } if (swabflag) TIFFSwabLong8(&dircount64); if (dircount64>0xFFFF) { Error("Sanity check on directory count failed"); goto done; } dircount = (uint16)dircount64; direntrysize = 20; } dirmem = _TIFFmalloc(dircount * direntrysize); if (dirmem == NULL) { Fatal("No space for TIFF directory"); goto done; } n = read(fd, (char*) dirmem, dircount*direntrysize); if (n != dircount*direntrysize) { n /= direntrysize; Error( #if defined(__WIN32__) && defined(_MSC_VER) "Could only read %lu of %u entries in directory at offset %#I64x", (unsigned long)n, dircount, (unsigned __int64) off); #else "Could only read %lu of %u entries in directory at offset %#llx", (unsigned long)n, dircount, (unsigned long long) off); #endif dircount = n; nextdiroff = 0; } else { if (!bigtiff) { uint32 nextdiroff32; if (read(fd, (char*) &nextdiroff32, sizeof (uint32)) != sizeof (uint32)) nextdiroff32 = 0; if (swabflag) TIFFSwabLong(&nextdiroff32); nextdiroff = nextdiroff32; } else { if (read(fd, (char*) &nextdiroff, sizeof (uint64)) != sizeof (uint64)) nextdiroff = 0; if (swabflag) TIFFSwabLong8(&nextdiroff); } } #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) printf("Directory %u: offset %I64u (%#I64x) next %I64u (%#I64x)\n", ix, (unsigned __int64)off, (unsigned __int64)off, (unsigned __int64)nextdiroff, (unsigned __int64)nextdiroff); #else printf("Directory %u: offset %llu (%#llx) next %llu (%#llx)\n", ix, (unsigned long long)off, (unsigned long long)off, (unsigned long long)nextdiroff, (unsigned long long)nextdiroff); #endif for (dp = (uint8*)dirmem, n = dircount; n > 0; n--) { uint16 tag; uint16 type; uint16 typewidth; uint64 count; uint64 datasize; int datafits; void* datamem; uint64 dataoffset; int datatruncated; tag = *(uint16*)dp; if (swabflag) TIFFSwabShort(&tag); dp += sizeof(uint16); type = *(uint16*)dp; dp += sizeof(uint16); if (swabflag) TIFFSwabShort(&type); PrintTag(stdout, tag); putchar(' '); PrintType(stdout, type); putchar(' '); if (!bigtiff) { uint32 count32; count32 = *(uint32*)dp; if (swabflag) TIFFSwabLong(&count32); dp += sizeof(uint32); count = count32; } else { count = *(uint64*)dp; if (swabflag) TIFFSwabLong8(&count); dp += sizeof(uint64); } #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) printf("%I64u<", (unsigned __int64)count); #else printf("%llu<", (unsigned long long)count); #endif if (type >= NWIDTHS) typewidth = 0; else typewidth = datawidth[type]; datasize = count*typewidth; datafits = 1; datamem = dp; dataoffset = 0; datatruncated = 0; if (!bigtiff) { if (datasize>4) { uint32 dataoffset32; datafits = 0; datamem = NULL; dataoffset32 = *(uint32*)dp; if (swabflag) TIFFSwabLong(&dataoffset32); dataoffset = dataoffset32; } dp += sizeof(uint32); } else { if (datasize>8) { datafits = 0; datamem = NULL; dataoffset = *(uint64*)dp; if (swabflag) TIFFSwabLong8(&dataoffset); } dp += sizeof(uint64); } if (datasize>0x10000) { datatruncated = 1; count = 0x10000/typewidth; datasize = count*typewidth; } if (count>maxitems) { datatruncated = 1; count = maxitems; datasize = count*typewidth; } if (!datafits) { datamem = _TIFFmalloc((uint32)datasize); if (datamem) { #if defined(__WIN32__) && defined(_MSC_VER) if (_lseeki64(fd, (__int64)dataoffset, SEEK_SET) != (__int64)dataoffset) #else if (lseek(fd, (off_t)dataoffset, 0) != (off_t)dataoffset) #endif { Error( "Seek error accessing tag %u value", tag); _TIFFfree(datamem); datamem = NULL; } if (read(fd, datamem, (size_t)datasize) != (TIFF_SSIZE_T)datasize) { Error( "Read error accessing tag %u value", tag); _TIFFfree(datamem); datamem = NULL; } } else Error("No space for data for tag %u",tag); } if (datamem) { if (swabflag) { switch (type) { case TIFF_BYTE: case TIFF_ASCII: case TIFF_SBYTE: case TIFF_UNDEFINED: break; case TIFF_SHORT: case TIFF_SSHORT: TIFFSwabArrayOfShort((uint16*)datamem,(tmsize_t)count); break; case TIFF_LONG: case TIFF_SLONG: case TIFF_FLOAT: case TIFF_IFD: TIFFSwabArrayOfLong((uint32*)datamem,(tmsize_t)count); break; case TIFF_RATIONAL: case TIFF_SRATIONAL: TIFFSwabArrayOfLong((uint32*)datamem,(tmsize_t)count*2); break; case TIFF_DOUBLE: case TIFF_LONG8: case TIFF_SLONG8: case TIFF_IFD8: TIFFSwabArrayOfLong8((uint64*)datamem,(tmsize_t)count); break; } } PrintData(stdout,type,(uint32)count,datamem); if (datatruncated) printf(" ..."); if (!datafits) _TIFFfree(datamem); } printf(">\n"); } done: if (dirmem) _TIFFfree((char *)dirmem); return (nextdiroff); } static const struct tagname { uint16 tag; const char* name; } tagnames[] = { { TIFFTAG_SUBFILETYPE, "SubFileType" }, { TIFFTAG_OSUBFILETYPE, "OldSubFileType" }, { TIFFTAG_IMAGEWIDTH, "ImageWidth" }, { TIFFTAG_IMAGELENGTH, "ImageLength" }, { TIFFTAG_BITSPERSAMPLE, "BitsPerSample" }, { TIFFTAG_COMPRESSION, "Compression" }, { TIFFTAG_PHOTOMETRIC, "Photometric" }, { TIFFTAG_THRESHHOLDING, "Threshholding" }, { TIFFTAG_CELLWIDTH, "CellWidth" }, { TIFFTAG_CELLLENGTH, "CellLength" }, { TIFFTAG_FILLORDER, "FillOrder" }, { TIFFTAG_DOCUMENTNAME, "DocumentName" }, { TIFFTAG_IMAGEDESCRIPTION, "ImageDescription" }, { TIFFTAG_MAKE, "Make" }, { TIFFTAG_MODEL, "Model" }, { TIFFTAG_STRIPOFFSETS, "StripOffsets" }, { TIFFTAG_ORIENTATION, "Orientation" }, { TIFFTAG_SAMPLESPERPIXEL, "SamplesPerPixel" }, { TIFFTAG_ROWSPERSTRIP, "RowsPerStrip" }, { TIFFTAG_STRIPBYTECOUNTS, "StripByteCounts" }, { TIFFTAG_MINSAMPLEVALUE, "MinSampleValue" }, { TIFFTAG_MAXSAMPLEVALUE, "MaxSampleValue" }, { TIFFTAG_XRESOLUTION, "XResolution" }, { TIFFTAG_YRESOLUTION, "YResolution" }, { TIFFTAG_PLANARCONFIG, "PlanarConfig" }, { TIFFTAG_PAGENAME, "PageName" }, { TIFFTAG_XPOSITION, "XPosition" }, { TIFFTAG_YPOSITION, "YPosition" }, { TIFFTAG_FREEOFFSETS, "FreeOffsets" }, { TIFFTAG_FREEBYTECOUNTS, "FreeByteCounts" }, { TIFFTAG_GRAYRESPONSEUNIT, "GrayResponseUnit" }, { TIFFTAG_GRAYRESPONSECURVE,"GrayResponseCurve" }, { TIFFTAG_GROUP3OPTIONS, "Group3Options" }, { TIFFTAG_GROUP4OPTIONS, "Group4Options" }, { TIFFTAG_RESOLUTIONUNIT, "ResolutionUnit" }, { TIFFTAG_PAGENUMBER, "PageNumber" }, { TIFFTAG_COLORRESPONSEUNIT,"ColorResponseUnit" }, { TIFFTAG_TRANSFERFUNCTION, "TransferFunction" }, { TIFFTAG_SOFTWARE, "Software" }, { TIFFTAG_DATETIME, "DateTime" }, { TIFFTAG_ARTIST, "Artist" }, { TIFFTAG_HOSTCOMPUTER, "HostComputer" }, { TIFFTAG_PREDICTOR, "Predictor" }, { TIFFTAG_WHITEPOINT, "Whitepoint" }, { TIFFTAG_PRIMARYCHROMATICITIES,"PrimaryChromaticities" }, { TIFFTAG_COLORMAP, "Colormap" }, { TIFFTAG_HALFTONEHINTS, "HalftoneHints" }, { TIFFTAG_TILEWIDTH, "TileWidth" }, { TIFFTAG_TILELENGTH, "TileLength" }, { TIFFTAG_TILEOFFSETS, "TileOffsets" }, { TIFFTAG_TILEBYTECOUNTS, "TileByteCounts" }, { TIFFTAG_BADFAXLINES, "BadFaxLines" }, { TIFFTAG_CLEANFAXDATA, "CleanFaxData" }, { TIFFTAG_CONSECUTIVEBADFAXLINES, "ConsecutiveBadFaxLines" }, { TIFFTAG_SUBIFD, "SubIFD" }, { TIFFTAG_INKSET, "InkSet" }, { TIFFTAG_INKNAMES, "InkNames" }, { TIFFTAG_NUMBEROFINKS, "NumberOfInks" }, { TIFFTAG_DOTRANGE, "DotRange" }, { TIFFTAG_TARGETPRINTER, "TargetPrinter" }, { TIFFTAG_EXTRASAMPLES, "ExtraSamples" }, { TIFFTAG_SAMPLEFORMAT, "SampleFormat" }, { TIFFTAG_SMINSAMPLEVALUE, "SMinSampleValue" }, { TIFFTAG_SMAXSAMPLEVALUE, "SMaxSampleValue" }, { TIFFTAG_JPEGPROC, "JPEGProcessingMode" }, { TIFFTAG_JPEGIFOFFSET, "JPEGInterchangeFormat" }, { TIFFTAG_JPEGIFBYTECOUNT, "JPEGInterchangeFormatLength" }, { TIFFTAG_JPEGRESTARTINTERVAL,"JPEGRestartInterval" }, { TIFFTAG_JPEGLOSSLESSPREDICTORS,"JPEGLosslessPredictors" }, { TIFFTAG_JPEGPOINTTRANSFORM,"JPEGPointTransform" }, { TIFFTAG_JPEGTABLES, "JPEGTables" }, { TIFFTAG_JPEGQTABLES, "JPEGQTables" }, { TIFFTAG_JPEGDCTABLES, "JPEGDCTables" }, { TIFFTAG_JPEGACTABLES, "JPEGACTables" }, { TIFFTAG_YCBCRCOEFFICIENTS,"YCbCrCoefficients" }, { TIFFTAG_YCBCRSUBSAMPLING, "YCbCrSubsampling" }, { TIFFTAG_YCBCRPOSITIONING, "YCbCrPositioning" }, { TIFFTAG_REFERENCEBLACKWHITE, "ReferenceBlackWhite" }, { TIFFTAG_REFPTS, "IgReferencePoints (Island Graphics)" }, { TIFFTAG_REGIONTACKPOINT, "IgRegionTackPoint (Island Graphics)" }, { TIFFTAG_REGIONWARPCORNERS,"IgRegionWarpCorners (Island Graphics)" }, { TIFFTAG_REGIONAFFINE, "IgRegionAffine (Island Graphics)" }, { TIFFTAG_MATTEING, "OBSOLETE Matteing (Silicon Graphics)" }, { TIFFTAG_DATATYPE, "OBSOLETE DataType (Silicon Graphics)" }, { TIFFTAG_IMAGEDEPTH, "ImageDepth (Silicon Graphics)" }, { TIFFTAG_TILEDEPTH, "TileDepth (Silicon Graphics)" }, { 32768, "OLD BOGUS Matteing tag" }, { TIFFTAG_COPYRIGHT, "Copyright" }, { TIFFTAG_ICCPROFILE, "ICC Profile" }, { TIFFTAG_JBIGOPTIONS, "JBIG Options" }, { TIFFTAG_STONITS, "StoNits" }, }; #define NTAGS (sizeof (tagnames) / sizeof (tagnames[0])) static void PrintTag(FILE* fd, uint16 tag) { const struct tagname *tp; for (tp = tagnames; tp < &tagnames[NTAGS]; tp++) if (tp->tag == tag) { fprintf(fd, "%s (%u)", tp->name, tag); return; } fprintf(fd, "%u (%#x)", tag, tag); } static void PrintType(FILE* fd, uint16 type) { static const char *typenames[] = { "0", "BYTE", "ASCII", "SHORT", "LONG", "RATIONAL", "SBYTE", "UNDEFINED", "SSHORT", "SLONG", "SRATIONAL", "FLOAT", "DOUBLE", "IFD", "14", "15", "LONG8", "SLONG8", "IFD8" }; #define NTYPES (sizeof (typenames) / sizeof (typenames[0])) if (type < NTYPES) fprintf(fd, "%s (%u)", typenames[type], type); else fprintf(fd, "%u (%#x)", type, type); } #undef NTYPES #include static void PrintASCII(FILE* fd, uint32 cc, const unsigned char* cp) { for (; cc > 0; cc--, cp++) { const char* tp; if (isprint(*cp)) { fputc(*cp, fd); continue; } for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++) if (*tp++ == *cp) break; if (*tp) fprintf(fd, "\\%c", *tp); else if (*cp) fprintf(fd, "\\%03o", *cp); else fprintf(fd, "\\0"); } } static void PrintData(FILE* fd, uint16 type, uint32 count, unsigned char* data) { char* sep = ""; switch (type) { case TIFF_BYTE: while (count-- > 0) fprintf(fd, bytefmt, sep, *data++), sep = " "; break; case TIFF_SBYTE: while (count-- > 0) fprintf(fd, sbytefmt, sep, *(char *)data++), sep = " "; break; case TIFF_UNDEFINED: while (count-- > 0) fprintf(fd, bytefmt, sep, *data++), sep = " "; break; case TIFF_ASCII: PrintASCII(fd, count, data); break; case TIFF_SHORT: { uint16 *wp = (uint16*)data; while (count-- > 0) fprintf(fd, shortfmt, sep, *wp++), sep = " "; break; } case TIFF_SSHORT: { int16 *wp = (int16*)data; while (count-- > 0) fprintf(fd, sshortfmt, sep, *wp++), sep = " "; break; } case TIFF_LONG: { uint32 *lp = (uint32*)data; while (count-- > 0) { fprintf(fd, longfmt, sep, (unsigned long) *lp++); sep = " "; } break; } case TIFF_SLONG: { int32 *lp = (int32*)data; while (count-- > 0) fprintf(fd, slongfmt, sep, (long) *lp++), sep = " "; break; } case TIFF_LONG8: { uint64 *llp = (uint64*)data; while (count-- > 0) { #if defined(__WIN32__) && defined(_MSC_VER) fprintf(fd, long8fmt, sep, (unsigned __int64) *llp++); #else fprintf(fd, long8fmt, sep, (unsigned long long) *llp++); #endif sep = " "; } break; } case TIFF_SLONG8: { int64 *llp = (int64*)data; while (count-- > 0) #if defined(__WIN32__) && defined(_MSC_VER) fprintf(fd, slong8fmt, sep, (__int64) *llp++), sep = " "; #else fprintf(fd, slong8fmt, sep, (long long) *llp++), sep = " "; #endif break; } case TIFF_RATIONAL: { uint32 *lp = (uint32*)data; while (count-- > 0) { if (lp[1] == 0) fprintf(fd, "%sNan (%lu/%lu)", sep, (unsigned long) lp[0], (unsigned long) lp[1]); else fprintf(fd, rationalfmt, sep, (double)lp[0] / (double)lp[1]); sep = " "; lp += 2; } break; } case TIFF_SRATIONAL: { int32 *lp = (int32*)data; while (count-- > 0) { if (lp[1] == 0) fprintf(fd, "%sNan (%ld/%ld)", sep, (long) lp[0], (long) lp[1]); else fprintf(fd, srationalfmt, sep, (double)lp[0] / (double)lp[1]); sep = " "; lp += 2; } break; } case TIFF_FLOAT: { float *fp = (float *)data; while (count-- > 0) fprintf(fd, floatfmt, sep, *fp++), sep = " "; break; } case TIFF_DOUBLE: { double *dp = (double *)data; while (count-- > 0) fprintf(fd, doublefmt, sep, *dp++), sep = " "; break; } case TIFF_IFD: { uint32 *lp = (uint32*)data; while (count-- > 0) { fprintf(fd, ifdfmt, sep, (unsigned long) *lp++); sep = " "; } break; } case TIFF_IFD8: { uint64 *llp = (uint64*)data; while (count-- > 0) { #if defined(__WIN32__) && defined(_MSC_VER) fprintf(fd, ifd8fmt, sep, (unsigned __int64) *llp++); #else fprintf(fd, ifd8fmt, sep, (unsigned long long) *llp++); #endif sep = " "; } break; } } } static void ReadError(char* what) { Fatal("Error while reading %s", what); } #include static void vError(FILE* fd, const char* fmt, va_list ap) { fprintf(fd, "%s: ", curfile); vfprintf(fd, fmt, ap); fprintf(fd, ".\n"); } static void Error(const char* fmt, ...) { va_list ap; va_start(ap, fmt); vError(stderr, fmt, ap); va_end(ap); } static void Fatal(const char* fmt, ...) { va_list ap; va_start(ap, fmt); vError(stderr, fmt, ap); va_end(ap); exit(-1); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/tiff2ps.c0000644000212300117540000030136311571220372012256 00000000000000/* $Id: tiff2ps.c,v 1.49 2011-05-31 17:10:18 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include /* for atof */ #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" /* * Revision history * * 2010-Sep-17 * Richard Nolde: Reinstate code from Feb 2009 that never got * accepted into CVS with major modifications to handle -H and -W * options. Replaced original PlaceImage function with several * new functions that make support for multiple output pages * from a single image easier to understand. Added additional * warning messages for incompatible command line options. * Add new command line options to specify PageOrientation * Document Structuring Comment for landscape or portrait * and code to determine the values from ouput width and height * if not specified on the command line. * Add new command line option to specify document creator * as an alterntive to the string "tiff2ps" following model * of patch submitted by Thomas Jarosch for specifiying a * document title which is also supported now. * * 2009-Feb-11 * Richard Nolde: Added support for rotations of 90, 180, 270 * and auto using -r <90|180|270|auto>. Auto picks the best * fit for the image on the specified paper size (eg portrait * or landscape) if -h or -w is specified. Rotation is in * degrees counterclockwise since that is how Postscript does * it. The auto opption rotates the image 90 degrees ccw to * produce landscape if that is a better fit than portait. * * Cleaned up code in TIFF2PS and broke into smaller functions * to simplify rotations. * * Identified incompatible options and returned errors, eg * -i for imagemask operator is only available for Level2 or * Level3 Postscript in the current implmentation since there * is a difference in the way the operands are called for Level1 * and there is no function to provide the Level1 version. * -H was not handled properly if -h and/or -w were specified. * It should only clip the masked images if the scaled image * exceeds the maxPageHeight specified with -H. * * New design allows for all of the following combinations: * Conversion of TIFF to Postscript with optional rotations * of 90, 180, 270, or auto degrees counterclockwise * Conversion of TIFF to Postscript with entire image scaled * to maximum of values spedified with -h or -w while * maintaining aspect ratio. Same rotations apply. * Conversion of TIFF to Postscript with clipping of output * viewport to height specified with -H, producing multiple * pages at this height and original width as needed. * Same rotations apply. * Conversion of TIFF to Postscript with image scaled to * maximum specified by -h and -w and the resulting scaled * image is presented in an output viewport clipped by -H height. * The same rotations apply. * * Added maxPageWidth option using -W flag. MaxPageHeight and * MaxPageWidth are mutually exclusive since the aspect ratio * cannot be maintained if you set both. * Rewrote PlaceImage to allow maxPageHeight and maxPageWidth * options to work with values smaller or larger than the * physical paper size and still preserve the aspect ratio. * This is accomplished by creating multiple pages across * as well as down if need be. * * 2001-Mar-21 * I (Bruce A. Mallett) added this revision history comment ;) * * Fixed PS_Lvl2page() code which outputs non-ASCII85 raw * data. Moved test for when to output a line break to * *after* the output of a character. This just serves * to fix an eye-nuisance where the first line of raw * data was one character shorter than subsequent lines. * * Added an experimental ASCII85 encoder which can be used * only when there is a single buffer of bytes to be encoded. * This version is much faster at encoding a straight-line * buffer of data because it can avoid a lot of the loop * overhead of the byte-by-byte version. To use this version * you need to define EXP_ASCII85ENCODER (experimental ...). * * Added bug fix given by Michael Schmidt to PS_Lvl2page() * in which an end-of-data marker ('>') was not being output * when producing non-ASCII85 encoded PostScript Level 2 * data. * * Fixed PS_Lvl2colorspace() so that it no longer assumes that * a TIFF having more than 2 planes is a CMYK. This routine * no longer looks at the samples per pixel but instead looks * at the "photometric" value. This change allows support of * CMYK TIFFs. * * Modified the PostScript L2 imaging loop so as to test if * the input stream is still open before attempting to do a * flushfile on it. This was done because some RIPs close * the stream after doing the image operation. * * Got rid of the realloc() being done inside a loop in the * PSRawDataBW() routine. The code now walks through the * byte-size array outside the loop to determine the largest * size memory block that will be needed. * * Added "-m" switch to ask tiff2ps to, where possible, use the * "imagemask" operator instead of the "image" operator. * * Added the "-i #" switch to allow interpolation to be disabled. * * Unrolled a loop or two to improve performance. */ /* * Define EXP_ASCII85ENCODER if you want to use an experimental * version of the ASCII85 encoding routine. The advantage of * using this routine is that tiff2ps will convert to ASCII85 * encoding at between 3 and 4 times the speed as compared to * using the old (non-experimental) encoder. The disadvantage * is that you will be using a new (and unproven) encoding * routine. So user beware, you have been warned! */ #define EXP_ASCII85ENCODER /* * NB: this code assumes uint32 works with printf's %l[ud]. */ #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif int ascii85 = FALSE; /* use ASCII85 encoding */ int interpolate = TRUE; /* interpolate level2 image */ int level2 = FALSE; /* generate PostScript level 2 */ int level3 = FALSE; /* generate PostScript level 3 */ int printAll = FALSE; /* print all images in file */ int generateEPSF = TRUE; /* generate Encapsulated PostScript */ int PSduplex = FALSE; /* enable duplex printing */ int PStumble = FALSE; /* enable top edge binding */ int PSavoiddeadzone = TRUE; /* enable avoiding printer deadzone */ double maxPageHeight = 0; /* maximum height to select from image and print per page */ double maxPageWidth = 0; /* maximum width to select from image and print per page */ double splitOverlap = 0; /* amount for split pages to overlag */ int rotation = 0; /* optional value for rotation angle */ int auto_rotate = 0; /* rotate image for best fit on the page */ char *filename = NULL; /* input filename */ char *title = NULL; /* optional document title string */ char *creator = NULL; /* optional document creator string */ char pageOrientation[12]; /* set optional PageOrientation DSC to Landscape or Portrait */ int useImagemask = FALSE; /* Use imagemask instead of image operator */ uint16 res_unit = 0; /* Resolution units: 2 - inches, 3 - cm */ /* * ASCII85 Encoding Support. */ unsigned char ascii85buf[10]; int ascii85count; int ascii85breaklen; int TIFF2PS(FILE*, TIFF*, double, double, double, double, int); void PSpage(FILE*, TIFF*, uint32, uint32); void PSColorContigPreamble(FILE*, uint32, uint32, int); void PSColorSeparatePreamble(FILE*, uint32, uint32, int); void PSDataColorContig(FILE*, TIFF*, uint32, uint32, int); void PSDataColorSeparate(FILE*, TIFF*, uint32, uint32, int); void PSDataPalette(FILE*, TIFF*, uint32, uint32); void PSDataBW(FILE*, TIFF*, uint32, uint32); void PSRawDataBW(FILE*, TIFF*, uint32, uint32); void Ascii85Init(void); void Ascii85Put(unsigned char code, FILE* fd); void Ascii85Flush(FILE* fd); void PSHead(FILE*, double, double, double, double); void PSTail(FILE*, int); int psStart(FILE *, int, int, int *, double *, double, double, double, double, double, double, double, double, double, double); int psPageSize(FILE *, int, double, double, double, double, double, double); int psRotateImage(FILE *, int, double, double, double, double); int psMaskImage(FILE *, TIFF *, int, int, int *, double, double, double, double, double, double, double, double, double); int psScaleImage(FILE *, double, int, int, double, double, double, double, double, double); int get_viewport (double, double, double, double, double *, double *, int); int exportMaskedImage(FILE *, double, double, double, double, int, int, double, double, double, int, int); #if defined( EXP_ASCII85ENCODER) tsize_t Ascii85EncodeBlock( uint8 * ascii85_p, unsigned f_eod, const uint8 * raw_p, tsize_t raw_l ); #endif static void usage(int); int main(int argc, char* argv[]) { int dirnum = -1, c, np = 0; int centered = 0; double bottommargin = 0; double leftmargin = 0; double pageWidth = 0; double pageHeight = 0; uint32 diroff = 0; extern char *optarg; extern int optind; FILE* output = stdout; pageOrientation[0] = '\0'; while ((c = getopt(argc, argv, "b:d:h:H:W:L:i:w:l:o:O:P:C:r:t:acemxyzps1238DT")) != -1) switch (c) { case 'b': bottommargin = atof(optarg); break; case 'c': centered = 1; break; case 'C': creator = optarg; break; case 'd': /* without -a, this only processes one image at this IFD */ dirnum = atoi(optarg); break; case 'D': PSduplex = TRUE; break; case 'i': interpolate = atoi(optarg) ? TRUE:FALSE; break; case 'T': PStumble = TRUE; break; case 'e': PSavoiddeadzone = FALSE; generateEPSF = TRUE; break; case 'h': pageHeight = atof(optarg); break; case 'H': maxPageHeight = atof(optarg); break; case 'W': maxPageWidth = atof(optarg); break; case 'L': splitOverlap = atof(optarg); break; case 'm': useImagemask = TRUE; break; case 'o': switch (optarg[0]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': diroff = (uint32) strtoul(optarg, NULL, 0); break; default: TIFFError ("-o", "Offset must be a numeric value."); exit (1); } break; case 'O': /* XXX too bad -o is already taken */ output = fopen(optarg, "w"); if (output == NULL) { fprintf(stderr, "%s: %s: Cannot open output file.\n", argv[0], optarg); exit(-2); } break; case 'P': switch (optarg[0]) { case 'l': case 'L': strcpy (pageOrientation, "Landscape"); break; case 'p': case 'P': strcpy (pageOrientation, "Portrait"); break; default: TIFFError ("-P", "Page orientation must be Landscape or Portrait"); exit (-1); } break; case 'l': leftmargin = atof(optarg); break; case 'a': /* removed fall through to generate warning below, R Nolde 09-01-2010 */ printAll = TRUE; break; case 'p': generateEPSF = FALSE; break; case 'r': if (strcmp (optarg, "auto") == 0) { rotation = 0; auto_rotate = TRUE; } else { rotation = atoi(optarg); auto_rotate = FALSE; } switch (rotation) { case 0: case 90: case 180: case 270: break; default: fprintf (stderr, "Rotation angle must be 90, 180, 270 (degrees ccw) or auto\n"); exit (-1); } break; case 's': printAll = FALSE; break; case 't': title = optarg; break; case 'w': pageWidth = atof(optarg); break; case 'z': PSavoiddeadzone = FALSE; break; case '1': level2 = FALSE; level3 = FALSE; ascii85 = FALSE; break; case '2': level2 = TRUE; ascii85 = TRUE; /* default to yes */ break; case '3': level3 = TRUE; ascii85 = TRUE; /* default to yes */ break; case '8': ascii85 = FALSE; break; case 'x': res_unit = RESUNIT_CENTIMETER; break; case 'y': res_unit = RESUNIT_INCH; break; case '?': usage(-1); } if (useImagemask == TRUE) { if ((level2 == FALSE) && (level3 == FALSE)) { TIFFError ("-m "," imagemask operator requres Postscript Level2 or Level3"); exit (1); } } if (pageWidth && (maxPageWidth > pageWidth)) { TIFFError ("-W", "Max viewport width cannot exceed page width"); exit (1); } if (pageHeight && (maxPageHeight > pageHeight)) { TIFFError ("-H", "Max viewport height cannot exceed page height"); exit (1); } /* auto rotate requires a specified page width and height */ if (auto_rotate == TRUE) { if ((pageWidth == 0) || (pageHeight == 0)) TIFFWarning ("-r auto", " requires page height and width specified with -h and -w"); if ((maxPageWidth > 0) || (maxPageHeight > 0)) { TIFFError ("-r auto", " is incompatible with maximum page width/height specified by -H or -W"); exit (1); } } if ((maxPageWidth > 0) && (maxPageHeight > 0)) { TIFFError ("-H and -W", " Use only one of -H or -W to define a viewport"); exit (1); } if ((generateEPSF == TRUE) && (printAll == TRUE)) { TIFFError(" -e and -a", "Warning: Cannot generate Encapsulated Postscript for multiple images"); generateEPSF = FALSE; } if ((generateEPSF == TRUE) && (PSduplex == TRUE)) { TIFFError(" -e and -D", "Warning: Encapsulated Postscript does not support Duplex option"); PSduplex = FALSE; } if ((generateEPSF == TRUE) && (PStumble == TRUE)) { TIFFError(" -e and -T", "Warning: Encapsulated Postscript does not support Top Edge Binding option"); PStumble = FALSE; } if ((generateEPSF == TRUE) && (PSavoiddeadzone == TRUE)) PSavoiddeadzone = FALSE; for (; argc - optind > 0; optind++) { TIFF* tif = TIFFOpen(filename = argv[optind], "r"); if (tif != NULL) { if (dirnum != -1 && !TIFFSetDirectory(tif, (tdir_t)dirnum)) return (-1); else if (diroff != 0 && !TIFFSetSubDirectory(tif, diroff)) return (-1); np = TIFF2PS(output, tif, pageWidth, pageHeight, leftmargin, bottommargin, centered); if (np < 0) { TIFFError("Error", "Unable to process %s", filename); } TIFFClose(tif); } } if (np) PSTail(output, np); else usage(-1); if (output != stdout) fclose(output); return (0); } static uint16 samplesperpixel; static uint16 bitspersample; static uint16 planarconfiguration; static uint16 photometric; static uint16 compression; static uint16 extrasamples; static int alpha; static int checkImage(TIFF* tif) { switch (photometric) { case PHOTOMETRIC_YCBCR: if ((compression == COMPRESSION_JPEG || compression == COMPRESSION_OJPEG) && planarconfiguration == PLANARCONFIG_CONTIG) { /* can rely on libjpeg to convert to RGB */ TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); photometric = PHOTOMETRIC_RGB; } else { if (level2 || level3) break; TIFFError(filename, "Can not handle image with %s", "PhotometricInterpretation=YCbCr"); return (0); } /* fall thru... */ case PHOTOMETRIC_RGB: if (alpha && bitspersample != 8) { TIFFError(filename, "Can not handle %d-bit/sample RGB image with alpha", bitspersample); return (0); } /* fall thru... */ case PHOTOMETRIC_SEPARATED: case PHOTOMETRIC_PALETTE: case PHOTOMETRIC_MINISBLACK: case PHOTOMETRIC_MINISWHITE: break; case PHOTOMETRIC_LOGL: case PHOTOMETRIC_LOGLUV: if (compression != COMPRESSION_SGILOG && compression != COMPRESSION_SGILOG24) { TIFFError(filename, "Can not handle %s data with compression other than SGILog", (photometric == PHOTOMETRIC_LOGL) ? "LogL" : "LogLuv" ); return (0); } /* rely on library to convert to RGB/greyscale */ TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT); photometric = (photometric == PHOTOMETRIC_LOGL) ? PHOTOMETRIC_MINISBLACK : PHOTOMETRIC_RGB; bitspersample = 8; break; case PHOTOMETRIC_CIELAB: /* fall thru... */ default: TIFFError(filename, "Can not handle image with PhotometricInterpretation=%d", photometric); return (0); } switch (bitspersample) { case 1: case 2: case 4: case 8: case 16: break; default: TIFFError(filename, "Can not handle %d-bit/sample image", bitspersample); return (0); } if (planarconfiguration == PLANARCONFIG_SEPARATE && extrasamples > 0) TIFFWarning(filename, "Ignoring extra samples"); return (1); } #define PS_UNIT_SIZE 72.0F #define PSUNITS(npix,res) ((npix) * (PS_UNIT_SIZE / (res))) static char RGBcolorimage[] = "\ /bwproc {\n\ rgbproc\n\ dup length 3 idiv string 0 3 0\n\ 5 -1 roll {\n\ add 2 1 roll 1 sub dup 0 eq {\n\ pop 3 idiv\n\ 3 -1 roll\n\ dup 4 -1 roll\n\ dup 3 1 roll\n\ 5 -1 roll put\n\ 1 add 3 0\n\ } { 2 1 roll } ifelse\n\ } forall\n\ pop pop pop\n\ } def\n\ /colorimage where {pop} {\n\ /colorimage {pop pop /rgbproc exch def {bwproc} image} bind def\n\ } ifelse\n\ "; /* * Adobe Photoshop requires a comment line of the form: * * %ImageData:
* <1 for binary|2 for hex> "data start" * * It is claimed to be part of some future revision of the EPS spec. */ static void PhotoshopBanner(FILE* fd, uint32 w, uint32 h, int bs, int nc, char* startline) { fprintf(fd, "%%ImageData: %ld %ld %d %d 0 %d 2 \"", (long) w, (long) h, bitspersample, nc, bs); fprintf(fd, startline, nc); fprintf(fd, "\"\n"); } /* Convert pixel width and height pw, ph, to points pprw, pprh * using image resolution and resolution units from TIFF tags. * pw : image width in pixels * ph : image height in pixels * pprw : image width in PS units (72 dpi) * pprh : image height in PS units (72 dpi) */ static void setupPageState(TIFF* tif, uint32* pw, uint32* ph, double* pprw, double* pprh) { float xres = 0.0F, yres = 0.0F; TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, pw); TIFFGetField(tif, TIFFTAG_IMAGELENGTH, ph); if (res_unit == 0) /* Not specified as command line option */ if (!TIFFGetFieldDefaulted(tif, TIFFTAG_RESOLUTIONUNIT, &res_unit)) res_unit = RESUNIT_INCH; /* * Calculate printable area. */ if (!TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres) || fabs(xres) < 0.0000001) xres = PS_UNIT_SIZE; if (!TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres) || fabs(yres) < 0.0000001) yres = PS_UNIT_SIZE; switch (res_unit) { case RESUNIT_CENTIMETER: xres *= 2.54F, yres *= 2.54F; break; case RESUNIT_INCH: break; case RESUNIT_NONE: /* Subsequent code assumes we have converted to inches! */ res_unit = RESUNIT_INCH; break; default: /* Last ditch guess for unspecified RESUNIT case * check that the resolution is not inches before scaling it. * Moved to end of function with additional check, RJN, 08-31-2010 * if (xres != PS_UNIT_SIZE || yres != PS_UNIT_SIZE) * xres *= PS_UNIT_SIZE, yres *= PS_UNIT_SIZE; */ break; } /* This is a hack to deal with images that have no meaningful Resolution Size * but may have x and/or y resolutions of 1 pixel per undefined unit. */ if ((xres > 1.0) && (xres != PS_UNIT_SIZE)) *pprw = PSUNITS(*pw, xres); else *pprw = PSUNITS(*pw, PS_UNIT_SIZE); if ((yres > 1.0) && (yres != PS_UNIT_SIZE)) *pprh = PSUNITS(*ph, yres); else *pprh = PSUNITS(*ph, PS_UNIT_SIZE); } static int isCCITTCompression(TIFF* tif) { uint16 compress; TIFFGetField(tif, TIFFTAG_COMPRESSION, &compress); return (compress == COMPRESSION_CCITTFAX3 || compress == COMPRESSION_CCITTFAX4 || compress == COMPRESSION_CCITTRLE || compress == COMPRESSION_CCITTRLEW); } static tsize_t tf_bytesperrow; static tsize_t ps_bytesperrow; static tsize_t tf_rowsperstrip; static tsize_t tf_numberstrips; static char *hex = "0123456789abcdef"; /* * Pagewidth and pageheight are the output size in points, * may refer to values specified with -h and -w, or to * values read from the image if neither -h nor -w are used. * Imagewidth and imageheight are image size in points. * Ximages and Yimages are number of pages across and down. * Only one of maxPageHeight or maxPageWidth can be used. * These are global variables unfortunately. */ int get_subimage_count(double pagewidth, double pageheight, double imagewidth, double imageheight, int *ximages, int *yimages, int rotation, double scale) { int pages = 1; double splitheight = 0; /* Requested Max Height in points */ double splitwidth = 0; /* Requested Max Width in points */ double overlap = 0; /* Repeated edge width in points */ splitheight = maxPageHeight * PS_UNIT_SIZE; splitwidth = maxPageWidth * PS_UNIT_SIZE; overlap = splitOverlap * PS_UNIT_SIZE; pagewidth *= PS_UNIT_SIZE; pageheight *= PS_UNIT_SIZE; if ((imagewidth < 1.0) || (imageheight < 1.0)) { TIFFError("get_subimage_count", "Invalid image width or height"); return (0); } switch (rotation) { case 0: case 180: if (splitheight > 0) /* -H maxPageHeight */ { if (imageheight > splitheight) /* More than one vertical image segment */ { if (pagewidth) *ximages = (int)ceil((scale * imagewidth) / (pagewidth - overlap)); else *ximages = 1; *yimages = (int)ceil((scale * imageheight) / (splitheight - overlap)); /* Max vert pages needed */ } else { if (pagewidth) *ximages = (int)ceil((scale * imagewidth) / (pagewidth - overlap)); /* Max horz pages needed */ else *ximages = 1; *yimages = 1; /* Max vert pages needed */ } } else { if (splitwidth > 0) /* -W maxPageWidth */ { if (imagewidth >splitwidth) { *ximages = (int)ceil((scale * imagewidth) / (splitwidth - overlap)); /* Max horz pages needed */ if (pageheight) *yimages = (int)ceil((scale * imageheight) / (pageheight - overlap)); /* Max vert pages needed */ else *yimages = 1; } else { *ximages = 1; /* Max vert pages needed */ if (pageheight) *yimages = (int)ceil((scale * imageheight) / (pageheight - overlap)); /* Max vert pages needed */ else *yimages = 1; } } else { *ximages = 1; *yimages = 1; } } break; case 90: case 270: if (splitheight > 0) /* -H maxPageHeight */ { if (imagewidth > splitheight) /* More than one vertical image segment */ { *yimages = (int)ceil((scale * imagewidth) / (splitheight - overlap)); /* Max vert pages needed */ if (pagewidth) *ximages = (int)ceil((scale * imageheight) / (pagewidth - overlap)); /* Max horz pages needed */ else *ximages = 1; } else { *yimages = 1; /* Max vert pages needed */ if (pagewidth) *ximages = (int)ceil((scale * imageheight) / (pagewidth - overlap)); /* Max horz pages needed */ else *ximages = 1; } } else { if (splitwidth > 0) /* -W maxPageWidth */ { if (imageheight > splitwidth) { if (pageheight) *yimages = (int)ceil((scale * imagewidth) / (pageheight - overlap)); /* Max vert pages needed */ else *yimages = 1; *ximages = (int)ceil((scale * imageheight) / (splitwidth - overlap)); /* Max horz pages needed */ } else { if (pageheight) *yimages = (int)ceil((scale * imagewidth) / (pageheight - overlap)); /* Max horz pages needed */ else *yimages = 1; *ximages = 1; /* Max vert pages needed */ } } else { *ximages = 1; *yimages = 1; } } break; default: *ximages = 1; *yimages = 1; } pages = (*ximages) * (*yimages); return (pages); } /* New version of PlaceImage that handles only the translation and rotation * for a single output page. */ int exportMaskedImage(FILE *fp, double pagewidth, double pageheight, double imagewidth, double imageheight, int row, int column, double left_offset, double bott_offset, double scale, int center, int rotation) { double xtran = 0.0; double ytran = 0.0; double xscale = 1.0; double yscale = 1.0; double splitheight = 0; /* Requested Max Height in points */ double splitwidth = 0; /* Requested Max Width in points */ double overlap = 0; /* Repeated edge width in points */ double subimage_height = 0.0; splitheight = maxPageHeight * PS_UNIT_SIZE; splitwidth = maxPageWidth * PS_UNIT_SIZE; overlap = splitOverlap * PS_UNIT_SIZE; xscale = scale * imagewidth; yscale = scale * imageheight; if ((xscale < 0.0) || (yscale < 0.0)) { TIFFError("exportMaskedImage", "Invalid parameters."); return (-1); } /* If images are cropped to a vewport with -H or -W, the output pages are shifted to * the top of each output page rather than the Postscript default lower edge. */ switch (rotation) { case 0: case 180: if (splitheight > 0) /* -H maxPageHeight */ { if (splitheight < imageheight) /* More than one vertical image segments */ { xtran = -1.0 * column * (pagewidth - overlap); subimage_height = imageheight - ((splitheight - overlap) * row); ytran = pageheight - subimage_height * (pageheight / splitheight); } else /* Only one page in vertical direction */ { xtran = -1.0 * column * (pagewidth - overlap); ytran = splitheight - imageheight; } } else { if (splitwidth > 0) /* maxPageWidth */ { if (splitwidth < imagewidth) { xtran = -1.0 * column * splitwidth; ytran = -1.0 * row * (pageheight - overlap); } else /* Only one page in horizontal direction */ { ytran = -1.0 * row * (pageheight - overlap); xtran = 0; } } else /* Simple case, no splitting */ { ytran = pageheight - imageheight; xtran = 0; } } bott_offset += ytran / (center ? 2 : 1); left_offset += xtran / (center ? 2 : 1); break; case 90: case 270: if (splitheight > 0) /* -H maxPageHeight */ { if (splitheight < imagewidth) /* More than one vertical image segments */ { xtran = -1.0 * column * (pageheight - overlap); /* Commented code places image at bottom of page instead of top. ytran = -1.0 * row * splitheight; */ if (row == 0) ytran = -1.0 * (imagewidth - splitheight); else ytran = -1.0 * (imagewidth - (splitheight - overlap) * (row + 1)); } else /* Only one page in vertical direction */ { xtran = -1.0 * column * (pageheight - overlap); ytran = splitheight - imagewidth; } } else { if (splitwidth > 0) /* maxPageWidth */ { if (splitwidth < imageheight) { xtran = -1.0 * column * splitwidth; ytran = -1.0 * row * (pagewidth - overlap); } else /* Only one page in horizontal direction */ { ytran = -1.0 * row * (pagewidth - overlap); xtran = 0; } } else /* Simple case, no splitting */ { ytran = pageheight - imageheight; xtran = 0; /* pagewidth - imagewidth; */ } } bott_offset += ytran / (center ? 2 : 1); left_offset += xtran / (center ? 2 : 1); break; default: xtran = 0; ytran = 0; } switch (rotation) { case 0: fprintf(fp, "%f %f translate\n", left_offset, bott_offset); fprintf(fp, "%f %f scale\n", xscale, yscale); break; case 180: fprintf(fp, "%f %f translate\n", left_offset, bott_offset); fprintf(fp, "%f %f scale\n1 1 translate 180 rotate\n", xscale, yscale); break; case 90: fprintf(fp, "%f %f translate\n", left_offset, bott_offset); fprintf(fp, "%f %f scale\n1 0 translate 90 rotate\n", yscale, xscale); break; case 270: fprintf(fp, "%f %f translate\n", left_offset, bott_offset); fprintf(fp, "%f %f scale\n0 1 translate 270 rotate\n", yscale, xscale); break; default: TIFFError ("exportMaskedImage", "Unsupported rotation angle %d. No rotation", rotation); fprintf( fp, "%f %f scale\n", xscale, yscale); break; } return (0); } /* Rotate an image without scaling or clipping */ int psRotateImage (FILE * fd, int rotation, double pswidth, double psheight, double left_offset, double bottom_offset) { if ((left_offset != 0.0) || (bottom_offset != 0)) fprintf (fd, "%f %f translate\n", left_offset, bottom_offset); /* Exchange width and height for 90/270 rotations */ switch (rotation) { case 0: fprintf (fd, "%f %f scale\n", pswidth, psheight); break; case 90: fprintf (fd, "%f %f scale\n1 0 translate 90 rotate\n", psheight, pswidth); break; case 180: fprintf (fd, "%f %f scale\n1 1 translate 180 rotate\n", pswidth, psheight); break; case 270: fprintf (fd, "%f %f scale\n0 1 translate 270 rotate\n", psheight, pswidth); break; default: TIFFError ("psRotateImage", "Unsupported rotation %d.", rotation); fprintf( fd, "%f %f scale\n", pswidth, psheight); return (1); } return (0); } /* Scale and rotate an image to a single output page. */ int psScaleImage(FILE * fd, double scale, int rotation, int center, double reqwidth, double reqheight, double pswidth, double psheight, double left_offset, double bottom_offset) { double hcenter = 0.0, vcenter = 0.0; /* Adjust offsets for centering */ if (center) { switch (rotation) { case 90: vcenter = (reqheight - pswidth * scale) / 2; hcenter = (reqwidth - psheight * scale) / 2; fprintf (fd, "%f %f translate\n", hcenter, vcenter); fprintf (fd, "%f %f scale\n1 0 translate 90 rotate\n", psheight * scale, pswidth * scale); break; case 180: hcenter = (reqwidth - pswidth * scale) / 2; vcenter = (reqheight - psheight * scale) / 2; fprintf (fd, "%f %f translate\n", hcenter, vcenter); fprintf (fd, "%f %f scale\n1 1 translate 180 rotate\n", pswidth * scale, psheight * scale); break; case 270: vcenter = (reqheight - pswidth * scale) / 2; hcenter = (reqwidth - psheight * scale) / 2; fprintf (fd, "%f %f translate\n", hcenter, vcenter); fprintf (fd, "%f %f scale\n0 1 translate 270 rotate\n", psheight * scale, pswidth * scale); break; case 0: default: hcenter = (reqwidth - pswidth * scale) / 2; vcenter = (reqheight - psheight * scale) / 2; fprintf (fd, "%f %f translate\n", hcenter, vcenter); fprintf (fd, "%f %f scale\n", pswidth * scale, psheight * scale); break; } } else /* Not centered */ { switch (rotation) { case 0: fprintf (fd, "%f %f translate\n", left_offset ? left_offset : 0.0, bottom_offset ? bottom_offset : reqheight - (psheight * scale)); fprintf (fd, "%f %f scale\n", pswidth * scale, psheight * scale); break; case 90: fprintf (fd, "%f %f translate\n", left_offset ? left_offset : 0.0, bottom_offset ? bottom_offset : reqheight - (pswidth * scale)); fprintf (fd, "%f %f scale\n1 0 translate 90 rotate\n", psheight * scale, pswidth * scale); break; case 180: fprintf (fd, "%f %f translate\n", left_offset ? left_offset : 0.0, bottom_offset ? bottom_offset : reqheight - (psheight * scale)); fprintf (fd, "%f %f scale\n1 1 translate 180 rotate\n", pswidth * scale, psheight * scale); break; case 270: fprintf (fd, "%f %f translate\n", left_offset ? left_offset : 0.0, bottom_offset ? bottom_offset : reqheight - (pswidth * scale)); fprintf (fd, "%f %f scale\n0 1 translate 270 rotate\n", psheight * scale, pswidth * scale); break; default: TIFFError ("psScaleImage", "Unsupported rotation %d", rotation); fprintf (fd, "%f %f scale\n", pswidth * scale, psheight * scale); return (1); } } return (0); } /* This controls the visible portion of the page which is displayed. * N.B. Setting maxPageHeight no longer sets pageheight if not set explicitly */ int psPageSize (FILE * fd, int rotation, double pgwidth, double pgheight, double reqwidth, double reqheight, double pswidth, double psheight) { double xscale = 1.0, yscale = 1.0, scale = 1.0; double splitheight; double splitwidth; double new_width; double new_height; splitheight = maxPageHeight * PS_UNIT_SIZE; splitwidth = maxPageWidth * PS_UNIT_SIZE; switch (rotation) { case 0: case 180: if ((splitheight > 0) || (splitwidth > 0)) { if (pgwidth != 0 || pgheight != 0) { xscale = reqwidth / (splitwidth ? splitwidth : pswidth); yscale = reqheight / (splitheight ? splitheight : psheight); scale = (xscale < yscale) ? xscale : yscale; } new_width = splitwidth ? splitwidth : scale * pswidth; new_height = splitheight ? splitheight : scale * psheight; if (strlen(pageOrientation)) fprintf (fd, "%%%%PageOrientation: %s\n", pageOrientation); else fprintf (fd, "%%%%PageOrientation: %s\n", (new_width > new_height) ? "Landscape" : "Portrait"); fprintf (fd, "%%%%PageBoundingBox: 0 0 %ld %ld\n", (long)new_width, (long)new_height); fprintf (fd, "1 dict begin /PageSize [ %f %f ] def currentdict end setpagedevice\n", new_width, new_height); } else /* No viewport defined with -H or -W */ { if ((pgwidth == 0) && (pgheight == 0)) /* Image not scaled */ { if (strlen(pageOrientation)) fprintf (fd, "%%%%PageOrientation: %s\n", pageOrientation); else fprintf (fd, "%%%%PageOrientation: %s\n", (pswidth > psheight) ? "Landscape" : "Portrait"); fprintf (fd, "%%%%PageBoundingBox: 0 0 %ld %ld\n", (long)pswidth, (long)psheight); fprintf(fd, "1 dict begin /PageSize [ %f %f ] def currentdict end setpagedevice\n", pswidth, psheight); } else /* Image scaled */ { if (strlen(pageOrientation)) fprintf (fd, "%%%%PageOrientation: %s\n", pageOrientation); else fprintf (fd, "%%%%PageOrientation: %s\n", (reqwidth > reqheight) ? "Landscape" : "Portrait"); fprintf (fd, "%%%%PageBoundingBox: 0 0 %ld %ld\n", (long)reqwidth, (long)reqheight); fprintf(fd, "1 dict begin /PageSize [ %f %f ] def currentdict end setpagedevice\n", reqwidth, reqheight); } } break; case 90: case 270: if ((splitheight > 0) || (splitwidth > 0)) { if (pgwidth != 0 || pgheight != 0) { xscale = reqwidth / (splitwidth ? splitwidth : pswidth); yscale = reqheight / (splitheight ? splitheight : psheight); scale = (xscale < yscale) ? xscale : yscale; } new_width = splitwidth ? splitwidth : scale * psheight; new_height = splitheight ? splitheight : scale * pswidth; if (strlen(pageOrientation)) fprintf (fd, "%%%%PageOrientation: %s\n", pageOrientation); else fprintf (fd, "%%%%PageOrientation: %s\n", (new_width > new_height) ? "Landscape" : "Portrait"); fprintf (fd, "%%%%PageBoundingBox: 0 0 %ld %ld\n", (long)new_width, (long)new_height); fprintf (fd, "1 dict begin /PageSize [ %f %f ] def currentdict end setpagedevice\n", new_width, new_height); } else { if ((pgwidth == 0) && (pgheight == 0)) /* Image not scaled */ { if (strlen(pageOrientation)) fprintf (fd, "%%%%PageOrientation: %s\n", pageOrientation); else fprintf (fd, "%%%%PageOrientation: %s\n", (psheight > pswidth) ? "Landscape" : "Portrait"); fprintf (fd, "%%%%PageBoundingBox: 0 0 %ld %ld\n", (long)psheight, (long)pswidth); fprintf(fd, "1 dict begin /PageSize [ %f %f ] def currentdict end setpagedevice\n", psheight, pswidth); } else /* Image scaled */ { if (strlen(pageOrientation)) fprintf (fd, "%%%%PageOrientation: %s\n", pageOrientation); else fprintf (fd, "%%%%PageOrientation: %s\n", (reqwidth > reqheight) ? "Landscape" : "Portrait"); fprintf (fd, "%%%%PageBoundingBox: 0 0 %ld %ld\n", (long)reqwidth, (long)reqheight); fprintf(fd, "1 dict begin /PageSize [ %f %f ] def currentdict end setpagedevice\n", reqwidth, reqheight); } } break; default: TIFFError ("psPageSize", "Invalid rotation %d", rotation); return (1); } fputs("<<\n /Policies <<\n /PageSize 3\n >>\n>> setpagedevice\n", fd); return (0); } /* end psPageSize */ /* Mask an image as a series of pages, each only showing a section defined * by the maxPageHeight or maxPageWidth options. */ int psMaskImage(FILE *fd, TIFF *tif, int rotation, int center, int *npages, double pixwidth, double pixheight, double left_margin, double bottom_margin, double pgwidth, double pgheight, double pswidth, double psheight, double scale) { int i, j; int ximages = 1, yimages = 1; int pages = *npages; double view_width = 0; double view_height = 0; if (get_viewport (pgwidth, pgheight, pswidth, psheight, &view_width, &view_height, rotation)) { TIFFError ("get_viewport", "Unable to set image viewport"); return (-1); } if (get_subimage_count(pgwidth, pgheight, pswidth, psheight, &ximages, &yimages, rotation, scale) < 1) { TIFFError("get_subimage_count", "Invalid image count: %d columns, %d rows", ximages, yimages); return (-1); } for (i = 0; i < yimages; i++) { for (j = 0; j < ximages; j++) { pages++; *npages = pages; fprintf(fd, "%%%%Page: %d %d\n", pages, pages); /* Write out the PageSize info for non EPS files */ if (!generateEPSF && ( level2 || level3 )) { if (psPageSize(fd, rotation, pgwidth, pgheight, view_width, view_height, pswidth, psheight)) return (-1); } fprintf(fd, "gsave\n"); fprintf(fd, "100 dict begin\n"); if (exportMaskedImage(fd, view_width, view_height, pswidth, psheight, i, j, left_margin, bottom_margin, scale, center, rotation)) { TIFFError("exportMaskedImage", "Invalid image parameters."); return (-1); } PSpage(fd, tif, pixwidth, pixheight); fprintf(fd, "end\n"); fprintf(fd, "grestore\n"); fprintf(fd, "showpage\n"); } } return (pages); } /* Compute scale factor and write out file header */ int psStart(FILE *fd, int npages, int auto_rotate, int *rotation, double *scale, double ox, double oy, double pgwidth, double pgheight, double reqwidth, double reqheight, double pswidth, double psheight, double left_offset, double bottom_offset) { double maxsource = 0.0; /* Used for auto rotations */ double maxtarget = 0.0; double xscale = 1.0, yscale = 1.0; double splitheight; double splitwidth; double view_width = 0.0, view_height = 0.0; double page_width = 0.0, page_height = 0.0; /* Splitheight and splitwidth are in inches */ splitheight = maxPageHeight * PS_UNIT_SIZE; splitwidth = maxPageWidth * PS_UNIT_SIZE; page_width = pgwidth * PS_UNIT_SIZE; page_height = pgheight * PS_UNIT_SIZE; /* If user has specified a page width and height and requested the * image to be auto-rotated to fit on that media, we match the * longest dimension of the image to the longest dimension of the * target media but we have to ignore auto rotate if user specified * maxPageHeight since this makes life way too complicated. */ if (auto_rotate) { if ((splitheight != 0) || (splitwidth != 0)) { TIFFError ("psStart", "Auto-rotate is incompatible with page splitting "); return (1); } /* Find longest edges in image and output media */ maxsource = (pswidth >= psheight) ? pswidth : psheight; maxtarget = (reqwidth >= reqheight) ? reqwidth : reqheight; if (((maxsource == pswidth) && (maxtarget != reqwidth)) || ((maxsource == psheight) && (maxtarget != reqheight))) { /* optimal orientaion does not match input orientation */ *rotation = 90; xscale = (reqwidth - left_offset)/psheight; yscale = (reqheight - bottom_offset)/pswidth; } else /* optimal orientaion matches input orientation */ { xscale = (reqwidth - left_offset)/pswidth; yscale = (reqheight - bottom_offset)/psheight; } *scale = (xscale < yscale) ? xscale : yscale; /* Do not scale image beyound original size */ if (*scale > 1.0) *scale = 1.0; /* Set the size of the displayed image to requested page size * and optimal orientation. */ if (!npages) PSHead(fd, reqwidth, reqheight, ox, oy); return (0); } /* N.B. If pgwidth or pgheight are set from maxPageHeight/Width, * we have a problem with the tests below under splitheight. */ switch (*rotation) /* Auto rotate has NOT been specified */ { case 0: case 180: if ((splitheight != 0) || (splitwidth != 0)) { /* Viewport clipped to maxPageHeight or maxPageWidth */ if ((page_width != 0) || (page_height != 0)) /* Image scaled */ { xscale = (reqwidth - left_offset) / (page_width ? page_width : pswidth); yscale = (reqheight - bottom_offset) / (page_height ? page_height : psheight); *scale = (xscale < yscale) ? xscale : yscale; /* if (*scale > 1.0) *scale = 1.0; */ } else /* Image clipped but not scaled */ *scale = 1.0; view_width = splitwidth ? splitwidth : *scale * pswidth; view_height = splitheight ? splitheight: *scale * psheight; } else /* Viewport not clipped to maxPageHeight or maxPageWidth */ { if ((page_width != 0) || (page_height != 0)) { /* Image scaled */ xscale = (reqwidth - left_offset) / pswidth; yscale = (reqheight - bottom_offset) / psheight; view_width = reqwidth; view_height = reqheight; } else { /* Image not scaled */ xscale = (pswidth - left_offset)/pswidth; yscale = (psheight - bottom_offset)/psheight; view_width = pswidth; view_height = psheight; } } break; case 90: case 270: if ((splitheight != 0) || (splitwidth != 0)) { /* Viewport clipped to maxPageHeight or maxPageWidth */ if ((page_width != 0) || (page_height != 0)) /* Image scaled */ { xscale = (reqwidth - left_offset)/ psheight; yscale = (reqheight - bottom_offset)/ pswidth; *scale = (xscale < yscale) ? xscale : yscale; /* if (*scale > 1.0) *scale = 1.0; */ } else /* Image clipped but not scaled */ *scale = 1.0; view_width = splitwidth ? splitwidth : *scale * psheight; view_height = splitheight ? splitheight : *scale * pswidth; } else /* Viewport not clipped to maxPageHeight or maxPageWidth */ { if ((page_width != 0) || (page_height != 0)) /* Image scaled */ { xscale = (reqwidth - left_offset) / psheight; yscale = (reqheight - bottom_offset) / pswidth; view_width = reqwidth; view_height = reqheight; } else { xscale = (pswidth - left_offset)/ psheight; yscale = (psheight - bottom_offset)/ pswidth; view_width = psheight; view_height = pswidth; } } break; default: TIFFError ("psPageSize", "Invalid rotation %d", *rotation); return (1); } if (!npages) PSHead(fd, (page_width ? page_width : view_width), (page_height ? page_height : view_height), ox, oy); *scale = (xscale < yscale) ? xscale : yscale; if (*scale > 1.0) *scale = 1.0; return (0); } int get_viewport (double pgwidth, double pgheight, double pswidth, double psheight, double *view_width, double *view_height, int rotation) { /* Only one of maxPageHeight or maxPageWidth can be specified */ if (maxPageHeight != 0) /* Clip the viewport to maxPageHeight on each page */ { *view_height = maxPageHeight * PS_UNIT_SIZE; /* * if (res_unit == RESUNIT_CENTIMETER) * *view_height /= 2.54F; */ } else { if (pgheight != 0) /* User has set PageHeight with -h flag */ { *view_height = pgheight * PS_UNIT_SIZE; /* Postscript size for Page Height in inches */ /* if (res_unit == RESUNIT_CENTIMETER) * *view_height /= 2.54F; */ } else /* If no width or height are specified, use the original size from image */ switch (rotation) { default: case 0: case 180: *view_height = psheight; break; case 90: case 270: *view_height = pswidth; break; } } if (maxPageWidth != 0) /* Clip the viewport to maxPageWidth on each page */ { *view_width = maxPageWidth * PS_UNIT_SIZE; /* if (res_unit == RESUNIT_CENTIMETER) * *view_width /= 2.54F; */ } else { if (pgwidth != 0) /* User has set PageWidth with -w flag */ { *view_width = pgwidth * PS_UNIT_SIZE; /* Postscript size for Page Width in inches */ /* if (res_unit == RESUNIT_CENTIMETER) * *view_width /= 2.54F; */ } else /* If no width or height are specified, use the original size from image */ switch (rotation) { default: case 0: case 180: *view_width = pswidth; break; case 90: case 270: *view_width = psheight; /* (*view_height / psheight) * psheight; */ break; } } return (0); } /* pgwidth and pgheight specify page width and height in inches from -h and -w flags * lm and bm are the LeftMargin and BottomMargin in inches * center causes the image to be centered on the page if the paper size is * larger than the image size * returns the sequence number of the page processed or -1 on error */ int TIFF2PS(FILE* fd, TIFF* tif, double pgwidth, double pgheight, double lm, double bm, int center) { uint32 pixwidth = 0, pixheight = 0; /* Image width and height in pixels */ double ox = 0.0, oy = 0.0; /* Offset from current Postscript origin */ double pswidth, psheight; /* Original raw image width and height in points */ double view_width, view_height; /* Viewport width and height in points */ double scale = 1.0; double left_offset = lm * PS_UNIT_SIZE; double bottom_offset = bm * PS_UNIT_SIZE; uint32 subfiletype; uint16* sampleinfo; static int npages = 0; if (!TIFFGetField(tif, TIFFTAG_XPOSITION, &ox)) ox = 0; if (!TIFFGetField(tif, TIFFTAG_YPOSITION, &oy)) oy = 0; /* Consolidated all the tag information into one code segment, Richard Nolde */ do { tf_numberstrips = TIFFNumberOfStrips(tif); TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &tf_rowsperstrip); TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &bitspersample); TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel); TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planarconfiguration); TIFFGetField(tif, TIFFTAG_COMPRESSION, &compression); TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, &extrasamples, &sampleinfo); alpha = (extrasamples == 1 && sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA); if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric)) { switch (samplesperpixel - extrasamples) { case 1: if (isCCITTCompression(tif)) photometric = PHOTOMETRIC_MINISWHITE; else photometric = PHOTOMETRIC_MINISBLACK; break; case 3: photometric = PHOTOMETRIC_RGB; break; case 4: photometric = PHOTOMETRIC_SEPARATED; break; } } /* Read image tags for width and height in pixels pixwidth, pixheight, * and convert to points pswidth, psheight */ setupPageState(tif, &pixwidth, &pixheight, &pswidth, &psheight); view_width = pswidth; view_height = psheight; if (get_viewport (pgwidth, pgheight, pswidth, psheight, &view_width, &view_height, rotation)) { TIFFError("get_viewport", "Unable to set image viewport"); return (1); } /* Write the Postscript file header with Bounding Box and Page Size definitions */ if (psStart(fd, npages, auto_rotate, &rotation, &scale, ox, oy, pgwidth, pgheight, view_width, view_height, pswidth, psheight, left_offset, bottom_offset)) return (-1); if (checkImage(tif)) /* Aborts if unsupported image parameters */ { tf_bytesperrow = TIFFScanlineSize(tif); /* Set viewport clipping and scaling options */ if ((maxPageHeight) || (maxPageWidth) || (pgwidth != 0) || (pgheight != 0)) { if ((maxPageHeight) || (maxPageWidth)) /* used -H or -W option */ { if (psMaskImage(fd, tif, rotation, center, &npages, pixwidth, pixheight, left_offset, bottom_offset, pgwidth, pgheight, pswidth, psheight, scale) < 0) return (-1); } else /* N.B. Setting maxPageHeight no longer sets pgheight */ { if (pgwidth != 0 || pgheight != 0) { /* User did not specify a maxium page height or width using -H or -W flag * but did use -h or -w flag to scale to a specific size page. */ npages++; fprintf(fd, "%%%%Page: %d %d\n", npages, npages); if (!generateEPSF && ( level2 || level3 )) { /* Write out the PageSize info for non EPS files */ if (psPageSize(fd, rotation, pgwidth, pgheight, view_width, view_height, pswidth, psheight)) return (-1); } fprintf(fd, "gsave\n"); fprintf(fd, "100 dict begin\n"); if (psScaleImage(fd, scale, rotation, center, view_width, view_height, pswidth, psheight, left_offset, bottom_offset)) return (-1); PSpage(fd, tif, pixwidth, pixheight); fprintf(fd, "end\n"); fprintf(fd, "grestore\n"); fprintf(fd, "showpage\n"); } } } else /* Simple rotation: user did not use -H, -W, -h or -w */ { npages++; fprintf(fd, "%%%%Page: %d %d\n", npages, npages); if (!generateEPSF && ( level2 || level3 )) { /* Write out the PageSize info for non EPS files */ if (psPageSize(fd, rotation, pgwidth, pgheight, view_width, view_height, pswidth, psheight)) return (-1); } fprintf(fd, "gsave\n"); fprintf(fd, "100 dict begin\n"); if (psRotateImage(fd, rotation, pswidth, psheight, left_offset, bottom_offset)) return (-1); PSpage(fd, tif, pixwidth, pixheight); fprintf(fd, "end\n"); fprintf(fd, "grestore\n"); fprintf(fd, "showpage\n"); } } if (generateEPSF) break; TIFFGetFieldDefaulted(tif, TIFFTAG_SUBFILETYPE, &subfiletype); } while (((subfiletype & FILETYPE_PAGE) || printAll) && TIFFReadDirectory(tif)); return(npages); } static char DuplexPreamble[] = "\ %%BeginFeature: *Duplex True\n\ systemdict begin\n\ /languagelevel where { pop languagelevel } { 1 } ifelse\n\ 2 ge { 1 dict dup /Duplex true put setpagedevice }\n\ { statusdict /setduplex known { statusdict begin setduplex true end } if\n\ } ifelse\n\ end\n\ %%EndFeature\n\ "; static char TumblePreamble[] = "\ %%BeginFeature: *Tumble True\n\ systemdict begin\n\ /languagelevel where { pop languagelevel } { 1 } ifelse\n\ 2 ge { 1 dict dup /Tumble true put setpagedevice }\n\ { statusdict /settumble known { statusdict begin true settumble end } if\n\ } ifelse\n\ end\n\ %%EndFeature\n\ "; static char AvoidDeadZonePreamble[] = "\ gsave newpath clippath pathbbox grestore\n\ 4 2 roll 2 copy translate\n\ exch 3 1 roll sub 3 1 roll sub exch\n\ currentpagedevice /PageSize get aload pop\n\ exch 3 1 roll div 3 1 roll div abs exch abs\n\ 2 copy gt { exch } if pop\n\ dup 1 lt { dup scale } { pop } ifelse\n\ "; void PSHead(FILE *fd, double pagewidth, double pageheight, double xoff, double yoff) { time_t t; t = time(0); fprintf(fd, "%%!PS-Adobe-3.0%s\n", generateEPSF ? " EPSF-3.0" : ""); fprintf(fd, "%%%%Creator: %s\n", creator ? creator : "tiff2ps"); fprintf(fd, "%%%%Title: %s\n", title ? title : filename); fprintf(fd, "%%%%CreationDate: %s", ctime(&t)); fprintf(fd, "%%%%DocumentData: Clean7Bit\n"); /* NB: should use PageBoundingBox for each page instead of BoundingBox * * PageBoundingBox DSC added in PSPageSize function, R Nolde 09-01-2010 */ fprintf(fd, "%%%%Origin: %ld %ld\n", (long) xoff, (long) yoff); fprintf(fd, "%%%%BoundingBox: 0 0 %ld %ld\n", (long) ceil(pagewidth), (long) ceil(pageheight)); fprintf(fd, "%%%%LanguageLevel: %d\n", (level3 ? 3 : (level2 ? 2 : 1))); if (generateEPSF == TRUE) fprintf(fd, "%%%%Pages: 1 1\n"); else fprintf(fd, "%%%%Pages: (atend)\n"); fprintf(fd, "%%%%EndComments\n"); if (generateEPSF == FALSE) { fprintf(fd, "%%%%BeginSetup\n"); if (PSduplex) fprintf(fd, "%s", DuplexPreamble); if (PStumble) fprintf(fd, "%s", TumblePreamble); if (PSavoiddeadzone && (level2 || level3)) fprintf(fd, "%s", AvoidDeadZonePreamble); fprintf(fd, "%%%%EndSetup\n"); } } void PSTail(FILE *fd, int npages) { fprintf(fd, "%%%%Trailer\n"); if (generateEPSF == FALSE) fprintf(fd, "%%%%Pages: %d\n", npages); fprintf(fd, "%%%%EOF\n"); } static int checkcmap(TIFF* tif, int n, uint16* r, uint16* g, uint16* b) { (void) tif; while (n-- > 0) if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256) return (16); TIFFWarning(filename, "Assuming 8-bit colormap"); return (8); } static void PS_Lvl2colorspace(FILE* fd, TIFF* tif) { uint16 *rmap, *gmap, *bmap; int i, num_colors; const char * colorspace_p; switch ( photometric ) { case PHOTOMETRIC_SEPARATED: colorspace_p = "CMYK"; break; case PHOTOMETRIC_RGB: colorspace_p = "RGB"; break; default: colorspace_p = "Gray"; } /* * Set up PostScript Level 2 colorspace according to * section 4.8 in the PostScript refenence manual. */ fputs("% PostScript Level 2 only.\n", fd); if (photometric != PHOTOMETRIC_PALETTE) { if (photometric == PHOTOMETRIC_YCBCR) { /* MORE CODE HERE */ } fprintf(fd, "/Device%s setcolorspace\n", colorspace_p ); return; } /* * Set up an indexed/palette colorspace */ num_colors = (1 << bitspersample); if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &rmap, &gmap, &bmap)) { TIFFError(filename, "Palette image w/o \"Colormap\" tag"); return; } if (checkcmap(tif, num_colors, rmap, gmap, bmap) == 16) { /* * Convert colormap to 8-bits values. */ #define CVT(x) (((x) * 255) / ((1L<<16)-1)) for (i = 0; i < num_colors; i++) { rmap[i] = CVT(rmap[i]); gmap[i] = CVT(gmap[i]); bmap[i] = CVT(bmap[i]); } #undef CVT } fprintf(fd, "[ /Indexed /DeviceRGB %d", num_colors - 1); if (ascii85) { Ascii85Init(); fputs("\n<~", fd); ascii85breaklen -= 2; } else fputs(" <", fd); for (i = 0; i < num_colors; i++) { if (ascii85) { Ascii85Put((unsigned char)rmap[i], fd); Ascii85Put((unsigned char)gmap[i], fd); Ascii85Put((unsigned char)bmap[i], fd); } else { fputs((i % 8) ? " " : "\n ", fd); fprintf(fd, "%02x%02x%02x", rmap[i], gmap[i], bmap[i]); } } if (ascii85) Ascii85Flush(fd); else fputs(">\n", fd); fputs("] setcolorspace\n", fd); } static int PS_Lvl2ImageDict(FILE* fd, TIFF* tif, uint32 w, uint32 h) { int use_rawdata; uint32 tile_width, tile_height; uint16 predictor, minsamplevalue, maxsamplevalue; int repeat_count; char im_h[64], im_x[64], im_y[64]; char * imageOp = "image"; if ( useImagemask && (bitspersample == 1) ) imageOp = "imagemask"; (void)strcpy(im_x, "0"); (void)sprintf(im_y, "%lu", (long) h); (void)sprintf(im_h, "%lu", (long) h); tile_width = w; tile_height = h; if (TIFFIsTiled(tif)) { repeat_count = TIFFNumberOfTiles(tif); TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width); TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height); if (tile_width > w || tile_height > h || (w % tile_width) != 0 || (h % tile_height != 0)) { /* * The tiles does not fit image width and height. * Set up a clip rectangle for the image unit square. */ fputs("0 0 1 1 rectclip\n", fd); } if (tile_width < w) { fputs("/im_x 0 def\n", fd); (void)strcpy(im_x, "im_x neg"); } if (tile_height < h) { fputs("/im_y 0 def\n", fd); (void)sprintf(im_y, "%lu im_y sub", (unsigned long) h); } } else { repeat_count = tf_numberstrips; tile_height = tf_rowsperstrip; if (tile_height > h) tile_height = h; if (repeat_count > 1) { fputs("/im_y 0 def\n", fd); fprintf(fd, "/im_h %lu def\n", (unsigned long) tile_height); (void)strcpy(im_h, "im_h"); (void)sprintf(im_y, "%lu im_y sub", (unsigned long) h); } } /* * Output start of exec block */ fputs("{ % exec\n", fd); if (repeat_count > 1) fprintf(fd, "%d { %% repeat\n", repeat_count); /* * Output filter options and image dictionary. */ if (ascii85) fputs(" /im_stream currentfile /ASCII85Decode filter def\n", fd); fputs(" <<\n", fd); fputs(" /ImageType 1\n", fd); fprintf(fd, " /Width %lu\n", (unsigned long) tile_width); /* * Workaround for some software that may crash when last strip * of image contains fewer number of scanlines than specified * by the `/Height' variable. So for stripped images with multiple * strips we will set `/Height' as `im_h', because one is * recalculated for each strip - including the (smaller) final strip. * For tiled images and images with only one strip `/Height' will * contain number of scanlines in tile (or image height in case of * one-stripped image). */ if (TIFFIsTiled(tif) || tf_numberstrips == 1) fprintf(fd, " /Height %lu\n", (unsigned long) tile_height); else fprintf(fd, " /Height im_h\n"); if (planarconfiguration == PLANARCONFIG_SEPARATE && samplesperpixel > 1) fputs(" /MultipleDataSources true\n", fd); fprintf(fd, " /ImageMatrix [ %lu 0 0 %ld %s %s ]\n", (unsigned long) w, - (long)h, im_x, im_y); fprintf(fd, " /BitsPerComponent %d\n", bitspersample); fprintf(fd, " /Interpolate %s\n", interpolate ? "true" : "false"); switch (samplesperpixel - extrasamples) { case 1: switch (photometric) { case PHOTOMETRIC_MINISBLACK: fputs(" /Decode [0 1]\n", fd); break; case PHOTOMETRIC_MINISWHITE: switch (compression) { case COMPRESSION_CCITTRLE: case COMPRESSION_CCITTRLEW: case COMPRESSION_CCITTFAX3: case COMPRESSION_CCITTFAX4: /* * Manage inverting with /Blackis1 flag * since there migth be uncompressed parts */ fputs(" /Decode [0 1]\n", fd); break; default: /* * ERROR... */ fputs(" /Decode [1 0]\n", fd); break; } break; case PHOTOMETRIC_PALETTE: TIFFGetFieldDefaulted(tif, TIFFTAG_MINSAMPLEVALUE, &minsamplevalue); TIFFGetFieldDefaulted(tif, TIFFTAG_MAXSAMPLEVALUE, &maxsamplevalue); fprintf(fd, " /Decode [%u %u]\n", minsamplevalue, maxsamplevalue); break; default: /* * ERROR ? */ fputs(" /Decode [0 1]\n", fd); break; } break; case 3: switch (photometric) { case PHOTOMETRIC_RGB: fputs(" /Decode [0 1 0 1 0 1]\n", fd); break; case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: default: /* * ERROR?? */ fputs(" /Decode [0 1 0 1 0 1]\n", fd); break; } break; case 4: /* * ERROR?? */ fputs(" /Decode [0 1 0 1 0 1 0 1]\n", fd); break; } fputs(" /DataSource", fd); if (planarconfiguration == PLANARCONFIG_SEPARATE && samplesperpixel > 1) fputs(" [", fd); if (ascii85) fputs(" im_stream", fd); else fputs(" currentfile /ASCIIHexDecode filter", fd); use_rawdata = TRUE; switch (compression) { case COMPRESSION_NONE: /* 1: uncompressed */ break; case COMPRESSION_CCITTRLE: /* 2: CCITT modified Huffman RLE */ case COMPRESSION_CCITTRLEW: /* 32771: #1 w/ word alignment */ case COMPRESSION_CCITTFAX3: /* 3: CCITT Group 3 fax encoding */ case COMPRESSION_CCITTFAX4: /* 4: CCITT Group 4 fax encoding */ fputs("\n\t<<\n", fd); if (compression == COMPRESSION_CCITTFAX3) { uint32 g3_options; fputs("\t /EndOfLine true\n", fd); fputs("\t /EndOfBlock false\n", fd); if (!TIFFGetField(tif, TIFFTAG_GROUP3OPTIONS, &g3_options)) g3_options = 0; if (g3_options & GROUP3OPT_2DENCODING) fprintf(fd, "\t /K %s\n", im_h); if (g3_options & GROUP3OPT_UNCOMPRESSED) fputs("\t /Uncompressed true\n", fd); if (g3_options & GROUP3OPT_FILLBITS) fputs("\t /EncodedByteAlign true\n", fd); } if (compression == COMPRESSION_CCITTFAX4) { uint32 g4_options; fputs("\t /K -1\n", fd); TIFFGetFieldDefaulted(tif, TIFFTAG_GROUP4OPTIONS, &g4_options); if (g4_options & GROUP4OPT_UNCOMPRESSED) fputs("\t /Uncompressed true\n", fd); } if (!(tile_width == w && w == 1728U)) fprintf(fd, "\t /Columns %lu\n", (unsigned long) tile_width); fprintf(fd, "\t /Rows %s\n", im_h); if (compression == COMPRESSION_CCITTRLE || compression == COMPRESSION_CCITTRLEW) { fputs("\t /EncodedByteAlign true\n", fd); fputs("\t /EndOfBlock false\n", fd); } if (photometric == PHOTOMETRIC_MINISBLACK) fputs("\t /BlackIs1 true\n", fd); fprintf(fd, "\t>> /CCITTFaxDecode filter"); break; case COMPRESSION_LZW: /* 5: Lempel-Ziv & Welch */ TIFFGetFieldDefaulted(tif, TIFFTAG_PREDICTOR, &predictor); if (predictor == 2) { fputs("\n\t<<\n", fd); fprintf(fd, "\t /Predictor %u\n", predictor); fprintf(fd, "\t /Columns %lu\n", (unsigned long) tile_width); fprintf(fd, "\t /Colors %u\n", samplesperpixel); fprintf(fd, "\t /BitsPerComponent %u\n", bitspersample); fputs("\t>>", fd); } fputs(" /LZWDecode filter", fd); break; case COMPRESSION_DEFLATE: /* 5: ZIP */ case COMPRESSION_ADOBE_DEFLATE: if ( level3 ) { TIFFGetFieldDefaulted(tif, TIFFTAG_PREDICTOR, &predictor); if (predictor > 1) { fprintf(fd, "\t %% PostScript Level 3 only."); fputs("\n\t<<\n", fd); fprintf(fd, "\t /Predictor %u\n", predictor); fprintf(fd, "\t /Columns %lu\n", (unsigned long) tile_width); fprintf(fd, "\t /Colors %u\n", samplesperpixel); fprintf(fd, "\t /BitsPerComponent %u\n", bitspersample); fputs("\t>>", fd); } fputs(" /FlateDecode filter", fd); } else { use_rawdata = FALSE ; } break; case COMPRESSION_PACKBITS: /* 32773: Macintosh RLE */ fputs(" /RunLengthDecode filter", fd); use_rawdata = TRUE; break; case COMPRESSION_OJPEG: /* 6: !6.0 JPEG */ case COMPRESSION_JPEG: /* 7: %JPEG DCT compression */ #ifdef notdef /* * Code not tested yet */ fputs(" /DCTDecode filter", fd); use_rawdata = TRUE; #else use_rawdata = FALSE; #endif break; case COMPRESSION_NEXT: /* 32766: NeXT 2-bit RLE */ case COMPRESSION_THUNDERSCAN: /* 32809: ThunderScan RLE */ case COMPRESSION_PIXARFILM: /* 32908: Pixar companded 10bit LZW */ case COMPRESSION_JBIG: /* 34661: ISO JBIG */ use_rawdata = FALSE; break; case COMPRESSION_SGILOG: /* 34676: SGI LogL or LogLuv */ case COMPRESSION_SGILOG24: /* 34677: SGI 24-bit LogLuv */ use_rawdata = FALSE; break; default: /* * ERROR... */ use_rawdata = FALSE; break; } if (planarconfiguration == PLANARCONFIG_SEPARATE && samplesperpixel > 1) { uint16 i; /* * NOTE: This code does not work yet... */ for (i = 1; i < samplesperpixel; i++) fputs(" dup", fd); fputs(" ]", fd); } fprintf( fd, "\n >> %s\n", imageOp ); if (ascii85) fputs(" im_stream status { im_stream flushfile } if\n", fd); if (repeat_count > 1) { if (tile_width < w) { fprintf(fd, " /im_x im_x %lu add def\n", (unsigned long) tile_width); if (tile_height < h) { fprintf(fd, " im_x %lu ge {\n", (unsigned long) w); fputs(" /im_x 0 def\n", fd); fprintf(fd, " /im_y im_y %lu add def\n", (unsigned long) tile_height); fputs(" } if\n", fd); } } if (tile_height < h) { if (tile_width >= w) { fprintf(fd, " /im_y im_y %lu add def\n", (unsigned long) tile_height); if (!TIFFIsTiled(tif)) { fprintf(fd, " /im_h %lu im_y sub", (unsigned long) h); fprintf(fd, " dup %lu gt { pop", (unsigned long) tile_height); fprintf(fd, " %lu } if def\n", (unsigned long) tile_height); } } } fputs("} repeat\n", fd); } /* * End of exec function */ fputs("}\n", fd); return(use_rawdata); } /* Flip the byte order of buffers with 16 bit samples */ static void PS_FlipBytes(unsigned char* buf, tsize_t count) { int i; unsigned char temp; if (count <= 0 || bitspersample <= 8) { return; } count--; for (i = 0; i < count; i += 2) { temp = buf[i]; buf[i] = buf[i + 1]; buf[i + 1] = temp; } } #define MAXLINE 36 int PS_Lvl2page(FILE* fd, TIFF* tif, uint32 w, uint32 h) { uint16 fillorder; int use_rawdata, tiled_image, breaklen = MAXLINE; uint32 chunk_no, num_chunks; uint64 *bc; unsigned char *buf_data, *cp; tsize_t chunk_size, byte_count; #if defined( EXP_ASCII85ENCODER ) tsize_t ascii85_l; /* Length, in bytes, of ascii85_p[] data */ uint8 * ascii85_p = 0; /* Holds ASCII85 encoded data */ #endif PS_Lvl2colorspace(fd, tif); use_rawdata = PS_Lvl2ImageDict(fd, tif, w, h); /* See http://bugzilla.remotesensing.org/show_bug.cgi?id=80 */ #ifdef ENABLE_BROKEN_BEGINENDDATA fputs("%%BeginData:\n", fd); #endif fputs("exec\n", fd); tiled_image = TIFFIsTiled(tif); if (tiled_image) { num_chunks = TIFFNumberOfTiles(tif); TIFFGetField(tif, TIFFTAG_TILEBYTECOUNTS, &bc); } else { num_chunks = TIFFNumberOfStrips(tif); TIFFGetField(tif, TIFFTAG_STRIPBYTECOUNTS, &bc); } if (use_rawdata) { chunk_size = (tsize_t) bc[0]; for (chunk_no = 1; chunk_no < num_chunks; chunk_no++) if ((tsize_t) bc[chunk_no] > chunk_size) chunk_size = (tsize_t) bc[chunk_no]; } else { if (tiled_image) chunk_size = TIFFTileSize(tif); else chunk_size = TIFFStripSize(tif); } buf_data = (unsigned char *)_TIFFmalloc(chunk_size); if (!buf_data) { TIFFError(filename, "Can't alloc %lu bytes for %s.", (unsigned long) chunk_size, tiled_image ? "tiles" : "strips"); return(FALSE); } #if defined( EXP_ASCII85ENCODER ) if ( ascii85 ) { /* * Allocate a buffer to hold the ASCII85 encoded data. Note * that it is allocated with sufficient room to hold the * encoded data (5*chunk_size/4) plus the EOD marker (+8) * and formatting line breaks. The line breaks are more * than taken care of by using 6*chunk_size/4 rather than * 5*chunk_size/4. */ ascii85_p = _TIFFmalloc( (chunk_size+(chunk_size/2)) + 8 ); if ( !ascii85_p ) { _TIFFfree( buf_data ); TIFFError( filename, "Cannot allocate ASCII85 encoding buffer." ); return ( FALSE ); } } #endif TIFFGetFieldDefaulted(tif, TIFFTAG_FILLORDER, &fillorder); for (chunk_no = 0; chunk_no < num_chunks; chunk_no++) { if (ascii85) Ascii85Init(); else breaklen = MAXLINE; if (use_rawdata) { if (tiled_image) byte_count = TIFFReadRawTile(tif, chunk_no, buf_data, chunk_size); else byte_count = TIFFReadRawStrip(tif, chunk_no, buf_data, chunk_size); if (fillorder == FILLORDER_LSB2MSB) TIFFReverseBits(buf_data, byte_count); } else { if (tiled_image) byte_count = TIFFReadEncodedTile(tif, chunk_no, buf_data, chunk_size); else byte_count = TIFFReadEncodedStrip(tif, chunk_no, buf_data, chunk_size); } if (byte_count < 0) { TIFFError(filename, "Can't read %s %d.", tiled_image ? "tile" : "strip", chunk_no); if (ascii85) Ascii85Put('\0', fd); } /* * for 16 bits, the two bytes must be most significant * byte first */ if (bitspersample == 16 && !TIFFIsBigEndian(tif)) { PS_FlipBytes(buf_data, byte_count); } /* * For images with alpha, matte against a white background; * i.e. Cback * (1 - Aimage) where Cback = 1. We will fill the * lower part of the buffer with the modified values. * * XXX: needs better solution */ if (alpha) { int adjust, i, j = 0; int ncomps = samplesperpixel - extrasamples; for (i = 0; i < byte_count; i+=samplesperpixel) { adjust = 255 - buf_data[i + ncomps]; switch (ncomps) { case 1: buf_data[j++] = buf_data[i] + adjust; break; case 2: buf_data[j++] = buf_data[i] + adjust; buf_data[j++] = buf_data[i+1] + adjust; break; case 3: buf_data[j++] = buf_data[i] + adjust; buf_data[j++] = buf_data[i+1] + adjust; buf_data[j++] = buf_data[i+2] + adjust; break; } } byte_count -= j; } if (ascii85) { #if defined( EXP_ASCII85ENCODER ) ascii85_l = Ascii85EncodeBlock(ascii85_p, 1, buf_data, byte_count ); if ( ascii85_l > 0 ) fwrite( ascii85_p, ascii85_l, 1, fd ); #else for (cp = buf_data; byte_count > 0; byte_count--) Ascii85Put(*cp++, fd); #endif } else { for (cp = buf_data; byte_count > 0; byte_count--) { putc(hex[((*cp)>>4)&0xf], fd); putc(hex[(*cp)&0xf], fd); cp++; if (--breaklen <= 0) { putc('\n', fd); breaklen = MAXLINE; } } } if ( !ascii85 ) { if ( level2 || level3 ) putc( '>', fd ); putc('\n', fd); } #if !defined( EXP_ASCII85ENCODER ) else Ascii85Flush(fd); #endif } #if defined( EXP_ASCII85ENCODER ) if ( ascii85_p ) _TIFFfree( ascii85_p ); #endif _TIFFfree(buf_data); #ifdef ENABLE_BROKEN_BEGINENDDATA fputs("%%EndData\n", fd); #endif return(TRUE); } void PSpage(FILE* fd, TIFF* tif, uint32 w, uint32 h) { char * imageOp = "image"; if ( useImagemask && (bitspersample == 1) ) imageOp = "imagemask"; if ((level2 || level3) && PS_Lvl2page(fd, tif, w, h)) return; ps_bytesperrow = tf_bytesperrow - (extrasamples * bitspersample / 8)*w; switch (photometric) { case PHOTOMETRIC_RGB: if (planarconfiguration == PLANARCONFIG_CONTIG) { fprintf(fd, "%s", RGBcolorimage); PSColorContigPreamble(fd, w, h, 3); PSDataColorContig(fd, tif, w, h, 3); } else { PSColorSeparatePreamble(fd, w, h, 3); PSDataColorSeparate(fd, tif, w, h, 3); } break; case PHOTOMETRIC_SEPARATED: /* XXX should emit CMYKcolorimage */ if (planarconfiguration == PLANARCONFIG_CONTIG) { PSColorContigPreamble(fd, w, h, 4); PSDataColorContig(fd, tif, w, h, 4); } else { PSColorSeparatePreamble(fd, w, h, 4); PSDataColorSeparate(fd, tif, w, h, 4); } break; case PHOTOMETRIC_PALETTE: fprintf(fd, "%s", RGBcolorimage); PhotoshopBanner(fd, w, h, 1, 3, "false 3 colorimage"); fprintf(fd, "/scanLine %ld string def\n", (long) ps_bytesperrow * 3L); fprintf(fd, "%lu %lu 8\n", (unsigned long) w, (unsigned long) h); fprintf(fd, "[%lu 0 0 -%lu 0 %lu]\n", (unsigned long) w, (unsigned long) h, (unsigned long) h); fprintf(fd, "{currentfile scanLine readhexstring pop} bind\n"); fprintf(fd, "false 3 colorimage\n"); PSDataPalette(fd, tif, w, h); break; case PHOTOMETRIC_MINISBLACK: case PHOTOMETRIC_MINISWHITE: PhotoshopBanner(fd, w, h, 1, 1, imageOp); fprintf(fd, "/scanLine %ld string def\n", (long) ps_bytesperrow); fprintf(fd, "%lu %lu %d\n", (unsigned long) w, (unsigned long) h, bitspersample); fprintf(fd, "[%lu 0 0 -%lu 0 %lu]\n", (unsigned long) w, (unsigned long) h, (unsigned long) h); fprintf(fd, "{currentfile scanLine readhexstring pop} bind\n"); fprintf(fd, "%s\n", imageOp); PSDataBW(fd, tif, w, h); break; } putc('\n', fd); } void PSColorContigPreamble(FILE* fd, uint32 w, uint32 h, int nc) { ps_bytesperrow = nc * (tf_bytesperrow / samplesperpixel); PhotoshopBanner(fd, w, h, 1, nc, "false %d colorimage"); fprintf(fd, "/line %ld string def\n", (long) ps_bytesperrow); fprintf(fd, "%lu %lu %d\n", (unsigned long) w, (unsigned long) h, bitspersample); fprintf(fd, "[%lu 0 0 -%lu 0 %lu]\n", (unsigned long) w, (unsigned long) h, (unsigned long) h); fprintf(fd, "{currentfile line readhexstring pop} bind\n"); fprintf(fd, "false %d colorimage\n", nc); } void PSColorSeparatePreamble(FILE* fd, uint32 w, uint32 h, int nc) { int i; PhotoshopBanner(fd, w, h, ps_bytesperrow, nc, "true %d colorimage"); for (i = 0; i < nc; i++) fprintf(fd, "/line%d %ld string def\n", i, (long) ps_bytesperrow); fprintf(fd, "%lu %lu %d\n", (unsigned long) w, (unsigned long) h, bitspersample); fprintf(fd, "[%lu 0 0 -%lu 0 %lu] \n", (unsigned long) w, (unsigned long) h, (unsigned long) h); for (i = 0; i < nc; i++) fprintf(fd, "{currentfile line%d readhexstring pop}bind\n", i); fprintf(fd, "true %d colorimage\n", nc); } #define DOBREAK(len, howmany, fd) \ if (((len) -= (howmany)) <= 0) { \ putc('\n', fd); \ (len) = MAXLINE-(howmany); \ } #define PUTHEX(c,fd) putc(hex[((c)>>4)&0xf],fd); putc(hex[(c)&0xf],fd) void PSDataColorContig(FILE* fd, TIFF* tif, uint32 w, uint32 h, int nc) { uint32 row; int breaklen = MAXLINE, es = samplesperpixel - nc; tsize_t cc; unsigned char *tf_buf; unsigned char *cp, c; (void) w; tf_buf = (unsigned char *) _TIFFmalloc(tf_bytesperrow); if (tf_buf == NULL) { TIFFError(filename, "No space for scanline buffer"); return; } for (row = 0; row < h; row++) { if (TIFFReadScanline(tif, tf_buf, row, 0) < 0) break; cp = tf_buf; /* * for 16 bits, the two bytes must be most significant * byte first */ if (bitspersample == 16 && !HOST_BIGENDIAN) { PS_FlipBytes(cp, tf_bytesperrow); } if (alpha) { int adjust; cc = 0; for (; cc < tf_bytesperrow; cc += samplesperpixel) { DOBREAK(breaklen, nc, fd); /* * For images with alpha, matte against * a white background; i.e. * Cback * (1 - Aimage) * where Cback = 1. */ adjust = 255 - cp[nc]; switch (nc) { case 4: c = *cp++ + adjust; PUTHEX(c,fd); case 3: c = *cp++ + adjust; PUTHEX(c,fd); case 2: c = *cp++ + adjust; PUTHEX(c,fd); case 1: c = *cp++ + adjust; PUTHEX(c,fd); } cp += es; } } else { cc = 0; for (; cc < tf_bytesperrow; cc += samplesperpixel) { DOBREAK(breaklen, nc, fd); switch (nc) { case 4: c = *cp++; PUTHEX(c,fd); case 3: c = *cp++; PUTHEX(c,fd); case 2: c = *cp++; PUTHEX(c,fd); case 1: c = *cp++; PUTHEX(c,fd); } cp += es; } } } _TIFFfree((char *) tf_buf); } void PSDataColorSeparate(FILE* fd, TIFF* tif, uint32 w, uint32 h, int nc) { uint32 row; int breaklen = MAXLINE; tsize_t cc; tsample_t s, maxs; unsigned char *tf_buf; unsigned char *cp, c; (void) w; tf_buf = (unsigned char *) _TIFFmalloc(tf_bytesperrow); if (tf_buf == NULL) { TIFFError(filename, "No space for scanline buffer"); return; } maxs = (samplesperpixel > nc ? nc : samplesperpixel); for (row = 0; row < h; row++) { for (s = 0; s < maxs; s++) { if (TIFFReadScanline(tif, tf_buf, row, s) < 0) break; for (cp = tf_buf, cc = 0; cc < tf_bytesperrow; cc++) { DOBREAK(breaklen, 1, fd); c = *cp++; PUTHEX(c,fd); } } } _TIFFfree((char *) tf_buf); } #define PUTRGBHEX(c,fd) \ PUTHEX(rmap[c],fd); PUTHEX(gmap[c],fd); PUTHEX(bmap[c],fd) void PSDataPalette(FILE* fd, TIFF* tif, uint32 w, uint32 h) { uint16 *rmap, *gmap, *bmap; uint32 row; int breaklen = MAXLINE, nc; tsize_t cc; unsigned char *tf_buf; unsigned char *cp, c; (void) w; if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &rmap, &gmap, &bmap)) { TIFFError(filename, "Palette image w/o \"Colormap\" tag"); return; } switch (bitspersample) { case 8: case 4: case 2: case 1: break; default: TIFFError(filename, "Depth %d not supported", bitspersample); return; } nc = 3 * (8 / bitspersample); tf_buf = (unsigned char *) _TIFFmalloc(tf_bytesperrow); if (tf_buf == NULL) { TIFFError(filename, "No space for scanline buffer"); return; } if (checkcmap(tif, 1<= 0; i--) { rmap[i] = CVT(rmap[i]); gmap[i] = CVT(gmap[i]); bmap[i] = CVT(bmap[i]); } #undef CVT } for (row = 0; row < h; row++) { if (TIFFReadScanline(tif, tf_buf, row, 0) < 0) break; for (cp = tf_buf, cc = 0; cc < tf_bytesperrow; cc++) { DOBREAK(breaklen, nc, fd); switch (bitspersample) { case 8: c = *cp++; PUTRGBHEX(c, fd); break; case 4: c = *cp++; PUTRGBHEX(c&0xf, fd); c >>= 4; PUTRGBHEX(c, fd); break; case 2: c = *cp++; PUTRGBHEX(c&0x3, fd); c >>= 2; PUTRGBHEX(c&0x3, fd); c >>= 2; PUTRGBHEX(c&0x3, fd); c >>= 2; PUTRGBHEX(c, fd); break; case 1: c = *cp++; PUTRGBHEX(c&0x1, fd); c >>= 1; PUTRGBHEX(c&0x1, fd); c >>= 1; PUTRGBHEX(c&0x1, fd); c >>= 1; PUTRGBHEX(c&0x1, fd); c >>= 1; PUTRGBHEX(c&0x1, fd); c >>= 1; PUTRGBHEX(c&0x1, fd); c >>= 1; PUTRGBHEX(c&0x1, fd); c >>= 1; PUTRGBHEX(c, fd); break; } } } _TIFFfree((char *) tf_buf); } void PSDataBW(FILE* fd, TIFF* tif, uint32 w, uint32 h) { int breaklen = MAXLINE; unsigned char* tf_buf; unsigned char* cp; tsize_t stripsize = TIFFStripSize(tif); tstrip_t s; #if defined( EXP_ASCII85ENCODER ) tsize_t ascii85_l; /* Length, in bytes, of ascii85_p[] data */ uint8 *ascii85_p = 0; /* Holds ASCII85 encoded data */ #endif (void) w; (void) h; tf_buf = (unsigned char *) _TIFFmalloc(stripsize); if (tf_buf == NULL) { TIFFError(filename, "No space for scanline buffer"); return; } // FIXME memset(tf_buf, 0, stripsize); #if defined( EXP_ASCII85ENCODER ) if ( ascii85 ) { /* * Allocate a buffer to hold the ASCII85 encoded data. Note * that it is allocated with sufficient room to hold the * encoded data (5*stripsize/4) plus the EOD marker (+8) * and formatting line breaks. The line breaks are more * than taken care of by using 6*stripsize/4 rather than * 5*stripsize/4. */ ascii85_p = _TIFFmalloc( (stripsize+(stripsize/2)) + 8 ); if ( !ascii85_p ) { _TIFFfree( tf_buf ); TIFFError( filename, "Cannot allocate ASCII85 encoding buffer." ); return; } } #endif if (ascii85) Ascii85Init(); for (s = 0; s < TIFFNumberOfStrips(tif); s++) { tmsize_t cc = TIFFReadEncodedStrip(tif, s, tf_buf, stripsize); if (cc < 0) { TIFFError(filename, "Can't read strip"); break; } cp = tf_buf; if (photometric == PHOTOMETRIC_MINISWHITE) { for (cp += cc; --cp >= tf_buf;) *cp = ~*cp; cp++; } /* * for 16 bits, the two bytes must be most significant * byte first */ if (bitspersample == 16 && !HOST_BIGENDIAN) { PS_FlipBytes(cp, cc); } if (ascii85) { #if defined( EXP_ASCII85ENCODER ) if (alpha) { int adjust, i; for (i = 0; i < cc; i+=2) { adjust = 255 - cp[i + 1]; cp[i / 2] = cp[i] + adjust; } cc /= 2; } ascii85_l = Ascii85EncodeBlock( ascii85_p, 1, cp, cc ); if ( ascii85_l > 0 ) fwrite( ascii85_p, ascii85_l, 1, fd ); #else while (cc-- > 0) Ascii85Put(*cp++, fd); #endif /* EXP_ASCII85_ENCODER */ } else { unsigned char c; if (alpha) { int adjust; while (cc-- > 0) { DOBREAK(breaklen, 1, fd); /* * For images with alpha, matte against * a white background; i.e. * Cback * (1 - Aimage) * where Cback = 1. */ adjust = 255 - cp[1]; c = *cp++ + adjust; PUTHEX(c,fd); cp++, cc--; } } else { while (cc-- > 0) { c = *cp++; DOBREAK(breaklen, 1, fd); PUTHEX(c, fd); } } } } if ( !ascii85 ) { if ( level2 || level3) fputs(">\n", fd); } #if !defined( EXP_ASCII85ENCODER ) else Ascii85Flush(fd); #else if ( ascii85_p ) _TIFFfree( ascii85_p ); #endif _TIFFfree(tf_buf); } void PSRawDataBW(FILE* fd, TIFF* tif, uint32 w, uint32 h) { uint64 *bc; uint32 bufsize; int breaklen = MAXLINE; tmsize_t cc; uint16 fillorder; unsigned char *tf_buf; unsigned char *cp, c; tstrip_t s; #if defined( EXP_ASCII85ENCODER ) tsize_t ascii85_l; /* Length, in bytes, of ascii85_p[] data */ uint8 * ascii85_p = 0; /* Holds ASCII85 encoded data */ #endif (void) w; (void) h; TIFFGetFieldDefaulted(tif, TIFFTAG_FILLORDER, &fillorder); TIFFGetField(tif, TIFFTAG_STRIPBYTECOUNTS, &bc); /* * Find largest strip: */ bufsize = (uint32) bc[0]; for ( s = 0; ++s < (tstrip_t)tf_numberstrips; ) { if ( bc[s] > bufsize ) bufsize = (uint32) bc[s]; } tf_buf = (unsigned char*) _TIFFmalloc(bufsize); if (tf_buf == NULL) { TIFFError(filename, "No space for strip buffer"); return; } #if defined( EXP_ASCII85ENCODER ) if ( ascii85 ) { /* * Allocate a buffer to hold the ASCII85 encoded data. Note * that it is allocated with sufficient room to hold the * encoded data (5*bufsize/4) plus the EOD marker (+8) * and formatting line breaks. The line breaks are more * than taken care of by using 6*bufsize/4 rather than * 5*bufsize/4. */ ascii85_p = _TIFFmalloc( (bufsize+(bufsize/2)) + 8 ); if ( !ascii85_p ) { _TIFFfree( tf_buf ); TIFFError( filename, "Cannot allocate ASCII85 encoding buffer." ); return; } } #endif for (s = 0; s < (tstrip_t) tf_numberstrips; s++) { cc = TIFFReadRawStrip(tif, s, tf_buf, (tmsize_t) bc[s]); if (cc < 0) { TIFFError(filename, "Can't read strip"); break; } if (fillorder == FILLORDER_LSB2MSB) TIFFReverseBits(tf_buf, cc); if (!ascii85) { for (cp = tf_buf; cc > 0; cc--) { DOBREAK(breaklen, 1, fd); c = *cp++; PUTHEX(c, fd); } fputs(">\n", fd); breaklen = MAXLINE; } else { Ascii85Init(); #if defined( EXP_ASCII85ENCODER ) ascii85_l = Ascii85EncodeBlock( ascii85_p, 1, tf_buf, cc ); if ( ascii85_l > 0 ) fwrite( ascii85_p, ascii85_l, 1, fd ); #else for (cp = tf_buf; cc > 0; cc--) Ascii85Put(*cp++, fd); Ascii85Flush(fd); #endif /* EXP_ASCII85ENCODER */ } } _TIFFfree((char *) tf_buf); #if defined( EXP_ASCII85ENCODER ) if ( ascii85_p ) _TIFFfree( ascii85_p ); #endif } void Ascii85Init(void) { ascii85breaklen = 2*MAXLINE; ascii85count = 0; } static char* Ascii85Encode(unsigned char* raw) { static char encoded[6]; uint32 word; word = (((raw[0]<<8)+raw[1])<<16) + (raw[2]<<8) + raw[3]; if (word != 0L) { uint32 q; uint16 w1; q = word / (85L*85*85*85); /* actually only a byte */ encoded[0] = (char) (q + '!'); word -= q * (85L*85*85*85); q = word / (85L*85*85); encoded[1] = (char) (q + '!'); word -= q * (85L*85*85); q = word / (85*85); encoded[2] = (char) (q + '!'); w1 = (uint16) (word - q*(85L*85)); encoded[3] = (char) ((w1 / 85) + '!'); encoded[4] = (char) ((w1 % 85) + '!'); encoded[5] = '\0'; } else encoded[0] = 'z', encoded[1] = '\0'; return (encoded); } void Ascii85Put(unsigned char code, FILE* fd) { ascii85buf[ascii85count++] = code; if (ascii85count >= 4) { unsigned char* p; int n; for (n = ascii85count, p = ascii85buf; n >= 4; n -= 4, p += 4) { char* cp; for (cp = Ascii85Encode(p); *cp; cp++) { putc(*cp, fd); if (--ascii85breaklen == 0) { putc('\n', fd); ascii85breaklen = 2*MAXLINE; } } } _TIFFmemcpy(ascii85buf, p, n); ascii85count = n; } } void Ascii85Flush(FILE* fd) { if (ascii85count > 0) { char* res; _TIFFmemset(&ascii85buf[ascii85count], 0, 3); res = Ascii85Encode(ascii85buf); fwrite(res[0] == 'z' ? "!!!!" : res, ascii85count + 1, 1, fd); } fputs("~>\n", fd); } #if defined( EXP_ASCII85ENCODER) #define A85BREAKCNTR ascii85breaklen #define A85BREAKLEN (2*MAXLINE) /***************************************************************************** * * Name: Ascii85EncodeBlock( ascii85_p, f_eod, raw_p, raw_l ) * * Description: This routine will encode the raw data in the buffer described * by raw_p and raw_l into ASCII85 format and store the encoding * in the buffer given by ascii85_p. * * Parameters: ascii85_p - A buffer supplied by the caller which will * contain the encoded ASCII85 data. * f_eod - Flag: Nz means to end the encoded buffer with * an End-Of-Data marker. * raw_p - Pointer to the buffer of data to be encoded * raw_l - Number of bytes in raw_p[] to be encoded * * Returns: (int) < 0 Error, see errno * >= 0 Number of bytes written to ascii85_p[]. * * Notes: An external variable given by A85BREAKCNTR is used to * determine when to insert newline characters into the * encoded data. As each byte is placed into ascii85_p this * external is decremented. If the variable is decrement to * or past zero then a newline is inserted into ascii85_p * and the A85BREAKCNTR is then reset to A85BREAKLEN. * Note: for efficiency reasons the A85BREAKCNTR variable * is not actually checked on *every* character * placed into ascii85_p but often only for every * 5 characters. * * THE CALLER IS RESPONSIBLE FOR ENSURING THAT ASCII85_P[] IS * SUFFICIENTLY LARGE TO THE ENCODED DATA! * You will need at least 5 * (raw_l/4) bytes plus space for * newline characters and space for an EOD marker (if * requested). A safe calculation is to use 6*(raw_l/4) + 8 * to size ascii85_p. * *****************************************************************************/ tsize_t Ascii85EncodeBlock( uint8 * ascii85_p, unsigned f_eod, const uint8 * raw_p, tsize_t raw_l ) { char ascii85[5]; /* Encoded 5 tuple */ tsize_t ascii85_l; /* Number of bytes written to ascii85_p[] */ int rc; /* Return code */ uint32 val32; /* Unencoded 4 tuple */ ascii85_l = 0; /* Nothing written yet */ if ( raw_p ) { --raw_p; /* Prepare for pre-increment fetches */ for ( ; raw_l > 3; raw_l -= 4 ) { val32 = *(++raw_p) << 24; val32 += *(++raw_p) << 16; val32 += *(++raw_p) << 8; val32 += *(++raw_p); if ( val32 == 0 ) /* Special case */ { ascii85_p[ascii85_l] = 'z'; rc = 1; } else { ascii85[4] = (char) ((val32 % 85) + 33); val32 /= 85; ascii85[3] = (char) ((val32 % 85) + 33); val32 /= 85; ascii85[2] = (char) ((val32 % 85) + 33); val32 /= 85; ascii85[1] = (char) ((val32 % 85) + 33); ascii85[0] = (char) ((val32 / 85) + 33); _TIFFmemcpy( &ascii85_p[ascii85_l], ascii85, sizeof(ascii85) ); rc = sizeof(ascii85); } ascii85_l += rc; if ( (A85BREAKCNTR -= rc) <= 0 ) { ascii85_p[ascii85_l] = '\n'; ++ascii85_l; A85BREAKCNTR = A85BREAKLEN; } } /* * Output any straggler bytes: */ if ( raw_l > 0 ) { tsize_t len; /* Output this many bytes */ len = raw_l + 1; val32 = *++raw_p << 24; /* Prime the pump */ if ( --raw_l > 0 ) val32 += *(++raw_p) << 16; if ( --raw_l > 0 ) val32 += *(++raw_p) << 8; val32 /= 85; ascii85[3] = (char) ((val32 % 85) + 33); val32 /= 85; ascii85[2] = (char) ((val32 % 85) + 33); val32 /= 85; ascii85[1] = (char) ((val32 % 85) + 33); ascii85[0] = (char) ((val32 / 85) + 33); _TIFFmemcpy( &ascii85_p[ascii85_l], ascii85, len ); ascii85_l += len; } } /* * If requested add an ASCII85 End Of Data marker: */ if ( f_eod ) { ascii85_p[ascii85_l++] = '~'; ascii85_p[ascii85_l++] = '>'; ascii85_p[ascii85_l++] = '\n'; } return ( ascii85_l ); } /* Ascii85EncodeBlock() */ #endif /* EXP_ASCII85ENCODER */ char* stuff[] = { "usage: tiff2ps [options] input.tif ...", "where options are:", " -1 generate PostScript Level 1 (default)", " -2 generate PostScript Level 2", " -3 generate PostScript Level 3", " -8 disable use of ASCII85 encoding with PostScript Level 2/3", " -a convert all directories in file (default is first), Not EPS", " -b # set the bottom margin to # inches", " -c center image (-b and -l still add to this)", " -d # set initial directory to # counting from zero", " -D enable duplex printing (two pages per sheet of paper)", " -e generate Encapsulated PostScript (EPS) (implies -z)", " -h # set printed page height to # inches (no default)", " -w # set printed page width to # inches (no default)", " -H # split image if height is more than # inches", " -P L or P set optional PageOrientation DSC comment to Landscape or Portrait", " -W # split image if width is more than # inches", " -L # overLap split images by # inches", " -i # enable/disable (Nz/0) pixel interpolation (default: enable)", " -l # set the left margin to # inches", " -m use \"imagemask\" operator instead of \"image\"", " -o # convert directory at file offset # bytes", " -O file write PostScript to file instead of standard output", " -p generate regular PostScript", " -r # or auto rotate by 90, 180, 270 degrees or auto", " -s generate PostScript for a single image", " -t name set postscript document title. Otherwise the filename is used", " -T print pages for top edge binding", " -x override resolution units as centimeters", " -y override resolution units as inches", " -z enable printing in the deadzone (only for PostScript Level 2/3)", NULL }; static void usage(int code) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(code); } tiff-4.0.3/tools/tiffsplit.c0000644000212300117540000002030311650573505012704 00000000000000/* $Id: tiffsplit.c,v 1.22 2011-10-22 17:03:01 bfriesen Exp $ */ /* * Copyright (c) 1992-1997 Sam Leffler * Copyright (c) 1992-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include "tiffio.h" #ifndef HAVE_GETOPT extern int getopt(int, char**, char*); #endif #define CopyField(tag, v) \ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) #define CopyField2(tag, v1, v2) \ if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2) #define CopyField3(tag, v1, v2, v3) \ if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3) #define PATH_LENGTH 8192 static const char TIFF_SUFFIX[] = ".tif"; static char fname[PATH_LENGTH]; static int tiffcp(TIFF*, TIFF*); static void newfilename(void); static int cpStrips(TIFF*, TIFF*); static int cpTiles(TIFF*, TIFF*); int main(int argc, char* argv[]) { TIFF *in, *out; if (argc < 2) { fprintf(stderr, "%s\n\n", TIFFGetVersion()); fprintf(stderr, "usage: tiffsplit input.tif [prefix]\n"); return (-3); } if (argc > 2) { strncpy(fname, argv[2], sizeof(fname)); fname[sizeof(fname) - 1] = '\0'; } in = TIFFOpen(argv[1], "r"); if (in != NULL) { do { size_t path_len; char *path; newfilename(); path_len = strlen(fname) + sizeof(TIFF_SUFFIX); path = (char *) _TIFFmalloc(path_len); strncpy(path, fname, path_len); path[path_len - 1] = '\0'; strncat(path, TIFF_SUFFIX, path_len - strlen(path) - 1); out = TIFFOpen(path, TIFFIsBigEndian(in)?"wb":"wl"); _TIFFfree(path); if (out == NULL) return (-2); if (!tiffcp(in, out)) return (-1); TIFFClose(out); } while (TIFFReadDirectory(in)); (void) TIFFClose(in); } return (0); } static void newfilename(void) { static int first = 1; static long lastTurn; static long fnum; static short defname; static char *fpnt; if (first) { if (fname[0]) { fpnt = fname + strlen(fname); defname = 0; } else { fname[0] = 'x'; fpnt = fname + 1; defname = 1; } first = 0; } #define MAXFILES 17576 if (fnum == MAXFILES) { if (!defname || fname[0] == 'z') { fprintf(stderr, "tiffsplit: too many files.\n"); exit(1); } fname[0]++; fnum = 0; } if (fnum % 676 == 0) { if (fnum != 0) { /* * advance to next letter every 676 pages * condition for 'z'++ will be covered above */ fpnt[0]++; } else { /* * set to 'a' if we are on the very first file */ fpnt[0] = 'a'; } /* * set the value of the last turning point */ lastTurn = fnum; } /* * start from 0 every 676 times (provided by lastTurn) * this keeps us within a-z boundaries */ fpnt[1] = (char)((fnum - lastTurn) / 26) + 'a'; /* * cycle last letter every file, from a-z, then repeat */ fpnt[2] = (char)(fnum % 26) + 'a'; fnum++; } static int tiffcp(TIFF* in, TIFF* out) { uint16 bitspersample, samplesperpixel, compression, shortv, *shortav; uint32 w, l; float floatv; char *stringv; uint32 longv; CopyField(TIFFTAG_SUBFILETYPE, longv); CopyField(TIFFTAG_TILEWIDTH, w); CopyField(TIFFTAG_TILELENGTH, l); CopyField(TIFFTAG_IMAGEWIDTH, w); CopyField(TIFFTAG_IMAGELENGTH, l); CopyField(TIFFTAG_BITSPERSAMPLE, bitspersample); CopyField(TIFFTAG_SAMPLESPERPIXEL, samplesperpixel); CopyField(TIFFTAG_COMPRESSION, compression); if (compression == COMPRESSION_JPEG) { uint32 count = 0; void *table = NULL; if (TIFFGetField(in, TIFFTAG_JPEGTABLES, &count, &table) && count > 0 && table) { TIFFSetField(out, TIFFTAG_JPEGTABLES, count, table); } } CopyField(TIFFTAG_PHOTOMETRIC, shortv); CopyField(TIFFTAG_PREDICTOR, shortv); CopyField(TIFFTAG_THRESHHOLDING, shortv); CopyField(TIFFTAG_FILLORDER, shortv); CopyField(TIFFTAG_ORIENTATION, shortv); CopyField(TIFFTAG_MINSAMPLEVALUE, shortv); CopyField(TIFFTAG_MAXSAMPLEVALUE, shortv); CopyField(TIFFTAG_XRESOLUTION, floatv); CopyField(TIFFTAG_YRESOLUTION, floatv); CopyField(TIFFTAG_GROUP3OPTIONS, longv); CopyField(TIFFTAG_GROUP4OPTIONS, longv); CopyField(TIFFTAG_RESOLUTIONUNIT, shortv); CopyField(TIFFTAG_PLANARCONFIG, shortv); CopyField(TIFFTAG_ROWSPERSTRIP, longv); CopyField(TIFFTAG_XPOSITION, floatv); CopyField(TIFFTAG_YPOSITION, floatv); CopyField(TIFFTAG_IMAGEDEPTH, longv); CopyField(TIFFTAG_TILEDEPTH, longv); CopyField(TIFFTAG_SAMPLEFORMAT, shortv); CopyField2(TIFFTAG_EXTRASAMPLES, shortv, shortav); { uint16 *red, *green, *blue; CopyField3(TIFFTAG_COLORMAP, red, green, blue); } { uint16 shortv2; CopyField2(TIFFTAG_PAGENUMBER, shortv, shortv2); } CopyField(TIFFTAG_ARTIST, stringv); CopyField(TIFFTAG_IMAGEDESCRIPTION, stringv); CopyField(TIFFTAG_MAKE, stringv); CopyField(TIFFTAG_MODEL, stringv); CopyField(TIFFTAG_SOFTWARE, stringv); CopyField(TIFFTAG_DATETIME, stringv); CopyField(TIFFTAG_HOSTCOMPUTER, stringv); CopyField(TIFFTAG_PAGENAME, stringv); CopyField(TIFFTAG_DOCUMENTNAME, stringv); CopyField(TIFFTAG_BADFAXLINES, longv); CopyField(TIFFTAG_CLEANFAXDATA, longv); CopyField(TIFFTAG_CONSECUTIVEBADFAXLINES, longv); CopyField(TIFFTAG_FAXRECVPARAMS, longv); CopyField(TIFFTAG_FAXRECVTIME, longv); CopyField(TIFFTAG_FAXSUBADDRESS, stringv); CopyField(TIFFTAG_FAXDCS, stringv); if (TIFFIsTiled(in)) return (cpTiles(in, out)); else return (cpStrips(in, out)); } static int cpStrips(TIFF* in, TIFF* out) { tmsize_t bufsize = TIFFStripSize(in); unsigned char *buf = (unsigned char *)_TIFFmalloc(bufsize); if (buf) { tstrip_t s, ns = TIFFNumberOfStrips(in); uint64 *bytecounts; if (!TIFFGetField(in, TIFFTAG_STRIPBYTECOUNTS, &bytecounts)) { fprintf(stderr, "tiffsplit: strip byte counts are missing\n"); return (0); } for (s = 0; s < ns; s++) { if (bytecounts[s] > (uint64)bufsize) { buf = (unsigned char *)_TIFFrealloc(buf, (tmsize_t)bytecounts[s]); if (!buf) return (0); bufsize = (tmsize_t)bytecounts[s]; } if (TIFFReadRawStrip(in, s, buf, (tmsize_t)bytecounts[s]) < 0 || TIFFWriteRawStrip(out, s, buf, (tmsize_t)bytecounts[s]) < 0) { _TIFFfree(buf); return (0); } } _TIFFfree(buf); return (1); } return (0); } static int cpTiles(TIFF* in, TIFF* out) { tmsize_t bufsize = TIFFTileSize(in); unsigned char *buf = (unsigned char *)_TIFFmalloc(bufsize); if (buf) { ttile_t t, nt = TIFFNumberOfTiles(in); uint64 *bytecounts; if (!TIFFGetField(in, TIFFTAG_TILEBYTECOUNTS, &bytecounts)) { fprintf(stderr, "tiffsplit: tile byte counts are missing\n"); return (0); } for (t = 0; t < nt; t++) { if (bytecounts[t] > (uint64) bufsize) { buf = (unsigned char *)_TIFFrealloc(buf, (tmsize_t)bytecounts[t]); if (!buf) return (0); bufsize = (tmsize_t)bytecounts[t]; } if (TIFFReadRawTile(in, t, buf, (tmsize_t)bytecounts[t]) < 0 || TIFFWriteRawTile(out, t, buf, (tmsize_t)bytecounts[t]) < 0) { _TIFFfree(buf); return (0); } } _TIFFfree(buf); return (1); } return (0); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/Makefile.am0000644000212300117540000000717412026614023012570 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. LIBPORT = $(top_builddir)/port/libport.la LIBTIFF = $(top_builddir)/libtiff/libtiff.la EXTRA_DIST = Makefile.vc bin_PROGRAMS = \ bmp2tiff \ fax2ps \ fax2tiff \ gif2tiff \ pal2rgb \ ppm2tiff \ ras2tiff \ raw2tiff \ rgb2ycbcr \ thumbnail \ tiff2bw \ tiff2pdf \ tiff2ps \ tiff2rgba \ tiffcmp \ tiffcp \ tiffcrop \ tiffdither \ tiffdump \ tiffinfo \ tiffmedian \ tiffset \ tiffsplit if HAVE_OPENGL bin_PROGRAMS += tiffgt endif EXTRA_PROGRAMS = sgi2tiff sgisv ycbcr if HAVE_RPATH AM_LDFLAGS = $(LIBDIR) endif bmp2tiff_SOURCES = bmp2tiff.c bmp2tiff_LDADD = $(LIBTIFF) $(LIBPORT) fax2ps_SOURCES = fax2ps.c fax2ps_LDADD = $(LIBTIFF) $(LIBPORT) fax2tiff_SOURCES = fax2tiff.c fax2tiff_LDADD = $(LIBTIFF) $(LIBPORT) gif2tiff_SOURCES = gif2tiff.c gif2tiff_LDADD = $(LIBTIFF) $(LIBPORT) pal2rgb_SOURCES = pal2rgb.c pal2rgb_LDADD = $(LIBTIFF) $(LIBPORT) ppm2tiff_SOURCES = ppm2tiff.c ppm2tiff_LDADD = $(LIBTIFF) $(LIBPORT) ras2tiff_SOURCES = ras2tiff.c rasterfile.h ras2tiff_LDADD = $(LIBTIFF) $(LIBPORT) raw2tiff_SOURCES = raw2tiff.c raw2tiff_LDADD = $(LIBTIFF) $(LIBPORT) rgb2ycbcr_SOURCES = rgb2ycbcr.c rgb2ycbcr_LDADD = $(LIBTIFF) $(LIBPORT) thumbnail_SOURCES = thumbnail.c thumbnail_LDADD = $(LIBTIFF) $(LIBPORT) tiff2bw_SOURCES = tiff2bw.c tiff2bw_LDADD = $(LIBTIFF) $(LIBPORT) tiff2pdf_SOURCES = tiff2pdf.c tiff2pdf_LDADD = $(LIBTIFF) $(LIBPORT) tiff2ps_SOURCES = tiff2ps.c tiff2ps_LDADD = $(LIBTIFF) $(LIBPORT) tiff2rgba_SOURCES = tiff2rgba.c tiff2rgba_LDADD = $(LIBTIFF) $(LIBPORT) tiffcmp_SOURCES = tiffcmp.c tiffcmp_LDADD = $(LIBTIFF) $(LIBPORT) tiffcp_SOURCES = tiffcp.c tiffcp_LDADD = $(LIBTIFF) $(LIBPORT) tiffcrop_SOURCES = tiffcrop.c tiffcrop_LDADD = $(LIBTIFF) $(LIBPORT) tiffdither_SOURCES = tiffdither.c tiffdither_LDADD = $(LIBTIFF) $(LIBPORT) tiffdump_SOURCES = tiffdump.c tiffdump_LDADD = $(LIBTIFF) $(LIBPORT) tiffinfo_SOURCES = tiffinfo.c tiffinfo_LDADD = $(LIBTIFF) $(LIBPORT) tiffmedian_SOURCES = tiffmedian.c tiffmedian_LDADD = $(LIBTIFF) $(LIBPORT) tiffset_SOURCES = tiffset.c tiffset_LDADD = $(LIBTIFF) $(LIBPORT) tiffsplit_SOURCES = tiffsplit.c tiffsplit_LDADD = $(LIBTIFF) $(LIBPORT) tiffgt_SOURCES = tiffgt.c tiffgt_CFLAGS = $(CFLAGS) $(GLUT_CFLAGS) $(AM_CFLAGS) tiffgt_LDADD = $(LIBTIFF) $(LIBPORT) $(X_LIBS) $(GLUT_LIBS) AM_CPPFLAGS = -I$(top_srcdir)/libtiff echo: (echo $(CFLAGS)) (echo $(tiffgt_CFLAGS)) (echo $(GL_CFLAGS)) (echo $(GLU_CFLAGS)) (echo $(GLUT_CFLAGS)) tiff-4.0.3/tools/tiffdither.c0000644000212300117540000002122111345765562013037 00000000000000/* $Id: tiffdither.c,v 1.12 2010-03-10 18:56:50 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" #define streq(a,b) (strcmp(a,b) == 0) #define strneq(a,b,n) (strncmp(a,b,n) == 0) #define CopyField(tag, v) \ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) uint32 imagewidth; uint32 imagelength; int threshold = 128; static void usage(void); /* * Floyd-Steinberg error propragation with threshold. * This code is stolen from tiffmedian. */ static void fsdither(TIFF* in, TIFF* out) { unsigned char *outline, *inputline, *inptr; short *thisline, *nextline, *tmpptr; register unsigned char *outptr; register short *thisptr, *nextptr; register uint32 i, j; uint32 imax, jmax; int lastline, lastpixel; int bit; tsize_t outlinesize; imax = imagelength - 1; jmax = imagewidth - 1; inputline = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(in)); thisline = (short *)_TIFFmalloc(imagewidth * sizeof (short)); nextline = (short *)_TIFFmalloc(imagewidth * sizeof (short)); outlinesize = TIFFScanlineSize(out); outline = (unsigned char *) _TIFFmalloc(outlinesize); /* * Get first line */ if (TIFFReadScanline(in, inputline, 0, 0) <= 0) goto skip_on_error; inptr = inputline; nextptr = nextline; for (j = 0; j < imagewidth; ++j) *nextptr++ = *inptr++; for (i = 1; i < imagelength; ++i) { tmpptr = thisline; thisline = nextline; nextline = tmpptr; lastline = (i == imax); if (TIFFReadScanline(in, inputline, i, 0) <= 0) break; inptr = inputline; nextptr = nextline; for (j = 0; j < imagewidth; ++j) *nextptr++ = *inptr++; thisptr = thisline; nextptr = nextline; _TIFFmemset(outptr = outline, 0, outlinesize); bit = 0x80; for (j = 0; j < imagewidth; ++j) { register int v; lastpixel = (j == jmax); v = *thisptr++; if (v < 0) v = 0; else if (v > 255) v = 255; if (v > threshold) { *outptr |= bit; v -= 255; } bit >>= 1; if (bit == 0) { outptr++; bit = 0x80; } if (!lastpixel) thisptr[0] += v * 7 / 16; if (!lastline) { if (j != 0) nextptr[-1] += v * 3 / 16; *nextptr++ += v * 5 / 16; if (!lastpixel) nextptr[0] += v / 16; } } if (TIFFWriteScanline(out, outline, i-1, 0) < 0) break; } skip_on_error: _TIFFfree(inputline); _TIFFfree(thisline); _TIFFfree(nextline); _TIFFfree(outline); } static uint16 compression = COMPRESSION_PACKBITS; static uint16 predictor = 0; static uint32 group3options = 0; static void processG3Options(char* cp) { if ((cp = strchr(cp, ':'))) { do { cp++; if (strneq(cp, "1d", 2)) group3options &= ~GROUP3OPT_2DENCODING; else if (strneq(cp, "2d", 2)) group3options |= GROUP3OPT_2DENCODING; else if (strneq(cp, "fill", 4)) group3options |= GROUP3OPT_FILLBITS; else usage(); } while ((cp = strchr(cp, ':'))); } } static int processCompressOptions(char* opt) { if (streq(opt, "none")) compression = COMPRESSION_NONE; else if (streq(opt, "packbits")) compression = COMPRESSION_PACKBITS; else if (strneq(opt, "g3", 2)) { processG3Options(opt); compression = COMPRESSION_CCITTFAX3; } else if (streq(opt, "g4")) compression = COMPRESSION_CCITTFAX4; else if (strneq(opt, "lzw", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_LZW; } else if (strneq(opt, "zip", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_DEFLATE; } else return (0); return (1); } int main(int argc, char* argv[]) { TIFF *in, *out; uint16 samplesperpixel, bitspersample = 1, shortv; float floatv; char thing[1024]; uint32 rowsperstrip = (uint32) -1; uint16 fillorder = 0; int c; extern int optind; extern char *optarg; while ((c = getopt(argc, argv, "c:f:r:t:")) != -1) switch (c) { case 'c': /* compression scheme */ if (!processCompressOptions(optarg)) usage(); break; case 'f': /* fill order */ if (streq(optarg, "lsb2msb")) fillorder = FILLORDER_LSB2MSB; else if (streq(optarg, "msb2lsb")) fillorder = FILLORDER_MSB2LSB; else usage(); break; case 'r': /* rows/strip */ rowsperstrip = atoi(optarg); break; case 't': threshold = atoi(optarg); if (threshold < 0) threshold = 0; else if (threshold > 255) threshold = 255; break; case '?': usage(); /*NOTREACHED*/ } if (argc - optind < 2) usage(); in = TIFFOpen(argv[optind], "r"); if (in == NULL) return (-1); TIFFGetField(in, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel); if (samplesperpixel != 1) { fprintf(stderr, "%s: Not a b&w image.\n", argv[0]); return (-1); } TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bitspersample); if (bitspersample != 8) { fprintf(stderr, " %s: Sorry, only handle 8-bit samples.\n", argv[0]); return (-1); } out = TIFFOpen(argv[optind+1], "w"); if (out == NULL) return (-1); CopyField(TIFFTAG_IMAGEWIDTH, imagewidth); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &imagelength); TIFFSetField(out, TIFFTAG_IMAGELENGTH, imagelength-1); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 1); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(out, TIFFTAG_COMPRESSION, compression); if (fillorder) TIFFSetField(out, TIFFTAG_FILLORDER, fillorder); else CopyField(TIFFTAG_FILLORDER, shortv); sprintf(thing, "Dithered B&W version of %s", argv[optind]); TIFFSetField(out, TIFFTAG_IMAGEDESCRIPTION, thing); CopyField(TIFFTAG_PHOTOMETRIC, shortv); CopyField(TIFFTAG_ORIENTATION, shortv); CopyField(TIFFTAG_XRESOLUTION, floatv); CopyField(TIFFTAG_YRESOLUTION, floatv); CopyField(TIFFTAG_RESOLUTIONUNIT, shortv); rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip); TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip); switch (compression) { case COMPRESSION_CCITTFAX3: TIFFSetField(out, TIFFTAG_GROUP3OPTIONS, group3options); break; case COMPRESSION_LZW: case COMPRESSION_DEFLATE: if (predictor) TIFFSetField(out, TIFFTAG_PREDICTOR, predictor); break; } fsdither(in, out); TIFFClose(in); TIFFClose(out); return (0); } char* stuff[] = { "usage: tiffdither [options] input.tif output.tif", "where options are:", " -r # make each strip have no more than # rows", " -f lsb2msb force lsb-to-msb FillOrder for output", " -f msb2lsb force msb-to-lsb FillOrder for output", " -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", " -c zip[:opts] compress output with deflate encoding", " -c packbits compress output with packbits encoding", " -c g3[:opts] compress output with CCITT Group 3 encoding", " -c g4 compress output with CCITT Group 4 encoding", " -c none use no compression algorithm on output", "", "Group 3 options:", " 1d use default CCITT Group 3 1D-encoding", " 2d use optional CCITT Group 3 2D-encoding", " fill byte-align EOL codes", "For example, -c g3:2d:fill to get G3-2D-encoded data with byte-aligned EOLs", "", "LZW and deflate options:", " # set predictor value", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/fax2ps.c0000644000212300117540000003177611545674514012130 00000000000000/* $Id: fax2ps.c,v 1.27 2011-04-02 19:30:20 bfriesen Exp $" */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_IO_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" float defxres = 204.; /* default x resolution (pixels/inch) */ float defyres = 98.; /* default y resolution (lines/inch) */ const float half = 0.5; const float points = 72.0; float pageWidth = 0; /* image page width (inches) */ float pageHeight = 0; /* image page length (inches) */ int scaleToPage = 0; /* if true, scale raster to page dimensions */ int totalPages = 0; /* total # pages printed */ int row; /* current output row */ int maxline = 512; /* max output line of PostScript */ /* * Turn a bit-mapped scanline into the appropriate sequence * of PostScript characters to be rendered. * * Original version written by Bret D. Whissel, * Florida State University Meteorology Department * March 13-15, 1995. */ static void printruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) { static struct { char white, black; unsigned short width; } WBarr[] = { { 'd', 'n', 512 }, { 'e', 'o', 256 }, { 'f', 'p', 128 }, { 'g', 'q', 64 }, { 'h', 'r', 32 }, { 'i', 's', 16 }, { 'j', 't', 8 }, { 'k', 'u', 4 }, { 'l', 'v', 2 }, { 'm', 'w', 1 } }; static char* svalue = " !\"#$&'*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abc"; int colormode = 1; /* 0 for white, 1 for black */ uint32 runlength = 0; int n = maxline; uint32 x = 0; int l; (void) buf; printf("%d m(", row++); while (runs < erun) { if (runlength <= 0) { colormode ^= 1; runlength = *runs++; if (x+runlength > lastx) runlength = runs[-1] = lastx-x; x += runlength; if (!colormode && runs == erun) break; /* don't bother printing the final white run */ } /* * If a runlength is greater than 6 pixels, then spit out * black or white characters until the runlength drops to * 6 or less. Once a runlength is <= 6, then combine black * and white runlengths until a 6-pixel pattern is obtained. * Then write out the special character. Six-pixel patterns * were selected since 64 patterns is the largest power of * two less than the 92 "easily printable" PostScript * characters (i.e., no escape codes or octal chars). */ l = 0; while (runlength > 6) { /* Run is greater than six... */ if (runlength >= WBarr[l].width) { if (n == 0) { putchar('\n'); n = maxline; } putchar(colormode ? WBarr[l].black : WBarr[l].white), n--; runlength -= WBarr[l].width; } else l++; } while (runlength > 0 && runlength <= 6) { uint32 bitsleft = 6; int t = 0; while (bitsleft) { if (runlength <= bitsleft) { if (colormode) t |= ((1 << runlength)-1) << (bitsleft-runlength); bitsleft -= runlength; runlength = 0; if (bitsleft) { if (runs >= erun) break; colormode ^= 1; runlength = *runs++; if (x+runlength > lastx) runlength = runs[-1] = lastx-x; x += runlength; } } else { /* runlength exceeds bits left */ if (colormode) t |= ((1 << bitsleft)-1); runlength -= bitsleft; bitsleft = 0; } } if (n == 0) { putchar('\n'); n = maxline; } putchar(svalue[t]), n--; } } printf(")s\n"); } /* * Create a special PostScript font for printing FAX documents. By taking * advantage of the font-cacheing mechanism, a substantial speed-up in * rendering time is realized. */ static void emitFont(FILE* fd) { static const char* fontPrologue[] = { "/newfont 10 dict def newfont begin /FontType 3 def /FontMatrix [1", "0 0 1 0 0] def /FontBBox [0 0 512 1] def /Encoding 256 array def", "0 1 31{Encoding exch /255 put}for 120 1 255{Encoding exch /255", "put}for Encoding 37 /255 put Encoding 40 /255 put Encoding 41 /255", "put Encoding 92 /255 put /count 0 def /ls{Encoding exch count 3", "string cvs cvn put /count count 1 add def}def 32 1 36{ls}for", "38 1 39{ls}for 42 1 91{ls}for 93 1 99{ls}for /count 100", "def 100 1 119{ls}for /CharDict 5 dict def CharDict begin /white", "{dup 255 eq{pop}{1 dict begin 100 sub neg 512 exch bitshift", "/cw exch def cw 0 0 0 cw 1 setcachedevice end}ifelse}def /black", "{dup 255 eq{pop}{1 dict begin 110 sub neg 512 exch bitshift", "/cw exch def cw 0 0 0 cw 1 setcachedevice 0 0 moveto cw 0 rlineto", "0 1 rlineto cw neg 0 rlineto closepath fill end}ifelse}def /numbuild", "{dup 255 eq{pop}{6 0 0 0 6 1 setcachedevice 0 1 5{0 moveto", "dup 32 and 32 eq{1 0 rlineto 0 1 rlineto -1 0 rlineto closepath", "fill newpath}if 1 bitshift}for pop}ifelse}def /.notdef {}", "def /255 {}def end /BuildChar{exch begin dup 110 ge{Encoding", "exch get 3 string cvs cvi CharDict /black get}{dup 100 ge {Encoding", "exch get 3 string cvs cvi CharDict /white get}{Encoding exch get", "3 string cvs cvi CharDict /numbuild get}ifelse}ifelse exec end", "}def end /Bitfont newfont definefont 1 scalefont setfont", NULL }; int i; for (i = 0; fontPrologue[i] != NULL; i++) fprintf(fd, "%s\n", fontPrologue[i]); } void printTIF(TIFF* tif, uint16 pageNumber) { uint32 w, h; uint16 unit, compression; float xres, yres, scale = 1.0; tstrip_t s, ns; time_t creation_time; TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h); TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w); if (!TIFFGetField(tif, TIFFTAG_COMPRESSION, &compression) || compression < COMPRESSION_CCITTRLE || compression > COMPRESSION_CCITT_T6) return; if (!TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres) || !xres) { TIFFWarning(TIFFFileName(tif), "No x-resolution, assuming %g dpi", defxres); xres = defxres; } if (!TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres) || !yres) { TIFFWarning(TIFFFileName(tif), "No y-resolution, assuming %g lpi", defyres); yres = defyres; /* XXX */ } if (TIFFGetField(tif, TIFFTAG_RESOLUTIONUNIT, &unit) && unit == RESUNIT_CENTIMETER) { xres *= 2.54F; yres *= 2.54F; } if (pageWidth == 0) pageWidth = w / xres; if (pageHeight == 0) pageHeight = h / yres; printf("%%!PS-Adobe-3.0\n"); printf("%%%%Creator: fax2ps\n"); #ifdef notdef printf("%%%%Title: %s\n", file); #endif creation_time = time(0); printf("%%%%CreationDate: %s", ctime(&creation_time)); printf("%%%%Origin: 0 0\n"); printf("%%%%BoundingBox: 0 0 %u %u\n", (int)(pageWidth * points), (int)(pageHeight * points)); /* XXX */ printf("%%%%Pages: (atend)\n"); printf("%%%%EndComments\n"); printf("%%%%BeginProlog\n"); emitFont(stdout); printf("/d{bind def}def\n"); /* bind and def proc */ printf("/m{0 exch moveto}d\n"); printf("/s{show}d\n"); printf("/p{showpage}d \n"); /* end page */ printf("%%%%EndProlog\n"); printf("%%%%Page: \"%u\" %u\n", pageNumber, pageNumber); printf("/$pageTop save def gsave\n"); if (scaleToPage) scale = pageHeight / (h/yres) < pageWidth / (w/xres) ? pageHeight / (h/yres) : pageWidth / (w/xres); printf("%g %g translate\n", points * (pageWidth - scale*w/xres) * half, points * (scale*h/yres + (pageHeight - scale*h/yres) * half)); printf("%g %g scale\n", points/xres*scale, -points/yres*scale); printf("0 setgray\n"); TIFFSetField(tif, TIFFTAG_FAXFILLFUNC, printruns); ns = TIFFNumberOfStrips(tif); row = 0; for (s = 0; s < ns; s++) (void) TIFFReadEncodedStrip(tif, s, (tdata_t) NULL, (tsize_t) -1); printf("p\n"); printf("grestore $pageTop restore\n"); totalPages++; } #define GetPageNumber(tif) \ TIFFGetField(tif, TIFFTAG_PAGENUMBER, &pn, &ptotal) int findPage(TIFF* tif, uint16 pageNumber) { uint16 pn = (uint16) -1; uint16 ptotal = (uint16) -1; if (GetPageNumber(tif)) { while (pn != (pageNumber-1) && TIFFReadDirectory(tif) && GetPageNumber(tif)) ; return (pn == (pageNumber-1)); } else return (TIFFSetDirectory(tif, (tdir_t)(pageNumber-1))); } void fax2ps(TIFF* tif, uint16 npages, uint16* pages, char* filename) { if (npages > 0) { uint16 pn, ptotal; int i; if (!GetPageNumber(tif)) fprintf(stderr, "%s: No page numbers, counting directories.\n", filename); for (i = 0; i < npages; i++) { if (findPage(tif, pages[i])) printTIF(tif, pages[i]); else fprintf(stderr, "%s: No page number %d\n", filename, pages[i]); } } else { uint16 pageNumber = 0; do printTIF(tif, pageNumber++); while (TIFFReadDirectory(tif)); } } #undef GetPageNumber static int pcompar(const void* va, const void* vb) { const int* pa = (const int*) va; const int* pb = (const int*) vb; return (*pa - *pb); } static void usage(int code); int main(int argc, char** argv) { extern int optind; extern char* optarg; uint16 *pages = NULL, npages = 0, pageNumber; int c, dowarnings = 0; /* if 1, enable library warnings */ TIFF* tif; while ((c = getopt(argc, argv, "l:p:x:y:W:H:wS")) != -1) switch (c) { case 'H': /* page height */ pageHeight = (float)atof(optarg); break; case 'S': /* scale to page */ scaleToPage = 1; break; case 'W': /* page width */ pageWidth = (float)atof(optarg); break; case 'p': /* print specific page */ pageNumber = (uint16)atoi(optarg); if (pages) pages = (uint16*) realloc(pages, (npages+1)*sizeof(uint16)); else pages = (uint16*) malloc(sizeof(uint16)); pages[npages++] = pageNumber; break; case 'w': dowarnings = 1; break; case 'x': defxres = (float)atof(optarg); break; case 'y': defyres = (float)atof(optarg); break; case 'l': maxline = atoi(optarg); break; case '?': usage(-1); } if (npages > 0) qsort(pages, npages, sizeof(uint16), pcompar); if (!dowarnings) TIFFSetWarningHandler(0); if (optind < argc) { do { tif = TIFFOpen(argv[optind], "r"); if (tif) { fax2ps(tif, npages, pages, argv[optind]); TIFFClose(tif); } else fprintf(stderr, "%s: Can not open, or not a TIFF file.\n", argv[optind]); } while (++optind < argc); } else { int n; FILE* fd; char buf[16*1024]; fd = tmpfile(); if (fd == NULL) { fprintf(stderr, "Could not obtain temporary file.\n"); exit(-2); } #if defined(HAVE_SETMODE) && defined(O_BINARY) setmode(fileno(stdin), O_BINARY); #endif while ((n = read(fileno(stdin), buf, sizeof (buf))) > 0) write(fileno(fd), buf, n); lseek(fileno(fd), 0, SEEK_SET); #if defined(_WIN32) && defined(USE_WIN32_FILEIO) tif = TIFFFdOpen(_get_osfhandle(fileno(fd)), "temp", "r"); #else tif = TIFFFdOpen(fileno(fd), "temp", "r"); #endif if (tif) { fax2ps(tif, npages, pages, ""); TIFFClose(tif); } else fprintf(stderr, "Can not open, or not a TIFF file.\n"); fclose(fd); } printf("%%%%Trailer\n"); printf("%%%%Pages: %u\n", totalPages); printf("%%%%EOF\n"); return (0); } char* stuff[] = { "usage: fax2ps [options] [input.tif ...]", "where options are:", " -w suppress warning messages", " -l chars set maximum output line length for generated PostScript", " -p page# select page to print (can use multiple times)", " -x xres set default horizontal resolution of input data (dpi)", " -y yres set default vertical resolution of input data (lpi)", " -S scale output to page size", " -W width set output page width (inches), default is 8.5", " -H height set output page height (inches), default is 11", NULL }; static void usage(int code) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(code); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/ras2tiff.c0000644000212300117540000002161011345765561012430 00000000000000/* $Id: ras2tiff.c,v 1.18 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "rasterfile.h" #include "tiffio.h" #ifndef howmany #define howmany(x, y) (((x)+((y)-1))/(y)) #endif #define streq(a,b) (strcmp(a,b) == 0) #define strneq(a,b,n) (strncmp(a,b,n) == 0) static uint16 compression = (uint16) -1; static int jpegcolormode = JPEGCOLORMODE_RGB; static int quality = 75; /* JPEG quality */ static uint16 predictor = 0; static void usage(void); static int processCompressOptions(char*); int main(int argc, char* argv[]) { unsigned char* buf; long row; tsize_t linebytes, scanline; TIFF *out; FILE *in; struct rasterfile h; uint16 photometric; uint16 config = PLANARCONFIG_CONTIG; uint32 rowsperstrip = (uint32) -1; int c; extern int optind; extern char* optarg; while ((c = getopt(argc, argv, "c:r:h")) != -1) switch (c) { case 'c': /* compression scheme */ if (!processCompressOptions(optarg)) usage(); break; case 'r': /* rows/strip */ rowsperstrip = atoi(optarg); break; case 'h': usage(); /*NOTREACHED*/ } if (argc - optind != 2) usage(); in = fopen(argv[optind], "rb"); if (in == NULL) { fprintf(stderr, "%s: Can not open.\n", argv[optind]); return (-1); } if (fread(&h, sizeof (h), 1, in) != 1) { fprintf(stderr, "%s: Can not read header.\n", argv[optind]); fclose(in); return (-2); } if (strcmp(h.ras_magic, RAS_MAGIC) == 0) { #ifndef WORDS_BIGENDIAN TIFFSwabLong((uint32 *)&h.ras_width); TIFFSwabLong((uint32 *)&h.ras_height); TIFFSwabLong((uint32 *)&h.ras_depth); TIFFSwabLong((uint32 *)&h.ras_length); TIFFSwabLong((uint32 *)&h.ras_type); TIFFSwabLong((uint32 *)&h.ras_maptype); TIFFSwabLong((uint32 *)&h.ras_maplength); #endif } else if (strcmp(h.ras_magic, RAS_MAGIC_INV) == 0) { #ifdef WORDS_BIGENDIAN TIFFSwabLong((uint32 *)&h.ras_width); TIFFSwabLong((uint32 *)&h.ras_height); TIFFSwabLong((uint32 *)&h.ras_depth); TIFFSwabLong((uint32 *)&h.ras_length); TIFFSwabLong((uint32 *)&h.ras_type); TIFFSwabLong((uint32 *)&h.ras_maptype); TIFFSwabLong((uint32 *)&h.ras_maplength); #endif } else { fprintf(stderr, "%s: Not a rasterfile.\n", argv[optind]); fclose(in); return (-3); } out = TIFFOpen(argv[optind+1], "w"); if (out == NULL) { fclose(in); return (-4); } TIFFSetField(out, TIFFTAG_IMAGEWIDTH, (uint32) h.ras_width); TIFFSetField(out, TIFFTAG_IMAGELENGTH, (uint32) h.ras_height); TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, h.ras_depth > 8 ? 3 : 1); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, h.ras_depth > 1 ? 8 : 1); TIFFSetField(out, TIFFTAG_PLANARCONFIG, config); if (h.ras_maptype != RMT_NONE) { uint16* red; register uint16* map; register int i, j; int mapsize; buf = (unsigned char *)_TIFFmalloc(h.ras_maplength); if (buf == NULL) { fprintf(stderr, "No space to read in colormap.\n"); return (-5); } if (fread(buf, h.ras_maplength, 1, in) != 1) { fprintf(stderr, "%s: Read error on colormap.\n", argv[optind]); return (-6); } mapsize = 1< mapsize*3) { fprintf(stderr, "%s: Huh, %ld colormap entries, should be %d?\n", argv[optind], h.ras_maplength, mapsize*3); return (-7); } red = (uint16*)_TIFFmalloc(mapsize * 3 * sizeof (uint16)); if (red == NULL) { fprintf(stderr, "No space for colormap.\n"); return (-8); } map = red; for (j = 0; j < 3; j++) { #define SCALE(x) (((x)*((1L<<16)-1))/255) for (i = h.ras_maplength/3; i-- > 0;) *map++ = SCALE(*buf++); if ((i = h.ras_maplength/3) < mapsize) { i = mapsize - i; _TIFFmemset(map, 0, i*sizeof (uint16)); map += i; } } TIFFSetField(out, TIFFTAG_COLORMAP, red, red + mapsize, red + 2*mapsize); photometric = PHOTOMETRIC_PALETTE; if (compression == (uint16) -1) compression = COMPRESSION_PACKBITS; TIFFSetField(out, TIFFTAG_COMPRESSION, compression); } else { /* XXX this is bogus... */ photometric = h.ras_depth == 24 ? PHOTOMETRIC_RGB : PHOTOMETRIC_MINISBLACK; if (compression == (uint16) -1) compression = COMPRESSION_LZW; TIFFSetField(out, TIFFTAG_COMPRESSION, compression); } switch (compression) { case COMPRESSION_JPEG: if (photometric == PHOTOMETRIC_RGB && jpegcolormode == JPEGCOLORMODE_RGB) photometric = PHOTOMETRIC_YCBCR; TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality); TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode); break; case COMPRESSION_LZW: case COMPRESSION_DEFLATE: if (predictor != 0) TIFFSetField(out, TIFFTAG_PREDICTOR, predictor); break; } TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric); linebytes = ((h.ras_depth*h.ras_width+15) >> 3) &~ 1; scanline = TIFFScanlineSize(out); if (scanline > linebytes) { buf = (unsigned char *)_TIFFmalloc(scanline); _TIFFmemset(buf+linebytes, 0, scanline-linebytes); } else buf = (unsigned char *)_TIFFmalloc(linebytes); TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(out, rowsperstrip)); for (row = 0; row < h.ras_height; row++) { if (fread(buf, linebytes, 1, in) != 1) { fprintf(stderr, "%s: scanline %ld: Read error.\n", argv[optind], row); break; } if (h.ras_type == RT_STANDARD && h.ras_depth == 24) { tsize_t cc = h.ras_width; unsigned char* cp = buf; #define SWAP(a,b) { unsigned char t = (a); (a) = (b); (b) = t; } do { SWAP(cp[0], cp[2]); cp += 3; } while (--cc); } if (TIFFWriteScanline(out, buf, row, 0) < 0) break; } (void) TIFFClose(out); fclose(in); return (0); } static int processCompressOptions(char* opt) { if (streq(opt, "none")) compression = COMPRESSION_NONE; else if (streq(opt, "packbits")) compression = COMPRESSION_PACKBITS; else if (strneq(opt, "jpeg", 4)) { char* cp = strchr(opt, ':'); compression = COMPRESSION_JPEG; while( cp ) { if (isdigit((int)cp[1])) quality = atoi(cp+1); else if (cp[1] == 'r' ) jpegcolormode = JPEGCOLORMODE_RAW; else usage(); cp = strchr(cp+1,':'); } } else if (strneq(opt, "lzw", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_LZW; } else if (strneq(opt, "zip", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_DEFLATE; } else return (0); return (1); } char* stuff[] = { "usage: ras2tiff [options] input.ras output.tif", "where options are:", " -r # make each strip have no more than # rows", "", " -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", " -c zip[:opts] compress output with deflate encoding", " -c jpeg[:opts] compress output with JPEG encoding", " -c packbits compress output with packbits encoding", " -c none use no compression algorithm on output", "", "JPEG options:", " # set compression quality level (0-100, default 75)", " r output color image as RGB rather than YCbCr", "For example, -c jpeg:r:50 to get JPEG-encoded RGB data with 50% comp. quality", "", "LZW and deflate options:", " # set predictor value", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", " -h this help message", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/pal2rgb.c0000644000212300117540000003061211415374160012230 00000000000000/* $Id: pal2rgb.c,v 1.13 2010-07-02 12:02:56 dron Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffio.h" #define streq(a,b) (strcmp(a,b) == 0) #define strneq(a,b,n) (strncmp(a,b,n) == 0) static void usage(void); static void cpTags(TIFF* in, TIFF* out); static int checkcmap(int n, uint16* r, uint16* g, uint16* b) { while (n-- > 0) if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256) return (16); fprintf(stderr, "Warning, assuming 8-bit colormap.\n"); return (8); } #define CopyField(tag, v) \ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) #define CopyField3(tag, v1, v2, v3) \ if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3) static uint16 compression = (uint16) -1; static uint16 predictor = 0; static int quality = 75; /* JPEG quality */ static int jpegcolormode = JPEGCOLORMODE_RGB; static int processCompressOptions(char*); int main(int argc, char* argv[]) { uint16 bitspersample, shortv; uint32 imagewidth, imagelength; uint16 config = PLANARCONFIG_CONTIG; uint32 rowsperstrip = (uint32) -1; uint16 photometric = PHOTOMETRIC_RGB; uint16 *rmap, *gmap, *bmap; uint32 row; int cmap = -1; TIFF *in, *out; int c; extern int optind; extern char* optarg; while ((c = getopt(argc, argv, "C:c:p:r:")) != -1) switch (c) { case 'C': /* force colormap interpretation */ cmap = atoi(optarg); break; case 'c': /* compression scheme */ if (!processCompressOptions(optarg)) usage(); break; case 'p': /* planar configuration */ if (streq(optarg, "separate")) config = PLANARCONFIG_SEPARATE; else if (streq(optarg, "contig")) config = PLANARCONFIG_CONTIG; else usage(); break; case 'r': /* rows/strip */ rowsperstrip = atoi(optarg); break; case '?': usage(); /*NOTREACHED*/ } if (argc - optind != 2) usage(); in = TIFFOpen(argv[optind], "r"); if (in == NULL) return (-1); if (!TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &shortv) || shortv != PHOTOMETRIC_PALETTE) { fprintf(stderr, "%s: Expecting a palette image.\n", argv[optind]); return (-1); } if (!TIFFGetField(in, TIFFTAG_COLORMAP, &rmap, &gmap, &bmap)) { fprintf(stderr, "%s: No colormap (not a valid palette image).\n", argv[optind]); return (-1); } bitspersample = 0; TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bitspersample); if (bitspersample != 8) { fprintf(stderr, "%s: Sorry, can only handle 8-bit images.\n", argv[optind]); return (-1); } out = TIFFOpen(argv[optind+1], "w"); if (out == NULL) return (-2); cpTags(in, out); TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &imagewidth); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &imagelength); if (compression != (uint16)-1) TIFFSetField(out, TIFFTAG_COMPRESSION, compression); else TIFFGetField(in, TIFFTAG_COMPRESSION, &compression); switch (compression) { case COMPRESSION_JPEG: if (jpegcolormode == JPEGCOLORMODE_RGB) photometric = PHOTOMETRIC_YCBCR; else photometric = PHOTOMETRIC_RGB; TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality); TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode); break; case COMPRESSION_LZW: case COMPRESSION_DEFLATE: if (predictor != 0) TIFFSetField(out, TIFFTAG_PREDICTOR, predictor); break; } TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 3); TIFFSetField(out, TIFFTAG_PLANARCONFIG, config); TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip)); (void) TIFFGetField(in, TIFFTAG_PLANARCONFIG, &shortv); if (cmap == -1) cmap = checkcmap(1<= 0; i--) { #define CVT(x) (((x) * 255) / ((1L<<16)-1)) rmap[i] = CVT(rmap[i]); gmap[i] = CVT(gmap[i]); bmap[i] = CVT(bmap[i]); } } { unsigned char *ibuf, *obuf; register unsigned char* pp; register uint32 x; ibuf = (unsigned char*)_TIFFmalloc(TIFFScanlineSize(in)); obuf = (unsigned char*)_TIFFmalloc(TIFFScanlineSize(out)); switch (config) { case PLANARCONFIG_CONTIG: for (row = 0; row < imagelength; row++) { if (!TIFFReadScanline(in, ibuf, row, 0)) goto done; pp = obuf; for (x = 0; x < imagewidth; x++) { *pp++ = (unsigned char) rmap[ibuf[x]]; *pp++ = (unsigned char) gmap[ibuf[x]]; *pp++ = (unsigned char) bmap[ibuf[x]]; } if (!TIFFWriteScanline(out, obuf, row, 0)) goto done; } break; case PLANARCONFIG_SEPARATE: for (row = 0; row < imagelength; row++) { if (!TIFFReadScanline(in, ibuf, row, 0)) goto done; for (pp = obuf, x = 0; x < imagewidth; x++) *pp++ = (unsigned char) rmap[ibuf[x]]; if (!TIFFWriteScanline(out, obuf, row, 0)) goto done; for (pp = obuf, x = 0; x < imagewidth; x++) *pp++ = (unsigned char) gmap[ibuf[x]]; if (!TIFFWriteScanline(out, obuf, row, 0)) goto done; for (pp = obuf, x = 0; x < imagewidth; x++) *pp++ = (unsigned char) bmap[ibuf[x]]; if (!TIFFWriteScanline(out, obuf, row, 0)) goto done; } break; } _TIFFfree(ibuf); _TIFFfree(obuf); } done: (void) TIFFClose(in); (void) TIFFClose(out); return (0); } static int processCompressOptions(char* opt) { if (streq(opt, "none")) compression = COMPRESSION_NONE; else if (streq(opt, "packbits")) compression = COMPRESSION_PACKBITS; else if (strneq(opt, "jpeg", 4)) { char* cp = strchr(opt, ':'); compression = COMPRESSION_JPEG; while( cp ) { if (isdigit((int)cp[1])) quality = atoi(cp+1); else if (cp[1] == 'r' ) jpegcolormode = JPEGCOLORMODE_RAW; else usage(); cp = strchr(cp+1,':'); } } else if (strneq(opt, "lzw", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_LZW; } else if (strneq(opt, "zip", 3)) { char* cp = strchr(opt, ':'); if (cp) predictor = atoi(cp+1); compression = COMPRESSION_DEFLATE; } else return (0); return (1); } #define CopyField(tag, v) \ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) #define CopyField2(tag, v1, v2) \ if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2) #define CopyField3(tag, v1, v2, v3) \ if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3) #define CopyField4(tag, v1, v2, v3, v4) \ if (TIFFGetField(in, tag, &v1, &v2, &v3, &v4)) TIFFSetField(out, tag, v1, v2, v3, v4) static void cpTag(TIFF* in, TIFF* out, uint16 tag, uint16 count, TIFFDataType type) { switch (type) { case TIFF_SHORT: if (count == 1) { uint16 shortv; CopyField(tag, shortv); } else if (count == 2) { uint16 shortv1, shortv2; CopyField2(tag, shortv1, shortv2); } else if (count == 4) { uint16 *tr, *tg, *tb, *ta; CopyField4(tag, tr, tg, tb, ta); } else if (count == (uint16) -1) { uint16 shortv1; uint16* shortav; CopyField2(tag, shortv1, shortav); } break; case TIFF_LONG: { uint32 longv; CopyField(tag, longv); } break; case TIFF_RATIONAL: if (count == 1) { float floatv; CopyField(tag, floatv); } else if (count == (uint16) -1) { float* floatav; CopyField(tag, floatav); } break; case TIFF_ASCII: { char* stringv; CopyField(tag, stringv); } break; case TIFF_DOUBLE: if (count == 1) { double doublev; CopyField(tag, doublev); } else if (count == (uint16) -1) { double* doubleav; CopyField(tag, doubleav); } break; default: TIFFError(TIFFFileName(in), "Data type %d is not supported, tag %d skipped.", tag, type); } } #undef CopyField4 #undef CopyField3 #undef CopyField2 #undef CopyField static struct cpTag { uint16 tag; uint16 count; TIFFDataType type; } tags[] = { { TIFFTAG_IMAGEWIDTH, 1, TIFF_LONG }, { TIFFTAG_IMAGELENGTH, 1, TIFF_LONG }, { TIFFTAG_BITSPERSAMPLE, 1, TIFF_SHORT }, { TIFFTAG_COMPRESSION, 1, TIFF_SHORT }, { TIFFTAG_FILLORDER, 1, TIFF_SHORT }, { TIFFTAG_ROWSPERSTRIP, 1, TIFF_LONG }, { TIFFTAG_GROUP3OPTIONS, 1, TIFF_LONG }, { TIFFTAG_SUBFILETYPE, 1, TIFF_LONG }, { TIFFTAG_THRESHHOLDING, 1, TIFF_SHORT }, { TIFFTAG_DOCUMENTNAME, 1, TIFF_ASCII }, { TIFFTAG_IMAGEDESCRIPTION, 1, TIFF_ASCII }, { TIFFTAG_MAKE, 1, TIFF_ASCII }, { TIFFTAG_MODEL, 1, TIFF_ASCII }, { TIFFTAG_ORIENTATION, 1, TIFF_SHORT }, { TIFFTAG_MINSAMPLEVALUE, 1, TIFF_SHORT }, { TIFFTAG_MAXSAMPLEVALUE, 1, TIFF_SHORT }, { TIFFTAG_XRESOLUTION, 1, TIFF_RATIONAL }, { TIFFTAG_YRESOLUTION, 1, TIFF_RATIONAL }, { TIFFTAG_PAGENAME, 1, TIFF_ASCII }, { TIFFTAG_XPOSITION, 1, TIFF_RATIONAL }, { TIFFTAG_YPOSITION, 1, TIFF_RATIONAL }, { TIFFTAG_GROUP4OPTIONS, 1, TIFF_LONG }, { TIFFTAG_RESOLUTIONUNIT, 1, TIFF_SHORT }, { TIFFTAG_PAGENUMBER, 2, TIFF_SHORT }, { TIFFTAG_SOFTWARE, 1, TIFF_ASCII }, { TIFFTAG_DATETIME, 1, TIFF_ASCII }, { TIFFTAG_ARTIST, 1, TIFF_ASCII }, { TIFFTAG_HOSTCOMPUTER, 1, TIFF_ASCII }, { TIFFTAG_WHITEPOINT, 2, TIFF_RATIONAL }, { TIFFTAG_PRIMARYCHROMATICITIES, (uint16) -1,TIFF_RATIONAL }, { TIFFTAG_HALFTONEHINTS, 2, TIFF_SHORT }, { TIFFTAG_BADFAXLINES, 1, TIFF_LONG }, { TIFFTAG_CLEANFAXDATA, 1, TIFF_SHORT }, { TIFFTAG_CONSECUTIVEBADFAXLINES, 1, TIFF_LONG }, { TIFFTAG_INKSET, 1, TIFF_SHORT }, { TIFFTAG_INKNAMES, 1, TIFF_ASCII }, { TIFFTAG_DOTRANGE, 2, TIFF_SHORT }, { TIFFTAG_TARGETPRINTER, 1, TIFF_ASCII }, { TIFFTAG_SAMPLEFORMAT, 1, TIFF_SHORT }, { TIFFTAG_YCBCRCOEFFICIENTS, (uint16) -1,TIFF_RATIONAL }, { TIFFTAG_YCBCRSUBSAMPLING, 2, TIFF_SHORT }, { TIFFTAG_YCBCRPOSITIONING, 1, TIFF_SHORT }, { TIFFTAG_REFERENCEBLACKWHITE, (uint16) -1,TIFF_RATIONAL }, }; #define NTAGS (sizeof (tags) / sizeof (tags[0])) static void cpTags(TIFF* in, TIFF* out) { struct cpTag *p; for (p = tags; p < &tags[NTAGS]; p++) cpTag(in, out, p->tag, p->count, p->type); } #undef NTAGS char* stuff[] = { "usage: pal2rgb [options] input.tif output.tif", "where options are:", " -p contig pack samples contiguously (e.g. RGBRGB...)", " -p separate store samples separately (e.g. RRR...GGG...BBB...)", " -r # make each strip have no more than # rows", " -C 8 assume 8-bit colormap values (instead of 16-bit)", " -C 16 assume 16-bit colormap values", "", " -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", " -c zip[:opts] compress output with deflate encoding", " -c packbits compress output with packbits encoding", " -c none use no compression algorithm on output", "", "LZW and deflate options:", " # set predictor value", "For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", NULL }; static void usage(void) { char buf[BUFSIZ]; int i; setbuf(stderr, buf); fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i = 0; stuff[i] != NULL; i++) fprintf(stderr, "%s\n", stuff[i]); exit(-1); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/tools/tiff2pdf.c0000644000212300117540000047062012004130753012403 00000000000000/* $Id: tiff2pdf.c,v 1.69 2012-07-19 15:43:41 tgl Exp $ * * tiff2pdf - converts a TIFF image to a PDF document * * Copyright (c) 2003 Ross Finlayson * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the name of * Ross Finlayson may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Ross Finlayson. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL ROSS FINLAYSON BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tif_config.h" #include #include #include #include #include #include #if HAVE_UNISTD_H # include #endif #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_IO_H # include #endif #ifdef NEED_LIBPORT # include "libport.h" #endif #include "tiffiop.h" #include "tiffio.h" #ifndef HAVE_GETOPT extern int getopt(int, char**, char*); #endif #ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 #endif #ifndef EXIT_FAILURE # define EXIT_FAILURE 1 #endif #define TIFF2PDF_MODULE "tiff2pdf" #define PS_UNIT_SIZE 72.0F /* This type is of PDF color spaces. */ typedef enum { T2P_CS_BILEVEL = 0x01, /* Bilevel, black and white */ T2P_CS_GRAY = 0x02, /* Single channel */ T2P_CS_RGB = 0x04, /* Three channel tristimulus RGB */ T2P_CS_CMYK = 0x08, /* Four channel CMYK print inkset */ T2P_CS_LAB = 0x10, /* Three channel L*a*b* color space */ T2P_CS_PALETTE = 0x1000,/* One of the above with a color map */ T2P_CS_CALGRAY = 0x20, /* Calibrated single channel */ T2P_CS_CALRGB = 0x40, /* Calibrated three channel tristimulus RGB */ T2P_CS_ICCBASED = 0x80 /* ICC profile color specification */ } t2p_cs_t; /* This type is of PDF compression types. */ typedef enum{ T2P_COMPRESS_NONE=0x00 #ifdef CCITT_SUPPORT , T2P_COMPRESS_G4=0x01 #endif #if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT) , T2P_COMPRESS_JPEG=0x02 #endif #ifdef ZIP_SUPPORT , T2P_COMPRESS_ZIP=0x04 #endif } t2p_compress_t; /* This type is whether TIFF image data can be used in PDF without transcoding. */ typedef enum{ T2P_TRANSCODE_RAW=0x01, /* The raw data from the input can be used without recompressing */ T2P_TRANSCODE_ENCODE=0x02 /* The data from the input is perhaps unencoded and reencoded */ } t2p_transcode_t; /* This type is of information about the data samples of the input image. */ typedef enum{ T2P_SAMPLE_NOTHING=0x0000, /* The unencoded samples are normal for the output colorspace */ T2P_SAMPLE_ABGR_TO_RGB=0x0001, /* The unencoded samples are the result of ReadRGBAImage */ T2P_SAMPLE_RGBA_TO_RGB=0x0002, /* The unencoded samples are contiguous RGBA */ T2P_SAMPLE_RGBAA_TO_RGB=0x0004, /* The unencoded samples are RGBA with premultiplied alpha */ T2P_SAMPLE_YCBCR_TO_RGB=0x0008, T2P_SAMPLE_YCBCR_TO_LAB=0x0010, T2P_SAMPLE_REALIZE_PALETTE=0x0020, /* The unencoded samples are indexes into the color map */ T2P_SAMPLE_SIGNED_TO_UNSIGNED=0x0040, /* The unencoded samples are signed instead of unsignd */ T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED=0x0040, /* The L*a*b* samples have a* and b* signed */ T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG=0x0100 /* The unencoded samples are separate instead of contiguous */ } t2p_sample_t; /* This type is of error status of the T2P struct. */ typedef enum{ T2P_ERR_OK = 0, /* This is the value of t2p->t2p_error when there is no error */ T2P_ERR_ERROR = 1 /* This is the value of t2p->t2p_error when there was an error */ } t2p_err_t; /* This struct defines a logical page of a TIFF. */ typedef struct { tdir_t page_directory; uint32 page_number; ttile_t page_tilecount; uint32 page_extra; } T2P_PAGE; /* This struct defines a PDF rectangle's coordinates. */ typedef struct { float x1; float y1; float x2; float y2; float mat[9]; } T2P_BOX; /* This struct defines a tile of a PDF. */ typedef struct { T2P_BOX tile_box; } T2P_TILE; /* This struct defines information about the tiles on a PDF page. */ typedef struct { ttile_t tiles_tilecount; uint32 tiles_tilewidth; uint32 tiles_tilelength; uint32 tiles_tilecountx; uint32 tiles_tilecounty; uint32 tiles_edgetilewidth; uint32 tiles_edgetilelength; T2P_TILE* tiles_tiles; } T2P_TILES; /* This struct is the context of a function to generate PDF from a TIFF. */ typedef struct { t2p_err_t t2p_error; T2P_PAGE* tiff_pages; T2P_TILES* tiff_tiles; tdir_t tiff_pagecount; uint16 tiff_compression; uint16 tiff_photometric; uint16 tiff_fillorder; uint16 tiff_bitspersample; uint16 tiff_samplesperpixel; uint16 tiff_planar; uint32 tiff_width; uint32 tiff_length; float tiff_xres; float tiff_yres; uint16 tiff_orientation; toff_t tiff_dataoffset; tsize_t tiff_datasize; uint16 tiff_resunit; uint16 pdf_centimeters; uint16 pdf_overrideres; uint16 pdf_overridepagesize; float pdf_defaultxres; float pdf_defaultyres; float pdf_xres; float pdf_yres; float pdf_defaultpagewidth; float pdf_defaultpagelength; float pdf_pagewidth; float pdf_pagelength; float pdf_imagewidth; float pdf_imagelength; int pdf_image_fillpage; /* 0 (default: no scaling, 1:scale imagesize to pagesize */ T2P_BOX pdf_mediabox; T2P_BOX pdf_imagebox; uint16 pdf_majorversion; uint16 pdf_minorversion; uint32 pdf_catalog; uint32 pdf_pages; uint32 pdf_info; uint32 pdf_palettecs; uint16 pdf_fitwindow; uint32 pdf_startxref; #define TIFF2PDF_FILEID_SIZE 33 char pdf_fileid[TIFF2PDF_FILEID_SIZE]; #define TIFF2PDF_DATETIME_SIZE 17 char pdf_datetime[TIFF2PDF_DATETIME_SIZE]; #define TIFF2PDF_CREATOR_SIZE 512 char pdf_creator[TIFF2PDF_CREATOR_SIZE]; #define TIFF2PDF_AUTHOR_SIZE 512 char pdf_author[TIFF2PDF_AUTHOR_SIZE]; #define TIFF2PDF_TITLE_SIZE 512 char pdf_title[TIFF2PDF_TITLE_SIZE]; #define TIFF2PDF_SUBJECT_SIZE 512 char pdf_subject[TIFF2PDF_SUBJECT_SIZE]; #define TIFF2PDF_KEYWORDS_SIZE 512 char pdf_keywords[TIFF2PDF_KEYWORDS_SIZE]; t2p_cs_t pdf_colorspace; uint16 pdf_colorspace_invert; uint16 pdf_switchdecode; uint16 pdf_palettesize; unsigned char* pdf_palette; int pdf_labrange[4]; t2p_compress_t pdf_defaultcompression; uint16 pdf_defaultcompressionquality; t2p_compress_t pdf_compression; uint16 pdf_compressionquality; uint16 pdf_nopassthrough; t2p_transcode_t pdf_transcode; t2p_sample_t pdf_sample; uint32* pdf_xrefoffsets; uint32 pdf_xrefcount; tdir_t pdf_page; #ifdef OJPEG_SUPPORT tdata_t pdf_ojpegdata; uint32 pdf_ojpegdatalength; uint32 pdf_ojpegiflength; #endif float tiff_whitechromaticities[2]; float tiff_primarychromaticities[6]; float tiff_referenceblackwhite[2]; float* tiff_transferfunction[3]; int pdf_image_interpolate; /* 0 (default) : do not interpolate, 1 : interpolate */ uint16 tiff_transferfunctioncount; uint32 pdf_icccs; uint32 tiff_iccprofilelength; tdata_t tiff_iccprofile; /* fields for custom read/write procedures */ FILE *outputfile; int outputdisable; tsize_t outputwritten; } T2P; /* These functions are called by main. */ void tiff2pdf_usage(void); int tiff2pdf_match_paper_size(float*, float*, char*); /* These functions are used to generate a PDF from a TIFF. */ #ifdef __cplusplus extern "C" { #endif T2P* t2p_init(void); void t2p_validate(T2P*); tsize_t t2p_write_pdf(T2P*, TIFF*, TIFF*); void t2p_free(T2P*); #ifdef __cplusplus } #endif void t2p_read_tiff_init(T2P*, TIFF*); int t2p_cmp_t2p_page(const void*, const void*); void t2p_read_tiff_data(T2P*, TIFF*); void t2p_read_tiff_size(T2P*, TIFF*); void t2p_read_tiff_size_tile(T2P*, TIFF*, ttile_t); int t2p_tile_is_right_edge(T2P_TILES, ttile_t); int t2p_tile_is_bottom_edge(T2P_TILES, ttile_t); int t2p_tile_is_edge(T2P_TILES, ttile_t); int t2p_tile_is_corner_edge(T2P_TILES, ttile_t); tsize_t t2p_readwrite_pdf_image(T2P*, TIFF*, TIFF*); tsize_t t2p_readwrite_pdf_image_tile(T2P*, TIFF*, TIFF*, ttile_t); #ifdef OJPEG_SUPPORT int t2p_process_ojpeg_tables(T2P*, TIFF*); #endif #ifdef JPEG_SUPPORT int t2p_process_jpeg_strip(unsigned char*, tsize_t*, unsigned char*, tsize_t*, tstrip_t, uint32); #endif void t2p_tile_collapse_left(tdata_t, tsize_t, uint32, uint32, uint32); void t2p_write_advance_directory(T2P*, TIFF*); tsize_t t2p_sample_planar_separate_to_contig(T2P*, unsigned char*, unsigned char*, tsize_t); tsize_t t2p_sample_realize_palette(T2P*, unsigned char*); tsize_t t2p_sample_abgr_to_rgb(tdata_t, uint32); tsize_t t2p_sample_rgba_to_rgb(tdata_t, uint32); tsize_t t2p_sample_rgbaa_to_rgb(tdata_t, uint32); tsize_t t2p_sample_lab_signed_to_unsigned(tdata_t, uint32); tsize_t t2p_write_pdf_header(T2P*, TIFF*); tsize_t t2p_write_pdf_obj_start(uint32, TIFF*); tsize_t t2p_write_pdf_obj_end(TIFF*); tsize_t t2p_write_pdf_name(unsigned char*, TIFF*); tsize_t t2p_write_pdf_string(char*, TIFF*); tsize_t t2p_write_pdf_stream(tdata_t, tsize_t, TIFF*); tsize_t t2p_write_pdf_stream_start(TIFF*); tsize_t t2p_write_pdf_stream_end(TIFF*); tsize_t t2p_write_pdf_stream_dict(tsize_t, uint32, TIFF*); tsize_t t2p_write_pdf_stream_dict_start(TIFF*); tsize_t t2p_write_pdf_stream_dict_end(TIFF*); tsize_t t2p_write_pdf_stream_length(tsize_t, TIFF*); tsize_t t2p_write_pdf_catalog(T2P*, TIFF*); tsize_t t2p_write_pdf_info(T2P*, TIFF*, TIFF*); void t2p_pdf_currenttime(T2P*); void t2p_pdf_tifftime(T2P*, TIFF*); tsize_t t2p_write_pdf_pages(T2P*, TIFF*); tsize_t t2p_write_pdf_page(uint32, T2P*, TIFF*); void t2p_compose_pdf_page(T2P*); void t2p_compose_pdf_page_orient(T2P_BOX*, uint16); void t2p_compose_pdf_page_orient_flip(T2P_BOX*, uint16); tsize_t t2p_write_pdf_page_content(T2P*, TIFF*); tsize_t t2p_write_pdf_xobject_stream_dict(ttile_t, T2P*, TIFF*); tsize_t t2p_write_pdf_xobject_cs(T2P*, TIFF*); tsize_t t2p_write_pdf_transfer(T2P*, TIFF*); tsize_t t2p_write_pdf_transfer_dict(T2P*, TIFF*, uint16); tsize_t t2p_write_pdf_transfer_stream(T2P*, TIFF*, uint16); tsize_t t2p_write_pdf_xobject_calcs(T2P*, TIFF*); tsize_t t2p_write_pdf_xobject_icccs(T2P*, TIFF*); tsize_t t2p_write_pdf_xobject_icccs_dict(T2P*, TIFF*); tsize_t t2p_write_pdf_xobject_icccs_stream(T2P*, TIFF*); tsize_t t2p_write_pdf_xobject_cs_stream(T2P*, TIFF*); tsize_t t2p_write_pdf_xobject_decode(T2P*, TIFF*); tsize_t t2p_write_pdf_xobject_stream_filter(ttile_t, T2P*, TIFF*); tsize_t t2p_write_pdf_xreftable(T2P*, TIFF*); tsize_t t2p_write_pdf_trailer(T2P*, TIFF*); static void t2p_disable(TIFF *tif) { T2P *t2p = (T2P*) TIFFClientdata(tif); t2p->outputdisable = 1; } static void t2p_enable(TIFF *tif) { T2P *t2p = (T2P*) TIFFClientdata(tif); t2p->outputdisable = 0; } /* * Procs for TIFFClientOpen */ static tmsize_t t2pReadFile(TIFF *tif, tdata_t data, tmsize_t size) { thandle_t client = TIFFClientdata(tif); TIFFReadWriteProc proc = TIFFGetReadProc(tif); if (proc) return proc(client, data, size); return -1; } static tmsize_t t2pWriteFile(TIFF *tif, tdata_t data, tmsize_t size) { thandle_t client = TIFFClientdata(tif); TIFFReadWriteProc proc = TIFFGetWriteProc(tif); if (proc) return proc(client, data, size); return -1; } static uint64 t2pSeekFile(TIFF *tif, toff_t offset, int whence) { thandle_t client = TIFFClientdata(tif); TIFFSeekProc proc = TIFFGetSeekProc(tif); if (proc) return proc(client, offset, whence); return -1; } static tmsize_t t2p_readproc(thandle_t handle, tdata_t data, tmsize_t size) { (void) handle, (void) data, (void) size; return -1; } static tmsize_t t2p_writeproc(thandle_t handle, tdata_t data, tmsize_t size) { T2P *t2p = (T2P*) handle; if (t2p->outputdisable <= 0 && t2p->outputfile) { tsize_t written = fwrite(data, 1, size, t2p->outputfile); t2p->outputwritten += written; return written; } return size; } static uint64 t2p_seekproc(thandle_t handle, uint64 offset, int whence) { T2P *t2p = (T2P*) handle; if (t2p->outputdisable <= 0 && t2p->outputfile) return fseek(t2p->outputfile, (long) offset, whence); return offset; } static int t2p_closeproc(thandle_t handle) { (void) handle; return 0; } static uint64 t2p_sizeproc(thandle_t handle) { (void) handle; return -1; } static int t2p_mapproc(thandle_t handle, void **data, toff_t *offset) { (void) handle, (void) data, (void) offset; return -1; } static void t2p_unmapproc(thandle_t handle, void *data, toff_t offset) { (void) handle, (void) data, (void) offset; } static uint64 checkAdd64(uint64 summand1, uint64 summand2, T2P* t2p) { uint64 bytes = summand1 + summand2; if (bytes - summand1 != summand2) { TIFFError(TIFF2PDF_MODULE, "Integer overflow"); t2p->t2p_error = T2P_ERR_ERROR; bytes = 0; } return bytes; } static uint64 checkMultiply64(uint64 first, uint64 second, T2P* t2p) { uint64 bytes = first * second; if (second && bytes / second != first) { TIFFError(TIFF2PDF_MODULE, "Integer overflow"); t2p->t2p_error = T2P_ERR_ERROR; bytes = 0; } return bytes; } /* This is the main function. The program converts one TIFF file to one PDF file, including multiple page TIFF files, tiled TIFF files, black and white. grayscale, and color TIFF files that contain data of TIFF photometric interpretations of bilevel, grayscale, RGB, YCbCr, CMYK separation, and ICC L*a*b* as supported by libtiff and PDF. If you have multiple TIFF files to convert into one PDF file then use tiffcp or other program to concatenate the files into a multiple page TIFF file. If the input TIFF file is of huge dimensions (greater than 10000 pixels height or width) convert the input image to a tiled TIFF if it is not already. The standard output is standard output. Set the output file name with the "-o output.pdf" option. All black and white files are compressed into a single strip CCITT G4 Fax compressed PDF, unless tiled, where tiled black and white images are compressed into tiled CCITT G4 Fax compressed PDF, libtiff CCITT support is assumed. Color and grayscale data can be compressed using either JPEG compression, ITU-T T.81, or Zip/Deflate LZ77 compression, per PNG 1.2 and RFC 1951. Set the compression type using the -j or -z options. JPEG compression support requires that libtiff be configured with JPEG support, and Zip/Deflate compression support requires that libtiff is configured with Zip support, in tiffconf.h. Use only one or the other of -j and -z. The -q option sets the image compression quality, that is 1-100 with libjpeg JPEG compression and one of 1, 10, 11, 12, 13, 14, or 15 for PNG group compression predictor methods, add 100, 200, ..., 900 to set zlib compression quality 1-9. PNG Group differencing predictor methods are not currently implemented. If the input TIFF contains single strip CCITT G4 Fax compressed information, then that is written to the PDF file without transcoding, unless the options of no compression and no passthrough are set, -d and -n. If the input TIFF contains JPEG or single strip Zip/Deflate compressed information, and they are configured, then that is written to the PDF file without transcoding, unless the options of no compression and no passthrough are set. The default page size upon which the TIFF image is placed is determined by the resolution and extent of the image data. Default values for the TIFF image resolution can be set using the -x and -y options. The page size can be set using the -p option for paper size, or -w and -l for paper width and length, then each page of the TIFF image is centered on its page. The distance unit for default resolution and page width and length can be set by the -u option, the default unit is inch. Various items of the output document information can be set with the -e, -c, -a, -t, -s, and -k tags. Setting the argument of the option to "" for these tags causes the relevant document information field to be not written. Some of the document information values otherwise get their information from the input TIFF image, the software, author, document name, and image description. The output PDF file conforms to the PDF 1.1 specification or PDF 1.2 if using Zip/Deflate compression. The Portable Document Format (PDF) specification is copyrighted by Adobe Systems, Incorporated. Todos derechos reservados. Here is a listing of the usage example and the options to the tiff2pdf program that is part of the libtiff distribution. Options followed by a colon have a required argument. usage: tiff2pdf [options] input.tif options: -o: output to file name -j: compress with JPEG (requires libjpeg configured with libtiff) -z: compress with Zip/Deflate (requires zlib configured with libtiff) -q: compression quality -n: no compressed data passthrough -d: do not compress (decompress) -i: invert colors -u: set distance unit, 'i' for inch, 'm' for centimeter -x: set x resolution default -y: set y resolution default -w: width in units -l: length in units -r: 'd' for resolution default, 'o' for resolution override -p: paper size, eg "letter", "legal", "a4" -F: make the tiff fill the PDF page -f: set pdf "fit window" user preference -b: set PDF "Interpolate" user preference -e: date, overrides image or current date/time default, YYYYMMDDHHMMSS -c: creator, overrides image software default -a: author, overrides image artist default -t: title, overrides image document name default -s: subject, overrides image image description default -k: keywords -h: usage examples: tiff2pdf -o output.pdf input.tiff The above example would generate the file output.pdf from input.tiff. tiff2pdf input.tiff The above example would generate PDF output from input.tiff and write it to standard output. tiff2pdf -j -p letter -o output.pdf input.tiff The above example would generate the file output.pdf from input.tiff, putting the image pages on a letter sized page, compressing the output with JPEG. Please report bugs through: http://bugzilla.remotesensing.org/buglist.cgi?product=libtiff See also libtiff.3t, tiffcp. */ int main(int argc, char** argv){ extern char *optarg; extern int optind; const char *outfilename = NULL; T2P *t2p = NULL; TIFF *input = NULL, *output = NULL; int c, ret = EXIT_SUCCESS; t2p = t2p_init(); if (t2p == NULL){ TIFFError(TIFF2PDF_MODULE, "Can't initialize context"); goto fail; } while (argv && (c = getopt(argc, argv, "o:q:u:x:y:w:l:r:p:e:c:a:t:s:k:jzndifbhF")) != -1){ switch (c) { case 'o': outfilename = optarg; break; #ifdef JPEG_SUPPORT case 'j': t2p->pdf_defaultcompression=T2P_COMPRESS_JPEG; break; #endif #ifndef JPEG_SUPPORT case 'j': TIFFWarning( TIFF2PDF_MODULE, "JPEG support in libtiff required for JPEG compression, ignoring option"); break; #endif #ifdef ZIP_SUPPORT case 'z': t2p->pdf_defaultcompression=T2P_COMPRESS_ZIP; break; #endif #ifndef ZIP_SUPPORT case 'z': TIFFWarning( TIFF2PDF_MODULE, "Zip support in libtiff required for Zip compression, ignoring option"); break; #endif case 'q': t2p->pdf_defaultcompressionquality=atoi(optarg); break; case 'n': t2p->pdf_nopassthrough=1; break; case 'd': t2p->pdf_defaultcompression=T2P_COMPRESS_NONE; break; case 'u': if(optarg[0]=='m'){ t2p->pdf_centimeters=1; } break; case 'x': t2p->pdf_defaultxres = (float)atof(optarg) / (t2p->pdf_centimeters?2.54F:1.0F); break; case 'y': t2p->pdf_defaultyres = (float)atof(optarg) / (t2p->pdf_centimeters?2.54F:1.0F); break; case 'w': t2p->pdf_overridepagesize=1; t2p->pdf_defaultpagewidth = ((float)atof(optarg) * PS_UNIT_SIZE) / (t2p->pdf_centimeters?2.54F:1.0F); break; case 'l': t2p->pdf_overridepagesize=1; t2p->pdf_defaultpagelength = ((float)atof(optarg) * PS_UNIT_SIZE) / (t2p->pdf_centimeters?2.54F:1.0F); break; case 'r': if(optarg[0]=='o'){ t2p->pdf_overrideres=1; } break; case 'p': if(tiff2pdf_match_paper_size( &(t2p->pdf_defaultpagewidth), &(t2p->pdf_defaultpagelength), optarg)){ t2p->pdf_overridepagesize=1; } else { TIFFWarning(TIFF2PDF_MODULE, "Unknown paper size %s, ignoring option", optarg); } break; case 'i': t2p->pdf_colorspace_invert=1; break; case 'F': t2p->pdf_image_fillpage = 1; break; case 'f': t2p->pdf_fitwindow=1; break; case 'e': if (strlen(optarg) == 0) { t2p->pdf_datetime[0] = '\0'; } else { t2p->pdf_datetime[0] = 'D'; t2p->pdf_datetime[1] = ':'; strncpy(t2p->pdf_datetime + 2, optarg, sizeof(t2p->pdf_datetime) - 3); t2p->pdf_datetime[sizeof(t2p->pdf_datetime) - 1] = '\0'; } break; case 'c': strncpy(t2p->pdf_creator, optarg, sizeof(t2p->pdf_creator) - 1); t2p->pdf_creator[sizeof(t2p->pdf_creator) - 1] = '\0'; break; case 'a': strncpy(t2p->pdf_author, optarg, sizeof(t2p->pdf_author) - 1); t2p->pdf_author[sizeof(t2p->pdf_author) - 1] = '\0'; break; case 't': strncpy(t2p->pdf_title, optarg, sizeof(t2p->pdf_title) - 1); t2p->pdf_title[sizeof(t2p->pdf_title) - 1] = '\0'; break; case 's': strncpy(t2p->pdf_subject, optarg, sizeof(t2p->pdf_subject) - 1); t2p->pdf_subject[sizeof(t2p->pdf_subject) - 1] = '\0'; break; case 'k': strncpy(t2p->pdf_keywords, optarg, sizeof(t2p->pdf_keywords) - 1); t2p->pdf_keywords[sizeof(t2p->pdf_keywords) - 1] = '\0'; break; case 'b': t2p->pdf_image_interpolate = 1; break; case 'h': case '?': tiff2pdf_usage(); goto success; break; } } /* * Input */ if(argc > optind) { input = TIFFOpen(argv[optind++], "r"); if (input==NULL) { TIFFError(TIFF2PDF_MODULE, "Can't open input file %s for reading", argv[optind-1]); goto fail; } } else { TIFFError(TIFF2PDF_MODULE, "No input file specified"); tiff2pdf_usage(); goto fail; } if(argc > optind) { TIFFError(TIFF2PDF_MODULE, "No support for multiple input files"); tiff2pdf_usage(); goto fail; } /* * Output */ t2p->outputdisable = 0; if (outfilename) { t2p->outputfile = fopen(outfilename, "wb"); if (t2p->outputfile == NULL) { TIFFError(TIFF2PDF_MODULE, "Can't open output file %s for writing", outfilename); goto fail; } } else { outfilename = "-"; t2p->outputfile = stdout; } output = TIFFClientOpen(outfilename, "w", (thandle_t) t2p, t2p_readproc, t2p_writeproc, t2p_seekproc, t2p_closeproc, t2p_sizeproc, t2p_mapproc, t2p_unmapproc); if (output == NULL) { TIFFError(TIFF2PDF_MODULE, "Can't initialize output descriptor"); goto fail; } /* * Validate */ t2p_validate(t2p); t2pSeekFile(output, (toff_t) 0, SEEK_SET); /* * Write */ t2p_write_pdf(t2p, input, output); if (t2p->t2p_error != 0) { TIFFError(TIFF2PDF_MODULE, "An error occurred creating output PDF file"); goto fail; } goto success; fail: ret = EXIT_FAILURE; success: if(input != NULL) TIFFClose(input); if (output != NULL) TIFFClose(output); if (t2p != NULL) t2p_free(t2p); return ret; } void tiff2pdf_usage(){ char* lines[]={ "usage: tiff2pdf [options] input.tiff", "options:", " -o: output to file name", #ifdef JPEG_SUPPORT " -j: compress with JPEG", #endif #ifdef ZIP_SUPPORT " -z: compress with Zip/Deflate", #endif " -q: compression quality", " -n: no compressed data passthrough", " -d: do not compress (decompress)", " -i: invert colors", " -u: set distance unit, 'i' for inch, 'm' for centimeter", " -x: set x resolution default in dots per unit", " -y: set y resolution default in dots per unit", " -w: width in units", " -l: length in units", " -r: 'd' for resolution default, 'o' for resolution override", " -p: paper size, eg \"letter\", \"legal\", \"A4\"", " -F: make the tiff fill the PDF page", " -f: set PDF \"Fit Window\" user preference", " -e: date, overrides image or current date/time default, YYYYMMDDHHMMSS", " -c: sets document creator, overrides image software default", " -a: sets document author, overrides image artist default", " -t: sets document title, overrides image document name default", " -s: sets document subject, overrides image image description default", " -k: sets document keywords", " -b: set PDF \"Interpolate\" user preference", " -h: usage", NULL }; int i=0; fprintf(stderr, "%s\n\n", TIFFGetVersion()); for (i=0;lines[i]!=NULL;i++){ fprintf(stderr, "%s\n", lines[i]); } return; } int tiff2pdf_match_paper_size(float* width, float* length, char* papersize){ size_t i, len; const char* sizes[]={ "LETTER", "A4", "LEGAL", "EXECUTIVE", "LETTER", "LEGAL", "LEDGER", "TABLOID", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "A10", "A9", "A8", "A7", "A6", "A5", "A4", "A3", "A2", "A1", "A0", "2A0", "4A0", "2A", "4A", "B10", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "B2", "B1", "B0", "JISB10", "JISB9", "JISB8", "JISB7", "JISB6", "JISB5", "JISB4", "JISB3", "JISB2", "JISB1", "JISB0", "C10", "C9", "C8", "C7", "C6", "C5", "C4", "C3", "C2", "C1", "C0", "RA2", "RA1", "RA0", "SRA4", "SRA3", "SRA2", "SRA1", "SRA0", "A3EXTRA", "A4EXTRA", "STATEMENT", "FOLIO", "QUARTO", NULL } ; const int widths[]={ 612, 595, 612, 522, 612,612,792,792, 612,792,1224,1584,2448,2016,792,2016,2448,2880, 74,105,147,210,298,420,595,842,1191,1684,2384,3370,4768,3370,4768, 88,125,176,249,354,499,709,1001,1417,2004,2835, 91,128,181,258,363,516,729,1032,1460,2064,2920, 79,113,162,230,323,459,649,918,1298,1298,2599, 1219,1729,2438,638,907,1276,1814,2551, 914,667, 396, 612, 609, 0 }; const int lengths[]={ 792,842,1008, 756,792,1008,1224,1224, 792,1224,1584,2448,3168,2880,6480,10296,12672,10296, 105,147,210,298,420,595,842,1191,1684,2384,3370,4768,6741,4768,6741, 125,176,249,354,499,709,1001,1417,2004,2835,4008, 128,181,258,363,516,729,1032,1460,2064,2920,4127, 113,162,230,323,459,649,918,1298,1837,1837,3677, 1729,2438,3458,907,1276,1814,2551,3628, 1262,914, 612, 936, 780, 0 }; len=strlen(papersize); for(i=0;ipdf_majorversion=1; t2p->pdf_minorversion=1; t2p->pdf_defaultxres=300.0; t2p->pdf_defaultyres=300.0; t2p->pdf_defaultpagewidth=612.0; t2p->pdf_defaultpagelength=792.0; t2p->pdf_xrefcount=3; /* Catalog, Info, Pages */ return(t2p); } /* * This function frees a T2P context struct pointer and any allocated data fields of it. */ void t2p_free(T2P* t2p) { int i = 0; if (t2p != NULL) { if(t2p->pdf_xrefoffsets != NULL){ _TIFFfree( (tdata_t) t2p->pdf_xrefoffsets); } if(t2p->tiff_pages != NULL){ _TIFFfree( (tdata_t) t2p->tiff_pages); } for(i=0;itiff_pagecount;i++){ if(t2p->tiff_tiles[i].tiles_tiles != NULL){ _TIFFfree( (tdata_t) t2p->tiff_tiles[i].tiles_tiles); } } if(t2p->tiff_tiles != NULL){ _TIFFfree( (tdata_t) t2p->tiff_tiles); } if(t2p->pdf_palette != NULL){ _TIFFfree( (tdata_t) t2p->pdf_palette); } #ifdef OJPEG_SUPPORT if(t2p->pdf_ojpegdata != NULL){ _TIFFfree( (tdata_t) t2p->pdf_ojpegdata); } #endif _TIFFfree( (tdata_t) t2p ); } return; } /* This function validates the values of a T2P context struct pointer before calling t2p_write_pdf with it. */ void t2p_validate(T2P* t2p){ #ifdef JPEG_SUPPORT if(t2p->pdf_defaultcompression==T2P_COMPRESS_JPEG){ if(t2p->pdf_defaultcompressionquality>100 || t2p->pdf_defaultcompressionquality<1){ t2p->pdf_defaultcompressionquality=0; } } #endif #ifdef ZIP_SUPPORT if(t2p->pdf_defaultcompression==T2P_COMPRESS_ZIP){ uint16 m=t2p->pdf_defaultcompressionquality%100; if(t2p->pdf_defaultcompressionquality/100 > 9 || (m>1 && m<10) || m>15){ t2p->pdf_defaultcompressionquality=0; } if(t2p->pdf_defaultcompressionquality%100 !=0){ t2p->pdf_defaultcompressionquality/=100; t2p->pdf_defaultcompressionquality*=100; TIFFError( TIFF2PDF_MODULE, "PNG Group predictor differencing not implemented, assuming compression quality %u", t2p->pdf_defaultcompressionquality); } t2p->pdf_defaultcompressionquality%=100; if(t2p->pdf_minorversion<2){t2p->pdf_minorversion=2;} } #endif (void)0; return; } /* This function scans the input TIFF file for pages. It attempts to determine which IFD's of the TIFF file contain image document pages. For each, it gathers some information that has to do with the output of the PDF document as a whole. */ void t2p_read_tiff_init(T2P* t2p, TIFF* input){ tdir_t directorycount=0; tdir_t i=0; uint16 pagen=0; uint16 paged=0; uint16 xuint16=0; directorycount=TIFFNumberOfDirectories(input); t2p->tiff_pages = (T2P_PAGE*) _TIFFmalloc(directorycount * sizeof(T2P_PAGE)); if(t2p->tiff_pages==NULL){ TIFFError( TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for tiff_pages array, %s", (unsigned long) directorycount * sizeof(T2P_PAGE), TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; } _TIFFmemset( t2p->tiff_pages, 0x00, directorycount * sizeof(T2P_PAGE)); t2p->tiff_tiles = (T2P_TILES*) _TIFFmalloc(directorycount * sizeof(T2P_TILES)); if(t2p->tiff_tiles==NULL){ TIFFError( TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for tiff_tiles array, %s", (unsigned long) directorycount * sizeof(T2P_TILES), TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; } _TIFFmemset( t2p->tiff_tiles, 0x00, directorycount * sizeof(T2P_TILES)); for(i=0;it2p_error = T2P_ERR_ERROR; return; } if(TIFFGetField(input, TIFFTAG_PAGENUMBER, &pagen, &paged)){ if((pagen>paged) && (paged != 0)){ t2p->tiff_pages[t2p->tiff_pagecount].page_number = paged; } else { t2p->tiff_pages[t2p->tiff_pagecount].page_number = pagen; } goto ispage2; } if(TIFFGetField(input, TIFFTAG_SUBFILETYPE, &subfiletype)){ if ( ((subfiletype & FILETYPE_PAGE) != 0) || (subfiletype == 0)){ goto ispage; } else { goto isnotpage; } } if(TIFFGetField(input, TIFFTAG_OSUBFILETYPE, &subfiletype)){ if ((subfiletype == OFILETYPE_IMAGE) || (subfiletype == OFILETYPE_PAGE) || (subfiletype == 0) ){ goto ispage; } else { goto isnotpage; } } ispage: t2p->tiff_pages[t2p->tiff_pagecount].page_number=t2p->tiff_pagecount; ispage2: t2p->tiff_pages[t2p->tiff_pagecount].page_directory=i; if(TIFFIsTiled(input)){ t2p->tiff_pages[t2p->tiff_pagecount].page_tilecount = TIFFNumberOfTiles(input); } t2p->tiff_pagecount++; isnotpage: (void)0; } qsort((void*) t2p->tiff_pages, t2p->tiff_pagecount, sizeof(T2P_PAGE), t2p_cmp_t2p_page); for(i=0;itiff_pagecount;i++){ t2p->pdf_xrefcount += 5; TIFFSetDirectory(input, t2p->tiff_pages[i].page_directory ); if((TIFFGetField(input, TIFFTAG_PHOTOMETRIC, &xuint16) && (xuint16==PHOTOMETRIC_PALETTE)) || TIFFGetField(input, TIFFTAG_INDEXED, &xuint16)) { t2p->tiff_pages[i].page_extra++; t2p->pdf_xrefcount++; } #ifdef ZIP_SUPPORT if (TIFFGetField(input, TIFFTAG_COMPRESSION, &xuint16)) { if( (xuint16== COMPRESSION_DEFLATE || xuint16== COMPRESSION_ADOBE_DEFLATE) && ((t2p->tiff_pages[i].page_tilecount != 0) || TIFFNumberOfStrips(input)==1) && (t2p->pdf_nopassthrough==0) ){ if(t2p->pdf_minorversion<2){t2p->pdf_minorversion=2;} } } #endif if (TIFFGetField(input, TIFFTAG_TRANSFERFUNCTION, &(t2p->tiff_transferfunction[0]), &(t2p->tiff_transferfunction[1]), &(t2p->tiff_transferfunction[2]))) { if(t2p->tiff_transferfunction[1] != t2p->tiff_transferfunction[0]) { t2p->tiff_transferfunctioncount = 3; t2p->tiff_pages[i].page_extra += 4; t2p->pdf_xrefcount += 4; } else { t2p->tiff_transferfunctioncount = 1; t2p->tiff_pages[i].page_extra += 2; t2p->pdf_xrefcount += 2; } if(t2p->pdf_minorversion < 2) t2p->pdf_minorversion = 2; } else { t2p->tiff_transferfunctioncount=0; } if( TIFFGetField( input, TIFFTAG_ICCPROFILE, &(t2p->tiff_iccprofilelength), &(t2p->tiff_iccprofile)) != 0){ t2p->tiff_pages[i].page_extra++; t2p->pdf_xrefcount++; if(t2p->pdf_minorversion<3){t2p->pdf_minorversion=3;} } t2p->tiff_tiles[i].tiles_tilecount= t2p->tiff_pages[i].page_tilecount; if( (TIFFGetField(input, TIFFTAG_PLANARCONFIG, &xuint16) != 0) && (xuint16 == PLANARCONFIG_SEPARATE ) ){ TIFFGetField(input, TIFFTAG_SAMPLESPERPIXEL, &xuint16); t2p->tiff_tiles[i].tiles_tilecount/= xuint16; } if( t2p->tiff_tiles[i].tiles_tilecount > 0){ t2p->pdf_xrefcount += (t2p->tiff_tiles[i].tiles_tilecount -1)*2; TIFFGetField(input, TIFFTAG_TILEWIDTH, &( t2p->tiff_tiles[i].tiles_tilewidth) ); TIFFGetField(input, TIFFTAG_TILELENGTH, &( t2p->tiff_tiles[i].tiles_tilelength) ); t2p->tiff_tiles[i].tiles_tiles = (T2P_TILE*) _TIFFmalloc( t2p->tiff_tiles[i].tiles_tilecount * sizeof(T2P_TILE) ); if( t2p->tiff_tiles[i].tiles_tiles == NULL){ TIFFError( TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for t2p_read_tiff_init, %s", (unsigned long) t2p->tiff_tiles[i].tiles_tilecount * sizeof(T2P_TILE), TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; } } } return; } /* * This function is used by qsort to sort a T2P_PAGE* array of page structures * by page number. */ int t2p_cmp_t2p_page(const void* e1, const void* e2){ return( ((T2P_PAGE*)e1)->page_number - ((T2P_PAGE*)e2)->page_number ); } /* This function sets the input directory to the directory of a given page and determines information about the image. It checks the image characteristics to determine if it is possible to convert the image data into a page of PDF output, setting values of the T2P struct for this page. It determines what color space is used in the output PDF to represent the image. It determines if the image can be converted as raw data without requiring transcoding of the image data. */ void t2p_read_tiff_data(T2P* t2p, TIFF* input){ int i=0; uint16* r; uint16* g; uint16* b; uint16* a; uint16 xuint16; uint16* xuint16p; float* xfloatp; t2p->pdf_transcode = T2P_TRANSCODE_ENCODE; t2p->pdf_sample = T2P_SAMPLE_NOTHING; t2p->pdf_switchdecode = t2p->pdf_colorspace_invert; TIFFSetDirectory(input, t2p->tiff_pages[t2p->pdf_page].page_directory); TIFFGetField(input, TIFFTAG_IMAGEWIDTH, &(t2p->tiff_width)); if(t2p->tiff_width == 0){ TIFFError( TIFF2PDF_MODULE, "No support for %s with zero width", TIFFFileName(input) ); t2p->t2p_error = T2P_ERR_ERROR; return; } TIFFGetField(input, TIFFTAG_IMAGELENGTH, &(t2p->tiff_length)); if(t2p->tiff_length == 0){ TIFFError( TIFF2PDF_MODULE, "No support for %s with zero length", TIFFFileName(input) ); t2p->t2p_error = T2P_ERR_ERROR; return; } if(TIFFGetField(input, TIFFTAG_COMPRESSION, &(t2p->tiff_compression)) == 0){ TIFFError( TIFF2PDF_MODULE, "No support for %s with no compression tag", TIFFFileName(input) ); t2p->t2p_error = T2P_ERR_ERROR; return; } if( TIFFIsCODECConfigured(t2p->tiff_compression) == 0){ TIFFError( TIFF2PDF_MODULE, "No support for %s with compression type %u: not configured", TIFFFileName(input), t2p->tiff_compression ); t2p->t2p_error = T2P_ERR_ERROR; return; } TIFFGetFieldDefaulted(input, TIFFTAG_BITSPERSAMPLE, &(t2p->tiff_bitspersample)); switch(t2p->tiff_bitspersample){ case 1: case 2: case 4: case 8: break; case 0: TIFFWarning( TIFF2PDF_MODULE, "Image %s has 0 bits per sample, assuming 1", TIFFFileName(input)); t2p->tiff_bitspersample=1; break; default: TIFFError( TIFF2PDF_MODULE, "No support for %s with %u bits per sample", TIFFFileName(input), t2p->tiff_bitspersample); t2p->t2p_error = T2P_ERR_ERROR; return; } TIFFGetFieldDefaulted(input, TIFFTAG_SAMPLESPERPIXEL, &(t2p->tiff_samplesperpixel)); if(t2p->tiff_samplesperpixel>4){ TIFFError( TIFF2PDF_MODULE, "No support for %s with %u samples per pixel", TIFFFileName(input), t2p->tiff_samplesperpixel); t2p->t2p_error = T2P_ERR_ERROR; return; } if(t2p->tiff_samplesperpixel==0){ TIFFWarning( TIFF2PDF_MODULE, "Image %s has 0 samples per pixel, assuming 1", TIFFFileName(input)); t2p->tiff_samplesperpixel=1; } if(TIFFGetField(input, TIFFTAG_SAMPLEFORMAT, &xuint16) != 0 ){ switch(xuint16){ case 0: case 1: case 4: break; default: TIFFError( TIFF2PDF_MODULE, "No support for %s with sample format %u", TIFFFileName(input), xuint16); t2p->t2p_error = T2P_ERR_ERROR; return; break; } } TIFFGetFieldDefaulted(input, TIFFTAG_FILLORDER, &(t2p->tiff_fillorder)); if(TIFFGetField(input, TIFFTAG_PHOTOMETRIC, &(t2p->tiff_photometric)) == 0){ TIFFError( TIFF2PDF_MODULE, "No support for %s with no photometric interpretation tag", TIFFFileName(input) ); t2p->t2p_error = T2P_ERR_ERROR; return; } switch(t2p->tiff_photometric){ case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: if (t2p->tiff_bitspersample==1){ t2p->pdf_colorspace=T2P_CS_BILEVEL; if(t2p->tiff_photometric==PHOTOMETRIC_MINISWHITE){ t2p->pdf_switchdecode ^= 1; } } else { t2p->pdf_colorspace=T2P_CS_GRAY; if(t2p->tiff_photometric==PHOTOMETRIC_MINISWHITE){ t2p->pdf_switchdecode ^= 1; } } break; case PHOTOMETRIC_RGB: t2p->pdf_colorspace=T2P_CS_RGB; if(t2p->tiff_samplesperpixel == 3){ break; } if(TIFFGetField(input, TIFFTAG_INDEXED, &xuint16)){ if(xuint16==1) goto photometric_palette; } if(t2p->tiff_samplesperpixel > 3) { if(t2p->tiff_samplesperpixel == 4) { t2p->pdf_colorspace = T2P_CS_RGB; if(TIFFGetField(input, TIFFTAG_EXTRASAMPLES, &xuint16, &xuint16p) && xuint16 == 1) { if(xuint16p[0] == EXTRASAMPLE_ASSOCALPHA){ t2p->pdf_sample=T2P_SAMPLE_RGBAA_TO_RGB; break; } if(xuint16p[0] == EXTRASAMPLE_UNASSALPHA){ t2p->pdf_sample=T2P_SAMPLE_RGBA_TO_RGB; break; } TIFFWarning( TIFF2PDF_MODULE, "RGB image %s has 4 samples per pixel, assuming RGBA", TIFFFileName(input)); break; } t2p->pdf_colorspace=T2P_CS_CMYK; t2p->pdf_switchdecode ^= 1; TIFFWarning( TIFF2PDF_MODULE, "RGB image %s has 4 samples per pixel, assuming inverse CMYK", TIFFFileName(input)); break; } else { TIFFError( TIFF2PDF_MODULE, "No support for RGB image %s with %u samples per pixel", TIFFFileName(input), t2p->tiff_samplesperpixel); t2p->t2p_error = T2P_ERR_ERROR; break; } } else { TIFFError( TIFF2PDF_MODULE, "No support for RGB image %s with %u samples per pixel", TIFFFileName(input), t2p->tiff_samplesperpixel); t2p->t2p_error = T2P_ERR_ERROR; break; } case PHOTOMETRIC_PALETTE: photometric_palette: if(t2p->tiff_samplesperpixel!=1){ TIFFError( TIFF2PDF_MODULE, "No support for palettized image %s with not one sample per pixel", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; } t2p->pdf_colorspace=T2P_CS_RGB | T2P_CS_PALETTE; t2p->pdf_palettesize=0x0001<tiff_bitspersample; if(!TIFFGetField(input, TIFFTAG_COLORMAP, &r, &g, &b)){ TIFFError( TIFF2PDF_MODULE, "Palettized image %s has no color map", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; } if(t2p->pdf_palette != NULL){ _TIFFfree(t2p->pdf_palette); t2p->pdf_palette=NULL; } t2p->pdf_palette = (unsigned char*) _TIFFmalloc(t2p->pdf_palettesize*3); if(t2p->pdf_palette==NULL){ TIFFError( TIFF2PDF_MODULE, "Can't allocate %u bytes of memory for t2p_read_tiff_image, %s", t2p->pdf_palettesize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; } for(i=0;ipdf_palettesize;i++){ t2p->pdf_palette[(i*3)] = (unsigned char) (r[i]>>8); t2p->pdf_palette[(i*3)+1]= (unsigned char) (g[i]>>8); t2p->pdf_palette[(i*3)+2]= (unsigned char) (b[i]>>8); } t2p->pdf_palettesize *= 3; break; case PHOTOMETRIC_SEPARATED: if(TIFFGetField(input, TIFFTAG_INDEXED, &xuint16)){ if(xuint16==1){ goto photometric_palette_cmyk; } } if( TIFFGetField(input, TIFFTAG_INKSET, &xuint16) ){ if(xuint16 != INKSET_CMYK){ TIFFError( TIFF2PDF_MODULE, "No support for %s because its inkset is not CMYK", TIFFFileName(input) ); t2p->t2p_error = T2P_ERR_ERROR; return; } } if(t2p->tiff_samplesperpixel==4){ t2p->pdf_colorspace=T2P_CS_CMYK; } else { TIFFError( TIFF2PDF_MODULE, "No support for %s because it has %u samples per pixel", TIFFFileName(input), t2p->tiff_samplesperpixel); t2p->t2p_error = T2P_ERR_ERROR; return; } break; photometric_palette_cmyk: if(t2p->tiff_samplesperpixel!=1){ TIFFError( TIFF2PDF_MODULE, "No support for palettized CMYK image %s with not one sample per pixel", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; } t2p->pdf_colorspace=T2P_CS_CMYK | T2P_CS_PALETTE; t2p->pdf_palettesize=0x0001<tiff_bitspersample; if(!TIFFGetField(input, TIFFTAG_COLORMAP, &r, &g, &b, &a)){ TIFFError( TIFF2PDF_MODULE, "Palettized image %s has no color map", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; } if(t2p->pdf_palette != NULL){ _TIFFfree(t2p->pdf_palette); t2p->pdf_palette=NULL; } t2p->pdf_palette = (unsigned char*) _TIFFmalloc(t2p->pdf_palettesize*4); if(t2p->pdf_palette==NULL){ TIFFError( TIFF2PDF_MODULE, "Can't allocate %u bytes of memory for t2p_read_tiff_image, %s", t2p->pdf_palettesize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; } for(i=0;ipdf_palettesize;i++){ t2p->pdf_palette[(i*4)] = (unsigned char) (r[i]>>8); t2p->pdf_palette[(i*4)+1]= (unsigned char) (g[i]>>8); t2p->pdf_palette[(i*4)+2]= (unsigned char) (b[i]>>8); t2p->pdf_palette[(i*4)+3]= (unsigned char) (a[i]>>8); } t2p->pdf_palettesize *= 4; break; case PHOTOMETRIC_YCBCR: t2p->pdf_colorspace=T2P_CS_RGB; if(t2p->tiff_samplesperpixel==1){ t2p->pdf_colorspace=T2P_CS_GRAY; t2p->tiff_photometric=PHOTOMETRIC_MINISBLACK; break; } t2p->pdf_sample=T2P_SAMPLE_YCBCR_TO_RGB; #ifdef JPEG_SUPPORT if(t2p->pdf_defaultcompression==T2P_COMPRESS_JPEG){ t2p->pdf_sample=T2P_SAMPLE_NOTHING; } #endif break; case PHOTOMETRIC_CIELAB: t2p->pdf_labrange[0]= -127; t2p->pdf_labrange[1]= 127; t2p->pdf_labrange[2]= -127; t2p->pdf_labrange[3]= 127; t2p->pdf_sample=T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED; t2p->pdf_colorspace=T2P_CS_LAB; break; case PHOTOMETRIC_ICCLAB: t2p->pdf_labrange[0]= 0; t2p->pdf_labrange[1]= 255; t2p->pdf_labrange[2]= 0; t2p->pdf_labrange[3]= 255; t2p->pdf_colorspace=T2P_CS_LAB; break; case PHOTOMETRIC_ITULAB: t2p->pdf_labrange[0]=-85; t2p->pdf_labrange[1]=85; t2p->pdf_labrange[2]=-75; t2p->pdf_labrange[3]=124; t2p->pdf_sample=T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED; t2p->pdf_colorspace=T2P_CS_LAB; break; case PHOTOMETRIC_LOGL: case PHOTOMETRIC_LOGLUV: TIFFError( TIFF2PDF_MODULE, "No support for %s with photometric interpretation LogL/LogLuv", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; default: TIFFError( TIFF2PDF_MODULE, "No support for %s with photometric interpretation %u", TIFFFileName(input), t2p->tiff_photometric); t2p->t2p_error = T2P_ERR_ERROR; return; } if(TIFFGetField(input, TIFFTAG_PLANARCONFIG, &(t2p->tiff_planar))){ switch(t2p->tiff_planar){ case 0: TIFFWarning( TIFF2PDF_MODULE, "Image %s has planar configuration 0, assuming 1", TIFFFileName(input)); t2p->tiff_planar=PLANARCONFIG_CONTIG; case PLANARCONFIG_CONTIG: break; case PLANARCONFIG_SEPARATE: t2p->pdf_sample=T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG; if(t2p->tiff_bitspersample!=8){ TIFFError( TIFF2PDF_MODULE, "No support for %s with separated planar configuration and %u bits per sample", TIFFFileName(input), t2p->tiff_bitspersample); t2p->t2p_error = T2P_ERR_ERROR; return; } break; default: TIFFError( TIFF2PDF_MODULE, "No support for %s with planar configuration %u", TIFFFileName(input), t2p->tiff_planar); t2p->t2p_error = T2P_ERR_ERROR; return; } } TIFFGetFieldDefaulted(input, TIFFTAG_ORIENTATION, &(t2p->tiff_orientation)); if(t2p->tiff_orientation>8){ TIFFWarning(TIFF2PDF_MODULE, "Image %s has orientation %u, assuming 0", TIFFFileName(input), t2p->tiff_orientation); t2p->tiff_orientation=0; } if(TIFFGetField(input, TIFFTAG_XRESOLUTION, &(t2p->tiff_xres) ) == 0){ t2p->tiff_xres=0.0; } if(TIFFGetField(input, TIFFTAG_YRESOLUTION, &(t2p->tiff_yres) ) == 0){ t2p->tiff_yres=0.0; } TIFFGetFieldDefaulted(input, TIFFTAG_RESOLUTIONUNIT, &(t2p->tiff_resunit)); if(t2p->tiff_resunit == RESUNIT_CENTIMETER) { t2p->tiff_xres *= 2.54F; t2p->tiff_yres *= 2.54F; } else if (t2p->tiff_resunit != RESUNIT_INCH && t2p->pdf_centimeters != 0) { t2p->tiff_xres *= 2.54F; t2p->tiff_yres *= 2.54F; } t2p_compose_pdf_page(t2p); t2p->pdf_transcode = T2P_TRANSCODE_ENCODE; if(t2p->pdf_nopassthrough==0){ #ifdef CCITT_SUPPORT if(t2p->tiff_compression==COMPRESSION_CCITTFAX4 ){ if(TIFFIsTiled(input) || (TIFFNumberOfStrips(input)==1) ){ t2p->pdf_transcode = T2P_TRANSCODE_RAW; t2p->pdf_compression=T2P_COMPRESS_G4; } } #endif #ifdef ZIP_SUPPORT if(t2p->tiff_compression== COMPRESSION_ADOBE_DEFLATE || t2p->tiff_compression==COMPRESSION_DEFLATE){ if(TIFFIsTiled(input) || (TIFFNumberOfStrips(input)==1) ){ t2p->pdf_transcode = T2P_TRANSCODE_RAW; t2p->pdf_compression=T2P_COMPRESS_ZIP; } } #endif #ifdef OJPEG_SUPPORT if(t2p->tiff_compression==COMPRESSION_OJPEG){ t2p->pdf_transcode = T2P_TRANSCODE_RAW; t2p->pdf_compression=T2P_COMPRESS_JPEG; t2p_process_ojpeg_tables(t2p, input); } #endif #ifdef JPEG_SUPPORT if(t2p->tiff_compression==COMPRESSION_JPEG){ t2p->pdf_transcode = T2P_TRANSCODE_RAW; t2p->pdf_compression=T2P_COMPRESS_JPEG; } #endif (void)0; } if(t2p->pdf_transcode!=T2P_TRANSCODE_RAW){ t2p->pdf_compression = t2p->pdf_defaultcompression; } #ifdef JPEG_SUPPORT if(t2p->pdf_defaultcompression==T2P_COMPRESS_JPEG){ if(t2p->pdf_colorspace & T2P_CS_PALETTE){ t2p->pdf_sample|=T2P_SAMPLE_REALIZE_PALETTE; t2p->pdf_colorspace ^= T2P_CS_PALETTE; t2p->tiff_pages[t2p->pdf_page].page_extra--; } } if(t2p->tiff_compression==COMPRESSION_JPEG){ if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){ TIFFError( TIFF2PDF_MODULE, "No support for %s with JPEG compression and separated planar configuration", TIFFFileName(input)); t2p->t2p_error=T2P_ERR_ERROR; return; } } #endif #ifdef OJPEG_SUPPORT if(t2p->tiff_compression==COMPRESSION_OJPEG){ if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){ TIFFError( TIFF2PDF_MODULE, "No support for %s with OJPEG compression and separated planar configuration", TIFFFileName(input)); t2p->t2p_error=T2P_ERR_ERROR; return; } } #endif if(t2p->pdf_sample & T2P_SAMPLE_REALIZE_PALETTE){ if(t2p->pdf_colorspace & T2P_CS_CMYK){ t2p->tiff_samplesperpixel=4; t2p->tiff_photometric=PHOTOMETRIC_SEPARATED; } else { t2p->tiff_samplesperpixel=3; t2p->tiff_photometric=PHOTOMETRIC_RGB; } } if (TIFFGetField(input, TIFFTAG_TRANSFERFUNCTION, &(t2p->tiff_transferfunction[0]), &(t2p->tiff_transferfunction[1]), &(t2p->tiff_transferfunction[2]))) { if(t2p->tiff_transferfunction[1] != t2p->tiff_transferfunction[0]) { t2p->tiff_transferfunctioncount=3; } else { t2p->tiff_transferfunctioncount=1; } } else { t2p->tiff_transferfunctioncount=0; } if(TIFFGetField(input, TIFFTAG_WHITEPOINT, &xfloatp)!=0){ t2p->tiff_whitechromaticities[0]=xfloatp[0]; t2p->tiff_whitechromaticities[1]=xfloatp[1]; if(t2p->pdf_colorspace & T2P_CS_GRAY){ t2p->pdf_colorspace |= T2P_CS_CALGRAY; } if(t2p->pdf_colorspace & T2P_CS_RGB){ t2p->pdf_colorspace |= T2P_CS_CALRGB; } } if(TIFFGetField(input, TIFFTAG_PRIMARYCHROMATICITIES, &xfloatp)!=0){ t2p->tiff_primarychromaticities[0]=xfloatp[0]; t2p->tiff_primarychromaticities[1]=xfloatp[1]; t2p->tiff_primarychromaticities[2]=xfloatp[2]; t2p->tiff_primarychromaticities[3]=xfloatp[3]; t2p->tiff_primarychromaticities[4]=xfloatp[4]; t2p->tiff_primarychromaticities[5]=xfloatp[5]; if(t2p->pdf_colorspace & T2P_CS_RGB){ t2p->pdf_colorspace |= T2P_CS_CALRGB; } } if(t2p->pdf_colorspace & T2P_CS_LAB){ if(TIFFGetField(input, TIFFTAG_WHITEPOINT, &xfloatp) != 0){ t2p->tiff_whitechromaticities[0]=xfloatp[0]; t2p->tiff_whitechromaticities[1]=xfloatp[1]; } else { t2p->tiff_whitechromaticities[0]=0.3457F; /* 0.3127F; */ t2p->tiff_whitechromaticities[1]=0.3585F; /* 0.3290F; */ } } if(TIFFGetField(input, TIFFTAG_ICCPROFILE, &(t2p->tiff_iccprofilelength), &(t2p->tiff_iccprofile))!=0){ t2p->pdf_colorspace |= T2P_CS_ICCBASED; } else { t2p->tiff_iccprofilelength=0; t2p->tiff_iccprofile=NULL; } #ifdef CCITT_SUPPORT if( t2p->tiff_bitspersample==1 && t2p->tiff_samplesperpixel==1){ t2p->pdf_compression = T2P_COMPRESS_G4; } #endif return; } /* This function returns the necessary size of a data buffer to contain the raw or uncompressed image data from the input TIFF for a page. */ void t2p_read_tiff_size(T2P* t2p, TIFF* input){ uint64* sbc=NULL; #if defined(JPEG_SUPPORT) || defined (OJPEG_SUPPORT) unsigned char* jpt=NULL; tstrip_t i=0; tstrip_t stripcount=0; #endif uint64 k = 0; if(t2p->pdf_transcode == T2P_TRANSCODE_RAW){ #ifdef CCITT_SUPPORT if(t2p->pdf_compression == T2P_COMPRESS_G4 ){ TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc); t2p->tiff_datasize=(tmsize_t)sbc[0]; return; } #endif #ifdef ZIP_SUPPORT if(t2p->pdf_compression == T2P_COMPRESS_ZIP){ TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc); t2p->tiff_datasize=(tmsize_t)sbc[0]; return; } #endif #ifdef OJPEG_SUPPORT if(t2p->tiff_compression == COMPRESSION_OJPEG){ if(!TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc)){ TIFFError(TIFF2PDF_MODULE, "Input file %s missing field: TIFFTAG_STRIPBYTECOUNTS", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; } stripcount=TIFFNumberOfStrips(input); for(i=0;itiff_dataoffset))){ if(t2p->tiff_dataoffset != 0){ if(TIFFGetField(input, TIFFTAG_JPEGIFBYTECOUNT, &(t2p->tiff_datasize))!=0){ if((uint64)t2p->tiff_datasize < k) { TIFFWarning(TIFF2PDF_MODULE, "Input file %s has short JPEG interchange file byte count", TIFFFileName(input)); t2p->pdf_ojpegiflength=t2p->tiff_datasize; k = checkAdd64(k, t2p->tiff_datasize, t2p); k = checkAdd64(k, 6, t2p); k = checkAdd64(k, stripcount, t2p); k = checkAdd64(k, stripcount, t2p); t2p->tiff_datasize = (tsize_t) k; if ((uint64) t2p->tiff_datasize != k) { TIFFError(TIFF2PDF_MODULE, "Integer overflow"); t2p->t2p_error = T2P_ERR_ERROR; } return; } return; }else { TIFFError(TIFF2PDF_MODULE, "Input file %s missing field: TIFFTAG_JPEGIFBYTECOUNT", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; } } } k = checkAdd64(k, stripcount, t2p); k = checkAdd64(k, stripcount, t2p); k = checkAdd64(k, 2048, t2p); t2p->tiff_datasize = (tsize_t) k; if ((uint64) t2p->tiff_datasize != k) { TIFFError(TIFF2PDF_MODULE, "Integer overflow"); t2p->t2p_error = T2P_ERR_ERROR; } return; } #endif #ifdef JPEG_SUPPORT if(t2p->tiff_compression == COMPRESSION_JPEG) { uint32 count = 0; if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0 ){ if(count > 4){ k += count; k -= 2; /* don't use EOI of header */ } } else { k = 2; /* SOI for first strip */ } stripcount=TIFFNumberOfStrips(input); if(!TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc)){ TIFFError(TIFF2PDF_MODULE, "Input file %s missing field: TIFFTAG_STRIPBYTECOUNTS", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return; } for(i=0;itiff_datasize = (tsize_t) k; if ((uint64) t2p->tiff_datasize != k) { TIFFError(TIFF2PDF_MODULE, "Integer overflow"); t2p->t2p_error = T2P_ERR_ERROR; } return; } #endif (void) 0; } k = checkMultiply64(TIFFScanlineSize(input), t2p->tiff_length, t2p); if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){ k = checkMultiply64(k, t2p->tiff_samplesperpixel, t2p); } if (k == 0) { /* Assume we had overflow inside TIFFScanlineSize */ t2p->t2p_error = T2P_ERR_ERROR; } t2p->tiff_datasize = (tsize_t) k; if ((uint64) t2p->tiff_datasize != k) { TIFFError(TIFF2PDF_MODULE, "Integer overflow"); t2p->t2p_error = T2P_ERR_ERROR; } return; } /* This function returns the necessary size of a data buffer to contain the raw or uncompressed image data from the input TIFF for a tile of a page. */ void t2p_read_tiff_size_tile(T2P* t2p, TIFF* input, ttile_t tile){ uint64* tbc = NULL; uint16 edge=0; #ifdef JPEG_SUPPORT unsigned char* jpt; #endif uint64 k; edge |= t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile); edge |= t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile); if(t2p->pdf_transcode==T2P_TRANSCODE_RAW){ if(edge #if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT) && !(t2p->pdf_compression==T2P_COMPRESS_JPEG) #endif ){ t2p->tiff_datasize=TIFFTileSize(input); if (t2p->tiff_datasize == 0) { /* Assume we had overflow inside TIFFTileSize */ t2p->t2p_error = T2P_ERR_ERROR; } return; } else { TIFFGetField(input, TIFFTAG_TILEBYTECOUNTS, &tbc); k=tbc[tile]; #ifdef OJPEG_SUPPORT if(t2p->tiff_compression==COMPRESSION_OJPEG){ k = checkAdd64(k, 2048, t2p); } #endif #ifdef JPEG_SUPPORT if(t2p->tiff_compression==COMPRESSION_JPEG) { uint32 count = 0; if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt)!=0){ if(count > 4){ k = checkAdd64(k, count, t2p); k -= 2; /* don't use EOI of header or SOI of tile */ } } } #endif t2p->tiff_datasize = (tsize_t) k; if ((uint64) t2p->tiff_datasize != k) { TIFFError(TIFF2PDF_MODULE, "Integer overflow"); t2p->t2p_error = T2P_ERR_ERROR; } return; } } k = TIFFTileSize(input); if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){ k = checkMultiply64(k, t2p->tiff_samplesperpixel, t2p); } if (k == 0) { /* Assume we had overflow inside TIFFTileSize */ t2p->t2p_error = T2P_ERR_ERROR; } t2p->tiff_datasize = (tsize_t) k; if ((uint64) t2p->tiff_datasize != k) { TIFFError(TIFF2PDF_MODULE, "Integer overflow"); t2p->t2p_error = T2P_ERR_ERROR; } return; } /* * This functions returns a non-zero value when the tile is on the right edge * and does not have full imaged tile width. */ int t2p_tile_is_right_edge(T2P_TILES tiles, ttile_t tile){ if( ((tile+1) % tiles.tiles_tilecountx == 0) && (tiles.tiles_edgetilewidth != 0) ){ return(1); } else { return(0); } } /* * This functions returns a non-zero value when the tile is on the bottom edge * and does not have full imaged tile length. */ int t2p_tile_is_bottom_edge(T2P_TILES tiles, ttile_t tile){ if( ((tile+1) > (tiles.tiles_tilecount-tiles.tiles_tilecountx) ) && (tiles.tiles_edgetilelength != 0) ){ return(1); } else { return(0); } } /* * This function returns a non-zero value when the tile is a right edge tile * or a bottom edge tile. */ int t2p_tile_is_edge(T2P_TILES tiles, ttile_t tile){ return(t2p_tile_is_right_edge(tiles, tile) | t2p_tile_is_bottom_edge(tiles, tile) ); } /* This function returns a non-zero value when the tile is a right edge tile and a bottom edge tile. */ int t2p_tile_is_corner_edge(T2P_TILES tiles, ttile_t tile){ return(t2p_tile_is_right_edge(tiles, tile) & t2p_tile_is_bottom_edge(tiles, tile) ); } /* This function reads the raster image data from the input TIFF for an image and writes the data to the output PDF XObject image dictionary stream. It returns the amount written or zero on error. */ tsize_t t2p_readwrite_pdf_image(T2P* t2p, TIFF* input, TIFF* output){ tsize_t written=0; unsigned char* buffer=NULL; unsigned char* samplebuffer=NULL; tsize_t bufferoffset=0; tsize_t samplebufferoffset=0; tsize_t read=0; tstrip_t i=0; tstrip_t j=0; tstrip_t stripcount=0; tsize_t stripsize=0; tsize_t sepstripcount=0; tsize_t sepstripsize=0; #ifdef OJPEG_SUPPORT toff_t inputoffset=0; uint16 h_samp=1; uint16 v_samp=1; uint16 ri=1; uint32 rows=0; #endif #ifdef JPEG_SUPPORT unsigned char* jpt; float* xfloatp; uint64* sbc; unsigned char* stripbuffer; tsize_t striplength=0; uint32 max_striplength=0; #endif /* Fail if prior error (in particular, can't trust tiff_datasize) */ if (t2p->t2p_error != T2P_ERR_OK) return(0); if(t2p->pdf_transcode == T2P_TRANSCODE_RAW){ #ifdef CCITT_SUPPORT if(t2p->pdf_compression == T2P_COMPRESS_G4){ buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if (buffer == NULL) { TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } TIFFReadRawStrip(input, 0, (tdata_t) buffer, t2p->tiff_datasize); if (t2p->tiff_fillorder==FILLORDER_LSB2MSB){ /* * make sure is lsb-to-msb * bit-endianness fill order */ TIFFReverseBits(buffer, t2p->tiff_datasize); } t2pWriteFile(output, (tdata_t) buffer, t2p->tiff_datasize); _TIFFfree(buffer); return(t2p->tiff_datasize); } #endif #ifdef ZIP_SUPPORT if (t2p->pdf_compression == T2P_COMPRESS_ZIP) { buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer == NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } memset(buffer, 0, t2p->tiff_datasize); TIFFReadRawStrip(input, 0, (tdata_t) buffer, t2p->tiff_datasize); if (t2p->tiff_fillorder==FILLORDER_LSB2MSB) { TIFFReverseBits(buffer, t2p->tiff_datasize); } t2pWriteFile(output, (tdata_t) buffer, t2p->tiff_datasize); _TIFFfree(buffer); return(t2p->tiff_datasize); } #endif #ifdef OJPEG_SUPPORT if(t2p->tiff_compression == COMPRESSION_OJPEG) { if(t2p->tiff_dataoffset != 0) { buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer == NULL) { TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } memset(buffer, 0, t2p->tiff_datasize); if(t2p->pdf_ojpegiflength==0){ inputoffset=t2pSeekFile(input, 0, SEEK_CUR); t2pSeekFile(input, t2p->tiff_dataoffset, SEEK_SET); t2pReadFile(input, (tdata_t) buffer, t2p->tiff_datasize); t2pSeekFile(input, inputoffset, SEEK_SET); t2pWriteFile(output, (tdata_t) buffer, t2p->tiff_datasize); _TIFFfree(buffer); return(t2p->tiff_datasize); } else { inputoffset=t2pSeekFile(input, 0, SEEK_CUR); t2pSeekFile(input, t2p->tiff_dataoffset, SEEK_SET); bufferoffset = t2pReadFile(input, (tdata_t) buffer, t2p->pdf_ojpegiflength); t2p->pdf_ojpegiflength = 0; t2pSeekFile(input, inputoffset, SEEK_SET); TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &h_samp, &v_samp); buffer[bufferoffset++]= 0xff; buffer[bufferoffset++]= 0xdd; buffer[bufferoffset++]= 0x00; buffer[bufferoffset++]= 0x04; h_samp*=8; v_samp*=8; ri=(t2p->tiff_width+h_samp-1) / h_samp; TIFFGetField(input, TIFFTAG_ROWSPERSTRIP, &rows); ri*=(rows+v_samp-1)/v_samp; buffer[bufferoffset++]= (ri>>8) & 0xff; buffer[bufferoffset++]= ri & 0xff; stripcount=TIFFNumberOfStrips(input); for(i=0;ipdf_ojpegdata){ TIFFError(TIFF2PDF_MODULE, "No support for OJPEG image %s with bad tables", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } memset(buffer, 0, t2p->tiff_datasize); _TIFFmemcpy(buffer, t2p->pdf_ojpegdata, t2p->pdf_ojpegdatalength); bufferoffset=t2p->pdf_ojpegdatalength; stripcount=TIFFNumberOfStrips(input); for(i=0;it2p_error = T2P_ERR_ERROR; return(0); } return(t2p->tiff_datasize); } #endif #ifdef JPEG_SUPPORT if(t2p->tiff_compression == COMPRESSION_JPEG) { uint32 count = 0; buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } memset(buffer, 0, t2p->tiff_datasize); if (TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0) { if(count > 4) { _TIFFmemcpy(buffer, jpt, count); bufferoffset += count - 2; } } stripcount=TIFFNumberOfStrips(input); TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc); for(i=0;imax_striplength) max_striplength=sbc[i]; } stripbuffer = (unsigned char*) _TIFFmalloc(max_striplength); if(stripbuffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %u bytes of memory for t2p_readwrite_pdf_image, %s", max_striplength, TIFFFileName(input)); _TIFFfree(buffer); t2p->t2p_error = T2P_ERR_ERROR; return(0); } for(i=0;itiff_length)){ TIFFError(TIFF2PDF_MODULE, "Can't process JPEG data in input file %s", TIFFFileName(input)); _TIFFfree(samplebuffer); _TIFFfree(buffer); t2p->t2p_error = T2P_ERR_ERROR; return(0); } } buffer[bufferoffset++]=0xff; buffer[bufferoffset++]=0xd9; t2pWriteFile(output, (tdata_t) buffer, bufferoffset); _TIFFfree(stripbuffer); _TIFFfree(buffer); return(bufferoffset); } #endif (void)0; } if(t2p->pdf_sample==T2P_SAMPLE_NOTHING){ buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } memset(buffer, 0, t2p->tiff_datasize); stripsize=TIFFStripSize(input); stripcount=TIFFNumberOfStrips(input); for(i=0;it2p_error=T2P_ERR_ERROR; return(0); } bufferoffset+=read; } } else { if(t2p->pdf_sample & T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG){ sepstripsize=TIFFStripSize(input); sepstripcount=TIFFNumberOfStrips(input); stripsize=sepstripsize*t2p->tiff_samplesperpixel; stripcount=sepstripcount/t2p->tiff_samplesperpixel; buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } memset(buffer, 0, t2p->tiff_datasize); samplebuffer = (unsigned char*) _TIFFmalloc(stripsize); if(samplebuffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } for(i=0;itiff_samplesperpixel;j++){ read = TIFFReadEncodedStrip(input, i + j*stripcount, (tdata_t) &(samplebuffer[samplebufferoffset]), sepstripsize); if(read==-1){ TIFFError(TIFF2PDF_MODULE, "Error on decoding strip %u of %s", i + j*stripcount, TIFFFileName(input)); _TIFFfree(buffer); t2p->t2p_error=T2P_ERR_ERROR; return(0); } samplebufferoffset+=read; } t2p_sample_planar_separate_to_contig( t2p, &(buffer[bufferoffset]), samplebuffer, samplebufferoffset); bufferoffset+=samplebufferoffset; } _TIFFfree(samplebuffer); goto dataready; } buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } memset(buffer, 0, t2p->tiff_datasize); stripsize=TIFFStripSize(input); stripcount=TIFFNumberOfStrips(input); for(i=0;it2p_error=T2P_ERR_ERROR; return(0); } bufferoffset+=read; } if(t2p->pdf_sample & T2P_SAMPLE_REALIZE_PALETTE){ // FIXME: overflow? samplebuffer=(unsigned char*)_TIFFrealloc( (tdata_t) buffer, t2p->tiff_datasize * t2p->tiff_samplesperpixel); if(samplebuffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; _TIFFfree(buffer); } else { buffer=samplebuffer; t2p->tiff_datasize *= t2p->tiff_samplesperpixel; } t2p_sample_realize_palette(t2p, buffer); } if(t2p->pdf_sample & T2P_SAMPLE_RGBA_TO_RGB){ t2p->tiff_datasize=t2p_sample_rgba_to_rgb( (tdata_t)buffer, t2p->tiff_width*t2p->tiff_length); } if(t2p->pdf_sample & T2P_SAMPLE_RGBAA_TO_RGB){ t2p->tiff_datasize=t2p_sample_rgbaa_to_rgb( (tdata_t)buffer, t2p->tiff_width*t2p->tiff_length); } if(t2p->pdf_sample & T2P_SAMPLE_YCBCR_TO_RGB){ samplebuffer=(unsigned char*)_TIFFrealloc( (tdata_t)buffer, t2p->tiff_width*t2p->tiff_length*4); if(samplebuffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; _TIFFfree(buffer); return(0); } else { buffer=samplebuffer; } if(!TIFFReadRGBAImageOriented( input, t2p->tiff_width, t2p->tiff_length, (uint32*)buffer, ORIENTATION_TOPLEFT, 0)){ TIFFError(TIFF2PDF_MODULE, "Can't use TIFFReadRGBAImageOriented to extract RGB image from %s", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } t2p->tiff_datasize=t2p_sample_abgr_to_rgb( (tdata_t) buffer, t2p->tiff_width*t2p->tiff_length); } if(t2p->pdf_sample & T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED){ t2p->tiff_datasize=t2p_sample_lab_signed_to_unsigned( (tdata_t)buffer, t2p->tiff_width*t2p->tiff_length); } } dataready: t2p_disable(output); TIFFSetField(output, TIFFTAG_PHOTOMETRIC, t2p->tiff_photometric); TIFFSetField(output, TIFFTAG_BITSPERSAMPLE, t2p->tiff_bitspersample); TIFFSetField(output, TIFFTAG_SAMPLESPERPIXEL, t2p->tiff_samplesperpixel); TIFFSetField(output, TIFFTAG_IMAGEWIDTH, t2p->tiff_width); TIFFSetField(output, TIFFTAG_IMAGELENGTH, t2p->tiff_length); TIFFSetField(output, TIFFTAG_ROWSPERSTRIP, t2p->tiff_length); TIFFSetField(output, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(output, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB); switch(t2p->pdf_compression){ case T2P_COMPRESS_NONE: TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_NONE); break; #ifdef CCITT_SUPPORT case T2P_COMPRESS_G4: TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4); break; #endif #ifdef JPEG_SUPPORT case T2P_COMPRESS_JPEG: if(t2p->tiff_photometric==PHOTOMETRIC_YCBCR) { uint16 hor = 0, ver = 0; if (TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &hor, &ver) !=0 ) { if(hor != 0 && ver != 0){ TIFFSetField(output, TIFFTAG_YCBCRSUBSAMPLING, hor, ver); } } if(TIFFGetField(input, TIFFTAG_REFERENCEBLACKWHITE, &xfloatp)!=0){ TIFFSetField(output, TIFFTAG_REFERENCEBLACKWHITE, xfloatp); } } if(TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_JPEG)==0){ TIFFError(TIFF2PDF_MODULE, "Unable to use JPEG compression for input %s and output %s", TIFFFileName(input), TIFFFileName(output)); _TIFFfree(buffer); t2p->t2p_error = T2P_ERR_ERROR; return(0); } TIFFSetField(output, TIFFTAG_JPEGTABLESMODE, 0); if(t2p->pdf_colorspace & (T2P_CS_RGB | T2P_CS_LAB)){ TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR); if(t2p->tiff_photometric != PHOTOMETRIC_YCBCR){ TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); } else { TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RAW); } } if(t2p->pdf_colorspace & T2P_CS_GRAY){ (void)0; } if(t2p->pdf_colorspace & T2P_CS_CMYK){ (void)0; } if(t2p->pdf_defaultcompressionquality != 0){ TIFFSetField(output, TIFFTAG_JPEGQUALITY, t2p->pdf_defaultcompressionquality); } break; #endif #ifdef ZIP_SUPPORT case T2P_COMPRESS_ZIP: TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); if(t2p->pdf_defaultcompressionquality%100 != 0){ TIFFSetField(output, TIFFTAG_PREDICTOR, t2p->pdf_defaultcompressionquality % 100); } if(t2p->pdf_defaultcompressionquality/100 != 0){ TIFFSetField(output, TIFFTAG_ZIPQUALITY, (t2p->pdf_defaultcompressionquality / 100)); } break; #endif default: break; } t2p_enable(output); t2p->outputwritten = 0; #ifdef JPEG_SUPPORT if(t2p->pdf_compression == T2P_COMPRESS_JPEG && t2p->tiff_photometric == PHOTOMETRIC_YCBCR){ bufferoffset = TIFFWriteEncodedStrip(output, (tstrip_t)0, buffer, stripsize * stripcount); } else #endif { bufferoffset = TIFFWriteEncodedStrip(output, (tstrip_t)0, buffer, t2p->tiff_datasize); } if (buffer != NULL) { _TIFFfree(buffer); buffer=NULL; } if (bufferoffset == (tsize_t)-1) { TIFFError(TIFF2PDF_MODULE, "Error writing encoded strip to output PDF %s", TIFFFileName(output)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } written = t2p->outputwritten; return(written); } /* * This function reads the raster image data from the input TIFF for an image * tile and writes the data to the output PDF XObject image dictionary stream * for the tile. It returns the amount written or zero on error. */ tsize_t t2p_readwrite_pdf_image_tile(T2P* t2p, TIFF* input, TIFF* output, ttile_t tile){ uint16 edge=0; tsize_t written=0; unsigned char* buffer=NULL; tsize_t bufferoffset=0; unsigned char* samplebuffer=NULL; tsize_t samplebufferoffset=0; tsize_t read=0; uint16 i=0; ttile_t tilecount=0; tsize_t tilesize=0; ttile_t septilecount=0; tsize_t septilesize=0; #ifdef JPEG_SUPPORT unsigned char* jpt; float* xfloatp; uint32 xuint32=0; #endif /* Fail if prior error (in particular, can't trust tiff_datasize) */ if (t2p->t2p_error != T2P_ERR_OK) return(0); edge |= t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile); edge |= t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile); if( (t2p->pdf_transcode == T2P_TRANSCODE_RAW) && ((edge == 0) #if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT) || (t2p->pdf_compression == T2P_COMPRESS_JPEG) #endif ) ){ #ifdef CCITT_SUPPORT if(t2p->pdf_compression == T2P_COMPRESS_G4){ buffer= (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory " "for t2p_readwrite_pdf_image_tile, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } TIFFReadRawTile(input, tile, (tdata_t) buffer, t2p->tiff_datasize); if (t2p->tiff_fillorder==FILLORDER_LSB2MSB){ TIFFReverseBits(buffer, t2p->tiff_datasize); } t2pWriteFile(output, (tdata_t) buffer, t2p->tiff_datasize); _TIFFfree(buffer); return(t2p->tiff_datasize); } #endif #ifdef ZIP_SUPPORT if(t2p->pdf_compression == T2P_COMPRESS_ZIP){ buffer= (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory " "for t2p_readwrite_pdf_image_tile, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } TIFFReadRawTile(input, tile, (tdata_t) buffer, t2p->tiff_datasize); if (t2p->tiff_fillorder==FILLORDER_LSB2MSB){ TIFFReverseBits(buffer, t2p->tiff_datasize); } t2pWriteFile(output, (tdata_t) buffer, t2p->tiff_datasize); _TIFFfree(buffer); return(t2p->tiff_datasize); } #endif #ifdef OJPEG_SUPPORT if(t2p->tiff_compression == COMPRESSION_OJPEG){ if(! t2p->pdf_ojpegdata){ TIFFError(TIFF2PDF_MODULE, "No support for OJPEG image %s with " "bad tables", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } buffer=(unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory " "for t2p_readwrite_pdf_image, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } _TIFFmemcpy(buffer, t2p->pdf_ojpegdata, t2p->pdf_ojpegdatalength); if(edge!=0){ if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile)){ buffer[7]= (t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength >> 8) & 0xff; buffer[8]= (t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength ) & 0xff; } if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile)){ buffer[9]= (t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth >> 8) & 0xff; buffer[10]= (t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth ) & 0xff; } } bufferoffset=t2p->pdf_ojpegdatalength; bufferoffset+=TIFFReadRawTile(input, tile, (tdata_t) &(((unsigned char*)buffer)[bufferoffset]), -1); ((unsigned char*)buffer)[bufferoffset++]=0xff; ((unsigned char*)buffer)[bufferoffset++]=0xd9; t2pWriteFile(output, (tdata_t) buffer, bufferoffset); _TIFFfree(buffer); return(bufferoffset); } #endif #ifdef JPEG_SUPPORT if(t2p->tiff_compression == COMPRESSION_JPEG){ unsigned char table_end[2]; uint32 count = 0; buffer= (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory " "for t2p_readwrite_pdf_image_tile, %s", t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0) { if (count > 0) { _TIFFmemcpy(buffer, jpt, count); bufferoffset += count - 2; table_end[0] = buffer[bufferoffset-2]; table_end[1] = buffer[bufferoffset-1]; } if (count > 0) { xuint32 = bufferoffset; bufferoffset += TIFFReadRawTile( input, tile, (tdata_t) &(((unsigned char*)buffer)[bufferoffset-2]), -1); buffer[xuint32-2]=table_end[0]; buffer[xuint32-1]=table_end[1]; } else { bufferoffset += TIFFReadRawTile( input, tile, (tdata_t) &(((unsigned char*)buffer)[bufferoffset]), -1); } } t2pWriteFile(output, (tdata_t) buffer, bufferoffset); _TIFFfree(buffer); return(bufferoffset); } #endif (void)0; } if(t2p->pdf_sample==T2P_SAMPLE_NOTHING){ buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory for " "t2p_readwrite_pdf_image_tile, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } read = TIFFReadEncodedTile( input, tile, (tdata_t) &buffer[bufferoffset], t2p->tiff_datasize); if(read==-1){ TIFFError(TIFF2PDF_MODULE, "Error on decoding tile %u of %s", tile, TIFFFileName(input)); _TIFFfree(buffer); t2p->t2p_error=T2P_ERR_ERROR; return(0); } } else { if(t2p->pdf_sample == T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG){ septilesize=TIFFTileSize(input); septilecount=TIFFNumberOfTiles(input); tilesize=septilesize*t2p->tiff_samplesperpixel; tilecount=septilecount/t2p->tiff_samplesperpixel; buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory " "for t2p_readwrite_pdf_image_tile, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } samplebuffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(samplebuffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory " "for t2p_readwrite_pdf_image_tile, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } samplebufferoffset=0; for(i=0;itiff_samplesperpixel;i++){ read = TIFFReadEncodedTile(input, tile + i*tilecount, (tdata_t) &(samplebuffer[samplebufferoffset]), septilesize); if(read==-1){ TIFFError(TIFF2PDF_MODULE, "Error on decoding tile %u of %s", tile + i*tilecount, TIFFFileName(input)); _TIFFfree(samplebuffer); _TIFFfree(buffer); t2p->t2p_error=T2P_ERR_ERROR; return(0); } samplebufferoffset+=read; } t2p_sample_planar_separate_to_contig( t2p, &(buffer[bufferoffset]), samplebuffer, samplebufferoffset); bufferoffset+=samplebufferoffset; _TIFFfree(samplebuffer); } if(buffer==NULL){ buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize); if(buffer==NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %lu bytes of memory " "for t2p_readwrite_pdf_image_tile, %s", (unsigned long) t2p->tiff_datasize, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } read = TIFFReadEncodedTile( input, tile, (tdata_t) &buffer[bufferoffset], t2p->tiff_datasize); if(read==-1){ TIFFError(TIFF2PDF_MODULE, "Error on decoding tile %u of %s", tile, TIFFFileName(input)); _TIFFfree(buffer); t2p->t2p_error=T2P_ERR_ERROR; return(0); } } if(t2p->pdf_sample & T2P_SAMPLE_RGBA_TO_RGB){ t2p->tiff_datasize=t2p_sample_rgba_to_rgb( (tdata_t)buffer, t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth *t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength); } if(t2p->pdf_sample & T2P_SAMPLE_RGBAA_TO_RGB){ t2p->tiff_datasize=t2p_sample_rgbaa_to_rgb( (tdata_t)buffer, t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth *t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength); } if(t2p->pdf_sample & T2P_SAMPLE_YCBCR_TO_RGB){ TIFFError(TIFF2PDF_MODULE, "No support for YCbCr to RGB in tile for %s", TIFFFileName(input)); _TIFFfree(buffer); t2p->t2p_error = T2P_ERR_ERROR; return(0); } if(t2p->pdf_sample & T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED){ t2p->tiff_datasize=t2p_sample_lab_signed_to_unsigned( (tdata_t)buffer, t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth *t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength); } } if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile) != 0){ t2p_tile_collapse_left( buffer, TIFFTileRowSize(input), t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth, t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth, t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength); } t2p_disable(output); TIFFSetField(output, TIFFTAG_PHOTOMETRIC, t2p->tiff_photometric); TIFFSetField(output, TIFFTAG_BITSPERSAMPLE, t2p->tiff_bitspersample); TIFFSetField(output, TIFFTAG_SAMPLESPERPIXEL, t2p->tiff_samplesperpixel); if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile) == 0){ TIFFSetField( output, TIFFTAG_IMAGEWIDTH, t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth); } else { TIFFSetField( output, TIFFTAG_IMAGEWIDTH, t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth); } if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile) == 0){ TIFFSetField( output, TIFFTAG_IMAGELENGTH, t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength); TIFFSetField( output, TIFFTAG_ROWSPERSTRIP, t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength); } else { TIFFSetField( output, TIFFTAG_IMAGELENGTH, t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength); TIFFSetField( output, TIFFTAG_ROWSPERSTRIP, t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength); } TIFFSetField(output, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(output, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB); switch(t2p->pdf_compression){ case T2P_COMPRESS_NONE: TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_NONE); break; #ifdef CCITT_SUPPORT case T2P_COMPRESS_G4: TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4); break; #endif #ifdef JPEG_SUPPORT case T2P_COMPRESS_JPEG: if (t2p->tiff_photometric==PHOTOMETRIC_YCBCR) { uint16 hor = 0, ver = 0; if (TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &hor, &ver)!=0) { if (hor != 0 && ver != 0) { TIFFSetField(output, TIFFTAG_YCBCRSUBSAMPLING, hor, ver); } } if(TIFFGetField(input, TIFFTAG_REFERENCEBLACKWHITE, &xfloatp)!=0){ TIFFSetField(output, TIFFTAG_REFERENCEBLACKWHITE, xfloatp); } } TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_JPEG); TIFFSetField(output, TIFFTAG_JPEGTABLESMODE, 0); /* JPEGTABLESMODE_NONE */ if(t2p->pdf_colorspace & (T2P_CS_RGB | T2P_CS_LAB)){ TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR); if(t2p->tiff_photometric != PHOTOMETRIC_YCBCR){ TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); } else { TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RAW); } } if(t2p->pdf_colorspace & T2P_CS_GRAY){ (void)0; } if(t2p->pdf_colorspace & T2P_CS_CMYK){ (void)0; } if(t2p->pdf_defaultcompressionquality != 0){ TIFFSetField(output, TIFFTAG_JPEGQUALITY, t2p->pdf_defaultcompressionquality); } break; #endif #ifdef ZIP_SUPPORT case T2P_COMPRESS_ZIP: TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); if(t2p->pdf_defaultcompressionquality%100 != 0){ TIFFSetField(output, TIFFTAG_PREDICTOR, t2p->pdf_defaultcompressionquality % 100); } if(t2p->pdf_defaultcompressionquality/100 != 0){ TIFFSetField(output, TIFFTAG_ZIPQUALITY, (t2p->pdf_defaultcompressionquality / 100)); } break; #endif default: break; } t2p_enable(output); t2p->outputwritten = 0; bufferoffset = TIFFWriteEncodedStrip(output, (tstrip_t) 0, buffer, TIFFStripSize(output)); if (buffer != NULL) { _TIFFfree(buffer); buffer = NULL; } if (bufferoffset == -1) { TIFFError(TIFF2PDF_MODULE, "Error writing encoded tile to output PDF %s", TIFFFileName(output)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } written = t2p->outputwritten; return(written); } #ifdef OJPEG_SUPPORT int t2p_process_ojpeg_tables(T2P* t2p, TIFF* input){ uint16 proc=0; void* q; uint32 q_length=0; void* dc; uint32 dc_length=0; void* ac; uint32 ac_length=0; uint16* lp; uint16* pt; uint16 h_samp=1; uint16 v_samp=1; unsigned char* ojpegdata; uint16 table_count; uint32 offset_table; uint32 offset_ms_l; uint32 code_count; uint32 i=0; uint32 dest=0; uint16 ri=0; uint32 rows=0; if(!TIFFGetField(input, TIFFTAG_JPEGPROC, &proc)){ TIFFError(TIFF2PDF_MODULE, "Missing JPEGProc field in OJPEG image %s", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } if(proc!=JPEGPROC_BASELINE && proc!=JPEGPROC_LOSSLESS){ TIFFError(TIFF2PDF_MODULE, "Bad JPEGProc field in OJPEG image %s", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } if(!TIFFGetField(input, TIFFTAG_JPEGQTABLES, &q_length, &q)){ TIFFError(TIFF2PDF_MODULE, "Missing JPEGQTables field in OJPEG image %s", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } if(q_length < (64U * t2p->tiff_samplesperpixel)){ TIFFError(TIFF2PDF_MODULE, "Bad JPEGQTables field in OJPEG image %s", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } if(!TIFFGetField(input, TIFFTAG_JPEGDCTABLES, &dc_length, &dc)){ TIFFError(TIFF2PDF_MODULE, "Missing JPEGDCTables field in OJPEG image %s", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } if(proc==JPEGPROC_BASELINE){ if(!TIFFGetField(input, TIFFTAG_JPEGACTABLES, &ac_length, &ac)){ TIFFError(TIFF2PDF_MODULE, "Missing JPEGACTables field in OJPEG image %s", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } } else { if(!TIFFGetField(input, TIFFTAG_JPEGLOSSLESSPREDICTORS, &lp)){ TIFFError(TIFF2PDF_MODULE, "Missing JPEGLosslessPredictors field in OJPEG image %s", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } if(!TIFFGetField(input, TIFFTAG_JPEGPOINTTRANSFORM, &pt)){ TIFFError(TIFF2PDF_MODULE, "Missing JPEGPointTransform field in OJPEG image %s", TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } } if(!TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &h_samp, &v_samp)){ h_samp=1; v_samp=1; } if(t2p->pdf_ojpegdata != NULL){ _TIFFfree(t2p->pdf_ojpegdata); t2p->pdf_ojpegdata=NULL; } t2p->pdf_ojpegdata = _TIFFmalloc(2048); if(t2p->pdf_ojpegdata == NULL){ TIFFError(TIFF2PDF_MODULE, "Can't allocate %u bytes of memory for t2p_process_ojpeg_tables, %s", 2048, TIFFFileName(input)); t2p->t2p_error = T2P_ERR_ERROR; return(0); } _TIFFmemset(t2p->pdf_ojpegdata, 0x00, 2048); t2p->pdf_ojpegdatalength = 0; table_count=t2p->tiff_samplesperpixel; if(proc==JPEGPROC_BASELINE){ if(table_count>2) table_count=2; } ojpegdata=(unsigned char*)t2p->pdf_ojpegdata; ojpegdata[t2p->pdf_ojpegdatalength++]=0xff; ojpegdata[t2p->pdf_ojpegdatalength++]=0xd8; ojpegdata[t2p->pdf_ojpegdatalength++]=0xff; if(proc==JPEGPROC_BASELINE){ ojpegdata[t2p->pdf_ojpegdatalength++]=0xc0; } else { ojpegdata[t2p->pdf_ojpegdatalength++]=0xc3; } ojpegdata[t2p->pdf_ojpegdatalength++]=0x00; ojpegdata[t2p->pdf_ojpegdatalength++]=(8 + 3*t2p->tiff_samplesperpixel); ojpegdata[t2p->pdf_ojpegdatalength++]=(t2p->tiff_bitspersample & 0xff); if(TIFFIsTiled(input)){ ojpegdata[t2p->pdf_ojpegdatalength++]= (t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength >> 8) & 0xff; ojpegdata[t2p->pdf_ojpegdatalength++]= (t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength ) & 0xff; ojpegdata[t2p->pdf_ojpegdatalength++]= (t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth >> 8) & 0xff; ojpegdata[t2p->pdf_ojpegdatalength++]= (t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth ) & 0xff; } else { ojpegdata[t2p->pdf_ojpegdatalength++]= (t2p->tiff_length >> 8) & 0xff; ojpegdata[t2p->pdf_ojpegdatalength++]= (t2p->tiff_length ) & 0xff; ojpegdata[t2p->pdf_ojpegdatalength++]= (t2p->tiff_width >> 8) & 0xff; ojpegdata[t2p->pdf_ojpegdatalength++]= (t2p->tiff_width ) & 0xff; } ojpegdata[t2p->pdf_ojpegdatalength++]=(t2p->tiff_samplesperpixel & 0xff); for(i=0;itiff_samplesperpixel;i++){ ojpegdata[t2p->pdf_ojpegdatalength++]=i; if(i==0){ ojpegdata[t2p->pdf_ojpegdatalength] |= h_samp<<4 & 0xf0;; ojpegdata[t2p->pdf_ojpegdatalength++] |= v_samp & 0x0f; } else { ojpegdata[t2p->pdf_ojpegdatalength++]= 0x11; } ojpegdata[t2p->pdf_ojpegdatalength++]=i; } for(dest=0;desttiff_samplesperpixel;dest++){ ojpegdata[t2p->pdf_ojpegdatalength++]=0xff; ojpegdata[t2p->pdf_ojpegdatalength++]=0xdb; ojpegdata[t2p->pdf_ojpegdatalength++]=0x00; ojpegdata[t2p->pdf_ojpegdatalength++]=0x43; ojpegdata[t2p->pdf_ojpegdatalength++]=dest; _TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength++]), &(((unsigned char*)q)[64*dest]), 64); t2p->pdf_ojpegdatalength+=64; } offset_table=0; for(dest=0;destpdf_ojpegdatalength++]=0xff; ojpegdata[t2p->pdf_ojpegdatalength++]=0xc4; offset_ms_l=t2p->pdf_ojpegdatalength; t2p->pdf_ojpegdatalength+=2; ojpegdata[t2p->pdf_ojpegdatalength++]=dest & 0x0f; _TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]), &(((unsigned char*)dc)[offset_table]), 16); code_count=0; offset_table+=16; for(i=0;i<16;i++){ code_count+=ojpegdata[t2p->pdf_ojpegdatalength++]; } ojpegdata[offset_ms_l]=((19+code_count)>>8) & 0xff; ojpegdata[offset_ms_l+1]=(19+code_count) & 0xff; _TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]), &(((unsigned char*)dc)[offset_table]), code_count); offset_table+=code_count; t2p->pdf_ojpegdatalength+=code_count; } if(proc==JPEGPROC_BASELINE){ offset_table=0; for(dest=0;destpdf_ojpegdatalength++]=0xff; ojpegdata[t2p->pdf_ojpegdatalength++]=0xc4; offset_ms_l=t2p->pdf_ojpegdatalength; t2p->pdf_ojpegdatalength+=2; ojpegdata[t2p->pdf_ojpegdatalength] |= 0x10; ojpegdata[t2p->pdf_ojpegdatalength++] |=dest & 0x0f; _TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]), &(((unsigned char*)ac)[offset_table]), 16); code_count=0; offset_table+=16; for(i=0;i<16;i++){ code_count+=ojpegdata[t2p->pdf_ojpegdatalength++]; } ojpegdata[offset_ms_l]=((19+code_count)>>8) & 0xff; ojpegdata[offset_ms_l+1]=(19+code_count) & 0xff; _TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]), &(((unsigned char*)ac)[offset_table]), code_count); offset_table+=code_count; t2p->pdf_ojpegdatalength+=code_count; } } if(TIFFNumberOfStrips(input)>1){ ojpegdata[t2p->pdf_ojpegdatalength++]=0xff; ojpegdata[t2p->pdf_ojpegdatalength++]=0xdd; ojpegdata[t2p->pdf_ojpegdatalength++]=0x00; ojpegdata[t2p->pdf_ojpegdatalength++]=0x04; h_samp*=8; v_samp*=8; ri=(t2p->tiff_width+h_samp-1) / h_samp; TIFFGetField(input, TIFFTAG_ROWSPERSTRIP, &rows); ri*=(rows+v_samp-1)/v_samp; ojpegdata[t2p->pdf_ojpegdatalength++]= (ri>>8) & 0xff; ojpegdata[t2p->pdf_ojpegdatalength++]= ri & 0xff; } ojpegdata[t2p->pdf_ojpegdatalength++]=0xff; ojpegdata[t2p->pdf_ojpegdatalength++]=0xda; ojpegdata[t2p->pdf_ojpegdatalength++]=0x00; ojpegdata[t2p->pdf_ojpegdatalength++]=(6 + 2*t2p->tiff_samplesperpixel); ojpegdata[t2p->pdf_ojpegdatalength++]=t2p->tiff_samplesperpixel & 0xff; for(i=0;itiff_samplesperpixel;i++){ ojpegdata[t2p->pdf_ojpegdatalength++]= i & 0xff; if(proc==JPEGPROC_BASELINE){ ojpegdata[t2p->pdf_ojpegdatalength] |= ( ( (i>(table_count-1U)) ? (table_count-1U) : i) << 4U) & 0xf0; ojpegdata[t2p->pdf_ojpegdatalength++] |= ( (i>(table_count-1U)) ? (table_count-1U) : i) & 0x0f; } else { ojpegdata[t2p->pdf_ojpegdatalength++] = (i << 4) & 0xf0; } } if(proc==JPEGPROC_BASELINE){ t2p->pdf_ojpegdatalength++; ojpegdata[t2p->pdf_ojpegdatalength++]=0x3f; t2p->pdf_ojpegdatalength++; } else { ojpegdata[t2p->pdf_ojpegdatalength++]= (lp[0] & 0xff); t2p->pdf_ojpegdatalength++; ojpegdata[t2p->pdf_ojpegdatalength++]= (pt[0] & 0x0f); } return(1); } #endif #ifdef JPEG_SUPPORT int t2p_process_jpeg_strip( unsigned char* strip, tsize_t* striplength, unsigned char* buffer, tsize_t* bufferoffset, tstrip_t no, uint32 height){ tsize_t i=0; uint16 ri =0; uint16 v_samp=1; uint16 h_samp=1; int j=0; i++; while(i<(*striplength)){ switch( strip[i] ){ case 0xd8: /* SOI - start of image */ _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), 2); *bufferoffset+=2; i+=2; break; case 0xc0: case 0xc1: case 0xc3: case 0xc9: case 0xca: if(no==0){ _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2); for(j=0;j>4) > h_samp) h_samp = (buffer[*bufferoffset+11+(2*j)]>>4); if( (buffer[*bufferoffset+11+(2*j)] & 0x0f) > v_samp) v_samp = (buffer[*bufferoffset+11+(2*j)] & 0x0f); } v_samp*=8; h_samp*=8; ri=((( ((uint16)(buffer[*bufferoffset+5])<<8) | (uint16)(buffer[*bufferoffset+6]) )+v_samp-1)/ v_samp); ri*=((( ((uint16)(buffer[*bufferoffset+7])<<8) | (uint16)(buffer[*bufferoffset+8]) )+h_samp-1)/ h_samp); buffer[*bufferoffset+5]= (unsigned char) ((height>>8) & 0xff); buffer[*bufferoffset+6]= (unsigned char) (height & 0xff); *bufferoffset+=strip[i+2]+2; i+=strip[i+2]+2; buffer[(*bufferoffset)++]=0xff; buffer[(*bufferoffset)++]=0xdd; buffer[(*bufferoffset)++]=0x00; buffer[(*bufferoffset)++]=0x04; buffer[(*bufferoffset)++]=(ri >> 8) & 0xff; buffer[(*bufferoffset)++]= ri & 0xff; } else { i+=strip[i+2]+2; } break; case 0xc4: case 0xdb: _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2); *bufferoffset+=strip[i+2]+2; i+=strip[i+2]+2; break; case 0xda: if(no==0){ _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2); *bufferoffset+=strip[i+2]+2; i+=strip[i+2]+2; } else { buffer[(*bufferoffset)++]=0xff; buffer[(*bufferoffset)++]= (unsigned char)(0xd0 | ((no-1)%8)); i+=strip[i+2]+2; } _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), (*striplength)-i-1); *bufferoffset+=(*striplength)-i-1; return(1); default: i+=strip[i+2]+2; } } return(0); } #endif /* This functions converts a tilewidth x tilelength buffer of samples into an edgetilewidth x tilelength buffer of samples. */ void t2p_tile_collapse_left( tdata_t buffer, tsize_t scanwidth, uint32 tilewidth, uint32 edgetilewidth, uint32 tilelength){ uint32 i; tsize_t edgescanwidth=0; edgescanwidth = (scanwidth * edgetilewidth + (tilewidth - 1))/ tilewidth; for(i=0;it2p_error = T2P_ERR_ERROR; return; } t2p_enable(output); return; } tsize_t t2p_sample_planar_separate_to_contig( T2P* t2p, unsigned char* buffer, unsigned char* samplebuffer, tsize_t samplebuffersize){ tsize_t stride=0; tsize_t i=0; tsize_t j=0; stride=samplebuffersize/t2p->tiff_samplesperpixel; for(i=0;itiff_samplesperpixel;j++){ buffer[i*t2p->tiff_samplesperpixel + j] = samplebuffer[i + j*stride]; } } return(samplebuffersize); } tsize_t t2p_sample_realize_palette(T2P* t2p, unsigned char* buffer){ uint32 sample_count=0; uint16 component_count=0; uint32 palette_offset=0; uint32 sample_offset=0; uint32 i=0; uint32 j=0; sample_count=t2p->tiff_width*t2p->tiff_length; component_count=t2p->tiff_samplesperpixel; for(i=sample_count;i>0;i--){ palette_offset=buffer[i-1] * component_count; sample_offset= (i-1) * component_count; for(j=0;jpdf_palette[palette_offset+j]; } } return(0); } /* This functions converts in place a buffer of ABGR interleaved data into RGB interleaved data, discarding A. */ tsize_t t2p_sample_abgr_to_rgb(tdata_t data, uint32 samplecount) { uint32 i=0; uint32 sample=0; for(i=0;i>8) & 0xff); ((char*)data)[i*3+2]= (char) ((sample>>16) & 0xff); } return(i*3); } /* * This functions converts in place a buffer of RGBA interleaved data * into RGB interleaved data, discarding A. */ tsize_t t2p_sample_rgbaa_to_rgb(tdata_t data, uint32 samplecount) { uint32 i; for(i = 0; i < samplecount; i++) memcpy((uint8*)data + i * 3, (uint8*)data + i * 4, 3); return(i * 3); } /* * This functions converts in place a buffer of RGBA interleaved data * into RGB interleaved data, adding 255-A to each component sample. */ tsize_t t2p_sample_rgba_to_rgb(tdata_t data, uint32 samplecount) { uint32 i = 0; uint32 sample = 0; uint8 alpha = 0; for (i = 0; i < samplecount; i++) { sample=((uint32*)data)[i]; alpha=(uint8)((255 - ((sample >> 24) & 0xff))); ((uint8 *)data)[i * 3] = (uint8) ((sample >> 16) & 0xff) + alpha; ((uint8 *)data)[i * 3 + 1] = (uint8) ((sample >> 8) & 0xff) + alpha; ((uint8 *)data)[i * 3 + 2] = (uint8) (sample & 0xff) + alpha; } return (i * 3); } /* This function converts the a and b samples of Lab data from signed to unsigned. */ tsize_t t2p_sample_lab_signed_to_unsigned(tdata_t buffer, uint32 samplecount){ uint32 i=0; for(i=0;ipdf_majorversion&0xff, t2p->pdf_minorversion&0xff); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t)"\n%\342\343\317\323\n", 7); return(written); } /* This function writes the beginning of a PDF object to output. */ tsize_t t2p_write_pdf_obj_start(uint32 number, TIFF* output){ tsize_t written=0; char buffer[16]; int buflen=0; buflen=sprintf(buffer, "%lu", (unsigned long)number); written += t2pWriteFile(output, (tdata_t) buffer, buflen ); written += t2pWriteFile(output, (tdata_t) " 0 obj\n", 7); return(written); } /* This function writes the end of a PDF object to output. */ tsize_t t2p_write_pdf_obj_end(TIFF* output){ tsize_t written=0; written += t2pWriteFile(output, (tdata_t) "endobj\n", 7); return(written); } /* This function writes a PDF name object to output. */ tsize_t t2p_write_pdf_name(unsigned char* name, TIFF* output){ tsize_t written=0; uint32 i=0; char buffer[64]; uint16 nextchar=0; size_t namelen=0; namelen = strlen((char *)name); if (namelen>126) { namelen=126; } written += t2pWriteFile(output, (tdata_t) "/", 1); for (i=0;i 0x7E){ sprintf(buffer, "#%.2X", name[i]); buffer[sizeof(buffer) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) buffer, 3); nextchar=1; } if (nextchar==0){ switch (name[i]){ case 0x23: sprintf(buffer, "#%.2X", name[i]); buffer[sizeof(buffer) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) buffer, 3); break; case 0x25: sprintf(buffer, "#%.2X", name[i]); buffer[sizeof(buffer) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) buffer, 3); break; case 0x28: sprintf(buffer, "#%.2X", name[i]); buffer[sizeof(buffer) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) buffer, 3); break; case 0x29: sprintf(buffer, "#%.2X", name[i]); buffer[sizeof(buffer) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) buffer, 3); break; case 0x2F: sprintf(buffer, "#%.2X", name[i]); buffer[sizeof(buffer) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) buffer, 3); break; case 0x3C: sprintf(buffer, "#%.2X", name[i]); buffer[sizeof(buffer) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) buffer, 3); break; case 0x3E: sprintf(buffer, "#%.2X", name[i]); buffer[sizeof(buffer) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) buffer, 3); break; case 0x5B: sprintf(buffer, "#%.2X", name[i]); buffer[sizeof(buffer) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) buffer, 3); break; case 0x5D: sprintf(buffer, "#%.2X", name[i]); buffer[sizeof(buffer) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) buffer, 3); break; case 0x7B: sprintf(buffer, "#%.2X", name[i]); buffer[sizeof(buffer) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) buffer, 3); break; case 0x7D: sprintf(buffer, "#%.2X", name[i]); buffer[sizeof(buffer) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) buffer, 3); break; default: written += t2pWriteFile(output, (tdata_t) &name[i], 1); } } nextchar=0; } written += t2pWriteFile(output, (tdata_t) " ", 1); return(written); } /* * This function writes a PDF string object to output. */ tsize_t t2p_write_pdf_string(char* pdfstr, TIFF* output) { tsize_t written = 0; uint32 i = 0; char buffer[64]; size_t len = 0; len = strlen(pdfstr); written += t2pWriteFile(output, (tdata_t) "(", 1); for (i=0; i>\n", 4); return(written); } /* This function writes a number to output. */ tsize_t t2p_write_pdf_stream_length(tsize_t len, TIFF* output){ tsize_t written=0; char buffer[16]; int buflen=0; buflen=sprintf(buffer, "%lu", (unsigned long)len); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) "\n", 1); return(written); } /* * This function writes the PDF Catalog structure to output. */ tsize_t t2p_write_pdf_catalog(T2P* t2p, TIFF* output) { tsize_t written = 0; char buffer[16]; int buflen = 0; written += t2pWriteFile(output, (tdata_t)"<< \n/Type /Catalog \n/Pages ", 27); buflen = snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_pages); written += t2pWriteFile(output, (tdata_t) buffer, TIFFmin((size_t)buflen, sizeof(buffer) - 1)); written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6); if(t2p->pdf_fitwindow){ written += t2pWriteFile(output, (tdata_t) "/ViewerPreferences <>\n", 39); } written += t2pWriteFile(output, (tdata_t)">>\n", 3); return(written); } /* This function writes the PDF Info structure to output. */ tsize_t t2p_write_pdf_info(T2P* t2p, TIFF* input, TIFF* output) { tsize_t written = 0; char* info; char buffer[512]; if(t2p->pdf_datetime[0] == '\0') t2p_pdf_tifftime(t2p, input); if (strlen(t2p->pdf_datetime) > 0) { written += t2pWriteFile(output, (tdata_t) "<< \n/CreationDate ", 18); written += t2p_write_pdf_string(t2p->pdf_datetime, output); written += t2pWriteFile(output, (tdata_t) "\n/ModDate ", 10); written += t2p_write_pdf_string(t2p->pdf_datetime, output); } written += t2pWriteFile(output, (tdata_t) "\n/Producer ", 11); _TIFFmemset((tdata_t)buffer, 0x00, sizeof(buffer)); snprintf(buffer, sizeof(buffer), "libtiff / tiff2pdf - %d", TIFFLIB_VERSION); written += t2p_write_pdf_string(buffer, output); written += t2pWriteFile(output, (tdata_t) "\n", 1); if (t2p->pdf_creator[0] != '\0') { written += t2pWriteFile(output, (tdata_t) "/Creator ", 9); written += t2p_write_pdf_string(t2p->pdf_creator, output); written += t2pWriteFile(output, (tdata_t) "\n", 1); } else { if (TIFFGetField(input, TIFFTAG_SOFTWARE, &info) != 0 && info) { if(strlen(info) >= sizeof(t2p->pdf_creator)) info[sizeof(t2p->pdf_creator) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) "/Creator ", 9); written += t2p_write_pdf_string(info, output); written += t2pWriteFile(output, (tdata_t) "\n", 1); } } if (t2p->pdf_author[0] != '\0') { written += t2pWriteFile(output, (tdata_t) "/Author ", 8); written += t2p_write_pdf_string(t2p->pdf_author, output); written += t2pWriteFile(output, (tdata_t) "\n", 1); } else { if ((TIFFGetField(input, TIFFTAG_ARTIST, &info) != 0 || TIFFGetField(input, TIFFTAG_COPYRIGHT, &info) != 0) && info) { if (strlen(info) >= sizeof(t2p->pdf_author)) info[sizeof(t2p->pdf_author) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) "/Author ", 8); written += t2p_write_pdf_string(info, output); written += t2pWriteFile(output, (tdata_t) "\n", 1); } } if (t2p->pdf_title[0] != '\0') { written += t2pWriteFile(output, (tdata_t) "/Title ", 7); written += t2p_write_pdf_string(t2p->pdf_title, output); written += t2pWriteFile(output, (tdata_t) "\n", 1); } else { if (TIFFGetField(input, TIFFTAG_DOCUMENTNAME, &info) != 0){ if(strlen(info) > 511) { info[512] = '\0'; } written += t2pWriteFile(output, (tdata_t) "/Title ", 7); written += t2p_write_pdf_string(info, output); written += t2pWriteFile(output, (tdata_t) "\n", 1); } } if (t2p->pdf_subject[0] != '\0') { written += t2pWriteFile(output, (tdata_t) "/Subject ", 9); written += t2p_write_pdf_string(t2p->pdf_subject, output); written += t2pWriteFile(output, (tdata_t) "\n", 1); } else { if (TIFFGetField(input, TIFFTAG_IMAGEDESCRIPTION, &info) != 0 && info) { if (strlen(info) >= sizeof(t2p->pdf_subject)) info[sizeof(t2p->pdf_subject) - 1] = '\0'; written += t2pWriteFile(output, (tdata_t) "/Subject ", 9); written += t2p_write_pdf_string(info, output); written += t2pWriteFile(output, (tdata_t) "\n", 1); } } if (t2p->pdf_keywords[0] != '\0') { written += t2pWriteFile(output, (tdata_t) "/Keywords ", 10); written += t2p_write_pdf_string(t2p->pdf_keywords, output); written += t2pWriteFile(output, (tdata_t) "\n", 1); } written += t2pWriteFile(output, (tdata_t) ">> \n", 4); return(written); } /* * This function fills a string of a T2P struct with the current time as a PDF * date string, it is called by t2p_pdf_tifftime. */ void t2p_pdf_currenttime(T2P* t2p) { struct tm* currenttime; time_t timenow; if (time(&timenow) == (time_t) -1) { TIFFError(TIFF2PDF_MODULE, "Can't get the current time: %s", strerror(errno)); timenow = (time_t) 0; } currenttime = localtime(&timenow); snprintf(t2p->pdf_datetime, sizeof(t2p->pdf_datetime), "D:%.4d%.2d%.2d%.2d%.2d%.2d", (currenttime->tm_year + 1900) % 65536, (currenttime->tm_mon + 1) % 256, (currenttime->tm_mday) % 256, (currenttime->tm_hour) % 256, (currenttime->tm_min) % 256, (currenttime->tm_sec) % 256); return; } /* * This function fills a string of a T2P struct with the date and time of a * TIFF file if it exists or the current time as a PDF date string. */ void t2p_pdf_tifftime(T2P* t2p, TIFF* input) { char* datetime; if (TIFFGetField(input, TIFFTAG_DATETIME, &datetime) != 0 && (strlen(datetime) >= 19) ){ t2p->pdf_datetime[0]='D'; t2p->pdf_datetime[1]=':'; t2p->pdf_datetime[2]=datetime[0]; t2p->pdf_datetime[3]=datetime[1]; t2p->pdf_datetime[4]=datetime[2]; t2p->pdf_datetime[5]=datetime[3]; t2p->pdf_datetime[6]=datetime[5]; t2p->pdf_datetime[7]=datetime[6]; t2p->pdf_datetime[8]=datetime[8]; t2p->pdf_datetime[9]=datetime[9]; t2p->pdf_datetime[10]=datetime[11]; t2p->pdf_datetime[11]=datetime[12]; t2p->pdf_datetime[12]=datetime[14]; t2p->pdf_datetime[13]=datetime[15]; t2p->pdf_datetime[14]=datetime[17]; t2p->pdf_datetime[15]=datetime[18]; t2p->pdf_datetime[16] = '\0'; } else { t2p_pdf_currenttime(t2p); } return; } /* * This function writes a PDF Pages Tree structure to output. */ tsize_t t2p_write_pdf_pages(T2P* t2p, TIFF* output) { tsize_t written=0; tdir_t i=0; char buffer[16]; int buflen=0; int page=0; written += t2pWriteFile(output, (tdata_t) "<< \n/Type /Pages \n/Kids [ ", 26); page = t2p->pdf_pages+1; for (i=0;itiff_pagecount;i++){ buflen=sprintf(buffer, "%d", page); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " 0 R ", 5); if ( ((i+1)%8)==0 ) { written += t2pWriteFile(output, (tdata_t) "\n", 1); } page +=3; page += t2p->tiff_pages[i].page_extra; if(t2p->tiff_pages[i].page_tilecount>0){ page += (2 * t2p->tiff_pages[i].page_tilecount); } else { page +=2; } } written += t2pWriteFile(output, (tdata_t) "] \n/Count ", 10); _TIFFmemset(buffer, 0x00, 16); buflen=sprintf(buffer, "%d", t2p->tiff_pagecount); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " \n>> \n", 6); return(written); } /* This function writes a PDF Page structure to output. */ tsize_t t2p_write_pdf_page(uint32 object, T2P* t2p, TIFF* output){ unsigned int i=0; tsize_t written=0; char buffer[16]; int buflen=0; written += t2pWriteFile(output, (tdata_t) "<<\n/Type /Page \n/Parent ", 24); buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_pages); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6); written += t2pWriteFile(output, (tdata_t) "/MediaBox [", 11); buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.x1); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " ", 1); buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.y1); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " ", 1); buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.x2); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " ", 1); buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.y2); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) "] \n", 3); written += t2pWriteFile(output, (tdata_t) "/Contents ", 10); buflen=sprintf(buffer, "%lu", (unsigned long)(object + 1)); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6); written += t2pWriteFile(output, (tdata_t) "/Resources << \n", 15); if( t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount != 0 ){ written += t2pWriteFile(output, (tdata_t) "/XObject <<\n", 12); for(i=0;itiff_tiles[t2p->pdf_page].tiles_tilecount;i++){ written += t2pWriteFile(output, (tdata_t) "/Im", 3); buflen = sprintf(buffer, "%u", t2p->pdf_page+1); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) "_", 1); buflen = sprintf(buffer, "%u", i+1); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " ", 1); buflen = sprintf( buffer, "%lu", (unsigned long)(object+3+(2*i)+t2p->tiff_pages[t2p->pdf_page].page_extra)); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " 0 R ", 5); if(i%4==3){ written += t2pWriteFile(output, (tdata_t) "\n", 1); } } written += t2pWriteFile(output, (tdata_t) ">>\n", 3); } else { written += t2pWriteFile(output, (tdata_t) "/XObject <<\n", 12); written += t2pWriteFile(output, (tdata_t) "/Im", 3); buflen = sprintf(buffer, "%u", t2p->pdf_page+1); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " ", 1); buflen = sprintf( buffer, "%lu", (unsigned long)(object+3+(2*i)+t2p->tiff_pages[t2p->pdf_page].page_extra)); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " 0 R ", 5); written += t2pWriteFile(output, (tdata_t) ">>\n", 3); } if(t2p->tiff_transferfunctioncount != 0) { written += t2pWriteFile(output, (tdata_t) "/ExtGState <<", 13); t2pWriteFile(output, (tdata_t) "/GS1 ", 5); buflen = sprintf( buffer, "%lu", (unsigned long)(object + 3)); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " 0 R ", 5); written += t2pWriteFile(output, (tdata_t) ">> \n", 4); } written += t2pWriteFile(output, (tdata_t) "/ProcSet [ ", 11); if(t2p->pdf_colorspace == T2P_CS_BILEVEL || t2p->pdf_colorspace == T2P_CS_GRAY ){ written += t2pWriteFile(output, (tdata_t) "/ImageB ", 8); } else { written += t2pWriteFile(output, (tdata_t) "/ImageC ", 8); if(t2p->pdf_colorspace & T2P_CS_PALETTE){ written += t2pWriteFile(output, (tdata_t) "/ImageI ", 8); } } written += t2pWriteFile(output, (tdata_t) "]\n>>\n>>\n", 8); return(written); } /* This function composes the page size and image and tile locations on a page. */ void t2p_compose_pdf_page(T2P* t2p){ uint32 i=0; uint32 i2=0; T2P_TILE* tiles=NULL; T2P_BOX* boxp=NULL; uint32 tilecountx=0; uint32 tilecounty=0; uint32 tilewidth=0; uint32 tilelength=0; int istiled=0; float f=0; float width_ratio=0; float length_ratio=0; t2p->pdf_xres = t2p->tiff_xres; t2p->pdf_yres = t2p->tiff_yres; if(t2p->pdf_overrideres) { t2p->pdf_xres = t2p->pdf_defaultxres; t2p->pdf_yres = t2p->pdf_defaultyres; } if(t2p->pdf_xres == 0.0) t2p->pdf_xres = t2p->pdf_defaultxres; if(t2p->pdf_yres == 0.0) t2p->pdf_yres = t2p->pdf_defaultyres; if (t2p->pdf_image_fillpage) { width_ratio = t2p->pdf_defaultpagewidth/t2p->tiff_width; length_ratio = t2p->pdf_defaultpagelength/t2p->tiff_length; if (width_ratio < length_ratio ) { t2p->pdf_imagewidth = t2p->pdf_defaultpagewidth; t2p->pdf_imagelength = t2p->tiff_length * width_ratio; } else { t2p->pdf_imagewidth = t2p->tiff_width * length_ratio; t2p->pdf_imagelength = t2p->pdf_defaultpagelength; } } else if (t2p->tiff_resunit != RESUNIT_CENTIMETER /* RESUNIT_NONE and */ && t2p->tiff_resunit != RESUNIT_INCH) { /* other cases */ t2p->pdf_imagewidth = ((float)(t2p->tiff_width))/t2p->pdf_xres; t2p->pdf_imagelength = ((float)(t2p->tiff_length))/t2p->pdf_yres; } else { t2p->pdf_imagewidth = ((float)(t2p->tiff_width))*PS_UNIT_SIZE/t2p->pdf_xres; t2p->pdf_imagelength = ((float)(t2p->tiff_length))*PS_UNIT_SIZE/t2p->pdf_yres; } if(t2p->pdf_overridepagesize != 0) { t2p->pdf_pagewidth = t2p->pdf_defaultpagewidth; t2p->pdf_pagelength = t2p->pdf_defaultpagelength; } else { t2p->pdf_pagewidth = t2p->pdf_imagewidth; t2p->pdf_pagelength = t2p->pdf_imagelength; } t2p->pdf_mediabox.x1=0.0; t2p->pdf_mediabox.y1=0.0; t2p->pdf_mediabox.x2=t2p->pdf_pagewidth; t2p->pdf_mediabox.y2=t2p->pdf_pagelength; t2p->pdf_imagebox.x1=0.0; t2p->pdf_imagebox.y1=0.0; t2p->pdf_imagebox.x2=t2p->pdf_imagewidth; t2p->pdf_imagebox.y2=t2p->pdf_imagelength; if(t2p->pdf_overridepagesize!=0){ t2p->pdf_imagebox.x1+=((t2p->pdf_pagewidth-t2p->pdf_imagewidth)/2.0F); t2p->pdf_imagebox.y1+=((t2p->pdf_pagelength-t2p->pdf_imagelength)/2.0F); t2p->pdf_imagebox.x2+=((t2p->pdf_pagewidth-t2p->pdf_imagewidth)/2.0F); t2p->pdf_imagebox.y2+=((t2p->pdf_pagelength-t2p->pdf_imagelength)/2.0F); } if(t2p->tiff_orientation > 4){ f=t2p->pdf_mediabox.x2; t2p->pdf_mediabox.x2=t2p->pdf_mediabox.y2; t2p->pdf_mediabox.y2=f; } istiled=((t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecount==0) ? 0 : 1; if(istiled==0){ t2p_compose_pdf_page_orient(&(t2p->pdf_imagebox), t2p->tiff_orientation); return; } else { tilewidth=(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilewidth; tilelength=(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilelength; tilecountx=(t2p->tiff_width + tilewidth -1)/ tilewidth; (t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecountx=tilecountx; tilecounty=(t2p->tiff_length + tilelength -1)/ tilelength; (t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecounty=tilecounty; (t2p->tiff_tiles[t2p->pdf_page]).tiles_edgetilewidth= t2p->tiff_width % tilewidth; (t2p->tiff_tiles[t2p->pdf_page]).tiles_edgetilelength= t2p->tiff_length % tilelength; tiles=(t2p->tiff_tiles[t2p->pdf_page]).tiles_tiles; for(i2=0;i2x1 = t2p->pdf_imagebox.x1 + ((float)(t2p->pdf_imagewidth * i * tilewidth) / (float)t2p->tiff_width); boxp->x2 = t2p->pdf_imagebox.x1 + ((float)(t2p->pdf_imagewidth * (i+1) * tilewidth) / (float)t2p->tiff_width); boxp->y1 = t2p->pdf_imagebox.y2 - ((float)(t2p->pdf_imagelength * (i2+1) * tilelength) / (float)t2p->tiff_length); boxp->y2 = t2p->pdf_imagebox.y2 - ((float)(t2p->pdf_imagelength * i2 * tilelength) / (float)t2p->tiff_length); } boxp=&(tiles[i2*tilecountx+i].tile_box); boxp->x1 = t2p->pdf_imagebox.x1 + ((float)(t2p->pdf_imagewidth * i * tilewidth) / (float)t2p->tiff_width); boxp->x2 = t2p->pdf_imagebox.x2; boxp->y1 = t2p->pdf_imagebox.y2 - ((float)(t2p->pdf_imagelength * (i2+1) * tilelength) / (float)t2p->tiff_length); boxp->y2 = t2p->pdf_imagebox.y2 - ((float)(t2p->pdf_imagelength * i2 * tilelength) / (float)t2p->tiff_length); } for(i=0;ix1 = t2p->pdf_imagebox.x1 + ((float)(t2p->pdf_imagewidth * i * tilewidth) / (float)t2p->tiff_width); boxp->x2 = t2p->pdf_imagebox.x1 + ((float)(t2p->pdf_imagewidth * (i+1) * tilewidth) / (float)t2p->tiff_width); boxp->y1 = t2p->pdf_imagebox.y1; boxp->y2 = t2p->pdf_imagebox.y2 - ((float)(t2p->pdf_imagelength * i2 * tilelength) / (float)t2p->tiff_length); } boxp=&(tiles[i2*tilecountx+i].tile_box); boxp->x1 = t2p->pdf_imagebox.x1 + ((float)(t2p->pdf_imagewidth * i * tilewidth) / (float)t2p->tiff_width); boxp->x2 = t2p->pdf_imagebox.x2; boxp->y1 = t2p->pdf_imagebox.y1; boxp->y2 = t2p->pdf_imagebox.y2 - ((float)(t2p->pdf_imagelength * i2 * tilelength) / (float)t2p->tiff_length); } if(t2p->tiff_orientation==0 || t2p->tiff_orientation==1){ for(i=0;i<(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecount;i++){ t2p_compose_pdf_page_orient( &(tiles[i].tile_box) , 0); } return; } for(i=0;i<(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecount;i++){ boxp=&(tiles[i].tile_box); boxp->x1 -= t2p->pdf_imagebox.x1; boxp->x2 -= t2p->pdf_imagebox.x1; boxp->y1 -= t2p->pdf_imagebox.y1; boxp->y2 -= t2p->pdf_imagebox.y1; if(t2p->tiff_orientation==2 || t2p->tiff_orientation==3){ boxp->x1 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x1; boxp->x2 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x2; } if(t2p->tiff_orientation==3 || t2p->tiff_orientation==4){ boxp->y1 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y1; boxp->y2 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y2; } if(t2p->tiff_orientation==8 || t2p->tiff_orientation==5){ boxp->y1 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y1; boxp->y2 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y2; } if(t2p->tiff_orientation==5 || t2p->tiff_orientation==6){ boxp->x1 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x1; boxp->x2 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x2; } if(t2p->tiff_orientation > 4){ f=boxp->x1; boxp->x1 = boxp->y1; boxp->y1 = f; f=boxp->x2; boxp->x2 = boxp->y2; boxp->y2 = f; t2p_compose_pdf_page_orient_flip(boxp, t2p->tiff_orientation); } else { t2p_compose_pdf_page_orient(boxp, t2p->tiff_orientation); } } return; } void t2p_compose_pdf_page_orient(T2P_BOX* boxp, uint16 orientation){ float m1[9]; float f=0.0; if( boxp->x1 > boxp->x2){ f=boxp->x1; boxp->x1=boxp->x2; boxp->x2 = f; } if( boxp->y1 > boxp->y2){ f=boxp->y1; boxp->y1=boxp->y2; boxp->y2 = f; } boxp->mat[0]=m1[0]=boxp->x2-boxp->x1; boxp->mat[1]=m1[1]=0.0; boxp->mat[2]=m1[2]=0.0; boxp->mat[3]=m1[3]=0.0; boxp->mat[4]=m1[4]=boxp->y2-boxp->y1; boxp->mat[5]=m1[5]=0.0; boxp->mat[6]=m1[6]=boxp->x1; boxp->mat[7]=m1[7]=boxp->y1; boxp->mat[8]=m1[8]=1.0; switch(orientation){ case 0: case 1: break; case 2: boxp->mat[0]=0.0F-m1[0]; boxp->mat[6]+=m1[0]; break; case 3: boxp->mat[0]=0.0F-m1[0]; boxp->mat[4]=0.0F-m1[4]; boxp->mat[6]+=m1[0]; boxp->mat[7]+=m1[4]; break; case 4: boxp->mat[4]=0.0F-m1[4]; boxp->mat[7]+=m1[4]; break; case 5: boxp->mat[0]=0.0F; boxp->mat[1]=0.0F-m1[0]; boxp->mat[3]=0.0F-m1[4]; boxp->mat[4]=0.0F; boxp->mat[6]+=m1[4]; boxp->mat[7]+=m1[0]; break; case 6: boxp->mat[0]=0.0F; boxp->mat[1]=0.0F-m1[0]; boxp->mat[3]=m1[4]; boxp->mat[4]=0.0F; boxp->mat[7]+=m1[0]; break; case 7: boxp->mat[0]=0.0F; boxp->mat[1]=m1[0]; boxp->mat[3]=m1[4]; boxp->mat[4]=0.0F; break; case 8: boxp->mat[0]=0.0F; boxp->mat[1]=m1[0]; boxp->mat[3]=0.0F-m1[4]; boxp->mat[4]=0.0F; boxp->mat[6]+=m1[4]; break; } return; } void t2p_compose_pdf_page_orient_flip(T2P_BOX* boxp, uint16 orientation){ float m1[9]; float f=0.0; if( boxp->x1 > boxp->x2){ f=boxp->x1; boxp->x1=boxp->x2; boxp->x2 = f; } if( boxp->y1 > boxp->y2){ f=boxp->y1; boxp->y1=boxp->y2; boxp->y2 = f; } boxp->mat[0]=m1[0]=boxp->x2-boxp->x1; boxp->mat[1]=m1[1]=0.0F; boxp->mat[2]=m1[2]=0.0F; boxp->mat[3]=m1[3]=0.0F; boxp->mat[4]=m1[4]=boxp->y2-boxp->y1; boxp->mat[5]=m1[5]=0.0F; boxp->mat[6]=m1[6]=boxp->x1; boxp->mat[7]=m1[7]=boxp->y1; boxp->mat[8]=m1[8]=1.0F; switch(orientation){ case 5: boxp->mat[0]=0.0F; boxp->mat[1]=0.0F-m1[4]; boxp->mat[3]=0.0F-m1[0]; boxp->mat[4]=0.0F; boxp->mat[6]+=m1[0]; boxp->mat[7]+=m1[4]; break; case 6: boxp->mat[0]=0.0F; boxp->mat[1]=0.0F-m1[4]; boxp->mat[3]=m1[0]; boxp->mat[4]=0.0F; boxp->mat[7]+=m1[4]; break; case 7: boxp->mat[0]=0.0F; boxp->mat[1]=m1[4]; boxp->mat[3]=m1[0]; boxp->mat[4]=0.0F; break; case 8: boxp->mat[0]=0.0F; boxp->mat[1]=m1[4]; boxp->mat[3]=0.0F-m1[0]; boxp->mat[4]=0.0F; boxp->mat[6]+=m1[0]; break; } return; } /* This function writes a PDF Contents stream to output. */ tsize_t t2p_write_pdf_page_content_stream(T2P* t2p, TIFF* output){ tsize_t written=0; ttile_t i=0; char buffer[512]; int buflen=0; T2P_BOX box; if(t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount>0){ for(i=0;itiff_tiles[t2p->pdf_page].tiles_tilecount; i++){ box=t2p->tiff_tiles[t2p->pdf_page].tiles_tiles[i].tile_box; buflen=sprintf(buffer, "q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d_%ld Do Q\n", t2p->tiff_transferfunctioncount?"/GS1 gs ":"", box.mat[0], box.mat[1], box.mat[3], box.mat[4], box.mat[6], box.mat[7], t2p->pdf_page + 1, (long)(i + 1)); written += t2p_write_pdf_stream(buffer, buflen, output); } } else { box=t2p->pdf_imagebox; buflen=sprintf(buffer, "q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d Do Q\n", t2p->tiff_transferfunctioncount?"/GS1 gs ":"", box.mat[0], box.mat[1], box.mat[3], box.mat[4], box.mat[6], box.mat[7], t2p->pdf_page+1); written += t2p_write_pdf_stream(buffer, buflen, output); } return(written); } /* This function writes a PDF Image XObject stream dictionary to output. */ tsize_t t2p_write_pdf_xobject_stream_dict(ttile_t tile, T2P* t2p, TIFF* output){ tsize_t written=0; char buffer[16]; int buflen=0; written += t2p_write_pdf_stream_dict(0, t2p->pdf_xrefcount+1, output); written += t2pWriteFile(output, (tdata_t) "/Type /XObject \n/Subtype /Image \n/Name /Im", 42); buflen=sprintf(buffer, "%u", t2p->pdf_page+1); written += t2pWriteFile(output, (tdata_t) buffer, buflen); if(tile != 0){ written += t2pWriteFile(output, (tdata_t) "_", 1); buflen=sprintf(buffer, "%lu", (unsigned long)tile); written += t2pWriteFile(output, (tdata_t) buffer, buflen); } written += t2pWriteFile(output, (tdata_t) "\n/Width ", 8); _TIFFmemset((tdata_t)buffer, 0x00, 16); if(tile==0){ buflen=sprintf(buffer, "%lu", (unsigned long)t2p->tiff_width); } else { if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)!=0){ buflen=sprintf( buffer, "%lu", (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth); } else { buflen=sprintf( buffer, "%lu", (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth); } } written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) "\n/Height ", 9); _TIFFmemset((tdata_t)buffer, 0x00, 16); if(tile==0){ buflen=sprintf(buffer, "%lu", (unsigned long)t2p->tiff_length); } else { if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)!=0){ buflen=sprintf( buffer, "%lu", (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength); } else { buflen=sprintf( buffer, "%lu", (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength); } } written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) "\n/BitsPerComponent ", 19); _TIFFmemset((tdata_t)buffer, 0x00, 16); buflen=sprintf(buffer, "%u", t2p->tiff_bitspersample); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) "\n/ColorSpace ", 13); written += t2p_write_pdf_xobject_cs(t2p, output); if (t2p->pdf_image_interpolate) written += t2pWriteFile(output, (tdata_t) "\n/Interpolate true", 18); if( (t2p->pdf_switchdecode != 0) #ifdef CCITT_SUPPORT && ! (t2p->pdf_colorspace == T2P_CS_BILEVEL && t2p->pdf_compression == T2P_COMPRESS_G4) #endif ){ written += t2p_write_pdf_xobject_decode(t2p, output); } written += t2p_write_pdf_xobject_stream_filter(tile, t2p, output); return(written); } /* * This function writes a PDF Image XObject Colorspace name to output. */ tsize_t t2p_write_pdf_xobject_cs(T2P* t2p, TIFF* output){ tsize_t written=0; char buffer[128]; int buflen=0; float X_W=1.0; float Y_W=1.0; float Z_W=1.0; if( (t2p->pdf_colorspace & T2P_CS_ICCBASED) != 0){ written += t2p_write_pdf_xobject_icccs(t2p, output); return(written); } if( (t2p->pdf_colorspace & T2P_CS_PALETTE) != 0){ written += t2pWriteFile(output, (tdata_t) "[ /Indexed ", 11); t2p->pdf_colorspace ^= T2P_CS_PALETTE; written += t2p_write_pdf_xobject_cs(t2p, output); t2p->pdf_colorspace |= T2P_CS_PALETTE; buflen=sprintf(buffer, "%u", (0x0001 << t2p->tiff_bitspersample)-1 ); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " ", 1); _TIFFmemset(buffer, 0x00, 16); buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_palettecs ); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " 0 R ]\n", 7); return(written); } if(t2p->pdf_colorspace & T2P_CS_BILEVEL){ written += t2pWriteFile(output, (tdata_t) "/DeviceGray \n", 13); } if(t2p->pdf_colorspace & T2P_CS_GRAY){ if(t2p->pdf_colorspace & T2P_CS_CALGRAY){ written += t2p_write_pdf_xobject_calcs(t2p, output); } else { written += t2pWriteFile(output, (tdata_t) "/DeviceGray \n", 13); } } if(t2p->pdf_colorspace & T2P_CS_RGB){ if(t2p->pdf_colorspace & T2P_CS_CALRGB){ written += t2p_write_pdf_xobject_calcs(t2p, output); } else { written += t2pWriteFile(output, (tdata_t) "/DeviceRGB \n", 12); } } if(t2p->pdf_colorspace & T2P_CS_CMYK){ written += t2pWriteFile(output, (tdata_t) "/DeviceCMYK \n", 13); } if(t2p->pdf_colorspace & T2P_CS_LAB){ written += t2pWriteFile(output, (tdata_t) "[/Lab << \n", 10); written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12); X_W = t2p->tiff_whitechromaticities[0]; Y_W = t2p->tiff_whitechromaticities[1]; Z_W = 1.0F - (X_W + Y_W); X_W /= Y_W; Z_W /= Y_W; Y_W = 1.0F; buflen=sprintf(buffer, "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) "/Range ", 7); buflen=sprintf(buffer, "[%d %d %d %d] \n", t2p->pdf_labrange[0], t2p->pdf_labrange[1], t2p->pdf_labrange[2], t2p->pdf_labrange[3]); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) ">>] \n", 5); } return(written); } tsize_t t2p_write_pdf_transfer(T2P* t2p, TIFF* output){ tsize_t written=0; char buffer[16]; int buflen=0; written += t2pWriteFile(output, (tdata_t) "<< /Type /ExtGState \n/TR ", 25); if(t2p->tiff_transferfunctioncount == 1){ buflen=sprintf(buffer, "%lu", (unsigned long)(t2p->pdf_xrefcount + 1)); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " 0 R ", 5); } else { written += t2pWriteFile(output, (tdata_t) "[ ", 2); buflen=sprintf(buffer, "%lu", (unsigned long)(t2p->pdf_xrefcount + 1)); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " 0 R ", 5); buflen=sprintf(buffer, "%lu", (unsigned long)(t2p->pdf_xrefcount + 2)); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " 0 R ", 5); buflen=sprintf(buffer, "%lu", (unsigned long)(t2p->pdf_xrefcount + 3)); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " 0 R ", 5); written += t2pWriteFile(output, (tdata_t) "/Identity ] ", 12); } written += t2pWriteFile(output, (tdata_t) " >> \n", 5); return(written); } tsize_t t2p_write_pdf_transfer_dict(T2P* t2p, TIFF* output, uint16 i){ tsize_t written=0; char buffer[32]; int buflen=0; (void)i; /* XXX */ written += t2pWriteFile(output, (tdata_t) "/FunctionType 0 \n", 17); written += t2pWriteFile(output, (tdata_t) "/Domain [0.0 1.0] \n", 19); written += t2pWriteFile(output, (tdata_t) "/Range [0.0 1.0] \n", 18); buflen=sprintf(buffer, "/Size [%u] \n", (1<tiff_bitspersample)); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) "/BitsPerSample 16 \n", 19); written += t2p_write_pdf_stream_dict(((tsize_t)1)<<(t2p->tiff_bitspersample+1), 0, output); return(written); } tsize_t t2p_write_pdf_transfer_stream(T2P* t2p, TIFF* output, uint16 i){ tsize_t written=0; written += t2p_write_pdf_stream( t2p->tiff_transferfunction[i], (((tsize_t)1)<<(t2p->tiff_bitspersample+1)), output); return(written); } /* This function writes a PDF Image XObject Colorspace array to output. */ tsize_t t2p_write_pdf_xobject_calcs(T2P* t2p, TIFF* output){ tsize_t written=0; char buffer[128]; int buflen=0; float X_W=0.0; float Y_W=0.0; float Z_W=0.0; float X_R=0.0; float Y_R=0.0; float Z_R=0.0; float X_G=0.0; float Y_G=0.0; float Z_G=0.0; float X_B=0.0; float Y_B=0.0; float Z_B=0.0; float x_w=0.0; float y_w=0.0; float z_w=0.0; float x_r=0.0; float y_r=0.0; float x_g=0.0; float y_g=0.0; float x_b=0.0; float y_b=0.0; float R=1.0; float G=1.0; float B=1.0; written += t2pWriteFile(output, (tdata_t) "[", 1); if(t2p->pdf_colorspace & T2P_CS_CALGRAY){ written += t2pWriteFile(output, (tdata_t) "/CalGray ", 9); X_W = t2p->tiff_whitechromaticities[0]; Y_W = t2p->tiff_whitechromaticities[1]; Z_W = 1.0F - (X_W + Y_W); X_W /= Y_W; Z_W /= Y_W; Y_W = 1.0F; } if(t2p->pdf_colorspace & T2P_CS_CALRGB){ written += t2pWriteFile(output, (tdata_t) "/CalRGB ", 8); x_w = t2p->tiff_whitechromaticities[0]; y_w = t2p->tiff_whitechromaticities[1]; x_r = t2p->tiff_primarychromaticities[0]; y_r = t2p->tiff_primarychromaticities[1]; x_g = t2p->tiff_primarychromaticities[2]; y_g = t2p->tiff_primarychromaticities[3]; x_b = t2p->tiff_primarychromaticities[4]; y_b = t2p->tiff_primarychromaticities[5]; z_w = y_w * ((x_g - x_b)*y_r - (x_r-x_b)*y_g + (x_r-x_g)*y_b); Y_R = (y_r/R) * ((x_g-x_b)*y_w - (x_w-x_b)*y_g + (x_w-x_g)*y_b) / z_w; X_R = Y_R * x_r / y_r; Z_R = Y_R * (((1-x_r)/y_r)-1); Y_G = ((0.0F-(y_g))/G) * ((x_r-x_b)*y_w - (x_w-x_b)*y_r + (x_w-x_r)*y_b) / z_w; X_G = Y_G * x_g / y_g; Z_G = Y_G * (((1-x_g)/y_g)-1); Y_B = (y_b/B) * ((x_r-x_g)*y_w - (x_w-x_g)*y_r + (x_w-x_r)*y_g) / z_w; X_B = Y_B * x_b / y_b; Z_B = Y_B * (((1-x_b)/y_b)-1); X_W = (X_R * R) + (X_G * G) + (X_B * B); Y_W = (Y_R * R) + (Y_G * G) + (Y_B * B); Z_W = (Z_R * R) + (Z_G * G) + (Z_B * B); X_W /= Y_W; Z_W /= Y_W; Y_W = 1.0; } written += t2pWriteFile(output, (tdata_t) "<< \n", 4); if(t2p->pdf_colorspace & T2P_CS_CALGRAY){ written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12); buflen=sprintf(buffer, "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) "/Gamma 2.2 \n", 12); } if(t2p->pdf_colorspace & T2P_CS_CALRGB){ written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12); buflen=sprintf(buffer, "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) "/Matrix ", 8); buflen=sprintf(buffer, "[%.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f] \n", X_R, Y_R, Z_R, X_G, Y_G, Z_G, X_B, Y_B, Z_B); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) "/Gamma [2.2 2.2 2.2] \n", 22); } written += t2pWriteFile(output, (tdata_t) ">>] \n", 5); return(written); } /* This function writes a PDF Image XObject Colorspace array to output. */ tsize_t t2p_write_pdf_xobject_icccs(T2P* t2p, TIFF* output){ tsize_t written=0; char buffer[16]; int buflen=0; written += t2pWriteFile(output, (tdata_t) "[/ICCBased ", 11); buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_icccs); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " 0 R] \n", 7); return(written); } tsize_t t2p_write_pdf_xobject_icccs_dict(T2P* t2p, TIFF* output){ tsize_t written=0; char buffer[16]; int buflen=0; written += t2pWriteFile(output, (tdata_t) "/N ", 3); buflen=sprintf(buffer, "%u \n", t2p->tiff_samplesperpixel); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) "/Alternate ", 11); t2p->pdf_colorspace ^= T2P_CS_ICCBASED; written += t2p_write_pdf_xobject_cs(t2p, output); t2p->pdf_colorspace |= T2P_CS_ICCBASED; written += t2p_write_pdf_stream_dict(t2p->tiff_iccprofilelength, 0, output); return(written); } tsize_t t2p_write_pdf_xobject_icccs_stream(T2P* t2p, TIFF* output){ tsize_t written=0; written += t2p_write_pdf_stream( (tdata_t) t2p->tiff_iccprofile, (tsize_t) t2p->tiff_iccprofilelength, output); return(written); } /* This function writes a palette stream for an indexed color space to output. */ tsize_t t2p_write_pdf_xobject_palettecs_stream(T2P* t2p, TIFF* output){ tsize_t written=0; written += t2p_write_pdf_stream( (tdata_t) t2p->pdf_palette, (tsize_t) t2p->pdf_palettesize, output); return(written); } /* This function writes a PDF Image XObject Decode array to output. */ tsize_t t2p_write_pdf_xobject_decode(T2P* t2p, TIFF* output){ tsize_t written=0; int i=0; written += t2pWriteFile(output, (tdata_t) "/Decode [ ", 10); for (i=0;itiff_samplesperpixel;i++){ written += t2pWriteFile(output, (tdata_t) "1 0 ", 4); } written += t2pWriteFile(output, (tdata_t) "]\n", 2); return(written); } /* This function writes a PDF Image XObject stream filter name and parameters to output. */ tsize_t t2p_write_pdf_xobject_stream_filter(ttile_t tile, T2P* t2p, TIFF* output){ tsize_t written=0; char buffer[16]; int buflen=0; if(t2p->pdf_compression==T2P_COMPRESS_NONE){ return(written); } written += t2pWriteFile(output, (tdata_t) "/Filter ", 8); switch(t2p->pdf_compression){ #ifdef CCITT_SUPPORT case T2P_COMPRESS_G4: written += t2pWriteFile(output, (tdata_t) "/CCITTFaxDecode ", 16); written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13); written += t2pWriteFile(output, (tdata_t) "<< /K -1 ", 9); if(tile==0){ written += t2pWriteFile(output, (tdata_t) "/Columns ", 9); buflen=sprintf(buffer, "%lu", (unsigned long)t2p->tiff_width); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " /Rows ", 7); buflen=sprintf(buffer, "%lu", (unsigned long)t2p->tiff_length); written += t2pWriteFile(output, (tdata_t) buffer, buflen); } else { if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)==0){ written += t2pWriteFile(output, (tdata_t) "/Columns ", 9); buflen=sprintf( buffer, "%lu", (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth); written += t2pWriteFile(output, (tdata_t) buffer, buflen); } else { written += t2pWriteFile(output, (tdata_t) "/Columns ", 9); buflen=sprintf( buffer, "%lu", (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth); written += t2pWriteFile(output, (tdata_t) buffer, buflen); } if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)==0){ written += t2pWriteFile(output, (tdata_t) " /Rows ", 7); buflen=sprintf( buffer, "%lu", (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength); written += t2pWriteFile(output, (tdata_t) buffer, buflen); } else { written += t2pWriteFile(output, (tdata_t) " /Rows ", 7); buflen=sprintf( buffer, "%lu", (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength); written += t2pWriteFile(output, (tdata_t) buffer, buflen); } } if(t2p->pdf_switchdecode == 0){ written += t2pWriteFile(output, (tdata_t) " /BlackIs1 true ", 16); } written += t2pWriteFile(output, (tdata_t) ">>\n", 3); break; #endif #ifdef JPEG_SUPPORT case T2P_COMPRESS_JPEG: written += t2pWriteFile(output, (tdata_t) "/DCTDecode ", 11); if(t2p->tiff_photometric != PHOTOMETRIC_YCBCR) { written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13); written += t2pWriteFile(output, (tdata_t) "<< /ColorTransform 0 >>\n", 24); } break; #endif #ifdef ZIP_SUPPORT case T2P_COMPRESS_ZIP: written += t2pWriteFile(output, (tdata_t) "/FlateDecode ", 13); if(t2p->pdf_compressionquality%100){ written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13); written += t2pWriteFile(output, (tdata_t) "<< /Predictor ", 14); _TIFFmemset(buffer, 0x00, 16); buflen=sprintf(buffer, "%u", t2p->pdf_compressionquality%100); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " /Columns ", 10); _TIFFmemset(buffer, 0x00, 16); buflen = sprintf(buffer, "%lu", (unsigned long)t2p->tiff_width); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " /Colors ", 9); _TIFFmemset(buffer, 0x00, 16); buflen=sprintf(buffer, "%u", t2p->tiff_samplesperpixel); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " /BitsPerComponent ", 19); _TIFFmemset(buffer, 0x00, 16); buflen=sprintf(buffer, "%u", t2p->tiff_bitspersample); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) ">>\n", 3); } break; #endif default: break; } return(written); } /* This function writes a PDF xref table to output. */ tsize_t t2p_write_pdf_xreftable(T2P* t2p, TIFF* output){ tsize_t written=0; char buffer[21]; int buflen=0; uint32 i=0; written += t2pWriteFile(output, (tdata_t) "xref\n0 ", 7); buflen=sprintf(buffer, "%lu", (unsigned long)(t2p->pdf_xrefcount + 1)); written += t2pWriteFile(output, (tdata_t) buffer, buflen); written += t2pWriteFile(output, (tdata_t) " \n0000000000 65535 f \n", 22); for (i=0;ipdf_xrefcount;i++){ sprintf(buffer, "%.10lu 00000 n \n", (unsigned long)t2p->pdf_xrefoffsets[i]); written += t2pWriteFile(output, (tdata_t) buffer, 20); } return(written); } /* * This function writes a PDF trailer to output. */ tsize_t t2p_write_pdf_trailer(T2P* t2p, TIFF* output) { tsize_t written = 0; char buffer[32]; int buflen = 0; size_t i = 0; for (i = 0; i < sizeof(t2p->pdf_fileid) - 8; i += 8) snprintf(t2p->pdf_fileid + i, 9, "%.8X", rand()); written += t2pWriteFile(output, (tdata_t) "trailer\n<<\n/Size ", 17); buflen = sprintf(buffer, "%lu", (unsigned long)(t2p->pdf_xrefcount+1)); written += t2pWriteFile(output, (tdata_t) buffer, buflen); _TIFFmemset(buffer, 0x00, 32); written += t2pWriteFile(output, (tdata_t) "\n/Root ", 7); buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_catalog); written += t2pWriteFile(output, (tdata_t) buffer, buflen); _TIFFmemset(buffer, 0x00, 32); written += t2pWriteFile(output, (tdata_t) " 0 R \n/Info ", 12); buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_info); written += t2pWriteFile(output, (tdata_t) buffer, buflen); _TIFFmemset(buffer, 0x00, 32); written += t2pWriteFile(output, (tdata_t) " 0 R \n/ID[<", 11); written += t2pWriteFile(output, (tdata_t) t2p->pdf_fileid, sizeof(t2p->pdf_fileid) - 1); written += t2pWriteFile(output, (tdata_t) "><", 2); written += t2pWriteFile(output, (tdata_t) t2p->pdf_fileid, sizeof(t2p->pdf_fileid) - 1); written += t2pWriteFile(output, (tdata_t) ">]\n>>\nstartxref\n", 16); buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_startxref); written += t2pWriteFile(output, (tdata_t) buffer, buflen); _TIFFmemset(buffer, 0x00, 32); written += t2pWriteFile(output, (tdata_t) "\n%%EOF\n", 7); return(written); } /* This function writes a PDF to a file given a pointer to a TIFF. The idea with using a TIFF* as output for a PDF file is that the file can be created with TIFFClientOpen for memory-mapped use within the TIFF library, and TIFFWriteEncodedStrip can be used to write compressed data to the output. The output is not actually a TIFF file, it is a PDF file. This function uses only t2pWriteFile and TIFFWriteEncodedStrip to write to the output TIFF file. When libtiff would otherwise be writing data to the output file, the write procedure of the TIFF structure is replaced with an empty implementation. The first argument to the function is an initialized and validated T2P context struct pointer. The second argument to the function is the TIFF* that is the input that has been opened for reading and no other functions have been called upon it. The third argument to the function is the TIFF* that is the output that has been opened for writing. It has to be opened so that it hasn't written any data to the output. If the output is seekable then it's OK to seek to the beginning of the file. The function only writes to the output PDF and does not seek. See the example usage in the main() function. TIFF* output = TIFFOpen("output.pdf", "w"); assert(output != NULL); if(output->tif_seekproc != NULL){ t2pSeekFile(output, (toff_t) 0, SEEK_SET); } This function returns the file size of the output PDF file. On error it returns zero and the t2p->t2p_error variable is set to T2P_ERR_ERROR. After this function completes, call t2p_free on t2p, TIFFClose on input, and TIFFClose on output. */ tsize_t t2p_write_pdf(T2P* t2p, TIFF* input, TIFF* output){ tsize_t written=0; ttile_t i2=0; tsize_t streamlen=0; uint16 i=0; t2p_read_tiff_init(t2p, input); if(t2p->t2p_error!=T2P_ERR_OK){return(0);} t2p->pdf_xrefoffsets= (uint32*) _TIFFmalloc(t2p->pdf_xrefcount * sizeof(uint32) ); if(t2p->pdf_xrefoffsets==NULL){ TIFFError( TIFF2PDF_MODULE, "Can't allocate %u bytes of memory for t2p_write_pdf", (unsigned int) (t2p->pdf_xrefcount * sizeof(uint32)) ); t2p->t2p_error = T2P_ERR_ERROR; return(written); } t2p->pdf_xrefcount=0; t2p->pdf_catalog=1; t2p->pdf_info=2; t2p->pdf_pages=3; written += t2p_write_pdf_header(t2p, output); t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; t2p->pdf_catalog=t2p->pdf_xrefcount; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_catalog(t2p, output); written += t2p_write_pdf_obj_end(output); t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; t2p->pdf_info=t2p->pdf_xrefcount; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_info(t2p, input, output); written += t2p_write_pdf_obj_end(output); t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; t2p->pdf_pages=t2p->pdf_xrefcount; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_pages(t2p, output); written += t2p_write_pdf_obj_end(output); for(t2p->pdf_page=0;t2p->pdf_pagetiff_pagecount;t2p->pdf_page++){ t2p_read_tiff_data(t2p, input); if(t2p->t2p_error!=T2P_ERR_OK){return(0);} t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_page(t2p->pdf_xrefcount, t2p, output); written += t2p_write_pdf_obj_end(output); t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_stream_dict_start(output); written += t2p_write_pdf_stream_dict(0, t2p->pdf_xrefcount+1, output); written += t2p_write_pdf_stream_dict_end(output); written += t2p_write_pdf_stream_start(output); streamlen=written; written += t2p_write_pdf_page_content_stream(t2p, output); streamlen=written-streamlen; written += t2p_write_pdf_stream_end(output); written += t2p_write_pdf_obj_end(output); t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_stream_length(streamlen, output); written += t2p_write_pdf_obj_end(output); if(t2p->tiff_transferfunctioncount != 0){ t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_transfer(t2p, output); written += t2p_write_pdf_obj_end(output); for(i=0; i < t2p->tiff_transferfunctioncount; i++){ t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_stream_dict_start(output); written += t2p_write_pdf_transfer_dict(t2p, output, i); written += t2p_write_pdf_stream_dict_end(output); written += t2p_write_pdf_stream_start(output); streamlen=written; written += t2p_write_pdf_transfer_stream(t2p, output, i); streamlen=written-streamlen; written += t2p_write_pdf_stream_end(output); written += t2p_write_pdf_obj_end(output); } } if( (t2p->pdf_colorspace & T2P_CS_PALETTE) != 0){ t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; t2p->pdf_palettecs=t2p->pdf_xrefcount; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_stream_dict_start(output); written += t2p_write_pdf_stream_dict(t2p->pdf_palettesize, 0, output); written += t2p_write_pdf_stream_dict_end(output); written += t2p_write_pdf_stream_start(output); streamlen=written; written += t2p_write_pdf_xobject_palettecs_stream(t2p, output); streamlen=written-streamlen; written += t2p_write_pdf_stream_end(output); written += t2p_write_pdf_obj_end(output); } if( (t2p->pdf_colorspace & T2P_CS_ICCBASED) != 0){ t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; t2p->pdf_icccs=t2p->pdf_xrefcount; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_stream_dict_start(output); written += t2p_write_pdf_xobject_icccs_dict(t2p, output); written += t2p_write_pdf_stream_dict_end(output); written += t2p_write_pdf_stream_start(output); streamlen=written; written += t2p_write_pdf_xobject_icccs_stream(t2p, output); streamlen=written-streamlen; written += t2p_write_pdf_stream_end(output); written += t2p_write_pdf_obj_end(output); } if(t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount !=0){ for(i2=0;i2tiff_tiles[t2p->pdf_page].tiles_tilecount;i2++){ t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_stream_dict_start(output); written += t2p_write_pdf_xobject_stream_dict( i2+1, t2p, output); written += t2p_write_pdf_stream_dict_end(output); written += t2p_write_pdf_stream_start(output); streamlen=written; t2p_read_tiff_size_tile(t2p, input, i2); written += t2p_readwrite_pdf_image_tile(t2p, input, output, i2); t2p_write_advance_directory(t2p, output); if(t2p->t2p_error!=T2P_ERR_OK){return(0);} streamlen=written-streamlen; written += t2p_write_pdf_stream_end(output); written += t2p_write_pdf_obj_end(output); t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_stream_length(streamlen, output); written += t2p_write_pdf_obj_end(output); } } else { t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_stream_dict_start(output); written += t2p_write_pdf_xobject_stream_dict( 0, t2p, output); written += t2p_write_pdf_stream_dict_end(output); written += t2p_write_pdf_stream_start(output); streamlen=written; t2p_read_tiff_size(t2p, input); written += t2p_readwrite_pdf_image(t2p, input, output); t2p_write_advance_directory(t2p, output); if(t2p->t2p_error!=T2P_ERR_OK){return(0);} streamlen=written-streamlen; written += t2p_write_pdf_stream_end(output); written += t2p_write_pdf_obj_end(output); t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written; written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output); written += t2p_write_pdf_stream_length(streamlen, output); written += t2p_write_pdf_obj_end(output); } } t2p->pdf_startxref = written; written += t2p_write_pdf_xreftable(t2p, output); written += t2p_write_pdf_trailer(t2p, output); t2p_disable(output); return(written); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/configure0000755000212300117540000245562612027361164011324 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for LibTIFF Software 4.0.3. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: tiff@lists.maptools.org about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script $0: under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='LibTIFF Software' PACKAGE_TARNAME='tiff' PACKAGE_VERSION='4.0.3' PACKAGE_STRING='LibTIFF Software 4.0.3' PACKAGE_BUGREPORT='tiff@lists.maptools.org' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBDIR WIN32_IO_FALSE WIN32_IO_TRUE HAVE_OPENGL_FALSE HAVE_OPENGL_TRUE GLUT_LIBS GLUT_CFLAGS GLU_LIBS GLU_CFLAGS GL_LIBS GL_CFLAGS PTHREAD_CFLAGS PTHREAD_LIBS PTHREAD_CC ax_pthread_config X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF HAVE_CXX_FALSE HAVE_CXX_TRUE LIBTIFF_DOCDIR HAVE_RPATH_FALSE HAVE_RPATH_TRUE LIBOBJS tiff_libs_private AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED LIBTOOL OBJDUMP DLLTOOL AS HAVE_LD_VERSION_SCRIPT_FALSE HAVE_LD_VERSION_SCRIPT_TRUE LN_S am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC LIBTIFF_RELEASE_DATE LIBTIFF_VERSION_INFO LIBTIFF_VERSION LIBTIFF_ALPHA_VERSION LIBTIFF_MICRO_VERSION LIBTIFF_MINOR_VERSION LIBTIFF_MAJOR_VERSION MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_maintainer_mode enable_dependency_tracking enable_ld_version_script enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock enable_silent_rules enable_rpath enable_largefile with_docdir enable_ccitt enable_packbits enable_lzw enable_thunder enable_next enable_logluv enable_mdi enable_zlib with_zlib_include_dir with_zlib_lib_dir enable_pixarlog enable_jpeg with_jpeg_include_dir with_jpeg_lib_dir enable_old_jpeg enable_jbig with_jbig_include_dir with_jbig_lib_dir enable_lzma with_lzma_include_dir with_lzma_lib_dir enable_jpeg12 with_jpeg12_include_dir with_jpeg12_lib enable_cxx with_x enable_strip_chopping with_default_strip_size enable_defer_strile_load enable_chunky_strip_read enable_extrasample_as_alpha enable_check_ycbcr_subsampling ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures LibTIFF Software 4.0.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/tiff] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of LibTIFF Software 4.0.3:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-ld-version-script enable linker version script (default is disabled) --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-rpath Enable runtime linker paths (-R libtool option) --disable-largefile omit support for large files --disable-ccitt disable support for CCITT Group 3 & 4 algorithms --disable-packbits disable support for Macintosh PackBits algorithm --disable-lzw disable support for LZW algorithm --disable-thunder disable support for ThunderScan 4-bit RLE algorithm --disable-next disable support for NeXT 2-bit RLE algorithm --disable-logluv disable support for LogLuv high dynamic range encoding --disable-mdi disable support for Microsoft Document Imaging --disable-zlib disable Zlib usage (required for Deflate compression, enabled by default) --disable-pixarlog disable support for Pixar log-format algorithm (requires Zlib) --disable-jpeg disable IJG JPEG library usage (required for JPEG compression, enabled by default) --disable-old-jpeg disable support for Old JPEG compresson (read-only, enabled by default) --disable-jbig disable JBIG-KIT usage (required for ISO JBIG compression, enabled by default) --disable-lzma disable liblzma usage (required for LZMA2 compression, enabled by default) --enable-jpeg12 enable libjpeg 8/12bit dual mode --enable-cxx enable C++ stream API building (requires C++ compiler) --disable-strip-chopping disable support for strip chopping (whether or not to convert single-strip uncompressed images to mutiple strips of specified size to reduce memory usage) --enable-defer-strile-load enable deferred strip/tile offset/size loading (experimental) --enable-chunky-strip-read enable reading large strips in chunks for TIFFReadScanline() (experimental) --disable-extrasample-as-alpha the RGBA interface will treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA files but don't mark the alpha properly --disable-check-ycbcr-subsampling disable picking up YCbCr subsampling info from the JPEG data stream to support files lacking the tag Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-docdir=DIR directory where documentation should be installed --with-zlib-include-dir=DIR location of Zlib headers --with-zlib-lib-dir=DIR location of Zlib library binary --with-jpeg-include-dir=DIR location of IJG JPEG library headers --with-jpeg-lib-dir=DIR location of IJG JPEG library binary --with-jbig-include-dir=DIR location of JBIG-KIT headers --with-jbig-lib-dir=DIR location of JBIG-KIT library binary --with-lzma-include-dir=DIR location of liblzma headers --with-lzma-lib-dir=DIR location of liblzma library binary --with-jpeg12-include-dir=DIR location of libjpeg 12bit headers --with-jpeg12-lib=LIBRARY path to libjpeg 12bit library --with-x use the X Window System --with-default-strip-size=SIZE default size of the strip in bytes (when strip chopping enabled) [[default=8192]] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF LibTIFF Software configure 4.0.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## -------------------------------------- ## ## Report this to tiff@lists.maptools.org ## ## -------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by LibTIFF Software $as_me 4.0.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in config "$srcdir"/config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac am__api_version='1.12' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='tiff' VERSION='4.0.3' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE LIBTIFF_MAJOR_VERSION=4 LIBTIFF_MINOR_VERSION=0 LIBTIFF_MICRO_VERSION=3 LIBTIFF_ALPHA_VERSION= LIBTIFF_VERSION=$LIBTIFF_MAJOR_VERSION.$LIBTIFF_MINOR_VERSION.$LIBTIFF_MICRO_VERSION$LIBTIFF_ALPHA_VERSION LIBTIFF_RELEASE_DATE=`date +"%Y%m%d"` LIBTIFF_CURRENT=7 LIBTIFF_REVISION=0 LIBTIFF_AGE=2 LIBTIFF_VERSION_INFO=$LIBTIFF_CURRENT:$LIBTIFF_REVISION:$LIBTIFF_AGE # This is a special hack for OpenBSD and MirOS systems. The dynamic linker # in OpenBSD uses some special semantics for shared libraries. Their soname # contains only two numbers, major and minor. # See http://bugzilla.remotesensing.org/show_bug.cgi?id=838 for details. #case "$host_os" in # openbsd* | mirbsd*) # LIBTIFF_VERSION_INFO=$LIBTIFF_MAJOR_VERSION$LIBTIFF_MINOR_VERSION:$LIBTIFF_MICRO_VERSION:0 # ;; # *) # LIBTIFF_VERSION_INFO=$LIBTIFF_MAJOR_VERSION:$LIBTIFF_MINOR_VERSION:$LIBTIFF_MICRO_VERSION # ;; #esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test "x$CC" != xcc; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&5' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # cc works too. : else # cc exists but doesn't like -o. eval ac_cv_prog_cc_${ac_cc}_c_o=no fi fi fi else eval ac_cv_prog_cc_${ac_cc}_c_o=no fi rm -f core conftest* fi if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h fi # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ansi= if test -z "$ansi"; then msg="for C compiler warning flags" else msg="for C compiler warning and ANSI conformance flags" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking $msg" >&5 $as_echo_n "checking $msg... " >&6; } if ${vl_cv_prog_cc_warnings+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then cat > conftest.c <&1 | grep -i "WorkShop" > /dev/null 2>&1 && $CC -c -v -Xc conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-v" else vl_cv_prog_cc_warnings="-v -Xc" fi elif $CC -V 2>&1 | grep -i "Digital UNIX Compiler" > /dev/null 2>&1 && $CC -c -verbose -w0 -warnprotos -std1 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos" else vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos -std1" fi elif $CC 2>&1 | grep -i "C for AIX Compiler" > /dev/null 2>&1 && $CC -c -qlanglvl=ansi -qinfo=all conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" else vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd -qlanglvl=ansi" fi elif $CC -version 2>&1 | grep -i "MIPSpro Compilers" > /dev/null 2>&1 && $CC -c -fullwarn -ansi -ansiE conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-fullwarn" else vl_cv_prog_cc_warnings="-fullwarn -ansi -ansiE" fi elif what $CC 2>&1 | grep -i "HP C Compiler" > /dev/null 2>&1 && $CC -c -Aa +w1 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="+w1" else vl_cv_prog_cc_warnings="+w1 -Aa" fi elif $CC -V 2>&1 | grep "/SX" > /dev/null 2>&1 && $CC -c -pvctl,fullmsg -Xc conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-pvctl,fullmsg" else vl_cv_prog_cc_warnings="-pvctl,fullmsg -Xc" fi elif $CC -V 2>&1 | grep -i "Cray" > /dev/null 2>&1 && $CC -c -h msglevel 2 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-h msglevel 2" else vl_cv_prog_cc_warnings="-h msglevel 2 -h conform" fi fi rm -f conftest.* fi if test -n "$vl_cv_prog_cc_warnings"; then CFLAGS="$CFLAGS $vl_cv_prog_cc_warnings" else vl_cv_prog_cc_warnings="unknown" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vl_cv_prog_cc_warnings" >&5 $as_echo "$vl_cv_prog_cc_warnings" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # Check if LD supports linker scripts, and define automake conditional # HAVE_LD_VERSION_SCRIPT if so. This functionality is currently # constrained to compilers using GNU ld on ELF systems or systems # which provide an adequate emulation thereof. # Check whether --enable-ld-version-script was given. if test "${enable_ld_version_script+set}" = set; then : enableval=$enable_ld_version_script; have_ld_version_script=$enableval else have_ld_version_script=no fi if test "$have_ld_version_script" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if LD -Wl,--version-script works" >&5 $as_echo_n "checking if LD -Wl,--version-script works... " >&6; } save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" cat > conftest.map <conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : have_ld_version_script=yes else have_ld_version_script=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext rm -f conftest.map LDFLAGS="$save_LDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_ld_version_script" >&5 $as_echo "$have_ld_version_script" >&6; } fi if test "$have_ld_version_script" = "yes"; then HAVE_LD_VERSION_SCRIPT_TRUE= HAVE_LD_VERSION_SCRIPT_FALSE='#' else HAVE_LD_VERSION_SCRIPT_TRUE='#' HAVE_LD_VERSION_SCRIPT_FALSE= fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump enable_dlopen=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Enable support for silent build rules # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' case "${host_os}" in cygwin* | mingw32* | beos* | darwin*) ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5 $as_echo_n "checking for sin in -lm... " >&6; } if ${ac_cv_lib_m_sin+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sin (); int main () { return sin (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_sin=yes else ac_cv_lib_m_sin=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5 $as_echo "$ac_cv_lib_m_sin" >&6; } if test "x$ac_cv_lib_m_sin" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi ;; esac tiff_libs_private= for ac_header in assert.h fcntl.h io.h limits.h malloc.h search.h sys/time.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi # Obtain size of an 'signed short' and define as SIZEOF_SIGNED_SHORT # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed short" >&5 $as_echo_n "checking size of signed short... " >&6; } if ${ac_cv_sizeof_signed_short+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed short))" "ac_cv_sizeof_signed_short" "$ac_includes_default"; then : else if test "$ac_cv_type_signed_short" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (signed short) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_signed_short=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed_short" >&5 $as_echo "$ac_cv_sizeof_signed_short" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SIGNED_SHORT $ac_cv_sizeof_signed_short _ACEOF # Obtain size of an 'unsigned short' and define as SIZEOF_UNSIGNED_SHORT # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned short" >&5 $as_echo_n "checking size of unsigned short... " >&6; } if ${ac_cv_sizeof_unsigned_short+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned short))" "ac_cv_sizeof_unsigned_short" "$ac_includes_default"; then : else if test "$ac_cv_type_unsigned_short" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (unsigned short) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_unsigned_short=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_short" >&5 $as_echo "$ac_cv_sizeof_unsigned_short" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_UNSIGNED_SHORT $ac_cv_sizeof_unsigned_short _ACEOF # Obtain size of an 'signed int' and define as SIZEOF_SIGNED_INT # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed int" >&5 $as_echo_n "checking size of signed int... " >&6; } if ${ac_cv_sizeof_signed_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed int))" "ac_cv_sizeof_signed_int" "$ac_includes_default"; then : else if test "$ac_cv_type_signed_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (signed int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_signed_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed_int" >&5 $as_echo "$ac_cv_sizeof_signed_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SIGNED_INT $ac_cv_sizeof_signed_int _ACEOF # Obtain size of an 'unsigned int' and define as SIZEOF_UNSIGNED_INT # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned int" >&5 $as_echo_n "checking size of unsigned int... " >&6; } if ${ac_cv_sizeof_unsigned_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned int))" "ac_cv_sizeof_unsigned_int" "$ac_includes_default"; then : else if test "$ac_cv_type_unsigned_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (unsigned int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_unsigned_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_int" >&5 $as_echo "$ac_cv_sizeof_unsigned_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_UNSIGNED_INT $ac_cv_sizeof_unsigned_int _ACEOF # Obtain size of a 'signed long' and define as SIZEOF_SIGNED_LONG # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed long" >&5 $as_echo_n "checking size of signed long... " >&6; } if ${ac_cv_sizeof_signed_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed long))" "ac_cv_sizeof_signed_long" "$ac_includes_default"; then : else if test "$ac_cv_type_signed_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (signed long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_signed_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed_long" >&5 $as_echo "$ac_cv_sizeof_signed_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SIGNED_LONG $ac_cv_sizeof_signed_long _ACEOF # Obtain size of a 'unsigned long' and define as SIZEOF_UNSIGNED_LONG # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5 $as_echo_n "checking size of unsigned long... " >&6; } if ${ac_cv_sizeof_unsigned_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"; then : else if test "$ac_cv_type_unsigned_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (unsigned long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_unsigned_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5 $as_echo "$ac_cv_sizeof_unsigned_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long _ACEOF # Obtain size of a 'long long' and define as SIZEOF_SIGNED_LONG_LONG. # If 'long long' is not supported then the value defined is zero. # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed long long" >&5 $as_echo_n "checking size of signed long long... " >&6; } if ${ac_cv_sizeof_signed_long_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed long long))" "ac_cv_sizeof_signed_long_long" "$ac_includes_default"; then : else if test "$ac_cv_type_signed_long_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (signed long long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_signed_long_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed_long_long" >&5 $as_echo "$ac_cv_sizeof_signed_long_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SIGNED_LONG_LONG $ac_cv_sizeof_signed_long_long _ACEOF # Obtain size of a 'unsigned long long' and define as # SIZEOF_UNSIGNED_LONG_LONG. If 'unsigned long long' is not # supported then the value defined is zero. # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long long" >&5 $as_echo_n "checking size of unsigned long long... " >&6; } if ${ac_cv_sizeof_unsigned_long_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long long))" "ac_cv_sizeof_unsigned_long_long" "$ac_includes_default"; then : else if test "$ac_cv_type_unsigned_long_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (unsigned long long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_unsigned_long_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long_long" >&5 $as_echo "$ac_cv_sizeof_unsigned_long_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long _ACEOF # Obtain the size of an 'unsigned char *' and define as # SIZEOF_UNSIGNED_CHAR_P. Result is available in # ac_cv_sizeof_unsigned_char_p. # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned char *" >&5 $as_echo_n "checking size of unsigned char *... " >&6; } if ${ac_cv_sizeof_unsigned_char_p+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned char *))" "ac_cv_sizeof_unsigned_char_p" "$ac_includes_default"; then : else if test "$ac_cv_type_unsigned_char_p" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (unsigned char *) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_unsigned_char_p=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_char_p" >&5 $as_echo "$ac_cv_sizeof_unsigned_char_p" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_UNSIGNED_CHAR_P $ac_cv_sizeof_unsigned_char_p _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signed 8-bit type" >&5 $as_echo_n "checking for signed 8-bit type... " >&6; } INT8_T='signed char' { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INT8_T" >&5 $as_echo "$INT8_T" >&6; } cat >>confdefs.h <<_ACEOF #define TIFF_INT8_T $INT8_T _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned 8-bit type" >&5 $as_echo_n "checking for unsigned 8-bit type... " >&6; } UINT8_T='unsigned char' { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UINT8_T" >&5 $as_echo "$UINT8_T" >&6; } cat >>confdefs.h <<_ACEOF #define TIFF_UINT8_T $UINT8_T _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signed 16-bit type" >&5 $as_echo_n "checking for signed 16-bit type... " >&6; } INT16_T='signed short' { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INT16_T" >&5 $as_echo "$INT16_T" >&6; } cat >>confdefs.h <<_ACEOF #define TIFF_INT16_T $INT16_T _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned 16-bit type" >&5 $as_echo_n "checking for unsigned 16-bit type... " >&6; } UINT16_T='unsigned short' { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UINT16_T" >&5 $as_echo "$UINT16_T" >&6; } cat >>confdefs.h <<_ACEOF #define TIFF_UINT16_T $UINT16_T _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signed 32-bit type" >&5 $as_echo_n "checking for signed 32-bit type... " >&6; } INT32_T='none' INT32_FORMAT='none' if test $ac_cv_sizeof_signed_int -eq 4 then INT32_T='signed int' INT32_FORMAT='"%d"' elif test $ac_cv_sizeof_signed_long -eq 4 then INT32_T='signed long' INT32_FORMAT='"%ld"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INT32_T" >&5 $as_echo "$INT32_T" >&6; } cat >>confdefs.h <<_ACEOF #define TIFF_INT32_T $INT32_T _ACEOF cat >>confdefs.h <<_ACEOF #define TIFF_INT32_FORMAT $INT32_FORMAT _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned 32-bit type" >&5 $as_echo_n "checking for unsigned 32-bit type... " >&6; } UINT32_T='none' UINT32_FORMAT='none' if test $ac_cv_sizeof_unsigned_int -eq 4 then UINT32_T='unsigned int' UINT32_FORMAT='"%u"' elif test $ac_cv_sizeof_unsigned_long -eq 4 then UINT32_T='unsigned long' UINT32_FORMAT='"%lu"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UINT32_T" >&5 $as_echo "$UINT32_T" >&6; } cat >>confdefs.h <<_ACEOF #define TIFF_UINT32_T $UINT32_T _ACEOF cat >>confdefs.h <<_ACEOF #define TIFF_UINT32_FORMAT $UINT32_FORMAT _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signed 64-bit type" >&5 $as_echo_n "checking for signed 64-bit type... " >&6; } INT64_T='none' INT64_FORMAT='none' if test $ac_cv_sizeof_signed_long -eq 8 then INT64_T='signed long' INT64_FORMAT='"%ld"' elif test $ac_cv_sizeof_signed_long_long -eq 8 then INT64_T='signed long long' case "${host_os}" in mingw32*) # MinGW32 understands 'long long', but uses printf from WIN32 CRT INT64_FORMAT='"%I64d"' ;; *) INT64_FORMAT='"%lld"' ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INT64_T" >&5 $as_echo "$INT64_T" >&6; } cat >>confdefs.h <<_ACEOF #define TIFF_INT64_T $INT64_T _ACEOF cat >>confdefs.h <<_ACEOF #define TIFF_INT64_FORMAT $INT64_FORMAT _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned 64-bit type" >&5 $as_echo_n "checking for unsigned 64-bit type... " >&6; } UINT64_T='none' UINT64_FORMAT='none' if test $ac_cv_sizeof_unsigned_long -eq 8 then UINT64_T='unsigned long' UINT64_FORMAT='"%lu"' elif test $ac_cv_sizeof_unsigned_long_long -eq 8 then UINT64_T='unsigned long long' case "${host_os}" in mingw32*) # MinGW32 understands 'unsigned long long', but uses printf from WIN32 CRT UINT64_FORMAT='"%I64u"' ;; *) UINT64_FORMAT='"%llu"' ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UINT64_T" >&5 $as_echo "$UINT64_T" >&6; } cat >>confdefs.h <<_ACEOF #define TIFF_UINT64_T $UINT64_T _ACEOF cat >>confdefs.h <<_ACEOF #define TIFF_UINT64_FORMAT $UINT64_FORMAT _ACEOF # Determine TIFF equivalent of ssize_t { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signed size type" >&5 $as_echo_n "checking for signed size type... " >&6; } SSIZE_T='unknown' SSIZE_FORMAT='unknown' if test $ac_cv_sizeof_signed_long -eq $ac_cv_sizeof_unsigned_char_p then SSIZE_T='signed long' SSIZE_FORMAT='"%ld"' elif test $ac_cv_sizeof_signed_long_long -eq $ac_cv_sizeof_unsigned_char_p then SSIZE_T='signed long long' SSIZE_FORMAT='"%lld"' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SSIZE_T" >&5 $as_echo "$SSIZE_T" >&6; } cat >>confdefs.h <<_ACEOF #define TIFF_SSIZE_T $SSIZE_T _ACEOF cat >>confdefs.h <<_ACEOF #define TIFF_SSIZE_FORMAT $SSIZE_FORMAT _ACEOF # Determine the type to use for the difference between two pointers. # We will default to the POSIX ptrdiff_t if it is available, but will # be prepared for the case when it is not. PTRDIFF_T='unknown' PTRDIFF_FORMAT='"%ld"' ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : PTRDIFF_T=ptrdiff_t fi if test $PTRDIFF_T = unknown then PTRDIFF_T=$SSIZE_T PTRDIFF_FORMAT=$SSIZE_FORMAT fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pointer difference type" >&5 $as_echo_n "checking for pointer difference type... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTRDIFF_T" >&5 $as_echo "$PTRDIFF_T" >&6; } cat >>confdefs.h <<_ACEOF #define TIFF_PTRDIFF_T $PTRDIFF_T _ACEOF cat >>confdefs.h <<_ACEOF #define TIFF_PTRDIFF_FORMAT $PTRDIFF_FORMAT _ACEOF ac_fn_c_check_type "$LINENO" "int8" "ac_cv_type_int8" " #if HAVE_INTTYPES_H # include #endif " if test "x$ac_cv_type_int8" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT8 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "int16" "ac_cv_type_int16" " #if HAVE_INTTYPES_H # include #endif " if test "x$ac_cv_type_int16" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT16 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "int32" "ac_cv_type_int32" " #if HAVE_INTTYPES_H # include #endif " if test "x$ac_cv_type_int32" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT32 1 _ACEOF fi for ac_func in floor isascii memmove memset mmap pow setmode sqrt strchr strrchr strstr strtol strtoull do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_func "$LINENO" "getopt" "ac_cv_func_getopt" if test "x$ac_cv_func_getopt" = xyes; then : $as_echo "#define HAVE_GETOPT 1" >>confdefs.h else case " $LIBOBJS " in *" getopt.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS getopt.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" if test "x$ac_cv_func_strcasecmp" = xyes; then : $as_echo "#define HAVE_STRCASECMP 1" >>confdefs.h else case " $LIBOBJS " in *" strcasecmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strcasecmp.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "strtoul" "ac_cv_func_strtoul" if test "x$ac_cv_func_strtoul" = xyes; then : $as_echo "#define HAVE_STRTOUL 1" >>confdefs.h else case " $LIBOBJS " in *" strtoul.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtoul.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "strtoull" "ac_cv_func_strtoull" if test "x$ac_cv_func_strtoull" = xyes; then : $as_echo "#define HAVE_STRTOULL 1" >>confdefs.h else case " $LIBOBJS " in *" strtoull.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtoull.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "lfind" "ac_cv_func_lfind" if test "x$ac_cv_func_lfind" = xyes; then : $as_echo "#define HAVE_LFIND 1" >>confdefs.h else case " $LIBOBJS " in *" lfind.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lfind.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking native cpu bit order" >&5 $as_echo_n "checking native cpu bit order... " >&6; } case "$host_cpu" in i*86*|x86_64*) HOST_FILLORDER=FILLORDER_LSB2MSB { $as_echo "$as_me:${as_lineno-$LINENO}: result: lsb2msb" >&5 $as_echo "lsb2msb" >&6; } ;; *) HOST_FILLORDER=FILLORDER_MSB2LSB { $as_echo "$as_me:${as_lineno-$LINENO}: result: msb2lsb" >&5 $as_echo "msb2lsb" >&6; } ;; esac cat >>confdefs.h <<_ACEOF #define HOST_FILLORDER $HOST_FILLORDER _ACEOF if test "$ac_cv_c_bigendian" = yes ; then HOST_BIGENDIAN=1 else HOST_BIGENDIAN=0 fi cat >>confdefs.h <<_ACEOF #define HOST_BIGENDIAN $HOST_BIGENDIAN _ACEOF #_POSIX_C_SOURCE=2 #AC_DEFINE_UNQUOTED(_POSIX_C_SOURCE, $_POSIX_C_SOURCE, [Define this macro to a positive integer to control which POSIX functionality is made available.]) HAVE_IEEEFP=1 cat >>confdefs.h <<_ACEOF #define HAVE_IEEEFP $HAVE_IEEEFP _ACEOF # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; HAVE_RPATH=$enableval else HAVE_RPATH=no fi if test "$HAVE_RPATH" = "yes"; then HAVE_RPATH_TRUE= HAVE_RPATH_FALSE='#' else HAVE_RPATH_TRUE='#' HAVE_RPATH_FALSE= fi # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi LIBTIFF_DOCDIR=\${prefix}/share/doc/${PACKAGE}-${LIBTIFF_VERSION} # Check whether --with-docdir was given. if test "${with_docdir+set}" = set; then : withval=$with_docdir; fi if test "x$with_docdir" != "x" ; then LIBTIFF_DOCDIR=$with_docdir fi # Check whether --enable-ccitt was given. if test "${enable_ccitt+set}" = set; then : enableval=$enable_ccitt; HAVE_CCITT=$enableval else HAVE_CCITT=yes fi if test "$HAVE_CCITT" = "yes" ; then $as_echo "#define CCITT_SUPPORT 1" >>confdefs.h fi # Check whether --enable-packbits was given. if test "${enable_packbits+set}" = set; then : enableval=$enable_packbits; HAVE_PACKBITS=$enableval else HAVE_PACKBITS=yes fi if test "$HAVE_PACKBITS" = "yes" ; then $as_echo "#define PACKBITS_SUPPORT 1" >>confdefs.h fi # Check whether --enable-lzw was given. if test "${enable_lzw+set}" = set; then : enableval=$enable_lzw; HAVE_LZW=$enableval else HAVE_LZW=yes fi if test "$HAVE_LZW" = "yes" ; then $as_echo "#define LZW_SUPPORT 1" >>confdefs.h fi # Check whether --enable-thunder was given. if test "${enable_thunder+set}" = set; then : enableval=$enable_thunder; HAVE_THUNDER=$enableval else HAVE_THUNDER=yes fi if test "$HAVE_THUNDER" = "yes" ; then $as_echo "#define THUNDER_SUPPORT 1" >>confdefs.h fi HAVE_NEXT=yes # Check whether --enable-next was given. if test "${enable_next+set}" = set; then : enableval=$enable_next; HAVE_NEXT=$enableval else HAVE_NEXT=yes fi if test "$HAVE_NEXT" = "yes" ; then $as_echo "#define NEXT_SUPPORT 1" >>confdefs.h fi # Check whether --enable-logluv was given. if test "${enable_logluv+set}" = set; then : enableval=$enable_logluv; HAVE_LOGLUV=$enableval else HAVE_LOGLUV=yes fi if test "$HAVE_LOGLUV" = "yes" ; then $as_echo "#define LOGLUV_SUPPORT 1" >>confdefs.h fi # Check whether --enable-mdi was given. if test "${enable_mdi+set}" = set; then : enableval=$enable_mdi; HAVE_MDI=$enableval else HAVE_MDI=yes fi if test "$HAVE_MDI" = "yes" ; then $as_echo "#define MDI_SUPPORT 1" >>confdefs.h fi HAVE_ZLIB=no # Check whether --enable-zlib was given. if test "${enable_zlib+set}" = set; then : enableval=$enable_zlib; fi # Check whether --with-zlib-include-dir was given. if test "${with_zlib_include_dir+set}" = set; then : withval=$with_zlib_include_dir; fi # Check whether --with-zlib-lib-dir was given. if test "${with_zlib_lib_dir+set}" = set; then : withval=$with_zlib_lib_dir; fi if test "x$enable_zlib" != "xno" ; then if test "x$with_zlib_lib_dir" != "x" ; then LDFLAGS="-L$with_zlib_lib_dir $LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflateEnd in -lz" >&5 $as_echo_n "checking for inflateEnd in -lz... " >&6; } if ${ac_cv_lib_z_inflateEnd+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inflateEnd (); int main () { return inflateEnd (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_inflateEnd=yes else ac_cv_lib_z_inflateEnd=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflateEnd" >&5 $as_echo "$ac_cv_lib_z_inflateEnd" >&6; } if test "x$ac_cv_lib_z_inflateEnd" = xyes; then : zlib_lib=yes else zlib_lib=no fi if test "$zlib_lib" = "no" -a "x$with_zlib_lib_dir" != "x"; then as_fn_error $? "Zlib library not found at $with_zlib_lib_dir" "$LINENO" 5 fi if test "x$with_zlib_include_dir" != "x" ; then CPPFLAGS="-I$with_zlib_include_dir $CPPFLAGS" fi ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : zlib_h=yes else zlib_h=no fi if test "$zlib_h" = "no" -a "x$with_zlib_include_dir" != "x" ; then as_fn_error $? "Zlib headers not found at $with_zlib_include_dir" "$LINENO" 5 fi if test "$zlib_lib" = "yes" -a "$zlib_h" = "yes" ; then HAVE_ZLIB=yes fi fi if test "$HAVE_ZLIB" = "yes" ; then $as_echo "#define ZIP_SUPPORT 1" >>confdefs.h LIBS="-lz $LIBS" tiff_libs_private="-lz ${tiff_libs_private}" if test "$HAVE_RPATH" = "yes" -a "x$with_zlib_lib_dir" != "x" ; then LIBDIR="-R $with_zlib_lib_dir $LIBDIR" fi fi # Check whether --enable-pixarlog was given. if test "${enable_pixarlog+set}" = set; then : enableval=$enable_pixarlog; HAVE_PIXARLOG=$enableval else HAVE_PIXARLOG=yes fi if test "$HAVE_ZLIB" = "yes" -a "$HAVE_PIXARLOG" = "yes" ; then $as_echo "#define PIXARLOG_SUPPORT 1" >>confdefs.h else HAVE_PIXARLOG=no fi HAVE_JPEG=no # Check whether --enable-jpeg was given. if test "${enable_jpeg+set}" = set; then : enableval=$enable_jpeg; fi # Check whether --with-jpeg-include-dir was given. if test "${with_jpeg_include_dir+set}" = set; then : withval=$with_jpeg_include_dir; fi # Check whether --with-jpeg-lib-dir was given. if test "${with_jpeg_lib_dir+set}" = set; then : withval=$with_jpeg_lib_dir; fi if test "x$enable_jpeg" != "xno" ; then if test "x$with_jpeg_lib_dir" != "x" ; then LDFLAGS="-L$with_jpeg_lib_dir $LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_read_scanlines in -ljpeg" >&5 $as_echo_n "checking for jpeg_read_scanlines in -ljpeg... " >&6; } if ${ac_cv_lib_jpeg_jpeg_read_scanlines+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljpeg $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jpeg_read_scanlines (); int main () { return jpeg_read_scanlines (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jpeg_jpeg_read_scanlines=yes else ac_cv_lib_jpeg_jpeg_read_scanlines=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_read_scanlines" >&5 $as_echo "$ac_cv_lib_jpeg_jpeg_read_scanlines" >&6; } if test "x$ac_cv_lib_jpeg_jpeg_read_scanlines" = xyes; then : jpeg_lib=yes else jpeg_lib=no fi if test "$jpeg_lib" = "no" -a "x$with_jpeg_lib_dir" != "x" ; then as_fn_error $? "IJG JPEG library not found at $with_jpeg_lib_dir" "$LINENO" 5 fi if test "x$with_jpeg_include_dir" != "x" ; then CPPFLAGS="-I$with_jpeg_include_dir $CPPFLAGS" fi ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" if test "x$ac_cv_header_jpeglib_h" = xyes; then : jpeg_h=yes else jpeg_h=no fi if test "$jpeg_h" = "no" -a "x$with_jpeg_include_dir" != "x" ; then as_fn_error $? "IJG JPEG library headers not found at $with_jpeg_include_dir" "$LINENO" 5 fi if test "$jpeg_lib" = "yes" -a "$jpeg_h" = "yes" ; then HAVE_JPEG=yes fi fi if test "$HAVE_JPEG" = "yes" ; then $as_echo "#define JPEG_SUPPORT 1" >>confdefs.h LIBS="-ljpeg $LIBS" tiff_libs_private="-ljpeg ${tiff_libs_private}" if test "$HAVE_RPATH" = "yes" -a "x$with_jpeg_lib_dir" != "x" ; then LIBDIR="-R $with_jpeg_lib_dir $LIBDIR" fi fi # Check whether --enable-old-jpeg was given. if test "${enable_old_jpeg+set}" = set; then : enableval=$enable_old_jpeg; HAVE_OJPEG=${enableval} else HAVE_OJPEG=yes fi if test "$HAVE_JPEG" = "yes" -a "$HAVE_OJPEG" = "yes" ; then $as_echo "#define OJPEG_SUPPORT 1" >>confdefs.h else HAVE_OJPEG=no fi HAVE_JBIG=no # Check whether --enable-jbig was given. if test "${enable_jbig+set}" = set; then : enableval=$enable_jbig; fi # Check whether --with-jbig-include-dir was given. if test "${with_jbig_include_dir+set}" = set; then : withval=$with_jbig_include_dir; fi # Check whether --with-jbig-lib-dir was given. if test "${with_jbig_lib_dir+set}" = set; then : withval=$with_jbig_lib_dir; fi if test "x$enable_jbig" != "xno" ; then if test "x$with_jbig_lib_dir" != "x" ; then LDFLAGS="-L$with_jbig_lib_dir $LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jbg_dec_init in -ljbig" >&5 $as_echo_n "checking for jbg_dec_init in -ljbig... " >&6; } if ${ac_cv_lib_jbig_jbg_dec_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljbig $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jbg_dec_init (); int main () { return jbg_dec_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jbig_jbg_dec_init=yes else ac_cv_lib_jbig_jbg_dec_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jbig_jbg_dec_init" >&5 $as_echo "$ac_cv_lib_jbig_jbg_dec_init" >&6; } if test "x$ac_cv_lib_jbig_jbg_dec_init" = xyes; then : jbig_lib=yes else jbig_lib=no fi if test "$jbig_lib" = "no" -a "x$with_jbig_lib_dir" != "x" ; then as_fn_error $? "JBIG-KIT library not found at $with_jbig_lib_dir" "$LINENO" 5 fi if test "x$with_jbig_include_dir" != "x" ; then CPPFLAGS="-I$with_jbig_include_dir $CPPFLAGS" fi ac_fn_c_check_header_mongrel "$LINENO" "jbig.h" "ac_cv_header_jbig_h" "$ac_includes_default" if test "x$ac_cv_header_jbig_h" = xyes; then : jbig_h=yes else jbig_h=no fi if test "$jbig_h" = "no" -a "x$with_jbig_include_dir" != "x" ; then as_fn_error $? "JBIG-KIT library headers not found at $with_jbig_include_dir" "$LINENO" 5 fi if test "$jbig_lib" = "yes" -a "$jbig_h" = "yes" ; then HAVE_JBIG=yes fi fi if test "$HAVE_JBIG" = "yes" ; then $as_echo "#define JBIG_SUPPORT 1" >>confdefs.h LIBS="-ljbig $LIBS" tiff_libs_private="-ljbig ${tiff_libs_private}" if test "$HAVE_RPATH" = "yes" -a "x$with_jbig_lib_dir" != "x" ; then LIBDIR="-R $with_jbig_lib_dir $LIBDIR" fi # Older versions of jbigkit lack jbg_newlen for ac_func in jbg_newlen do : ac_fn_c_check_func "$LINENO" "jbg_newlen" "ac_cv_func_jbg_newlen" if test "x$ac_cv_func_jbg_newlen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_JBG_NEWLEN 1 _ACEOF fi done fi HAVE_LZMA=no # Check whether --enable-lzma was given. if test "${enable_lzma+set}" = set; then : enableval=$enable_lzma; fi # Check whether --with-lzma-include-dir was given. if test "${with_lzma_include_dir+set}" = set; then : withval=$with_lzma_include_dir; fi # Check whether --with-lzma-lib-dir was given. if test "${with_lzma_lib_dir+set}" = set; then : withval=$with_lzma_lib_dir; fi if test "x$enable_lzma" != "xno" ; then if test "x$with_lzma_lib_dir" != "x" ; then LDFLAGS="-L$with_lzma_lib_dir $LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzma_code in -llzma" >&5 $as_echo_n "checking for lzma_code in -llzma... " >&6; } if ${ac_cv_lib_lzma_lzma_code+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-llzma $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char lzma_code (); int main () { return lzma_code (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lzma_lzma_code=yes else ac_cv_lib_lzma_lzma_code=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzma_lzma_code" >&5 $as_echo "$ac_cv_lib_lzma_lzma_code" >&6; } if test "x$ac_cv_lib_lzma_lzma_code" = xyes; then : lzma_lib=yes else lzma_lib=no fi if test "$lzma_lib" = "no" -a "x$with_lzma_lib_dir" != "x"; then as_fn_error $? "lzma library not found at $with_lzma_lib_dir" "$LINENO" 5 fi if test "x$with_lzma_include_dir" != "x" ; then CPPFLAGS="-I$with_lzma_include_dir $CPPFLAGS" fi ac_fn_c_check_header_mongrel "$LINENO" "lzma.h" "ac_cv_header_lzma_h" "$ac_includes_default" if test "x$ac_cv_header_lzma_h" = xyes; then : lzma_h=yes else lzma_h=no fi if test "$lzma_h" = "no" -a "x$with_lzma_include_dir" != "x" ; then as_fn_error $? "Liblzma headers not found at $with_lzma_include_dir" "$LINENO" 5 fi if test "$lzma_lib" = "yes" -a "$lzma_h" = "yes" ; then HAVE_LZMA=yes fi fi if test "$HAVE_LZMA" = "yes" ; then $as_echo "#define LZMA_SUPPORT 1" >>confdefs.h LIBS="-llzma $LIBS" tiff_libs_private="-llzma ${tiff_libs_private}" if test "$HAVE_RPATH" = "yes" -a "x$with_lzma_lib_dir" != "x" ; then LIBDIR="-R $with_lzma_lib_dir $LIBDIR" fi fi HAVE_JPEG12=no # Check whether --enable-jpeg12 was given. if test "${enable_jpeg12+set}" = set; then : enableval=$enable_jpeg12; fi # Check whether --with-jpeg12-include-dir was given. if test "${with_jpeg12_include_dir+set}" = set; then : withval=$with_jpeg12_include_dir; fi # Check whether --with-jpeg12-lib was given. if test "${with_jpeg12_lib+set}" = set; then : withval=$with_jpeg12_lib; fi if test "x$enable_jpeg12" == "xyes" ; then if test "x$with_jpeg12_lib" != "x" ; then LIBS="$with_jpeg12_lib $LIBS" fi HAVE_JPEG12=yes $as_echo "#define JPEG_DUAL_MODE_8_12 1" >>confdefs.h if test "x$with_jpeg12_include_dir" != "x" ; then cat >>confdefs.h <<_ACEOF #define LIBJPEG_12_PATH "$with_jpeg12_include_dir/jpeglib.h" _ACEOF fi fi # Check whether --enable-cxx was given. if test "${enable_cxx+set}" = set; then : enableval=$enable_cxx; HAVE_CXX=$enableval else HAVE_CXX=yes fi if test "$HAVE_CXX" = "yes" ; then $as_echo "#define CXX_SUPPORT 1" >>confdefs.h else HAVE_CXX=no fi if test "$HAVE_CXX" = "yes"; then HAVE_CXX_TRUE= HAVE_CXX_FALSE='#' else HAVE_CXX_TRUE='#' HAVE_CXX_FALSE= fi HAVE_OPENGL=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ax_pthread_ok=no if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 $as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_join (); int main () { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 $as_echo "$ax_pthread_ok" >&6; } if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" case "${host_cpu}-${host_os}" in *solaris*) ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" ;; *-darwin*) ax_pthread_flags="-pthread $ax_pthread_flags" ;; esac if test x"$ax_pthread_ok" = xno; then for flag in $ax_pthread_flags; do case $flag in none) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 $as_echo_n "checking whether pthreads work without any flags... " >&6; } ;; -*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 $as_echo_n "checking whether pthreads work with $flag... " >&6; } PTHREAD_CFLAGS="$flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ax_pthread_config+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ax_pthread_config="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" fi fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 $as_echo "$ax_pthread_config" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$ax_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 $as_echo_n "checking for the pthreads library -l$flag... " >&6; } PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include static void routine(void* a) {a=0;} static void* start_routine(void* a) {return a;} int main () { pthread_t th; pthread_attr_t attr; pthread_create(&th,0,start_routine,0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 $as_echo "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi if test "x$ax_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 $as_echo_n "checking for joinable pthread attribute... " >&6; } attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int attr=$attr; return attr; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : attr_name=$attr; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 $as_echo "$attr_name" >&6; } if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then cat >>confdefs.h <<_ACEOF #define PTHREAD_CREATE_JOINABLE $attr_name _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 $as_echo_n "checking if more special flags are required for pthreads... " >&6; } flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 $as_echo "${flag}" >&6; } if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" if test x"$GCC" != xyes; then for ac_prog in xlc_r cc_r do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PTHREAD_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PTHREAD_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 $as_echo "$PTHREAD_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PTHREAD_CC" && break done test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" else PTHREAD_CC=$CC fi else PTHREAD_CC="$CC" fi if test x"$ax_pthread_ok" = xyes; then $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h : else ax_pthread_ok=no fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the Microsoft C compiler" >&5 $as_echo_n "checking whether we are using the Microsoft C compiler... " >&6; } if ${ax_cv_c_compiler_ms+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef _MSC_VER choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_compiler_ms=yes else ax_compiler_ms=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ax_cv_c_compiler_ms=$ax_compiler_ms fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_ms" >&5 $as_echo "$ax_cv_c_compiler_ms" >&6; } if test X$ax_compiler_ms = Xno; then : GL_CFLAGS="${PTHREAD_CFLAGS}"; GL_LIBS="${PTHREAD_LIBS} -lm" fi if test "X$no_x" != "Xyes"; then : if test -n "$x_includes"; then : GL_CFLAGS="-I${x_includes} ${GL_CFLAGS}" fi if test -n "$x_libraries"; then : GL_LIBS="-L${x_libraries} -lX11 ${GL_LIBS}" fi fi ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" for ac_header in GL/gl.h OpenGL/gl.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done CPPFLAGS="${ax_save_CPPFLAGS}" for ac_header in windows.h do : ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" if test "x$ac_cv_header_windows_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINDOWS_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenGL library" >&5 $as_echo_n "checking for OpenGL library... " >&6; } if ${ax_cv_check_gl_libgl+:} false; then : $as_echo_n "(cached) " >&6 else ax_cv_check_gl_libgl="no" case $host_cpu in x86_64) ax_check_gl_libdir=lib64 ;; *) ax_check_gl_libdir=lib ;; esac ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="" ax_check_libs="-lopengl32 -lGL" for ax_lib in ${ax_check_libs}; do if test X$ax_compiler_ms = Xyes; then : ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'` else ax_try_lib="${ax_lib}" fi LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GL_H # include # elif defined(HAVE_OPENGL_GL_H) # include # else # error no gl.h # endif int main () { glBegin(0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_check_gl_libgl="${ax_try_lib}"; break else ax_check_gl_nvidia_flags="-L/usr/${ax_check_gl_libdir}/nvidia" LIBS="${ax_try_lib} ${ax_check_gl_nvidia_flags} ${GL_LIBS} ${ax_save_LIBS}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GL_H # include # elif defined(HAVE_OPENGL_GL_H) # include # else # error no gl.h # endif int main () { glBegin(0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_check_gl_libgl="${ax_try_lib} ${ax_check_gl_nvidia_flags}"; break else ax_check_gl_dylib_flag='-dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib' LIBS="${ax_try_lib} ${ax_check_gl_dylib_flag} ${GL_LIBS} ${ax_save_LIBS}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GL_H # include # elif defined(HAVE_OPENGL_GL_H) # include # else # error no gl.h # endif int main () { glBegin(0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_check_gl_libgl="${ax_try_lib} ${ax_check_gl_dylib_flag}"; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done if test "X$ax_cv_check_gl_libgl" = Xno -a "X$no_x" = Xyes; then : LIBS='-framework OpenGL' cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GL_H # include # elif defined(HAVE_OPENGL_GL_H) # include # else # error no gl.h # endif int main () { glBegin(0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_check_gl_libgl="$LIBS" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi LIBS=${ax_save_LIBS} CPPFLAGS=${ax_save_CPPFLAGS} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_gl_libgl" >&5 $as_echo "$ax_cv_check_gl_libgl" >&6; } if test "X$ax_cv_check_gl_libgl" = Xno; then : no_gl=yes; GL_CFLAGS=""; GL_LIBS="" else GL_LIBS="${ax_cv_check_gl_libgl} ${GL_LIBS}" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu GLU_CFLAGS="${GL_CFLAGS}" ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" for ac_header in GL/glu.h OpenGL/glu.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done CPPFLAGS="${ax_save_CPPFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenGL Utility library" >&5 $as_echo_n "checking for OpenGL Utility library... " >&6; } if ${ax_cv_check_glu_libglu+:} false; then : $as_echo_n "(cached) " >&6 else ax_cv_check_glu_libglu="no" ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="${GL_LIBS} ${ax_save_LIBS}" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test X$ax_compiler_ms = Xyes; then : ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GLU_H # include # elif defined(HAVE_OPENGL_GLU_H) # include # else # error no glu.h # endif int main () { gluBeginCurve(0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_check_glu_libglu=yes else LIBS="" ax_check_libs="-lglu32 -lGLU" for ax_lib in ${ax_check_libs}; do if test X$ax_compiler_ms = Xyes; then : ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'` else ax_try_lib="${ax_lib}" fi LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GLU_H # include # elif defined(HAVE_OPENGL_GLU_H) # include # else # error no glu.h # endif int main () { gluBeginCurve(0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_check_glu_libglu="${ax_try_lib}"; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test X$ax_compiler_ms = Xyes; then : ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu LIBS=${ax_save_LIBS} CPPFLAGS=${ax_save_CPPFLAGS} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_glu_libglu" >&5 $as_echo "$ax_cv_check_glu_libglu" >&6; } if test "X$ax_cv_check_glu_libglu" = Xno; then : no_glu=yes; GLU_CFLAGS=""; GLU_LIBS="" else if test "X$ax_cv_check_glu_libglu" = Xyes; then : GLU_LIBS="$GL_LIBS" else GLU_LIBS="${ax_cv_check_glu_libglu} ${GL_LIBS}" fi fi if test "X$ax_cv_check_glu_libglu" != Xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for varargs GLU tesselator callback function type" >&5 $as_echo_n "checking for varargs GLU tesselator callback function type... " >&6; } if ${ax_cv_varargs_glu_tesscb+:} false; then : $as_echo_n "(cached) " >&6 else ax_cv_varargs_glu_tesscb=no ax_save_CFLAGS="$CFLAGS" CFLAGS="$GL_CFLAGS $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # ifdef HAVE_GL_GLU_H # include # else # include # endif int main () { GLvoid (*func)(...); gluTessCallback(0, 0, func) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_varargs_glu_tesscb=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$ax_save_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_varargs_glu_tesscb" >&5 $as_echo "$ax_cv_varargs_glu_tesscb" >&6; } if test X$ax_cv_varargs_glu_tesscb = Xyes; then : $as_echo "#define HAVE_VARARGS_GLU_TESSCB 1" >>confdefs.h fi fi ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GLU_CFLAGS} ${CPPFLAGS}" for ac_header in GL/glut.h GLUT/glut.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done CPPFLAGS="${ax_save_CPPFLAGS}" GLUT_CFLAGS=${GLU_CFLAGS} GLUT_LIBS=${GLU_LIBS} if test X$no_x != Xyes; then : GLUT_LIBS="${X_PRE_LIBS} -lXi ${X_EXTRA_LIBS} ${GLUT_LIBS}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLUT library" >&5 $as_echo_n "checking for GLUT library... " >&6; } if ${ax_cv_check_glut_libglut+:} false; then : $as_echo_n "(cached) " >&6 else ax_cv_check_glut_libglut="no" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GLUT_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="" ax_check_libs="-lglut32 -lglut" for ax_lib in ${ax_check_libs}; do if test X$ax_compiler_ms = Xyes; then : ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'` else ax_try_lib="${ax_lib}" fi LIBS="${ax_try_lib} ${GLUT_LIBS} ${ax_save_LIBS}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if HAVE_WINDOWS_H && defined(_WIN32) # include # endif # ifdef HAVE_GL_GLUT_H # include # elif defined(HAVE_GLUT_GLUT_H) # include # else # error no glut.h # endif int main () { glutMainLoop() ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_check_glut_libglut="${ax_try_lib}"; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done if test "X$ax_cv_check_glut_libglut" = Xno -a "X$no_x" = Xyes; then : LIBS='-framework GLUT' cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if HAVE_WINDOWS_H && defined(_WIN32) # include # endif # ifdef HAVE_GL_GLUT_H # include # elif defined(HAVE_GLUT_GLUT_H) # include # else # error no glut.h # endif int main () { glutMainLoop() ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_check_glut_libglut="$LIBS" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="${ax_save_CPPFLAGS}" LIBS="${ax_save_LIBS}" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_glut_libglut" >&5 $as_echo "$ax_cv_check_glut_libglut" >&6; } if test "X$ax_cv_check_glut_libglut" = Xno; then : no_glut="yes"; GLUT_CFLAGS=""; GLUT_LIBS="" else GLUT_LIBS="${ax_cv_check_glut_libglut} ${GLUT_LIBS}" fi if test "$no_x" != "yes" -a "$no_gl" != "yes" \ -a "$no_glu" != "yes" -a "$no_glut" != "yes" ; then HAVE_OPENGL=yes fi if test "$HAVE_OPENGL" = "yes"; then HAVE_OPENGL_TRUE= HAVE_OPENGL_FALSE='#' else HAVE_OPENGL_TRUE='#' HAVE_OPENGL_FALSE= fi win32_io_ok=no case "${host_os}" in cygwin*) ;; *) if test x"$ac_cv_header_windows_h" = xyes; then win32_io_ok=yes $as_echo "#define USE_WIN32_FILEIO 1" >>confdefs.h fi ;; esac if test "$win32_io_ok" = yes; then WIN32_IO_TRUE= WIN32_IO_FALSE='#' else WIN32_IO_TRUE='#' WIN32_IO_FALSE= fi # Check whether --enable-strip-chopping was given. if test "${enable_strip_chopping+set}" = set; then : enableval=$enable_strip_chopping; HAVE_STRIPCHOP=$enableval else HAVE_STRIPCHOP=yes fi # Check whether --with-default-strip-size was given. if test "${with_default_strip_size+set}" = set; then : withval=$with_default_strip_size; fi if test "$HAVE_STRIPCHOP" = "yes" \ -a "x$with_default_strip_size" != "xno"; then $as_echo "#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP" >>confdefs.h if test "x$with_default_strip_size" = "x" \ -o "x$with_default_strip_size" = "xyes"; then with_default_strip_size="8192" fi cat >>confdefs.h <<_ACEOF #define STRIP_SIZE_DEFAULT $with_default_strip_size _ACEOF fi # Check whether --enable-defer-strile-load was given. if test "${enable_defer_strile_load+set}" = set; then : enableval=$enable_defer_strile_load; HAVE_DEFER_STRILE_LOAD=$enableval else HAVE_DEFER_STRILE_LOAD=no fi if test "$HAVE_DEFER_STRILE_LOAD" = "yes" ; then $as_echo "#define DEFER_STRILE_LOAD 1" >>confdefs.h fi # Check whether --enable-chunky-strip-read was given. if test "${enable_chunky_strip_read+set}" = set; then : enableval=$enable_chunky_strip_read; HAVE_CHUNKY_STRIP_READ=$enableval else HAVE_CHUNKY_STRIP_READ=no fi if test "$HAVE_CHUNKY_STRIP_READ" = "yes" ; then $as_echo "#define CHUNKY_STRIP_READ_SUPPORT 1" >>confdefs.h fi $as_echo "#define SUBIFD_SUPPORT 1" >>confdefs.h # Check whether --enable-extrasample-as-alpha was given. if test "${enable_extrasample_as_alpha+set}" = set; then : enableval=$enable_extrasample_as_alpha; HAVE_EXTRASAMPLE_AS_ALPHA=$enableval else HAVE_EXTRASAMPLE_AS_ALPHA=yes fi if test "$HAVE_EXTRASAMPLE_AS_ALPHA" = "yes" ; then $as_echo "#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1" >>confdefs.h fi # Check whether --enable-check-ycbcr-subsampling was given. if test "${enable_check_ycbcr_subsampling+set}" = set; then : enableval=$enable_check_ycbcr_subsampling; CHECK_JPEG_YCBCR_SUBSAMPLING=$enableval else CHECK_JPEG_YCBCR_SUBSAMPLING=yes fi if test "$CHECK_JPEG_YCBCR_SUBSAMPLING" = "yes" ; then $as_echo "#define CHECK_JPEG_YCBCR_SUBSAMPLING 1" >>confdefs.h fi ac_config_headers="$ac_config_headers libtiff/tif_config.h libtiff/tiffconf.h" ac_config_files="$ac_config_files Makefile build/Makefile contrib/Makefile contrib/addtiffo/Makefile contrib/dbs/Makefile contrib/dbs/xtiff/Makefile contrib/iptcutil/Makefile contrib/mfs/Makefile contrib/pds/Makefile contrib/ras/Makefile contrib/stream/Makefile contrib/tags/Makefile contrib/win_dib/Makefile html/Makefile html/images/Makefile html/man/Makefile libtiff-4.pc libtiff/Makefile man/Makefile port/Makefile test/Makefile tools/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LD_VERSION_SCRIPT_TRUE}" && test -z "${HAVE_LD_VERSION_SCRIPT_FALSE}"; then as_fn_error $? "conditional \"HAVE_LD_VERSION_SCRIPT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_RPATH_TRUE}" && test -z "${HAVE_RPATH_FALSE}"; then as_fn_error $? "conditional \"HAVE_RPATH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CXX_TRUE}" && test -z "${HAVE_CXX_FALSE}"; then as_fn_error $? "conditional \"HAVE_CXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_OPENGL_TRUE}" && test -z "${HAVE_OPENGL_FALSE}"; then as_fn_error $? "conditional \"HAVE_OPENGL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WIN32_IO_TRUE}" && test -z "${WIN32_IO_FALSE}"; then as_fn_error $? "conditional \"WIN32_IO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by LibTIFF Software $as_me 4.0.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ LibTIFF Software config.status 4.0.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "libtiff/tif_config.h") CONFIG_HEADERS="$CONFIG_HEADERS libtiff/tif_config.h" ;; "libtiff/tiffconf.h") CONFIG_HEADERS="$CONFIG_HEADERS libtiff/tiffconf.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "build/Makefile") CONFIG_FILES="$CONFIG_FILES build/Makefile" ;; "contrib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/Makefile" ;; "contrib/addtiffo/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/addtiffo/Makefile" ;; "contrib/dbs/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/dbs/Makefile" ;; "contrib/dbs/xtiff/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/dbs/xtiff/Makefile" ;; "contrib/iptcutil/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/iptcutil/Makefile" ;; "contrib/mfs/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/mfs/Makefile" ;; "contrib/pds/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pds/Makefile" ;; "contrib/ras/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/ras/Makefile" ;; "contrib/stream/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/stream/Makefile" ;; "contrib/tags/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/tags/Makefile" ;; "contrib/win_dib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/win_dib/Makefile" ;; "html/Makefile") CONFIG_FILES="$CONFIG_FILES html/Makefile" ;; "html/images/Makefile") CONFIG_FILES="$CONFIG_FILES html/images/Makefile" ;; "html/man/Makefile") CONFIG_FILES="$CONFIG_FILES html/man/Makefile" ;; "libtiff-4.pc") CONFIG_FILES="$CONFIG_FILES libtiff-4.pc" ;; "libtiff/Makefile") CONFIG_FILES="$CONFIG_FILES libtiff/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; "port/Makefile") CONFIG_FILES="$CONFIG_FILES port/Makefile" ;; "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "" echo "Libtiff is now configured for ${host}" echo "" echo " Installation directory: ${prefix}" echo " Documentation directory: ${LIBTIFF_DOCDIR}" echo " C compiler: ${CC} ${CFLAGS}" echo " C++ compiler: ${CXX} ${CXXFLAGS}" echo " Enable runtime linker paths: ${HAVE_RPATH}" echo " Enable linker symbol versioning: ${have_ld_version_script}" echo " Support Microsoft Document Imaging: ${HAVE_MDI}" echo " Use win32 IO: ${win32_io_ok}" echo "" echo " Support for internal codecs:" echo " CCITT Group 3 & 4 algorithms: ${HAVE_CCITT}" echo " Macintosh PackBits algorithm: ${HAVE_PACKBITS}" echo " LZW algorithm: ${HAVE_LZW}" echo " ThunderScan 4-bit RLE algorithm: ${HAVE_THUNDER}" echo " NeXT 2-bit RLE algorithm: ${HAVE_NEXT}" echo " LogLuv high dynamic range encoding: ${HAVE_LOGLUV}" echo "" echo " Support for external codecs:" echo " ZLIB support: ${HAVE_ZLIB}" echo " Pixar log-format algorithm: ${HAVE_PIXARLOG}" echo " JPEG support: ${HAVE_JPEG}" echo " Old JPEG support: ${HAVE_OJPEG}" echo " JPEG 8/12 bit dual mode: ${HAVE_JPEG12}" echo " ISO JBIG support: ${HAVE_JBIG}" echo " LZMA2 support: ${HAVE_LZMA}" echo "" echo " C++ support: ${HAVE_CXX}" echo "" echo " OpenGL support: ${HAVE_OPENGL}" echo "" tiff-4.0.3/configure.ac0000644000212300117540000010577012027360704011670 00000000000000dnl -*- Autoconf -*- dnl Tag Image File Format (TIFF) Software dnl dnl Copyright (C) 2004, Andrey Kiselev dnl dnl Permission to use, copy, modify, distribute, and sell this software and dnl its documentation for any purpose is hereby granted without fee, provided dnl that (i) the above copyright notices and this permission notice appear in dnl all copies of the software and related documentation, and (ii) the names of dnl Sam Leffler and Silicon Graphics may not be used in any advertising or dnl publicity relating to the software without the specific, prior written dnl permission of Sam Leffler and Silicon Graphics. dnl dnl THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, dnl EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY dnl WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. dnl dnl IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR dnl ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, dnl OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, dnl WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF dnl LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE dnl OF THIS SOFTWARE. dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.64) AC_INIT([LibTIFF Software],[4.0.3],[tiff@lists.maptools.org],[tiff]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_MACRO_DIR(m4) AC_LANG(C) dnl Compute the canonical host (run-time) system type variable AC_CANONICAL_HOST AM_INIT_AUTOMAKE dnl Do not rebuild generated files every time AM_MAINTAINER_MODE dnl Versioning. dnl Don't fill the ALPHA_VERSION field, if not applicable. LIBTIFF_MAJOR_VERSION=4 LIBTIFF_MINOR_VERSION=0 LIBTIFF_MICRO_VERSION=3 LIBTIFF_ALPHA_VERSION= LIBTIFF_VERSION=$LIBTIFF_MAJOR_VERSION.$LIBTIFF_MINOR_VERSION.$LIBTIFF_MICRO_VERSION$LIBTIFF_ALPHA_VERSION dnl This will be used with the 'make release' target LIBTIFF_RELEASE_DATE=`date +"%Y%m%d"` dnl Libtool library revision control info dnl See the libtool documentation under the heading "Libtool's versioning dnl system" in order to understand the meaning of these fields dnl dnl current dnl The most recent interface number that this library implements. dnl revision dnl The implementation number of the current interface. dnl age dnl The difference between the newest and oldest interfaces that dnl this library implements. In other words, the library implements dnl all the interface numbers in the range from number current - dnl age to current. dnl dnl Here are a set of rules to help you update your library version dnl information: dnl dnl 1. Start with version information of `0:0:0' for each libtool library. dnl 2. Update the version information only immediately before a public dnl release of your software. More frequent updates are unnecessary, and dnl only guarantee that the current interface number gets larger faster. dnl 3. If the library source code has changed at all since the last update, dnl then increment revision (`c:r:a' becomes `c:r+1:a'). dnl 4. If any interfaces have been added, removed, or changed since the last dnl update, increment current, and set revision to 0. dnl 5. If any interfaces have been added since the last public release, then dnl increment age. dnl 6. If any interfaces have been removed since the last public release, dnl then set age to 0. LIBTIFF_CURRENT=7 LIBTIFF_REVISION=0 LIBTIFF_AGE=2 LIBTIFF_VERSION_INFO=$LIBTIFF_CURRENT:$LIBTIFF_REVISION:$LIBTIFF_AGE # This is a special hack for OpenBSD and MirOS systems. The dynamic linker # in OpenBSD uses some special semantics for shared libraries. Their soname # contains only two numbers, major and minor. # See http://bugzilla.remotesensing.org/show_bug.cgi?id=838 for details. #case "$host_os" in # openbsd* | mirbsd*) # LIBTIFF_VERSION_INFO=$LIBTIFF_MAJOR_VERSION$LIBTIFF_MINOR_VERSION:$LIBTIFF_MICRO_VERSION:0 # ;; # *) # LIBTIFF_VERSION_INFO=$LIBTIFF_MAJOR_VERSION:$LIBTIFF_MINOR_VERSION:$LIBTIFF_MICRO_VERSION # ;; #esac AC_SUBST(LIBTIFF_MAJOR_VERSION) AC_SUBST(LIBTIFF_MINOR_VERSION) AC_SUBST(LIBTIFF_MICRO_VERSION) AC_SUBST(LIBTIFF_ALPHA_VERSION) AC_SUBST(LIBTIFF_VERSION) AC_SUBST(LIBTIFF_VERSION_INFO) AC_SUBST(LIBTIFF_RELEASE_DATE) dnl Checks for programs. AC_PROG_CC AM_PROG_CC_C_O dnl We want warnings. As many warnings as possible. VL_PROG_CC_WARNINGS() AC_PROG_INSTALL AC_PROG_LN_S # Check if LD supports linker scripts, and define automake conditional # HAVE_LD_VERSION_SCRIPT if so. This functionality is currently # constrained to compilers using GNU ld on ELF systems or systems # which provide an adequate emulation thereof. AC_ARG_ENABLE([ld-version-script], AS_HELP_STRING([--enable-ld-version-script], [enable linker version script (default is disabled)]), [have_ld_version_script=$enableval], [have_ld_version_script=no]) if test "$have_ld_version_script" != no; then AC_MSG_CHECKING([if LD -Wl,--version-script works]) save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" cat > conftest.map < #endif ]) dnl Checks for library functions. AC_CHECK_FUNCS([floor isascii memmove memset mmap pow setmode sqrt strchr strrchr strstr strtol strtoull]) dnl Will use local replacements for unavailable functions AC_REPLACE_FUNCS(getopt) AC_REPLACE_FUNCS(strcasecmp) AC_REPLACE_FUNCS(strtoul) AC_REPLACE_FUNCS(strtoull) AC_REPLACE_FUNCS(lfind) dnl --------------------------------------------------------------------------- dnl Check the native cpu bit order. dnl --------------------------------------------------------------------------- AC_MSG_CHECKING([native cpu bit order]) case "$host_cpu" in i*86*|x86_64*) HOST_FILLORDER=FILLORDER_LSB2MSB AC_MSG_RESULT([lsb2msb]) ;; *) HOST_FILLORDER=FILLORDER_MSB2LSB AC_MSG_RESULT([msb2lsb]) ;; esac AC_DEFINE_UNQUOTED(HOST_FILLORDER, $HOST_FILLORDER, [Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB)]) dnl --------------------------------------------------------------------------- dnl Configure legacy tifconf.h HOST_BIGENDIAN. dnl --------------------------------------------------------------------------- if test "$ac_cv_c_bigendian" = yes ; then HOST_BIGENDIAN=1 else HOST_BIGENDIAN=0 fi AC_DEFINE_UNQUOTED(HOST_BIGENDIAN,$HOST_BIGENDIAN,[Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian (Intel)]) dnl --------------------------------------------------------------------------- dnl Make the POSIX.2 features available. dnl --------------------------------------------------------------------------- #_POSIX_C_SOURCE=2 #AC_DEFINE_UNQUOTED(_POSIX_C_SOURCE, $_POSIX_C_SOURCE, [Define this macro to a positive integer to control which POSIX functionality is made available.]) dnl --------------------------------------------------------------------------- dnl Set the floating point format. dnl FIXME: write appropriate test. dnl --------------------------------------------------------------------------- HAVE_IEEEFP=1 AC_DEFINE_UNQUOTED(HAVE_IEEEFP, $HAVE_IEEEFP, [Define as 0 or 1 according to the floating point format suported by the machine]) dnl --------------------------------------------------------------------------- dnl Enable run-time paths to libraries usage. dnl --------------------------------------------------------------------------- AC_ARG_ENABLE(rpath, AS_HELP_STRING([--enable-rpath], [Enable runtime linker paths (-R libtool option)]), [HAVE_RPATH=$enableval], [HAVE_RPATH=no]) AM_CONDITIONAL(HAVE_RPATH, test "$HAVE_RPATH" = "yes") dnl --------------------------------------------------------------------------- dnl Support large files. dnl --------------------------------------------------------------------------- AC_SYS_LARGEFILE dnl --------------------------------------------------------------------------- dnl Point to path where we should install documentation. dnl --------------------------------------------------------------------------- LIBTIFF_DOCDIR=\${prefix}/share/doc/${PACKAGE}-${LIBTIFF_VERSION} AC_ARG_WITH(docdir, AS_HELP_STRING([--with-docdir=DIR], [directory where documentation should be installed]),,) if test "x$with_docdir" != "x" ; then LIBTIFF_DOCDIR=$with_docdir fi AC_SUBST(LIBTIFF_DOCDIR) dnl --------------------------------------------------------------------------- dnl Switch on/off internal codecs. dnl --------------------------------------------------------------------------- AC_ARG_ENABLE(ccitt, AS_HELP_STRING([--disable-ccitt], [disable support for CCITT Group 3 & 4 algorithms]), [HAVE_CCITT=$enableval], [HAVE_CCITT=yes]) if test "$HAVE_CCITT" = "yes" ; then AC_DEFINE(CCITT_SUPPORT,1,[Support CCITT Group 3 & 4 algorithms]) fi AC_ARG_ENABLE(packbits, AS_HELP_STRING([--disable-packbits], [disable support for Macintosh PackBits algorithm]), [HAVE_PACKBITS=$enableval], [HAVE_PACKBITS=yes]) if test "$HAVE_PACKBITS" = "yes" ; then AC_DEFINE(PACKBITS_SUPPORT,1,[Support Macintosh PackBits algorithm]) fi AC_ARG_ENABLE(lzw, AS_HELP_STRING([--disable-lzw], [disable support for LZW algorithm]), [HAVE_LZW=$enableval], [HAVE_LZW=yes]) if test "$HAVE_LZW" = "yes" ; then AC_DEFINE(LZW_SUPPORT,1,[Support LZW algorithm]) fi AC_ARG_ENABLE(thunder, AS_HELP_STRING([--disable-thunder], [disable support for ThunderScan 4-bit RLE algorithm]), [HAVE_THUNDER=$enableval], [HAVE_THUNDER=yes]) if test "$HAVE_THUNDER" = "yes" ; then AC_DEFINE(THUNDER_SUPPORT,1,[Support ThunderScan 4-bit RLE algorithm]) fi HAVE_NEXT=yes AC_ARG_ENABLE(next, AS_HELP_STRING([--disable-next], [disable support for NeXT 2-bit RLE algorithm]), [HAVE_NEXT=$enableval], [HAVE_NEXT=yes]) if test "$HAVE_NEXT" = "yes" ; then AC_DEFINE(NEXT_SUPPORT,1,[Support NeXT 2-bit RLE algorithm]) fi AC_ARG_ENABLE(logluv, AS_HELP_STRING([--disable-logluv], [disable support for LogLuv high dynamic range encoding]), [HAVE_LOGLUV=$enableval], [HAVE_LOGLUV=yes]) if test "$HAVE_LOGLUV" = "yes" ; then AC_DEFINE(LOGLUV_SUPPORT,1,[Support LogLuv high dynamic range encoding]) fi dnl --------------------------------------------------------------------------- dnl Switch on/off support for Microsoft Document Imaging dnl --------------------------------------------------------------------------- AC_ARG_ENABLE(mdi, AS_HELP_STRING([--disable-mdi], [disable support for Microsoft Document Imaging]), [HAVE_MDI=$enableval], [HAVE_MDI=yes]) if test "$HAVE_MDI" = "yes" ; then AC_DEFINE(MDI_SUPPORT,1,[Support Microsoft Document Imaging format]) fi dnl --------------------------------------------------------------------------- dnl Check for ZLIB. dnl --------------------------------------------------------------------------- HAVE_ZLIB=no AC_ARG_ENABLE(zlib, AS_HELP_STRING([--disable-zlib], [disable Zlib usage (required for Deflate compression, enabled by default)]),,) AC_ARG_WITH(zlib-include-dir, AS_HELP_STRING([--with-zlib-include-dir=DIR], [location of Zlib headers]),,) AC_ARG_WITH(zlib-lib-dir, AS_HELP_STRING([--with-zlib-lib-dir=DIR], [location of Zlib library binary]),,) if test "x$enable_zlib" != "xno" ; then if test "x$with_zlib_lib_dir" != "x" ; then LDFLAGS="-L$with_zlib_lib_dir $LDFLAGS" fi AC_CHECK_LIB(z, inflateEnd, [zlib_lib=yes], [zlib_lib=no],) if test "$zlib_lib" = "no" -a "x$with_zlib_lib_dir" != "x"; then AC_MSG_ERROR([Zlib library not found at $with_zlib_lib_dir]) fi if test "x$with_zlib_include_dir" != "x" ; then CPPFLAGS="-I$with_zlib_include_dir $CPPFLAGS" fi AC_CHECK_HEADER(zlib.h, [zlib_h=yes], [zlib_h=no]) if test "$zlib_h" = "no" -a "x$with_zlib_include_dir" != "x" ; then AC_MSG_ERROR([Zlib headers not found at $with_zlib_include_dir]) fi if test "$zlib_lib" = "yes" -a "$zlib_h" = "yes" ; then HAVE_ZLIB=yes fi fi if test "$HAVE_ZLIB" = "yes" ; then AC_DEFINE(ZIP_SUPPORT,1,[Support Deflate compression]) LIBS="-lz $LIBS" tiff_libs_private="-lz ${tiff_libs_private}" if test "$HAVE_RPATH" = "yes" -a "x$with_zlib_lib_dir" != "x" ; then LIBDIR="-R $with_zlib_lib_dir $LIBDIR" fi fi dnl --------------------------------------------------------------------------- dnl Check for Pixar log-format algorithm. dnl --------------------------------------------------------------------------- AC_ARG_ENABLE(pixarlog, AS_HELP_STRING([--disable-pixarlog], [disable support for Pixar log-format algorithm (requires Zlib)]), [HAVE_PIXARLOG=$enableval], [HAVE_PIXARLOG=yes]) if test "$HAVE_ZLIB" = "yes" -a "$HAVE_PIXARLOG" = "yes" ; then AC_DEFINE(PIXARLOG_SUPPORT, 1, [Support Pixar log-format algorithm (requires Zlib)]) else HAVE_PIXARLOG=no fi dnl --------------------------------------------------------------------------- dnl Check for JPEG. dnl --------------------------------------------------------------------------- HAVE_JPEG=no AC_ARG_ENABLE(jpeg, AS_HELP_STRING([--disable-jpeg], [disable IJG JPEG library usage (required for JPEG compression, enabled by default)]),,) AC_ARG_WITH(jpeg-include-dir, AS_HELP_STRING([--with-jpeg-include-dir=DIR], [location of IJG JPEG library headers]),,) AC_ARG_WITH(jpeg-lib-dir, AS_HELP_STRING([--with-jpeg-lib-dir=DIR], [location of IJG JPEG library binary]),,) if test "x$enable_jpeg" != "xno" ; then if test "x$with_jpeg_lib_dir" != "x" ; then LDFLAGS="-L$with_jpeg_lib_dir $LDFLAGS" fi AC_CHECK_LIB(jpeg, jpeg_read_scanlines, [jpeg_lib=yes], [jpeg_lib=no],) if test "$jpeg_lib" = "no" -a "x$with_jpeg_lib_dir" != "x" ; then AC_MSG_ERROR([IJG JPEG library not found at $with_jpeg_lib_dir]) fi if test "x$with_jpeg_include_dir" != "x" ; then CPPFLAGS="-I$with_jpeg_include_dir $CPPFLAGS" fi AC_CHECK_HEADER(jpeglib.h, [jpeg_h=yes], [jpeg_h=no]) if test "$jpeg_h" = "no" -a "x$with_jpeg_include_dir" != "x" ; then AC_MSG_ERROR([IJG JPEG library headers not found at $with_jpeg_include_dir]) fi if test "$jpeg_lib" = "yes" -a "$jpeg_h" = "yes" ; then HAVE_JPEG=yes fi fi if test "$HAVE_JPEG" = "yes" ; then AC_DEFINE(JPEG_SUPPORT,1,[Support JPEG compression (requires IJG JPEG library)]) LIBS="-ljpeg $LIBS" tiff_libs_private="-ljpeg ${tiff_libs_private}" if test "$HAVE_RPATH" = "yes" -a "x$with_jpeg_lib_dir" != "x" ; then LIBDIR="-R $with_jpeg_lib_dir $LIBDIR" fi fi dnl --------------------------------------------------------------------------- dnl Check for Old JPEG. dnl --------------------------------------------------------------------------- AC_ARG_ENABLE(old-jpeg, AS_HELP_STRING([--disable-old-jpeg], [disable support for Old JPEG compresson (read-only, enabled by default)]), [HAVE_OJPEG=${enableval}], [HAVE_OJPEG=yes]) if test "$HAVE_JPEG" = "yes" -a "$HAVE_OJPEG" = "yes" ; then AC_DEFINE(OJPEG_SUPPORT, 1, [Support Old JPEG compresson (read-only)]) else HAVE_OJPEG=no fi dnl --------------------------------------------------------------------------- dnl Check for JBIG-KIT. dnl --------------------------------------------------------------------------- HAVE_JBIG=no AC_ARG_ENABLE(jbig, AS_HELP_STRING([--disable-jbig], [disable JBIG-KIT usage (required for ISO JBIG compression, enabled by default)]),,) AC_ARG_WITH(jbig-include-dir, AS_HELP_STRING([--with-jbig-include-dir=DIR], [location of JBIG-KIT headers]),,) AC_ARG_WITH(jbig-lib-dir, AS_HELP_STRING([--with-jbig-lib-dir=DIR], [location of JBIG-KIT library binary]),,) if test "x$enable_jbig" != "xno" ; then if test "x$with_jbig_lib_dir" != "x" ; then LDFLAGS="-L$with_jbig_lib_dir $LDFLAGS" fi AC_CHECK_LIB(jbig, jbg_dec_init, [jbig_lib=yes], [jbig_lib=no],) if test "$jbig_lib" = "no" -a "x$with_jbig_lib_dir" != "x" ; then AC_MSG_ERROR([JBIG-KIT library not found at $with_jbig_lib_dir]) fi if test "x$with_jbig_include_dir" != "x" ; then CPPFLAGS="-I$with_jbig_include_dir $CPPFLAGS" fi AC_CHECK_HEADER(jbig.h, [jbig_h=yes], [jbig_h=no]) if test "$jbig_h" = "no" -a "x$with_jbig_include_dir" != "x" ; then AC_MSG_ERROR([JBIG-KIT library headers not found at $with_jbig_include_dir]) fi if test "$jbig_lib" = "yes" -a "$jbig_h" = "yes" ; then HAVE_JBIG=yes fi fi if test "$HAVE_JBIG" = "yes" ; then AC_DEFINE(JBIG_SUPPORT,1,[Support ISO JBIG compression (requires JBIG-KIT library)]) LIBS="-ljbig $LIBS" tiff_libs_private="-ljbig ${tiff_libs_private}" if test "$HAVE_RPATH" = "yes" -a "x$with_jbig_lib_dir" != "x" ; then LIBDIR="-R $with_jbig_lib_dir $LIBDIR" fi # Older versions of jbigkit lack jbg_newlen AC_CHECK_FUNCS([jbg_newlen]) fi dnl --------------------------------------------------------------------------- dnl Check for liblzma2. dnl --------------------------------------------------------------------------- HAVE_LZMA=no AC_ARG_ENABLE(lzma, AS_HELP_STRING([--disable-lzma], [disable liblzma usage (required for LZMA2 compression, enabled by default)]),,) AC_ARG_WITH(lzma-include-dir, AS_HELP_STRING([--with-lzma-include-dir=DIR], [location of liblzma headers]),,) AC_ARG_WITH(lzma-lib-dir, AS_HELP_STRING([--with-lzma-lib-dir=DIR], [location of liblzma library binary]),,) if test "x$enable_lzma" != "xno" ; then if test "x$with_lzma_lib_dir" != "x" ; then LDFLAGS="-L$with_lzma_lib_dir $LDFLAGS" fi AC_CHECK_LIB(lzma, lzma_code, [lzma_lib=yes], [lzma_lib=no],) if test "$lzma_lib" = "no" -a "x$with_lzma_lib_dir" != "x"; then AC_MSG_ERROR([lzma library not found at $with_lzma_lib_dir]) fi if test "x$with_lzma_include_dir" != "x" ; then CPPFLAGS="-I$with_lzma_include_dir $CPPFLAGS" fi AC_CHECK_HEADER(lzma.h, [lzma_h=yes], [lzma_h=no]) if test "$lzma_h" = "no" -a "x$with_lzma_include_dir" != "x" ; then AC_MSG_ERROR([Liblzma headers not found at $with_lzma_include_dir]) fi if test "$lzma_lib" = "yes" -a "$lzma_h" = "yes" ; then HAVE_LZMA=yes fi fi if test "$HAVE_LZMA" = "yes" ; then AC_DEFINE(LZMA_SUPPORT,1,[Support LZMA2 compression]) LIBS="-llzma $LIBS" tiff_libs_private="-llzma ${tiff_libs_private}" if test "$HAVE_RPATH" = "yes" -a "x$with_lzma_lib_dir" != "x" ; then LIBDIR="-R $with_lzma_lib_dir $LIBDIR" fi fi dnl --------------------------------------------------------------------------- dnl Should 8/12 bit jpeg mode be enabled? dnl --------------------------------------------------------------------------- HAVE_JPEG12=no AC_ARG_ENABLE(jpeg12, AS_HELP_STRING([--enable-jpeg12], [enable libjpeg 8/12bit dual mode]),,) AC_ARG_WITH(jpeg12-include-dir, AS_HELP_STRING([--with-jpeg12-include-dir=DIR], [location of libjpeg 12bit headers]),,) AC_ARG_WITH(jpeg12-lib, AS_HELP_STRING([--with-jpeg12-lib=LIBRARY], [path to libjpeg 12bit library]),,) if test "x$enable_jpeg12" == "xyes" ; then if test "x$with_jpeg12_lib" != "x" ; then LIBS="$with_jpeg12_lib $LIBS" fi HAVE_JPEG12=yes AC_DEFINE(JPEG_DUAL_MODE_8_12,1,[8/12 bit libjpeg dual mode enabled]) if test "x$with_jpeg12_include_dir" != "x" ; then AC_DEFINE_UNQUOTED(LIBJPEG_12_PATH,"$with_jpeg12_include_dir/jpeglib.h",[12bit libjpeg primary include file with path]) fi fi dnl --------------------------------------------------------------------------- dnl Check for C++. dnl --------------------------------------------------------------------------- AC_ARG_ENABLE(cxx, AS_HELP_STRING([--enable-cxx], [enable C++ stream API building (requires C++ compiler)]), [HAVE_CXX=$enableval], [HAVE_CXX=yes]) if test "$HAVE_CXX" = "yes" ; then AC_DEFINE(CXX_SUPPORT, 1, [Support C++ stream API (requires C++ compiler)]) else HAVE_CXX=no fi AM_CONDITIONAL(HAVE_CXX, test "$HAVE_CXX" = "yes") dnl --------------------------------------------------------------------------- dnl Check for OpenGL and GLUT. dnl --------------------------------------------------------------------------- HAVE_OPENGL=no AC_PATH_XTRA dnl AX_CHECK_GL sets GL_CFLAGS & GL_LIBS. Also PTHREAD_LIBS, dnl PTHREAD_CFLAGS, & PTHREAD_CC as a side-effect AX_CHECK_GL dnl AX_CHECK_GLU sets GLU_CFLAGS & GLU_LIBS AX_CHECK_GLU dnl AX_CHECK_GLUT sets GLUT_CFLAGS & GLUT_LIBS AX_CHECK_GLUT if test "$no_x" != "yes" -a "$no_gl" != "yes" \ -a "$no_glu" != "yes" -a "$no_glut" != "yes" ; then HAVE_OPENGL=yes fi AM_CONDITIONAL(HAVE_OPENGL, test "$HAVE_OPENGL" = "yes") dnl --------------------------------------------------------------------------- dnl Check for Win32 IO: make sure we have windows.h but not cygwin dnl this must be after the ogl test, since that looks for windows.h and we dnl test it dnl --------------------------------------------------------------------------- win32_io_ok=no case "${host_os}" in cygwin*) ;; *) if test x"$ac_cv_header_windows_h" = xyes; then win32_io_ok=yes AC_DEFINE(USE_WIN32_FILEIO,1,[define to use win32 IO system]) fi ;; esac AM_CONDITIONAL([WIN32_IO], [test "$win32_io_ok" = yes]) dnl --------------------------------------------------------------------------- dnl Check for X Athena Widgets dnl --------------------------------------------------------------------------- dnl HAVE_XAW=no dnl ICE_FIND_ATHENA dnl if test "$no_xaw" != "yes" ; then dnl HAVE_XAW=yes dnl fi dnl AM_CONDITIONAL(HAVE_XAW, test "$HAVE_XAW" = "yes") dnl =========================================================================== dnl ``Orthogonal Features'' dnl =========================================================================== dnl --------------------------------------------------------------------------- dnl Default handling of strip chopping support. dnl --------------------------------------------------------------------------- AC_ARG_ENABLE(strip-chopping, AS_HELP_STRING([--disable-strip-chopping], [disable support for strip chopping (whether or not to convert single-strip uncompressed images to mutiple strips of specified size to reduce memory usage)]), [HAVE_STRIPCHOP=$enableval], [HAVE_STRIPCHOP=yes]) AC_ARG_WITH(default-strip-size, AS_HELP_STRING([--with-default-strip-size=SIZE], [default size of the strip in bytes (when strip chopping enabled) [[default=8192]]]),,) if test "$HAVE_STRIPCHOP" = "yes" \ -a "x$with_default_strip_size" != "xno"; then AC_DEFINE(STRIPCHOP_DEFAULT,TIFF_STRIPCHOP,[Support strip chopping (whether or not to convert single-strip uncompressed images to mutiple strips of specified size to reduce memory usage)]) if test "x$with_default_strip_size" = "x" \ -o "x$with_default_strip_size" = "xyes"; then with_default_strip_size="8192" fi AC_DEFINE_UNQUOTED(STRIP_SIZE_DEFAULT,$with_default_strip_size,[Default size of the strip in bytes (when strip chopping enabled)]) fi dnl --------------------------------------------------------------------------- dnl Should we try to defer loading of strip/tile offsets and sizes to dnl optimize directory scanning? These is an experimental feature for dnl libtiff 4.0. dnl --------------------------------------------------------------------------- AC_ARG_ENABLE(defer-strile-load, AS_HELP_STRING([--enable-defer-strile-load], [enable deferred strip/tile offset/size loading (experimental)]), [HAVE_DEFER_STRILE_LOAD=$enableval], [HAVE_DEFER_STRILE_LOAD=no]) if test "$HAVE_DEFER_STRILE_LOAD" = "yes" ; then AC_DEFINE(DEFER_STRILE_LOAD,1,[enable deferred strip/tile offset/size loading (experimental)]) fi dnl --------------------------------------------------------------------------- dnl Check for support of CHUNKY_STRIP_READ_SUPPORT, a mechanism to allowing dnl reading large strips (usually one strip files) in chunks when using dnl TIFFReadScanline(). This is an experimental feature in libtiff 4.0. dnl --------------------------------------------------------------------------- AC_ARG_ENABLE(chunky-strip-read, AS_HELP_STRING([--enable-chunky-strip-read], [enable reading large strips in chunks for TIFFReadScanline() (experimental)]), [HAVE_CHUNKY_STRIP_READ=$enableval], [HAVE_CHUNKY_STRIP_READ=no]) if test "$HAVE_CHUNKY_STRIP_READ" = "yes" ; then AC_DEFINE(CHUNKY_STRIP_READ_SUPPORT,1,[enable partial strip reading for large strips (experimental)]) fi dnl --------------------------------------------------------------------------- dnl Default subifd support. dnl --------------------------------------------------------------------------- AC_DEFINE(SUBIFD_SUPPORT,1,[Enable SubIFD tag (330) support]) dnl --------------------------------------------------------------------------- dnl Default handling of ASSOCALPHA support. dnl --------------------------------------------------------------------------- AC_ARG_ENABLE(extrasample-as-alpha, AS_HELP_STRING([--disable-extrasample-as-alpha], [the RGBA interface will treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA files but don't mark the alpha properly]), [HAVE_EXTRASAMPLE_AS_ALPHA=$enableval], [HAVE_EXTRASAMPLE_AS_ALPHA=yes]) if test "$HAVE_EXTRASAMPLE_AS_ALPHA" = "yes" ; then AC_DEFINE(DEFAULT_EXTRASAMPLE_AS_ALPHA, 1, [Treat extra sample as alpha (default enabled). The RGBA interface will treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA files but don't mark the alpha properly.]) fi dnl --------------------------------------------------------------------------- dnl Default handling of YCbCr subsampling support. dnl See Bug 168 in Bugzilla, and JPEGFixupTestSubsampling() for details. dnl --------------------------------------------------------------------------- AC_ARG_ENABLE(check-ycbcr-subsampling, AS_HELP_STRING([--disable-check-ycbcr-subsampling], [disable picking up YCbCr subsampling info from the JPEG data stream to support files lacking the tag]), [CHECK_JPEG_YCBCR_SUBSAMPLING=$enableval], [CHECK_JPEG_YCBCR_SUBSAMPLING=yes]) if test "$CHECK_JPEG_YCBCR_SUBSAMPLING" = "yes" ; then AC_DEFINE(CHECK_JPEG_YCBCR_SUBSAMPLING, 1, [Pick up YCbCr subsampling info from the JPEG data stream to support files lacking the tag (default enabled).]) fi dnl --------------------------------------------------------------------------- AC_SUBST(LIBDIR) AC_CONFIG_HEADERS([libtiff/tif_config.h libtiff/tiffconf.h]) AC_CONFIG_FILES([Makefile \ build/Makefile \ contrib/Makefile \ contrib/addtiffo/Makefile \ contrib/dbs/Makefile \ contrib/dbs/xtiff/Makefile \ contrib/iptcutil/Makefile \ contrib/mfs/Makefile \ contrib/pds/Makefile \ contrib/ras/Makefile \ contrib/stream/Makefile \ contrib/tags/Makefile \ contrib/win_dib/Makefile \ html/Makefile \ html/images/Makefile \ html/man/Makefile \ libtiff-4.pc \ libtiff/Makefile \ man/Makefile \ port/Makefile \ test/Makefile \ tools/Makefile]) AC_OUTPUT dnl --------------------------------------------------------------------------- dnl Display configuration status dnl --------------------------------------------------------------------------- LOC_MSG() LOC_MSG([Libtiff is now configured for ${host}]) LOC_MSG() LOC_MSG([ Installation directory: ${prefix}]) LOC_MSG([ Documentation directory: ${LIBTIFF_DOCDIR}]) LOC_MSG([ C compiler: ${CC} ${CFLAGS}]) LOC_MSG([ C++ compiler: ${CXX} ${CXXFLAGS}]) LOC_MSG([ Enable runtime linker paths: ${HAVE_RPATH}]) LOC_MSG([ Enable linker symbol versioning: ${have_ld_version_script}]) LOC_MSG([ Support Microsoft Document Imaging: ${HAVE_MDI}]) LOC_MSG([ Use win32 IO: ${win32_io_ok}]) LOC_MSG() LOC_MSG([ Support for internal codecs:]) LOC_MSG([ CCITT Group 3 & 4 algorithms: ${HAVE_CCITT}]) LOC_MSG([ Macintosh PackBits algorithm: ${HAVE_PACKBITS}]) LOC_MSG([ LZW algorithm: ${HAVE_LZW}]) LOC_MSG([ ThunderScan 4-bit RLE algorithm: ${HAVE_THUNDER}]) LOC_MSG([ NeXT 2-bit RLE algorithm: ${HAVE_NEXT}]) LOC_MSG([ LogLuv high dynamic range encoding: ${HAVE_LOGLUV}]) LOC_MSG() LOC_MSG([ Support for external codecs:]) LOC_MSG([ ZLIB support: ${HAVE_ZLIB}]) LOC_MSG([ Pixar log-format algorithm: ${HAVE_PIXARLOG}]) LOC_MSG([ JPEG support: ${HAVE_JPEG}]) LOC_MSG([ Old JPEG support: ${HAVE_OJPEG}]) LOC_MSG([ JPEG 8/12 bit dual mode: ${HAVE_JPEG12}]) LOC_MSG([ ISO JBIG support: ${HAVE_JBIG}]) LOC_MSG([ LZMA2 support: ${HAVE_LZMA}]) LOC_MSG() LOC_MSG([ C++ support: ${HAVE_CXX}]) LOC_MSG() dnl LOC_MSG([ X Athena Widgets support: ${HAVE_XAW}]) LOC_MSG([ OpenGL support: ${HAVE_OPENGL}]) LOC_MSG() tiff-4.0.3/HOWTO-RELEASE0000644000212300117540000000725512027351677011313 00000000000000HOWTO-RELEASE: Notes on releasing. 0. Make sure that you have current FSF releases of autoconf, automake, and libtool packages installed under a common installation prefix and that these tools are in your executable search path prior to any other installed versions. Versions delivered with Linux may be altered so it is best to install official FSF releases. GNU 'm4' 1.4.16 is needed in order to avoid bugs in m4. These packages may be downloaded from the following ftp locations: autoconf - ftp://ftp.gnu.org/pub/gnu/autoconf automake - ftp://ftp.gnu.org/pub/gnu/automake libtool - ftp://ftp.gnu.org/pub/gnu/libtool m4 - ftp://ftp.gnu.org/pub/gnu/m4 Release builds should only be done on a system with a functioning and correctly set system clock and on a filesystem which accurately records file update times. Use of GNU make is recommended. 1. Commit any unsaved changes. 2. Create html/vX.X.html. Take ChangeLog entries and html-ify in there. Easist thing to do is take html/vX.(X-1).html and use it as a template. Add that file to the list of EXTRA_DIST files in the html/Makefile.am. 3. Update html/index.html to refer to this new page as the current release. 4. Increment the release version in configure.ac. Put 'alpha' or 'beta' after the version, if applicable. For example: 4.0.0 or 4.0.0beta7 Version should be updated in two places: in the second argument of the AC_INIT macro and in LIBTIFF_xxx_VERSION variables. 5. Update library ELF versioning in configure.ac (LIBTIFF_CURRENT, LIBTIFF_REVISION, and LIBTIFF_AGE). These numbers have nothing to do with the libtiff release version numbers. Note that as of libtiff 4.X, proper ELF versioning is used so please follow the rules listed in configure.ac. At a bare minimum, you should increment LIBTIFF_REVISION for each release so that installed library files don't overwrite existing files. If APIs have been added, removed, or interface structures have changed, then more care is required. 6. Add an entry to Changelog similar to: * libtiff 4.0.0 released. 7. In the source tree do ./autogen.sh This step may be skipped if you have already been using a maintainer build with current autoconf, automake, and libtool packages. It is only needed when updating tool versions. 8. It is recommended (but not required) to build outside of the source tree so that the source tree is kept in a pristine state. This also allows sharing the source directory on several networked systems. For example: mkdir libtiff-build cd libtiff-build /path/to/libtiff/configure --enable-maintainer-mode otherwise do ./configure --enable-maintainer-mode 9. In the build tree do make release This will update "RELEASE-DATE", "VERSION", and libtiff/tiffvers.h in the source tree. 10. In the source tree, verify that the version info in RELEASE-DATE, VERSION and libtiff/tiffvers.h is right. 11. In the build tree do make make distcheck If 'make distcheck' fails, then correct any issues until it succeeds. Two files with names tiff-version.tar.gz and tiff-version.zip will be created in the top level build directory. 12. In the source tree do 'cvs commit'. 13. In the source tree do cvs tag Release-v4-0-0 (or the appropriate name for the release) 14. Copy release packages from the build tree to the ftp.remotesensing.org ftp site. scp tiff-*.tar.gz tiff-*.zip \ warmerdam@upload.osgeo.org:/osgeo/download/libtiff 15. Announce to list, tiff@lists.maptools.org 16. Update libtiff page on freshmeat with new version announcement. tiff-4.0.3/ChangeLog0000644000212300117540000061526612027361063011161 000000000000002012-09-22 Bob Friesenhahn * libtiff 4.0.3 released. 2012-09-20 Bob Friesenhahn * Makefile.am: Update to Automake 1.12.4 2012-08-19 Bob Friesenhahn * Makefile.in: Update to Automake 1.12.3 * libtiff{tiff.h, tif_print.c, tif_dirinfo.c, tif_dirread.c}: Add some TIFF/FX support in libtiff. Add the tag definitions to tiff.h. Add the related TIFF field definitions to tif_dirinfo.c, and also fixes an error in a comment. Adds the photometric values to tif_print.c, and fixes a bug. These changes are by Steve Underwood. 2012-08-13 Frank Warmerdam * libtiff/tif_write.c: Fix bug rewriting image tiles in a compressed file: http://trac.osgeo.org/gdal/ticket/4771 2012-08-02 Frank Warmerdam * libtiff/tif_dirread.c: report error in case of mismatch value counts for tags (ie. DotRange). 2012-07-26 Tom Lane * libtiff/{tiffio.h, tif_dirinfo.c, libtiff.def}: Add six new functions TIFFFieldTag(), TIFFFieldName(), TIFFFieldDataType(), TIFFFieldPassCount(), TIFFFieldReadCount(), TIFFFieldWriteCount() as external accessors for the opaque type TIFFField. * tools/tiffset.c: Make tiffset use the above functions instead of relying on library private headers. 2012-07-19 Tom Lane * tools/tiff2pdf.c: Fix two places where t2p_error didn't get set after a malloc failure. No crash risk AFAICS, but the program might not report exit code 1 as desired. h/t mancha@mac.hush.com 2012-07-18 Tom Lane * tools/tiff2pdf.c: Fail when TIFFSetDirectory() fails. This prevents core dumps or perhaps even arbitrary code execution when processing a corrupt input file (CVE-2012-3401). 2012-07-06 Bob Friesenhahn * test/raw_decode.c (main): Test fixes to work with IJG JPEG 7+. IJG JPEG 7+ uses a different upsampling algorithm which produces different numeric results. * libtiff/tif_jpeg.c (JPEGPreDecode): Patch from Even Rouault to work with IJG JPEG 7+. 2012-07-04 Bob Friesenhahn * test/raw_decode.c: Add changes so that test can run with build directory outside of source directory. 2012-07-02 Frank Warmerdam * libtiff/tif_jpeg.c: Fix handling when writing RGBA jpeg compressed imagery (http://trac.osgeo.org/gdal/ticket/4732) 2012-06-20 Frank Warmerdam * libtiff/tif_fax3.c: fix memory initialization of runs, only partly done. * libtiff/tif_pixarlog.c: Make sure tbuf is large enough for one full "stride" past the end. 2012-06-19 Frank Warmerdam * libtiff/tif_packbits.c: fix read past end of data buffer. 2012-06-15 Frank Warmerdam * libtiff 4.0.2 released. * tools/tif2pdf.c, tools/tifdump.c: avoid unitialized variable warnings with clang. 2012-06-15 Tom Lane * tools/tiff2pdf.c: Defend against integer overflows while calculating required buffer sizes (CVE-2012-2113). 2012-06-12 Frank Warmerdam * libtiff/tif_print.c: Be careful about printing corrupt inknames. * libtiff/tif_fax3.c: Ensure runs array is initialized to zeros. 2012-06-07 Frank Warmerdam * libtiff/tif_print.c: avoid pretty printing other fields when we don't have the proper amount and type of data or if the field is actually autodefined. 2012-06-05 Frank Warmerdam * libtiff/tif_tile.c, libtiff/tif_strip.c: Ensure that illegal ycbcrsubsampling values result in a runtime error, not just an assertion. * tests/custom_dir.c: Add testing of EXIF and custom directory reading and writing. * libtiff/tif_dir.c, libtiff/tiffio.h: Add TIFFCreateCustomDirectory() and TIFFCreateEXIFDirectory() functions. * libtiff/tif_dir.c, tif_print.c : Remove FIELD_CUSTOM handling for PAGENUMBER, HALFTONEHINTS, and YCBCRSUBSAMPLING. Implement DOTRANGE differently. This is to avoid using special TIFFGetField/TIFFSetField rules for these fields in non-image directories (like EXIF). 2012-06-04 Frank Warmerdam * libtiff/tif_jpeg.c: Remove code for fixing up h_sampling and v_sampling in JPEGPreDecode(). If a fixup will be done it needs to be done sooner in JPEGFixupTagsSubsampling() or else buffer sized may be wrong. 2012-06-01 Frank Warmerdam * tools/tiffinfo.c: Do not try to read image data in EXIF directories. * libtiff/tif_getimage.c: added support for _SEPARATED CMYK images. http://bugzilla.maptools.org/show_bug.cgi?id=2379 * libtiff/tif_unix.c: use strerror() to return a more specific error message on failed open. http://bugzilla.maptools.org/show_bug.cgi?id=2341 * libtiff/tif_jpeg.c: Fix JPEGDecodeRaw() bugs. http://bugzilla.maptools.org/show_bug.cgi?id=2386 * tests/decode_raw.c, tests/images/quad-tile.jpg.tiff: add limited support for testing jpeg in tiff image decoding including the "raw" decode interface. 2012-05-31 Frank Warmerdam * libtiff/tif_jpeg.c: avoid overrunning the end of the output buffer in JPEGDecodeRaw() - mostly likely to occur when there is confusion about sampling values. * libtiff/tif_read.c: Make sure tif_rawdatasize is cleared when tif_rawdata is freed. * libtiff/tif_getimage.c: Add support for greyscale+alpha c/o Jérémie Laval. http://bugzilla.maptools.org/show_bug.cgi?id=2398 2012-05-29 Frank Warmerdam * libtiff/tif_dir.c: avoid using specific set/get logic to process fields in custom directories, like EXIF directories. This fixes problems like a tag "320" existing in a custom directory getting processed as if it were a colormap when it isn't really. Damn the wide variety of argument formulations to get/set functions for different tags! * libtiff/tif_dir.c: Ensure that we keep track of when tif_rawdata is a pointer into an mmap()ed file via TIFF_BUFFERMMAP flag. 2012-05-24 Frank Warmerdam * libtiff/tif_pixarlog.c: Allocate working buffer one word larger since we "forward accumulate" and overwrite the end by one word in at least some cases. 2012-05-23 Frank Warmerdam * libtiff/tif_pixarlog.c: avoid accessing out of the lookup arrays for out of range inputs. * tools/tiffinfo.c: initialize h=0 to avoid undefined variable for degenerate files. * libtiff/tif_ojpeg.c: if OJPEGWriteHeader() fails once do not bother trying again on the same image. * libtiff/tif_ojpeg.c: make things more resilient in the face of files without stripbytecounts or stripoffsets or where loading these fails. * libtiff/tif_print.c: be careful about whether min/max values are singular or one per sample. * libtiff/tif_print.c: Avoid confusion about count size when printing custom fields. May affect things like ISOSpeedRatings. * libtiff/tif_dir.c: avoid one byte past end of ink names reading in some cases. 2012-05-19 Bob Friesenhahn * man/TIFFGetField.3tiff: Correct the 'count' field type in the example for how to retreive the value of unsupported tags. 2012-03-30 Frank Warmerdam * tif_getimage.c: Fix size overflow (zdi-can-1221,CVE-2012-1173) care of Tom Lane @ Red Hat. 2012-02-18 Bob Friesenhahn * libtiff 4.0.1 released. * Update automake used to 1.11.3. * libtiff/tiffio.h: Use double-underbar syntax in GCC printf attribute specification to lessen the risk of accidental macro substitution. Patch from Vincent Torri. 2012-01-31 Frank Warmerdam * libtiff/tif_dir.c, libtiff/tif_dirread.c: Extra caution around assumption tag fetching is always successful. * libtiff/tif_jpeg.c: Extra caution for case where sp is NULL. 2012-01-22 Bob Friesenhahn * configure.ac: Add support for using library symbol versioning on ELF systems with the GNU linker. Support is enabled via --enable-ld-version-script. Disabled by default for now until there is a decision for how to deploy a libtiff with versioned symbols after libtiff 4.0.0 was already released. 2011-12-22 Bob Friesenhahn * libtiff/tif_win32.c: Eliminate some minor 64-bit warnings in tif_win32.c. Patch by Edward Lam. * configure.ac: Add libtiff private dependency on -llzma for pkg-config. Patch by Mark Brand. Updated Automake to 1.11.2. 2011-12-21 Bob Friesenhahn * libtiff 4.0.0 released. 2011-12-08 Frank Warmerdam * libtiff/tif_dirread.c, libtiff/tif_read.c: more cautious checking of _TIFFFillStriles() results (#gdal 4372) 2011-12-07 Frank Warmerdam * libtiff/tif_dirread.c: fixes to deal with invalid files where _TIFFFillStriles() fails, and we try to chop up strips (gdal #4372) * libtiff/tif_dirread.c: fix error reporting when there is no tag information struct and name (gdal #4373) 2011-10-22 Bob Friesenhahn * Update GNU libtool to 2.4.2. * tools/tiffsplit.c (tiffcp): TIFFGetField count field should be uint32 type for TIFFTAG_JPEGTABLES. Patch by Christophe Deroulers. 2011-06-21 Frank Warmerdam * libtiff/libtiff.def: Restore TIFFMergeFieldInfo. 2011-05-31 Jim Meyering * libtiff/tif_dirread.c (TIFFFetchStripThing): Free "data" also upon failure to allocate "resizeddata". * tools/tiff2ps.c (PSDataBW): Zero buffer *after* checking for allocation failure, not before. * libtiff/tif_ojpeg.c: plug leaks on OJPEG read failure path * tools/rgb2ycbcr.c (cvtRaster): unchecked malloc * libtiff/tif_jpeg.c, tools/tiff2pdf.c, tools/tiff2ps.c: mark NULL-deref and possible overflow * tools/tiff2pdf.c: remove decl+set of set-but-not-used local, "written" * libtiff/tif_jpeg.c (JPEGInitializeLibJPEG): Remove declaration and set of otherwise unused local, data_is_empty. * libtiff/tif_jpeg.c (JPEGDecodeRaw) [JPEG_LIB_MK1_OR_12BIT]: Diagnose out-of-memory failure and return 0 rather than dereferencing NULL. 2011-05-24 Frank Warmerdam * libtiff/tif_dirread.c: produce special error message for zero tag directories instead of error out on the malloc(0) failure. 2011-05-16 Frank Warmerdam * libtiff/tif_dirinfo.c: Restore TIFFMergeFieldInfo() and related declarations as they are in active use by libraries such as libgeotiff, and work just fine. (#2315) 2011-04-20 Frank Warmerdam * libtiff/tif_dirinfo.c,tiffio.h: Remove the obsolete TIFFMergeFieldInfo/TIFFFindFieldInfo/TIFFFindFieldInfoByName API. http://bugzilla.maptools.org/show_bug.cgi?id=2315 * libtiff/libtiff.def: add some missing (64bit) APIs. http://bugzilla.maptools.org/show_bug.cgi?id=2316 2011-04-09 Bob Friesenhahn * libtiff 4.0.0beta7 released. 2011-04-09 Bob Friesenhahn * configure.ac: Should use AC_CANONICAL_HOST since host specifies the run-time target whereas target is used to specify the final output target if the package is a build tool (like a compiler), which libtiff is not. Resolves libtiff bug 2307 "Use AC_CANONICAL_HOST macro". 2011-04-02 Bob Friesenhahn * configure.ac: Support configuring TIFF_INT64_FORMAT and TIFF_UINT64_FORMAT appropriately for MinGW32. * tools/tiffdump.c (ReadDirectory): MinGW32 needs to use WIN32 printf conventions for 64-bit types because it uses the WIN32 CRT. * libtiff/{tif_dumpmode.c,tif_luv.c,tif_lzw.c,tif_print.c, tif_read.c,tif_strip.c,tif_thunder.c}: MinGW32 needs to use WIN32 printf conventions for 64-bit types because it uses the WIN32 CRT. * tools/tiff2pdf.c (t2p_write_pdf_string): Fix printf syntax not understood by WIN32 CRT. * libtiff/tif_ojpeg.c: Fixes to compile with MinGW32 GCC. * tools/fax2ps.c (main): Use tmpfile() rather than mkstemp() since it is much more portable. Tmpfile is included in ISO/IEC 9899:1990 and the WIN32 CRT. 2011-03-26 Frank Warmerdam * tools/tiffset.c: add -d and -sd switches to allow operation on a particular directory, not just the first (jef). 2011-03-21 Frank Warmerdam * libtiff/tif_thunder.c: Correct potential buffer overflow with thunder encoded files with wrong bitspersample set. The libtiff development team would like to thank Marin Barbella and TippingPoint's Zero Day Initiative for reporting this vulnerability (ZDI-CAN-1004, CVE-2011-1167). http://bugzilla.maptools.org/show_bug.cgi?id=2300 2011-03-10 Frank Warmerdam * libtiff/tif_fax3.h: Fix to last change allowing zero length runs at the start of a scanline - needed for legal cases. 2011-03-02 Frank Warmerdam * libtiff/tif_fax3.h: Protect against a fax VL(n) codeword commanding a move left. Without this, a malicious input file can generate an indefinitely large series of runs without a0 ever reaching the right margin, thus overrunning our buffer of run lengths. Per CVE-2011-0192. This is a modified version of a patch proposed by Drew Yao of Apple Product Security. It adds an unexpected() report, and disallows the equality case, since emitting a run without increasing a0 still allows buffer overrun. 2011-02-23 Frank Warmerdam * libtiff/tif_jpeg.c: avoid divide by zero in degenerate case (#2296) * tools/tiff2rgba.c: close source file on error to make leak detection easier. * libtiff/tif_getimage.c: avoid leaks if TIFFRGBAImageBegin() fails. http://bugzilla.maptools.org/show_bug.cgi?id=2295 2011-02-22 Frank Warmerdam * libtiff/tif_lzma.c: Maintain tif_rawcc/tif_rawcp (CHUNKY_STRING_READ _SUPPORT) 2011-02-18 Frank Warmerdam * configure.ac, configure: Added support for --enable-chunky-strip-read configure option to enable the experimental feature from a couple months ago for reading big strips in chunks. * configure.ac, tif_read.c, tif_readdir.c, tif_dir.h, tiffiop.h, tif_write.c, tif_print.c, tif_jpeg.c, tif_dirwrite.c, tif_write.c: Implement optional support for deferring the load of strip/tile offset and size tags for optimized scanning of directories. Enabled with the --enable-defer-strile-load configure option (DEFER_STRILE_LOAD #define in tif_config.h). 2011-02-11 Frank Warmerdam * libtiff/tif_print.c: remove unused variable. 2011-02-09 Frank Warmerdam * libtiff/tif_win32.c: avoid error/warning buffer overrun problem with non-console (popup message) builds on win32. http://bugzilla.maptools.org/show_bug.cgi?id=2293 2011-01-24 Olivier Paquet * libtiff/{tif_dir.{h,c}, tif_dirinfo.c, tif_dirread.c, tif_dirwrite.c, tif_print.c, tiff.h, tiffiop.h} : Added support for TIFFTAG_SMINSAMPLEVALUE and TIFFTAG_SMAXSAMPLEVALUE to have different values for each sample. Presents the min/max of all samples by default for compatibility. TIFFSetField/TIFFGetField can be made to handle those tags as arrays by changing the new TIFFTAG_PERSAMPLE pseudo tag. http://www.asmail.be/msg0055458208.html 2011-01-06 Frank Warmerdam * libtiff/tif_pixarlog.c: Note that tif_rawcc/tif_rawcp are not maintained. * libtiff/tif_zip.c: Maintain tif_rawcc/tif_rawcp when decoding for CHUNKY_STRIP_READ_SUPPORT. * libtiff/tif_jpeg.c: ensure that rawcc and rawcp are maintained during JPEGPreDecode and JPEGDecode calls. * libtiff/tif_read.c: larger read ahead for CHUNKY_STRIP_READ_SUPPORT, as compression formats like JPEG keep 16 lines interleaved in a sense and might need to touch quite a bit of data. http://trac.osgeo.org/gdal/ticket/3894 2011-01-03 Lee Howard * libtiff/tif_jpeg.c: Fix regressions with 2 and 3 band images caused by commit on 2010-12-14. Submitted by e-mail from Even Rouault 2010-12-31 Olivier Paquet * libtiff/tif_dirwrite.c: Fixed writing of TIFFTAG_REFERENCEBLACKWHITE. http://bugzilla.maptools.org/show_bug.cgi?id=2266 2010-12-23 Andrey Kiselev * tools/tiffcp.c, man/tiffcp.1: Added support for specifying the compression level parameter (preset) for Deflate and LZMA encoders, e.g "-c lzma:p1" or "-c zip:p9". * libtiff/tif_lzma.c: Properly set the LZMA2 compression level (preset) in LZMAVSetField(). 2010-12-18 Bob Friesenhahn * libtiff/Makefile.am (libtiff_la_SOURCES): Added tif_lzma.c to Makefile. 2010-12-14 Andrey Kiselev * configure.ac, libtiff/{tif_codec.c, tif_config.h.in, tiff.h, tiffiop.h, tif_lzma.c}, tools/tiffcp.c, man/tiffcp.1: Implement a new TIFF compression scheme LZMA reserving a new value 34925 for Compression tag. As per bug http://bugzilla.maptools.org/show_bug.cgi?id=2221 2010-12-14 Lee Howard * libtiff/tif_dirread.c: tolerate some cases where FIELD_COLORMAP is missing http://bugzilla.maptools.org/show_bug.cgi?id=2189 2010-12-14 Lee Howard * libtiff/tif_read.c: change read_ahead to tmsize_t http://bugzilla.maptools.org/show_bug.cgi?id=2222 2010-12-14 Lee Howard * configure.ac, libtiff/Makefile.am: Build tif_win32.c on Windows except on Cygwin http://bugzilla.maptools.org/show_bug.cgi?id=2224 2010-12-14 Lee Howard * tools/gif2tiff.c: fix buffer overrun http://bugzilla.maptools.org/show_bug.cgi?id=2270 2010-12-14 Lee Howard * libtiff/tif_jpeg.c: reduce usage of JCS_UNKNOWN in order to improve compatibility with various viewers submitted by e-mail from Dwight Kelly 2010-12-13 Lee Howard * tools/fax2ps.c: be consistent with page-numbering http://bugzilla.maptools.org/show_bug.cgi?id=2225 2010-12-13 Lee Howard * libtiff/tif_color.c: prevent crash in handling bad TIFFs resolves CVE-2010-2595 http://bugzilla.maptools.org/show_bug.cgi?id=2208 2010-12-13 Lee Howard * tools/tiffcrop.c: new release by Richard Nolde http://bugzilla.maptools.org/show_bug.cgi?id=2004 2010-12-12 Lee Howard * tools/tiff2pdf.c: fix colors for images with RGBA interleaved data http://bugzilla.maptools.org/show_bug.cgi?id=2250 2010-12-12 Lee Howard * libtiff/tif_dirread.c: fix for Zeiss LSM and Canon CR2 files http://bugzilla.maptools.org/show_bug.cgi?id=2164 2010-12-11 Lee Howard * tools/tiff2pdf.c: remove invalid duplication for Lab http://bugzilla.maptools.org/show_bug.cgi?id=2162 2010-12-11 Lee Howard * libtiff/tif_jpeg.c: fix use of clumplines calculation http://bugzilla.maptools.org/show_bug.cgi?id=2149 2010-12-11 Lee Howard * tools/fax2ps.c: replace unsafe tmpfile() with mkstemp() http://bugzilla.maptools.org/show_bug.cgi?id=2118 2010-12-11 Lee Howard * libtiff/tif_ojpeg.c, libtiff/tif_pixarlog.c, libtiff/tif_zip.c: fix build errors for VC6 http://bugzilla.maptools.org/show_bug.cgi?id=2105 2010-12-11 Lee Howard * libtiff/tif_stream.cxx: warnings cleanup http://bugzilla.maptools.org/show_bug.cgi?id=2091 * libtiff/tif_dirread.c: warnings cleanup http://bugzilla.maptools.org/show_bug.cgi?id=2092 2010-12-11 Lee Howard * tools/tiff2pdf.c: add fill-page option http://bugzilla.maptools.org/show_bug.cgi?id=2051 2010-12-11 Lee Howard * libtiff/tif_dirread.c: modify warnings http://bugzilla.maptools.org/show_bug.cgi?id=2016 2010-12-11 Lee Howard * libtiff/tif_ojpeg.c: fix buffer overflow on problem data http://bugzilla.maptools.org/show_bug.cgi?id=1999 2010-12-11 Lee Howard * tools/tiffinfoce.c: strip byte counts are uint64* now 2010-12-11 Lee Howard * libtiff/tif_ojpeg.c: fix crash when reading a TIFF with a zero or missing byte-count tag * tools/tiffsplit.c: abort when reading a TIFF without a byte-count per http://bugzilla.maptools.org/show_bug.cgi?id=1996 2010-12-08 Lee Howard * libtiff/tif_dirread.c: fix crash when reading a badly-constructed TIFF per http://bugzilla.maptools.org/show_bug.cgi?id=1994 2010-12-06 Lee Howard * libtiff/tif_open.c: Fix mode check before opening a file. http://bugzilla.maptools.org/show_bug.cgi?id=1906 2010-11-27 Bob Friesenhahn * libtiff-4.pc.in: Added libtiff pkg-config .pc file support. Patch by Vincent Torri. 2010-10-21 Frank Warmerdam * tools/tiffinfo.c: avoid direct reference to _TIFFerrorHandler. * libtiff/tif_config.vc.h: define snprintf to _snprintf for tiff2pdf. * libtiff/libtiff.def: export _TIFFCheckMalloc for tools. 2010-09-25 Lee Howard * tools/tiff2ps.c: improvements and enhancements from Richard Nolde with additional command line options for Document Title, Document Creator, and Page Orientation 2010-07-13 Bob Friesenhahn * tools/tiffcrop.c: Patch from Richard Nolde to avoid a potentially unterminated buffer due to using an exceptionally long file name. 2010-07-08 Andrey Kiselev * tools/tiff2pdf.c: Fixed ID buffer filling in t2p_write_pdf_trailer(), thanks to Dmitry V. Levin. 2010-07-07 Andrey Kiselev * libtiff/tif_dirread.c: Really reset the tag count in CheckDirCount() to expected value as the warning message suggests. As per bug http://bugzilla.maptools.org/show_bug.cgi?id=1963 2010-07-06 Andrey Kiselev * tools/tiffset.c: Properly handle TIFFTAG_PAGENUMBER, TIFFTAG_HALFTONEHINTS, TIFFTAG_YCBCRSUBSAMPLING, TIFFTAG_DOTRANGE which should be set by value. * libtiff/tif_dirinfo.c: Don't use assertions in _TIFFFieldWithTag() and _TIFFFieldWithName() if the tag is not found in the tag table. This should be normal situation and returned NULL value should be properly handled by the caller. 2010-07-02 Andrey Kiselev * libtiff/tif_getimage.c: Avoid wrong math du to the signed/unsigned integer type conversions. As per bug http://bugzilla.maptools.org/show_bug.cgi?id=2207 * tools/{tiff2bw.c, thumbnail.c, pal2rgb.c}: Fix the count for WhitePoint tag as per bug http://bugzilla.maptools.org/show_bug.cgi?id=2042 * libtiff/tif_getimage.c: Check the number of samples per pixel when working with YCbCr image in PickContigCase(). As per bug http://bugzilla.maptools.org/show_bug.cgi?id=2216 * libtiff/tif_dir.c: Set the bogus post-decoding hook when processing TIFFTAG_BITSPERSAMPLE in _TIFFVSetField() for the case of 8 bit when we don't need any post-processing. That helps to reset the hook if we previously set this field to some other value and the hook was initialized accordingly. As per bug http://bugzilla.maptools.org/show_bug.cgi?id=2035 2010-07-01 Andrey Kiselev * tools/tiffgt.c: Properly check the raster buffer allocations for integer overflows. As per bug http://bugzilla.maptools.org/show_bug.cgi?id=2108 * m4/acinclude.m4: Update GL/GLU/GLUt/Pthread macros from the upstream. * libtiff/{tif_aux.c, tif_strip.c, tif_tile.c, tiffiop.h}: Move multiply_32() and multiply_64() functions into tif_aux.c file and rename them into _TIFFMultiply32() and _TIFFMultiply64() respectively. 2010-06-30 Andrey Kiselev * tools/tiff2pdf.c: Better generation of ID field in t2p_write_pdf_trailer(). Get rid of GCC aliasing warnings. * tools/tiff2pdf.c: Fixed computation of the tile buffer size when converting JPEG encoded tiles. * tools/tiff2pdf.c: Better handling of string fields, use static string buffers instead of dynamically allocated, use strncpy() instead of strcpy(), control the string lengths. 2010-06-25 Andrey Kiselev * tools/tiffcp.c: Initialize buffer arrays with zero to avoid referencing to uninitialized memory in some cases (e.g. when tile size set bigger than the image size). 2010-06-15 Bob Friesenhahn * tools/tiffcrop.c: Patch from Richard Nolde. Reject YCbCr subsampled data since tiffcrop currently doesn't support it. Fix JPEG support. 2010-06-13 Frank Warmerdam * libtiff/tif_dirinfo.c: Fix invocation of tag compare function (#2201) * tools/tiff2pdf.c: Fix assorted bugs in tiff2pdf: missing "return" in t2p_read_tiff_size() causes t2p->tiff_datasize to be set entirely wrong for COMPRESSION_JPEG case, resulting in memory stomp if actual size is larger. Also, there are a bunch of places that try to memset() a malloc'd buffer before checking for malloc failure, which would result in core dump if there actually were a failure. (#2211) 2010-06-11 Bob Friesenhahn * libtiff/tiffiop.h (TIFFSafeMultiply): Need more castings to avoid compiler warnings if parameter types are not sign consistent. * libtiff 4.0.0alpha6 released. * tools/tiffcrop.c: Applied patch from Richard Nolde: Corrected European page size dimensions. Added an option to allow the user to specify a custom page size on the command line. Fix the case where a page size specified with a fractional part was being coerced to an integer by retyping the variables that define the paper size. * html/index.html: Update for the 3.9.3 release. * tools/tiffcp.c (tiffcp): Applied Tom Lane's patch to reject YCbCr subsampled data since tiffcp currently doesn't support it. http://bugzilla.maptools.org/show_bug.cgi?id=2097 * Update libtool to version 2.2.10. 2010-06-10 Bob Friesenhahn * libtiff/tiffiop.h (TIFFSafeMultiply): Work properly if multiplier is zero. 2010-06-09 Bob Friesenhahn * libtiff/tif_fax3.c (Fax3SetupState): Yesterday's fix for CVE-2010-1411 was not complete. * libtiff/tiffiop.h (TIFFSafeMultiply): New macro to safely multiply two integers. Returns zero if there is an integer overflow. * tools/tiffcp.c (main): tiffcp should not leak memory if an error is reported when reading the input file. 2010-06-08 Bob Friesenhahn * Update libtool to version 2.2.8. * libtiff/tif_fax3.c (Fax3SetupState): Avoid under-allocation of buffer due to integer overflow in TIFFroundup() and several other potential overflows. In conjunction with the fix to TIFFhowmany(), fixes CVE-2010-1411. * libtiff/tiffiop.h (TIFFhowmany): Return zero if parameters would result in an integer overflow. This causes TIFFroundup() to also return zero if there would be an integer overflow. * contrib: Add an emacs formatting mode footer to all source files so that emacs can be effectively used. 2010-06-03 Oliver Chen Feng * libtiff/tools/tiffcp.c: add a new option -x to force merged tiff file PAGENUMBER value in sequence for users who care the page sequence, this will also prevent tiff2pdf from creating pdf file from the merged tiff file with wrong page sequence. 2010-05-08 Olivier Paquet * libtiff/tif_dirread.c: Restored TIFFReadDirEntryFloat function in order to add missing TIFF_SETGET_FLOAT case to TIFFFetchNormalTag. * libtiff/tif_dirinfo.c: Use correct set_field_type for TIFFTAG_PIXAR_FOVCOT so it is readable again (regression from 3.9.2). http://bugzilla.maptools.org/show_bug.cgi?id=2192 2010-05-07 Frank Warmerdam * libtiff/tif_jpeg.c: Ensure that quality is always set in JPEGPreEncode(), not just when we want to output local tables. Otherwise the quality used during compression may not be right and might not match the tables in the tables tag. This bug only occurs when seeking between directories in the midst of writing blocks. http://trac.osgeo.org/gdal/ticket/3539 2010-05-06 Andrey Kiselev * html/man/TIFFGetField.3tiff.html, html/man/TIFFSetField.3tiff.html: Regenerated from the source. 2010-05-05 Olivier Paquet * libtiff/tif_print.c: Fixed printing of TIFFTAG_REFERENCEBLACKWHITE which had stopped working. Also made it always print 6 floats instead of 2*SamplesPerPixel. http://bugzilla.maptools.org/show_bug.cgi?id=2191 http://bugzilla.maptools.org/show_bug.cgi?id=2186 * man/TIFFGetField.3tiff, man/TIFFSetField.3tiff: Fixed doc to reflect the fact that libtiff considers TIFFTAG_REFERENCEBLACKWHITE to be 6 floats. 2010-05-05 Frank Warmerdam * libtiff/tif_jpeg.c: Fix to use memcmp(), not memcpy() when checking if the jpeg table was written. This is a fix for the last fix on 04-21. 2010-04-21 Frank Warmerdam * libtiff/tif_jpeg.c: avoid preparing jpeg tables everytime JPEGSetupEncode() is called if the tables already seem to be established. This prevents spurious updates and rewriting of directories with jpegtables when doing updates to existing images. http://trac.osgeo.org/gdal/ticket/3539 2010-04-20 Olivier Paquet * libtiff/tif_dirinfo.c: Use correct set_field_type for TIFFTAG_PIXAR_IMAGEFULLWIDTH, TIFFTAG_PIXAR_IMAGEFULLLENGTH, TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN and TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA. They were unreadable with TIFF_SETGET_UNDEFINED, a regression from 3.9.2. http://bugzilla.maptools.org/show_bug.cgi?id=2139 2010-04-10 Bob Friesenhahn * libtiff/tif_dir.c (_TIFFVSetField): Add a special error case for when the tag count value is zero. Error handling is still a regression since in 3.9.2, empty tags are skipped (with a warning) rather than returning a hard error and refusing to read the file. * tools/ppm2tiff.c (main): While case for parsing comment line requires extra parenthesis to work as expected. Reported by Thomas Sinclair. 2010-04-02 Frank Warmerdam * libtiff/tif_read.c (primarily): Add support for CHUNKY_STRIP_READ_SUPPORT where large strips are read in chunks for applications using TIFFReadScanline(). This is intended to make it more practical work with very large compressed one-strip files. Feature is off by default. Enable by defining CHUNK_STRIP_READ_SUPPORT as a macro. http://trac.osgeo.org/gdal/ticket/3514 2010-03-31 Frank Warmerdam * libtiff/tif_flush.c: Use TIFFRewriteDirectory() when flushing directories so previously placed directories will be migrated to the end of file if needed. 2010-03-30 Frank Warmerdam * libtiff/tif_lzw.c: change type of dec_bitsleft field to uint64 to support operating on strips/tiles of more than 256MB. http://trac.osgeo.org/gdal/ticket/3512 2010-03-10 Bob Friesenhahn * libtiff/tif_aux.c (_TIFFCheckRealloc): Improve error message so that it is clearly a memory allocation error message, and also includes the size of the allocation request. 2010-02-22 Lee Howard * libtiff/tif_jpeg.c: Do not generate a JPEGTables tag when creating the JPEG TIFF as is is not required in order to prevent it from being unused and filled with invalid data. (Leave it to be generated by later activity.) http://bugzilla.maptools.org/show_bug.cgi?id=2135 * tools/tiff2pdf.c: Write the JPEG SOI headers into the TIFF strip data rather than skipping them. This fixes the ability to view in Acrobat Reader, Evince, and Ghostscript. http://bugzilla.maptools.org/show_bug.cgi?id=2135 * libtiff/tif_fax3.c: Don't return error on badly-terminated MMR strips. http://bugzilla.maptools.org/show_bug.cgi?id=2029 2009-12-03 Frank Warmerdam * libtiff/tif_jpeg.c: Made JPEGDecodeRaw() check for buffer overruns. Made so that when working with downsampled images a stub function reporting an error is used for tif_decoderow. We cannot meaningfully support reading scanlines in this situation. (#1936) * libtiff/tif_jpeg.c: Ensure that tif_scanlinesize is computed after resetting of the upsampling values (gdal:#3259). http://bugzilla.maptools.org/show_bug.cgi?id=1936 2009-11-30 Frank Warmerdam * contrib/dbs/tiff-grayscale.c, contrib/tif-palette.c, tools/ras2tiff.c: Fix resource leaks on error. http://bugzilla.maptools.org/show_bug.cgi?id=2121 * libtiff/tif_{aux.c,dir.c,dir.h,dirinfo.c}: Return to handling TIFFTAG_REFERENCEBLACKWHITE as a field in the TIFF directory instead of as a custom(generic) field to avoid a potential reentrancy problem. http://bugzilla.maptools.org/show_bug.cgi?id=2125 * libtiff/tif_color.c, libtiff/tif_getimage.c, libtiff/tiffio.h, man/TIFFcolor.3tiff: Make TIFFDisplay argument in TIFFCIELabToRGBInit const, and display_sRGB static and const. http://bugzilla.maptools.org/show_bug.cgi?id=2124 2009-11-04 Bob Friesenhahn * libtiff 4.0.0alpha5 released. 2009-11-03 Bob Friesenhahn * tools/tiffcrop.c: Updated tiffcrop from Richard Nolde. This version has undergone substantial testing with arbitrary sample bit depths. Also eliminates GCC compilation warnings. 2009-11-02 Bob Friesenhahn * port/libport.h: Add extern declarations for getopt standard globals. 2009-10-31 Bob Friesenhahn * libtiff/tif_lzw.c (LZWDecode, LZWDecodeCompat): Fix warnings noticed in 64-bit build of libtiff with Visual Studio 2005. Resolves "Bug 2067 - Visual Studio 2005 64-bit warnings in tif_lzw.c", http://bugzilla.maptools.org/show_bug.cgi?id=2067 * libtiff/tif_pixarlog.c (PixarLogEncode): Fix non-important warning noticed in Visual Studio 2005 build. Resolves "Bug 2068 - Visual Studio 2005 64-bit warning in tif_pixarlog.c", http://bugzilla.maptools.org/show_bug.cgi?id=2068 2009-10-29 Bob Friesenhahn * libtiff/tif_dirread.c: Eliminate GCC "dereferencing type-punned pointer" warnings. 2009-10-28 Bob Friesenhahn * html/tools.html: Add manual page links, and a summary description of tiffcrop. 2009-10-07 Bob Friesenhahn * configure.ac: x86_64 should use the same fill order as i386. 2009-09-24 Bob Friesenhahn * tools/tiffcrop.c, man/tiffcrop.1: New tiffcrop from Richard Nolde. Major updates to add significant functionality for reading and writing tile based images with bit depths not a multiple of 8 which cannot be handled by tiffcp. 2009-09-03 Bob Friesenhahn * libtiff/tif_ojpeg.c (OJPEGWriteHeaderInfo): IJG JPEG 7 needs do_fancy_upsampling=FALSE in order to read raw data. Resolves "Bug 2090 - OJPEG crash with libjpeg v7". http://bugzilla.maptools.org/show_bug.cgi?id=2090 2009-09-03 Frank Warmerdam * libtiff/tif_getimage.c: Fixed error recognition handling in RGBA interface when stoponerror is set. http://bugzilla.maptools.org/show_bug.cgi?id=2071 2009-08-30 Bob Friesenhahn * tools/{tiffcrop.c,tiffgt.c}: Applied patch from Oden Eriksson to fix build with gcc when using the "-Wformat -Werror=format-security" flags. 2009-08-29 Bob Friesenhahn * test/{bmp2tiff_palette.sh, bmp2tiff_rgb.sh, gif2tiff.sh, ppm2tiff_pbm.sh, ppm2tiff_pgm.sh, ppm2tiff_ppm.sh}: Additional utilities tests. 2009-08-28 Bob Friesenhahn * tools/tiffinfo.c: tiffinfo should return error status to the caller. Register a private error callback to accomplish that. * test/Makefile.am (TIFFIMAGES): Add test images in BMP, GIF, and PNM formats so that we will be able to test more of the tools. While adding these test images I notice that bmp2tiff and gif2tiff only support ancient versions of their respective formats. 2009-08-27 Bob Friesenhahn * libtiff 4.0.0alpha4 released. * HOWTO-RELEASE: Improved release instructions. 2009-08-24 Bob Friesenhahn * man/{TIFFClose.3tiff,raw2tiff.1,tiffcmp.1,tiffsplit.1}: Applied fixes for "Bug 2023 - nroff errors in manual pages". http://bugzilla.maptools.org/show_bug.cgi?id=2023 * tools/{rgb2ycbcr.c, tiff2rgba.c}: Applied fixes for "Bug 2079 - CVE-2009-2347 libtiff: integer overflows in various inter-color space conversion tools". http://bugzilla.maptools.org/show_bug.cgi?id=2079 * libtiff/tif_print.c (TIFFPrintDirectory): Apply fix from Jay Berkenbilt for "Bug 2024 - possible null pointer dereference with one-line fix". http://bugzilla.maptools.org/show_bug.cgi?id=2024 * libtiff/tif_dirread.c (TIFFReadCustomDirectory): Apply patch from Jay Berkenbilt for "Bug 1895 - logic error in tif_dirread.c: segfault after setting tdir_tag = IGNORE". http://bugzilla.maptools.org/show_bug.cgi?id=1895 2009-08-23 Bob Friesenhahn * test/Makefile.am, test/tiffcrop*.sh: Split previously existing tiffcrop.sh into a collection of many specific tests. Re-wrote all of the existing tests to be based on some simple shell functions. Make distcheck works again. Export certain variables (MAKE, MAKEFLAGS, MEMCHECK) to tests and added 'memcheck' and 'ptrcheck' targets to make it easy to run the tests under valgrind. 2009-08-21 Bob Friesenhahn * test/tiffcp-logluv.sh: Fix test so that it works with a VPATH build. * test/Makefile.am (AUTOMAKE_OPTIONS): Colorized tests was not actually activated since it needed to be enabled in this Makefile.am. Also activated parallel-tests mode since it offers useful features such as per-test .log files and a summary test report .log file. 2009-08-20 Bob Friesenhahn * configure.ac: Updated autotools. Autoconf 2.64, Automake 1.11, libtool 2.2.6. Enabled support for silent build rules (--enable-silent-rules or 'make V=0') and colorized tests. * html/{index.html, v3.9.0.html}: Update for 3.9.0 release. 2009-06-30 Frank Warmerdam * tests/tiffcp-logluv.sh: minimal testing of sgilog compression. * tools/tiffcp.c: add -c sgilog support. * libtiff/tif_luv.c: correct return codes from encoderow to be 1 on success instead of zero. http://bugzilla.maptools.org/show_bug.cgi?id=2069 * libtiff/tif_lzw.c: back out patch from #2065 and apply patch from #1085 for a better underflow fix that errors properly. http://bugzilla.maptools.org/show_bug.cgi?id=2065 http://bugzilla.maptools.org/show_bug.cgi?id=1985 2009-06-26 Frank Warmerdam * libtiff/tif_strip.c: Remove an inappropriate assertion that often fails on oddly sized 12bit jpeg compressed ycbcr images. 2009-06-22 Frank Warmerdam * libtiff/tif_lzw.c: Fix buffer underflow bug. http://bugzilla.maptools.org/show_bug.cgi?id=2065 2009-06-21 Frank Warmerdam * configure.ac, libtiff/tif_jpeg.c, libtiff/tif_jpeg_12.c: add support for dual mode 8/12 bit jpeg support. 2009-06-03 Frank Warmerdam * libtiff/tif_write.c: do not override the planar configuration to be contig for one sample files if planar configuration is already set. http://bugzilla.maptools.org/show_bug.cgi?id=2057 2009-06-02 Frank Warmerdam * libtiff/libtiff.def: Add TIFFUnsetField. 2009-05-03 Frank Warmerdam * libtiff/{tif_jpeg.c,tif_ojpeg.c,tif_getimage.c}: Fixed various error reports to use "%s" as format string. http://trac.osgeo.org/gdal/ticket/2976 2009-03-12 Frank Warmerdam * libtiff/{tif_fax3.c,tif_jpeg.c,tif_ojpeg.c}: Fix printdir chaining for some codecs (#2020). 2009-02-12 Frank Warmerdam * libtiff/tif_luv.c: Fix handling of tiled logluv images. http://bugzilla.maptools.org/show_bug.cgi?id=2005 2009-02-09 Frank Warmerdam * libtiff/tif_dirread.c: Improve allocation safety when allocated buffer for large tags. (#1998) Related to (#1993) 2009-02-06 Frank Warmerdam * tools/tiffcrop.c: Don't default image->res_unit to INCH. Now the test suite should pass. 2009-02-05 Frank Warmerdam * libtiff/tif_dirread.c: Re-incorporated a sanity check on tag size, but at the 2GB boundary to avoid overflow on 32bit systems. http://bugzilla.maptools.org/show_bug.cgi?id=1993 * libtiff/tif_dirread.c: Remove some assertions that blow due to corrupt files rather than in response to library internal inconsistencies. http://bugzilla.maptools.org/show_bug.cgi?id=1995 http://bugzilla.maptools.org/show_bug.cgi?id=1991 * libtiff/tif_dirread.c: Fixed testing for failed result from TIFFReadDirectoryFindFieldInfo(). http://bugzilla.maptools.org/show_bug.cgi?id=1992 2009-01-23 Frank Warmerdam * libtiff/tif_predict.c: Add support for 32bit integer horz. predictors. http://bugzilla.maptools.org/show_bug.cgi?id=1911 * libtiff/tif_dirwrite.c: Fix byte swapping of next directory offset. http://bugzilla.maptools.org/show_bug.cgi?id=1924 * tools/tiffcrop.c: initialize xres/yres values. * test/*.sh - default ${srcdir} to local directory. * test/common.sh - start verbose mode after common settings. * libtiff/tif_dirinfo.c: Replace lfind() with local equivelent to avoid type mismatches on different platforms. http://bugzilla.maptools.org/show_bug.cgi?id=1889 2009-01-22 Frank Warmerdam * tools/{fax2tiff.c,thumbnail.c,tiff2pdf.c,tiff2ps.c,tiffdump.c, tiffsplit.c}: avoid warnings, mostly 32bit/64bit casting issues. * port,tools: Introduce libport.h, and include in tools if NEED_LIBPORT defined, primarily to reduce prototype warnings on windows. * libtiff/tif_dirinfo.c,tif_dirread.c: Avoid warnings about unused parameters, and uninitialized variables. 2009-01-21 Bob Friesenhahn * test/common.sh: Execute tests like 'make VERBOSE=TRUE check' in order to trace full execution detail while executing the test suite. 2009-01-20 Frank Warmerdam * tools/tiffsplit.c: fix sampleformat to be shortv instead of longv. 2009-01-20 Bob Friesenhahn * test/Makefile.am (CLEANFILES): Make sure that test output files are removed by 'make clean' * Update autotools for 4.0.0 beta3 * 4.0.0 beta3 produced. 2009-01-12 Bob Friesenhahn * test/tiffcrop.sh: New test script for tiffcrop from Richard Nolde. * tools/tiff2ps.c: Remove spurious message to stderr. 2009-01-11 Bob Friesenhahn * tools/tiff2ps.c: Incorporated significant functionality update from Richard Nolde. In particular, support for rotating the image by 90, 180, 270, and 'auto' has been added. * man/tiffcrop.1: Incorporated documentation updates from Richard Nolde. * tools/tiffcrop.c: Incorporated significant functionality update from Richard Nolde. 2008-12-31 Bob Friesenhahn * libtiff/tiffio.h: GCC will now validate format specifications for TIFFError(), TIFFErrorExt(), TIFFWarning(), and TIFFWarningExt() in order to reveal bugs. * Many fixes throughout to work better as a 64-bit build. 2008-12-30 Bob Friesenhahn * tools/{tiff2pdf.c, tiff2ps.c, tiffinfo.c}: Offset and length tags now require 64-bit parameter rather than 32-bit. * libtiff/tif_dirread.c: Fixed issues with unaligned access to 64-bit values. * tools/thumbnail.c: Eliminate crash noticed while running test suite. 2008-12-29 Bob Friesenhahn * libtiff/tif_ojpeg.c (OJPEGLibjpegJpegSourceMgrFillInputBuffer): Initialize stack variables to avoid compiler warning. * tools/tiffinfoce.c (main): Use toff_t for offset type when retrieving offset of EXIF IFD. * libtiff/tiffio.h: Undeprecate toff_t and restore its use in the TIFFClientOpen() callback and other external function definitions. * tools/tiffinfo.c (main): Offset to EXIF IFD requires a 64-bit type now. Fixes crash when dumping files containing an EXIF IFD. * m4/libtool.m4: Update to libtool 2.2.6. 2008-12-21 Frank Warmerdam * libtiff/tif_dir.c, tiffio.h: Introduce TIFFUnsetField() function. * libtiff/tif_jpeg.c: Avoid errors if the application writes a full strip for the last partial strip in a jpeg compressed file. http://bugzilla.maptools.org/show_bug.cgi?id=1981 2008-10-29 Frank Warmerdam * libtiff/tif_flush.c: Make sure that BEENWRITING is cleared when we take the shortcut to only update the strip/tile offsets in place. http://trac.osgeo.org/gdal/ticket/2621 2008-10-21 Andrey Kiselev * libtiff/tif_jbig.c: Support the JBIG-KIT 2.0 (compatibility with the older versions retained). 2008-10-09 Frank Warmerdam * libtiff/tif_jpeg.c: Add #ifdefs for changes needed if using IPP enabled version of libjpeg from Intel. http://bugzilla.maptools.org/show_bug.cgi?id=1951 2008-09-05 Andrey Kiselev * tools/tiffsplit.c: Use byte counts of proper size (uint64). Required for libtiff 4.0. * tools/tiffsplit.c: Use dynamically allocated array instead of static when constructing output file names. 2008-09-03 Andrey Kiselev * tools/tiffsplit.c: Get rid of unsafe strcpy()/strcat() calls when doing the filename/path construction. * tools/tiff2pdf.c: More appropriate format string in t2p_write_pdf_string(); avoid signed/unsigned mismatch. * libtiff/tif_lzw.c: Properly zero out the codetable. As per bug http://bugzilla.maptools.org/show_bug.cgi?id=1929 * libtiff/tif_lzw.c: Properly zero out the string table. Fixes CVE-2008-2327 security issue. 2008-09-01 Frank Warmerdam * libtiff/tif_dirread.c: Avoid unused TIFFReadDirEntryFloat() function. * libtiff/tif_dirwrite.c: modified to write IFDs as either IFD8 or IFD depending on whether the file is bigtiff or classic tiff. http://bugzilla.maptools.org/show_bug.cgi?id=1917 2008-08-12 Edward Lam * tools/tiffdump.c: When compiling for Microsoft Windows, apply consistent (__int64) casting when testing if _lseeki64 has successfully seeked as requested. This is necessary for large file support to work since off_t is only 32-bit. 2008-07-29 Frank Warmerdam * tif_strip.c: Replace assertions related to samplesperpixel != 3 or the subsampling values not being 1, 2 or 4 (for jpeg compressed images) with control logic to return runtime errors (c/o Even Rouault) (#1927). 2008-06-17 Frank Warmerdam * tools/tiffcrop.c: Fix some portability problems. * libtiff/tif_ojpeg.c: Use same jpeg/win32 boolean/FAR hacks as are used in tif_jpeg.c. * libtiff/tif_win32.c: Ensure TIFFOpenW() uses same FILE_SHARE flags as TIFFOpen(). 2008-06-01 Frank Warmerdam * libtiff/tif_dirwrite.c: Fix alignment problems affecting architectures like Sparc/Solaris. http://bugzilla.maptools.org/show_bug.cgi?id=1892 2008-05-27 Frank Warmerdam * libtiff.def: Add TIFFFindField http://bugzilla.maptools.org/show_bug.cgi?id=1891 2008-05-26 Frank Warmerdam * tif_config.*.h, tiffconf.*.h: Remove SIZEOF_LONG definition, unused. * li2008-04-15 Andrey Kiselev btiff/tif_win32.c: Replace custom Win32 memory api with generic POSIX one. No apparent value to use of GlobalAlloc() in the modern age. http://bugzilla.maptools.org/show_bug.cgi?id=1885 * libtiff/tiffconf.vc.h: Added JBIG_SUPPORT and MDI_SUPPORT items in windows version (care of Edward Lam). 2008-05-24 Frank Warmerdam * tif_codec.c: Avoid NULL pointer dereferencing for exotic compression codec codes. * tif_dirwrite.c: fix potential memory leak. * tif_dirread.c: Fix unchecked malloc result. 2008-05-24 Bob Friesenhahn * test {tiff2pdf.sh tiff2ps-EPS1.sh tiff2ps-PS1.sh tiff2ps-PS2.sh tiff2ps-PS3.sh tiffcp-g3-1d-fill.sh tiffcp-g3-1d.sh tiffcp-g3-2d-fill.sh tiffcp-g3-2d.sh tiffcp-g3.sh tiffcp-g4.sh tiffcp-split-join.sh tiffcp-split.sh tiffcp-thumbnail.sh tiffdump.sh tiffinfo.sh}: Added more test scripts based on suggestions from Lee Howard posted to the tiff list on 13 Sep 2007. 2008-05-23 Frank Warmerdam * libtiff/tif_fax3.c: Add an assert in an effort to detect a possible runtime problem reported by coverity. * contrib/iptcutil/iptcutil.c: Fixed memory leak of str. * tools/tiffcrop.c, man/tiffcrop.1: Major update from Richard Nolde. http://bugzilla.maptools.org/show_bug.cgi?id=1888 * tools/tiffdither.c: remove dead onestrip code. avoid memory leak. * tools/rgb2ycbcr.c: fix memory leak of raster buffer. * tools/tiffcp.c: Simplify inknames code to avoid pointless test. Cleanup scanline allocation to avoid coverity warning. * tools/thumbnail.c: Check for TIFFOpen() failure. 2008-05-18 Frank Warmerdam * libtiff/tif_dirinfo.c: Use TIFF_SETGET_ASCII for PIXAR_TEXTUREFORMAT and PIXAR_WRAPMODES instead of TIFF_SETGET_UNDEFINED. Not exactly clear why this is needed. 2008-05-09 Bob Friesenhahn * Makefile.am (ACLOCAL_AMFLAGS): Libtool 2.2.4 does not like "ACLOCAL_AMFLAGS=-I ./m4". It wants "ACLOCAL_AMFLAGS=-I m4". 2008-04-15 Andrey Kiselev * test/: Test suite updated. Everything is passed now. * libtiff/tif_dirinfo.c: Fixed description of the TIFFTAG_NUMBEROFINKS tag. 2008-04-14 Andrey Kiselev * libtiff/{tif_dirread.c, tif_dirwrite.c, tiffiop.h}: Get rid of some of "dereferencing type-punned" warnings by converting tdir_offset field of TIFFDirEntry structure into union. 2008-04-10 Andrey Kiselev * libtiff/{tif_flush.c, tif_dirwrite.c, tiffio.h, tiffiop.h}: TIFFRewriteField() renamed into _TIFFRewriteField() and moved out from the public interface. Type of its 'count' parameter changed from uint32 to tmsize_t. * /libtiff/tiffiop.h: Make tif_nfields and tif_nfieldscompat fields of the tiff structure have the size_t type instead of uint32. 2008-04-09 Andrey Kiselev * tools/tiffdump.c: Added support for MSVS 6.0. * libtiff/tif_dirread.c: Use custom functions _TIFFUInt64ToFloat() and _TIFFUInt64ToDouble() to convert 64-bit integers into floating point values on MSVS 6.0 platform. 2008-03-14 Frank Warmerdam * tif_dirread.c: Removed sanity checks on tags larger than 4MB in TIFFReadDirEntryArray() since they are interfering with seemingly legitimate files. http://trac.osgeo.org/gdal/ticket/2005 2008-02-09 Joris Van Damme * tif_dirread.c: Added handling for the case of number of values for PageNumber tag different from 2 (previously resulted in an assert indicating lack of handling and was forgotten about) 2008-02-01 Frank Warmerdam * libtiff/tif_jpeg.c: Do not try to fixup subsampling tags based on the actual jpeg data stream if the first strip/tile has zero size. This is the case when GDAL creates a new file with zero sizes, closes and reopens it. 2008-01-07 Frank Warmerdam * tools/tiff2ps.c: fix up 64bit issues (from Edward Lam). 2008-01-01 Frank Warmerdam * libtiff/tif_dirwrite.c: #ifdef out lots of unused functions. * Makefile.vc, libtiff/Makefile.vc, tools/Makefile.vc: Improve clean targets. * tools/tiffinfo.c, tools/tiffcmp.c, tools/gif2tiff.c, tools/bmp2tiff.c tools/tiff2pdf.c: Fix 64-bit warnings when compiling under MSVC 2005 (x64). * tools/tiffset.c: Changes to reflect the fact that TIFFFieldWithTag() and TIFFFieldWithName() now return TIFFField pointers instead of TIFFFieldInfo pointers. * tools/tiffdump.c: Added ssize_t typedef on Windows since it doesn't exist. This makes it compile again on Windows * tif_aux.c, tif_getimage.c, tif_next.c, tif_predict.c, tif_win32.c, tiffconf.vc.h: Various 64bit fixes from Edward Lam identified on win64. * test/rewrite_tag.c: New test for TIFFRewriteField(). 2007-12-31 Frank Warmerdam * tif_dirwrite.c: Added TIFFRewriteField(). This new function rewrites one field "on disk" updating an existing directory entry. Lots of limitations still... * tiffiop.h, tif_write.c, tif_dirread.c, tif_flush.c: Keep track of TIFF_DIRTYSTRIP separately from TIFF_DIRTYDIRECT to indicate that the strip offset/size values are dirty but nothing else about the directory is dirty. In flush handle "just stripmaps dirty" as a special case that just rewrites these values without otherwise modifying the directory on disk using TIFFRewriteField(). We also modify logic so that in update mode the directory is not marked dirty on read, but only when something is changed. This means we need to keep track of updates to the stripmap stuff in TIFFAppendToStrip(). 2007-12-10 Frank Warmerdam * tif_jpeg.c: Improve ability to switch between encoding and decoding in the jpeg code (gdal bug #2033). 2007-11-23 Frank Warmerdam * tif_dir.c, tif_dirread.c, tif_dirwrite.c, tif_read.c, tif_write.c, tiffiop.h: Added TIFF_BUF4WRITE flag to indicate if contents of the rawcp/rawcc buffer are for writing and thus may require flushing. Necessary to distinguish whether they need to be written to disk when in mixed read/write mode and doing a mixture of writing followed by reading. http://trac.osgeo.org/gdal/ticket/1758 2007-11-23 Andrey Kiselev * configure.com, libtiff/tif_vms.c: Better OpenVMS support. Patches from Alexey Chupahin. 2007-11-02 Frank Warmerdam * tif_write.c: Rip out the fancy logic in TIFFAppendToStrip() for establishing if an existing tile can be rewritten to the same location by comparing the current size to all the other blocks in the same directory. This is dangerous in many situations and can easily corrupt a file. (observed in esoteric GDAL situation that's hard to document). This change involves leaving the stripbytecount[] values unaltered till TIFFAppendToStrip(). Now we only write a block back to the same location it used to be at if the new data is the same size or smaller - otherwise we move it to the end of file. * tif_dirwrite.c: Try to avoid writing out a full readbuffer of tile data when writing the directory just because we have BEENWRITING at some point in the past. This was causing odd junk to be written out in a tile of data when a single tile had an interleaving of reading and writing with reading last. (highlighted by gdal autotest/gcore/tif_write.py test 7. * tif_predict.c: use working buffer in PredictorEncodeTile to avoid modifying callers buffer. http://trac.osgeo.org/gdal/ticket/1965 * tif_predict.c/h: more fixes related to last item, keeping a distinct pfunc for encode and decode cases as these were getting mixed up sometimes. http://trac.osgeo.org/gdal/ticket/1948 2007-11-01 Frank Warmerdam * tif_predict.c/h, tif_lzw.c, tif_zip.c: Improvements so that predictor based encoding and decoding works in read-write update mode properly. http://trac.osgeo.org/gdal/ticket/1948 2007-10-24 Joris Van Damme * tif_dirread.c: Fixed problem with bogus file triggering assert(td->td_planarconfig == PLANARCONFIG_CONTIG) in ChopUpSingleUncompressedStrip 2007-10-22 Joris Van Damme * tif_jpeg.c: Resolved buffer incrementation bug that lead to faulty images at best, access violation at worst, when subsampled JPEG compressed imagery is decoded without the JPEG_COLORMODE feature 2007-10-11 Frank Warmerdam * html/index.html: Update "people responsible" section. 2007-10-05 Frank Warmerdam * tools/tiff2pdf.c: Fix problem with alpha setting in some cases as reported on the mailing list. 2007-10-01 Joris Van Damme * changed some more incorrect %lud printf flags to %lu 2007-09-29 Joris Van Damme * tif_dirread.c: Strip chopping interfered badly with uncompressed subsampled images because it tried to divide subsampled rowblocks, leading to all sorts of errors throughout the library for these images. Fixed by making strip chopping divide in row counts that are a multiple of vertical subsampling value. 2007-09-28 Joris Van Damme * tif_dirread.c: Logical cast working around compiler warning * tif_read.c: Correction of some error flags and parameter lists 2007-09-27 Joris Van Damme * tif_dirread.c: Made calculation of td_maxsamplevalue more robust when dealing with large bitspersample values, shutting up purification tools that warn about truncation, though it remains incorrect and indicates a conceptual problem there. * tif_open.c: Moved early exit in case of 'h' flag (to disable reading of first IFD) to proper place because it badly interfered with memory mapping, resulting in mapping flag even with dummy mapping functions that returned 0 whilst at the same time the mapping tif_size wasn't set, thus resulting in continuous incorrect beyond-eof errors. 2007-09-24 Joris Van Damme * tif_dirinfo.c: Fixed (MSVC) compiler reports about inconsistent use of const in tiffFields and exifFields definition 2007-09-20 Frank Warmerdam * tif_dirwrite.c: Always write tile/strip offsets and sizes using LONG8 type when output format is BigTIFF. The TIFFWriteDirectoryTagLongLong8Array() function was restructured accordingly. * tif_dirread.c: Improvements to error reporting text in TIFFFetchDirectory(). 2007-09-19 Bob Friesenhahn * test/images: Added a small collection of test images for use by test programs and scripts. * test/tiffinfo.sh: A trivial example test script. * test/common.sh: Added small script for setting the environment used by script-based tests. 2007-08-24 Frank Warmerdam * tif_dirwrite.c: Write the tif_nextdiroff value instead of a fixed zero when writing directory contents to preserve the ability to rewrite directories in place, even in the middle of a directory chain. * tif_dirinfo.c: _TIFFMergeFields() now only merges in field definitions that are missing. Existing definitions are silently ignored. * tif_dirread.c: Add runtime error for fields for which no definition is found (in addition to an assert for developers) in TIFFFetchNormalTag(). Not sure if this is needed, but it seems prudent. 2007-08-10 Joris Van Damme * libtiff/tif_getimage.c: removed SubsamplingHor and SubsamplingVer from _TIFFRGBAImage structure to revert unwanted ABI change. 2007-08-10 Joris Van Damme * libtiff/tif_win32.c: use SetFilePointer instead of SetFilePointerEx, as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1580 2007-07-19 Andrey Kiselev * libtiff/tif_stream.cxx: Put all callback functions declarations inside extern "C" block. * libtiff/{tif_lzw.c, tif_luv.c, tif_dumpmode.c, tif_print.c, tif_read.c, tif_strip.c, tif_thunder.c}: Use "%I64d" printf() formatter instead of "%lld" with MSVC compiler. * libtiff/{tiffiop.h, tif_aux.c}: Added _TIFFUInt64ToFloat() and _TIFFUInt64ToDouble() functions. 2007-07-18 Andrey Kiselev * libtiff/tif_dirread.c: Handle the case of MSVC 6 when using 64-bit integer constants. * libtiff/{Makefile.am, Makefile.v}: Do not distribute tiffconf.h, remove tif_config.h/tiffconf.h during cleaning. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1573 * libtiff/tif_unix.c: Do not use O_LARGEFILE. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1577 2007-07-13 Andrey Kiselev * libtiff 4.0.0alpha released. 2007-07-12 Andrey Kiselev * tools/tiff2pdf.c: Added missed extern optind as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1567 * libtiff/{tif_close.c, tif_dirinfo.c, tiffiop.c, tif_dirread.c, tif_dir.h, tif_dir.c, tiffio.h}: Transition to the new-style tag extending scheme completed. 2007-07-11 Bob Friesenhahn * libtiff/tif_stream.cxx: Adapt to use toff_t again. Update to use standard C++ library size types and attempt to detect overflow cases. 2007-07-08 Andrey Kiselev * libtiff/{tif_jpeg.c, tif_dir.h, tif_dir.c, tif_dirinfo.c, tiffio.h, tif_ojpeg.c, tif_print.c, tif_fax3.c, tif_dirread.c}: More work on new tag extending scheme. Use the new scheme everywhere. * libtiff/{tif_zip.c, tif_predict.c, tif_pixarlog.c, tif_luv.c, tif_fax3.c, tif_dirread.c, tif_dirwrite.c, tif_close.c, tif_ojpeg.c, tif_jpeg.c, tif_dirinfo.c, tif_dir.h, tiffio.h, tiffiop.h}: TIFFFIeldInfo structure replaced with TIFFField structure. TIFFFieldInfo retained for the backward compatibility. 2007-07-05 Bob Friesenhahn * tools/tiff2pdf.c: Fix a compile problem when JPEG_SUPPORT is not defined. 2007-07-04 Andrey Kiselev * libtiff/{tif_dir.c, tiff.h, tiffio.h, libtiff.def}: Unused TIFFReassignTagToIgnore() function and TIFFIgnoreSense enumeration removed. * libtiff/{tif_dirinfo.c, tif_fax3.c, tif_jbig.c, tif_jpeg.c}: Move tags TIFFTAG_FAXRECVPARAMS, TIFFTAG_FAXSUBADDRESS, TIFFTAG_FAXRECVTIME and TIFFTAG_FAXDCS to the common tag directory. These tags are not codec-specific and relate to image content, so process them as other normal tags. * libtiff/{tiffio.h, tif_dir.h}: TIFFTagValue structure moved from the public tiffio.h to private tif_dir.h. * contrib/{acorn, mac-cw, mac-mpw}: Removed as unmaintained and outdated. 2007-07-03 Andrey Kiselev * libtiff{tif_acorn.c, tif_apple.c, tif_atari.c, tif_msdos.c, tif_win3.c}: Obsoleted portability stuff removed. * tools/tiff2ps.c: Added support 16-bit images as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1566 Patch from William Bader. * tools/tiff2pdf.c: Fix for TIFFTAG_JPEGTABLES tag fetching and significant upgrade of the whole utility as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1560 Now we don't need tiffiop.h in tiff2pdf anymore and will open output PDF file using TIFFClientOpen() machinery as it is implemented by Leon Bottou. 2007-06-26 Bob Friesenhahn * configure.ac: Fix typo when substituting value for unsigned 8 bit type. Added support for a TIFF_PTRDIFF_T type to use when doing pointer arithmetic. Added support for a TIFF_SSIZE_T in order to return memory sizes but still allow returning -1 for errors. * libtiff/tiffconf.vc.h: Add porting type defintions for WIN32. 2007-06-25 Bob Friesenhahn * port/strtoull.c: New porting function in case strtoull() is not available on the target system. * configure.ac: Add configure support for determining sized types in a portable way and performing necessary substitutions in tif_config.h and tiffconf.h. Updated tiff.h to use the new definitions. 2007-04-27 Andrey Kiselev * tools/tiff2pdf.c: Check the tmpfile() return status as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=154 2007-04-07 Andrey Kiselev * libtiff/{tif_dir.h, tif_dirread.c, tif_dirinfo.c, tif_jpeg.c, tif_fax3.c, tif_jbig.c, tif_luv.c, tif_ojpeg.c, tif_pixarlog.c, tif_predict.c, tif_zip.c}: Finally fix bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1274 by introducing _TIFFMergeFieldInfo() returning integer error status instead of void in case of problems with field merging (e.g., if the field with such a tag already registered). TIFFMergeFieldInfo() in public API remains void. Use _TIFFMergeFieldInfo() everywhere and check returned value. 2007-04-07 Frank Warmerdam * contrib/addtiffo/tif_overview.c: Fix problems with odd sized output blocks in TIFF_DownSample_Subsampled() (bug 1542). 2007-04-06 Frank Warmerdam * libtiff/tif_jpeg.c: Changed JPEGInitializeLibJPEG() so that it will convert from decompressor to compressor or compress to decompress if required by the force arguments. This works around a problem in where the JPEGFixupTestSubsampling() may cause a decompressor to be setup on a directory when later a compressor is required with the force flag set. Occurs with the addtiffo program for instance. 2007-04-06 Andrey Kiselev * tools/tiffcrop.c, man/tiffcrop.1: Significant update in functionality from Richard Nolde. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1525 2007-03-28 Frank Warmerdam * libtiff/tif_fax3.c: "inline static" -> "static inline" for IRIC CC. 2007-03-17 Joris Van Damme * start of BigTIFF upgrade - CVS HEAD unstable until further notice 2007-03-07 Joris Van Damme * libtiff/tif_getimage.c: workaround for 'Fractional scanline' error reading OJPEG images with rowsperstrip that is not a multiple of vertical subsampling factor. This bug is mentioned in: http://bugzilla.remotesensing.org/show_bug.cgi?id=1390 http://www.asmail.be/msg0054766825.html 2007-03-07 Joris Van Damme * libtiff/tif_win32.c: made inclusion of windows.h unconditional * libtiff/tif_win32.c: replaced preprocessor indication for consiously unused arguments by standard C indication for the same 2007-02-27 Andrey Kiselev * libtiff/tif_dirread.c: Use uint32 type instead of tsize_t in byte counters in TIFFFetchData(). Should finally fix the issue http://bugzilla.remotesensing.org/show_bug.cgi?id=890 2007-02-24 Andrey Kiselev * tools/tiffset.c: Properly handle tags with TIFF_VARIABLE writecount. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1350 * libtiff/tif_dirread.c: Added special function to handle SubjectDistance EXIF tag as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1362 * tools/tiff2pdf.c: Do not assume inches when the resolution units do not specified. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1366 * tools/{tiffcp.c, tiffcrop.c}: Do not change RowsPerStrip value if it was set as infinite. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1368 * tools/tiffcrop.c, man/tiffcrop.1: New tiffcrop utility contributed by Richard Nolde. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1383 2007-02-22 Andrey Kiselev * libtiff/tif_dir.c: Workaround for incorrect TIFFs with ExtraSamples == 999 produced by Corel Draw. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1490 * libtiff/{tif_dirread.c, tif_read.c}: Type of the byte counters changed from tsize_t to uint32 to be able to work with data arrays larger than 2GB. Fixes bug http://bugzilla.remotesensing.org/show_bug.cgi?id=890 Idea submitted by Matt Hancher. 2007-01-31 Andrey Kiselev * tools/tif2rgba.c: This utility does not work properly on big-endian architectures. It was fixed including the bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1149 2007-01-15 Mateusz Loskot * Submitted libtiff port for Windows CE platform * libtiff/tif_config.wince.h: Added configuration header for WinCE. * libtiff/tiffconf.wince.h: Ported old configuration header for WinCE. * libtiff/tif_wince.c: Added WinCE-specific implementation of some functons from tif_win32.c. * libtiff/tif_win32.c: Disabled some functions already reimplemented in tif_wince.c. * libtiff/tiffiop.h, port/lfind.c: Added conditional include of some standard header files for Windows CE build. * tools/tiffinfoce.c: Ported tiffinfo utility for Windows CE. 2006-11-19 Frank Warmerdam * libtiff/tif_write.c: TIFFAppendToStrip() - clear sorted flag if we move a strip. http://bugzilla.remotesensing.org/show_bug.cgi?id=1359 2006-10-13 Andrey Kiselev * libtiff/tif_dir.c: More fixes for vulnerabilities, reported in Gentoo bug (): http://bugs.gentoo.org/show_bug.cgi?id=142383 * libtiff/contrib/dbs/xtiff/xtiff.c: Make xtiff utility compilable. Though it is still far from the state of being working and useful. 2006-10-12 Andrey Kiselev * libtiff/tif_fax3.c: Save the state of printdir codec dependent method. * libtiff/tif_jpeg.c: Save the state of printdir codec dependent method as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1273 * libtiff/tif_win32.c: Fixed problem with offset value manipulation as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1322 * libtiff/{tif_read.c, tif_jpeg.c, tif_dir.c}: More fixes for vulnerabilities, reported in Gentoo bug (): http://bugs.gentoo.org/show_bug.cgi?id=142383 2006-09-28 Andrey Kiselev * libtiff/{tif_fax3.c, tif_next.c, tif_pixarlog.c}: Fixed multiple vulnerabilities, as per Gentoo bug (): http://bugs.gentoo.org/show_bug.cgi?id=142383 2006-09-27 Frank Warmerdam * libtiff/tif_lzw.c, libtiff/tif_zip.c: Fixed problems with mixing encoding and decoding on the same read-write TIFF handle. The LZW code can now maintain encode and decode state at the same time. The ZIP code will switch back and forth as needed. http://bugzilla.remotesensing.org/show_bug.cgi?id=757 2006-09-20 Frank Warmerdam * libtiff: Rename config.h.vc and tif_config.h.vc to config.vc.h and tif_config.vc.h for easier identification by folks using an IDE. 2006-07-25 Frank Warmerdam * tif_msdos.c: Avoid handle leak for failed opens. c/o Thierry Pierron 2006-07-19 Frank Warmerdam * tif_dirwrite.c: take care not to flush out buffer of strip/tile data in _TIFFWriteDirectory if TIFF_BEENWRITING not set. Relates to bug report by Peng Gao with black strip at bottom of images. 2006-07-12 Frank Warmerdam * tif_dirwrite.c: make sure to use uint32 for wordcount in TIFFWriteNormanTag if writecount is VARIABLE2 for ASCII fields. It already seems to have been done for other field types. Needed for "tiffset" on files with geotiff ascii text. 2006-07-04 Bob Friesenhahn * {configure.ac, libtiff/tif_config.h.vc, libtiff/tif_jbig.c} (JBIGDecode): jbg_newlen is not available in older JBIG-KIT and its use does not appear to be required, so use it only when it is available. 2006-06-24 Andrey Kiselev * libtiff/tif_dirinfo.c: Added missed EXIF tag ColorSpace (40961). * libtiff/tif_dirread.c: Move IFD fetching code in the separate function TIFFFetchDirectory() avoiding code duplication in TIFFReadDirectory() and TIFFReadCustomDirectory(). 2006-06-19 Frank Warmerdam * tools/tiff2pdf.c: Fix handling of -q values. http://bugzilla.remotesensing.org/show_bug.cgi?id=587 2006-06-17 Frank Warmerdam * tif_readdir.c: Added case in EstimateStripByteCounts() for tiled files. Modified TIFFReadDirectory() to not invoke EstimateStripByteCounts() for case where entry 0 and 1 are unequal but one of them is zero. http://bugzilla.remotesensing.org/show_bug.cgi?id=1204 2006-06-08 Andrey Kiselev * libtiff/{tif_open.c, tif_dirread.c, tiffiop.h}: Move IFD looping checking code in the separate function TIFFCheckDirOffset(). * libtiff/tif_aux.c: Added _TIFFCheckRealloc() function. * tools/tiffcmp.c: Fixed floating point comparison logic as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1191 * libtiff/tif_fax3.c: Fixed problems in fax decoder as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1194 * tools/tiff2pdf.c: Fixed buffer overflow condition in t2p_write_pdf_string() as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1196 2006-06-07 Andrey Kiselev * {configure, configure.ac, libtiff/tif_jbig.c, tools/tiffcp.c}: Added support for JBIG compression scheme (34661 code) contributed by Lee Howard. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=896 * configure, configure.ac: OJPEG support enabled by default. * contrib/ojpeg/: Removed. New OJPEG support does not need this patch. 2006-06-03 Bob Friesenhahn * libtiff/{tif_dirinfo.c, tif_print.c} : Fix crash in TIFFPrintDirectory(). Joris Van Damme authored the fix. 2006-04-21 Andrey Kiselev * tools/tiff2pdf.c: Unified line ending characters (always use '\n') as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1163 * README.vms, Makefile.am, configure.com, libtiff/{Makefile.am, tif_config.h-vms, tif_stream.cxx, tif_vms.c, tiffconf.h-vms}: Added support for OpenVMS by Alexey Chupahin, elvis_75@mail.ru. 2006-04-20 Andrey Kiselev * tools/{fax2ps.c, fax2tiff.c, ppm2tiff.c, ras2tiff.c, tiff2pdf.c}: Properly set the binary mode for stdin stream as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1141 * man/{bmp2tiff.1, fax2ps.1, fax2tiff.1, gif2tiff.1, ras2tiff.1, raw2tiff.1, rgb2ycbcr.1, sgi2tiff.1, tiff2bw.1, tiff2pdf.1, tiff2ps.1, tiff2rgba.1, tiffcmp.1, tiffcp.1, tiffdither.1, tiffdump.1, tiffgt.1, tiffset.1}: Improvements in page formatting as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1140 * html/tools.html, html/man/Makefile.am, tools/tiff2pdf.c: Fixed typos as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1139 2006-04-18 Frank Warmerdam * nmake.opt: use /EHsc for VS2005 compatibility. Also define _CRT_SECURE_NO_DEPRECATE to avoid noise on VS2005. 2006-04-12 Joris Van Damme * libtiff/tif_getimage.c: Added support for planarconfig separate non-subsampled YCbCr (i.e. separate YCbCr with subsampling [1,1]) 2006-04-11 Joris Van Damme * libtiff/tif_getimage.c: Revision of all RGB(A) put routines - Conversion of unassociated alpha to associated alpha now done with more performant LUT, and calculation more correct - Conversion of 16bit data to 8bit data now done with more performant LUT, and calculation more correct - Bugfix of handling of 16bit RGB with unassociated alpha 2006-04-11 Joris Van Damme * libtiff/tif_getimage.c: - When there is no alpha, gtTileSeparate and gtStripSeparate allocated buffer for alpha strile and filled it, only to never read it back. Removed allocation and fill. - Minor rename of vars in gtTileSeparate and gtStripSeparate anticipating planned functionality extension 2006-04-08 Joris Van Damme * libtiff/tif_getimage.c: renamed pickTileContigCase to PickContigCase and pickTileSeparateCase to PickSeparateCase as both work on strips as well * libtiff/tif_getimage.c: moved img->get selection from TIFFRGBAImageBegin into PickContigCase and PickSeparateCase to create logical hook for planned functionality extension 2006-04-08 Joris Van Damme * libtiff/tif_ojpeg.c: resolved memory leak that was a consequence of inappropriate use of jpeg_abort instead of jpeg_destroy 2006-04-07 Joris Van Damme * libtiff/tif_getimage.c: replaced usage of TIFFScanlineSize in gtStripContig with TIFFNewScanlineSize so as to fix buggy behaviour on subsampled images - this ought to get sorted when we feel brave enough to replace TIFFScanlineSize alltogether * libtiff/tif_ojpeg.c: fixed bug in OJPEGReadSkip 2006-04-04 Joris Van Damme * libtiff/tiffio.h: added new type tstrile_t * libtiff/tif_dir.h: changed types of td_stripsperimage and td_nstrips to new tstrile_t, types of td_stripoffset and td_stripbytecount to toff_t* * libtiff/tif_ojpeg.c: totally new implementation * libtiff/tif_dirread.c: added several hacks to suit new support of OJPEG * libtiff/tif_getimage.c: removed TIFFTAG_JPEGCOLORMODE handling of OJPEG images in favor of tif_getimage.c native handling of YCbCr and desubsampling 2006-03-29 Frank Warmerdam * libtiff/tif_jpeg.c: JPEGVSetField() so that altering the photometric interpretation causes the "upsampled" flag to be recomputed. Fixes peculiar bug where photometric flag had to be set before jpegcolormode flag. 2006-03-25 Joris Van Damme * libtiff/tif_jpeg.c: strip size related bugfix in encode raw * libtiff/tif_strip.c: temporarilly added two new versions of TIFFScanlineSize - TIFFNewScanlineSize: proposed new version, after all related issues and side-effects are sorted out - TIFFOldScanlineSize: old version, from prior to 2006-03-21 change This needs further sorting out. 2006-03-25 Joris Van Damme * contrib/addtiffo/tif_ovrcache.c: bugfix to correctly pass size of last truncated strip data to TIFFWriteEncodedStrip 2006-03-25 Joris Van Damme * libtiff/{tif_jpeg.c, tif_strip.c}: bugfix of tif_jpeg decode raw 2006-03-25 Joris Van Damme * libtiff/tif_getimage.c: bugfix/rewrite of putcontig8bitYCbCr22tile * libtiff/tif_getimage.c: added putcontig8bitYCbCr12tile * libtiff/tif_read.c: added support for new TIFF_NOREADRAW flag to prepare the path for new tif_ojpeg.c 2006-03-23 Andrey Kiselev * libtiff 3.8.2 released. * tools/Makefile.am: Use runtime paths linker flags when rpath option enabled. 2006-03-21 Andrey Kiselev * libtiff/libtiff.def: Added missed exports as per bug http://bugzilla.remotesensing.org/attachment.cgi?id=337 * contrib/addtiffo/Makefile.vc, libtiff/Makefile.vc, port/Makefile.vc, tools/Makefile.vc: Makefiles improvements as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1128 * nmake.opt libtiff/{tif_config.h.vc, tif_unix.c, tiffio.h}, tools/{fax2ps.c, fax2tiff.c, tiff2pdf.c}: Fixed win32 I/O functions usage as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1127 * libtiff/tif_strip.c: Take subsampling in account when calculating TIFFScanlineSize(). * tools/tiffcp.c: Do not set RowsPerStrip bigger than image length. 2006-03-17 Andrey Kiselev * tools/fax2tiff.c: Fixed wrong TIFFerror() invocations as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1125 * tools/fax2ps.c: Fixed reading the input stream from stdin as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1124 2006-03-16 Andrey Kiselev * libtiff/tiffiop.h: Added decalration for _TIFFSetDefaultCompressionState(). * libtiff/{tif_jpeg.c, tif_fax3.c, tif_zip.c, tif_pixarlog.c, tif_lzw.c, tif_luv.c}: Use _TIFFSetDefaultCompressionState() in all codec cleanup methods. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1120 2006-03-15 Andrey Kiselev * libtiff/tif_jpeg.c: Do not cleanup codec state in TIFFInitJPEG(). As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1119 * tools/raw2tiff.c: Do not set RowsPerStrip larger than ImageLength. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1110 * libtiff/tiffiop.h: dblparam_t typedef removed; GLOBALDATA macro removed; move here the STRIP_SIZE_DEFAULT macro definition. * libtiff/{tif_dirread.c, tif_strip.c}: Removed STRIP_SIZE_DEFAULT macro definition. * libtiff/tif_dir.c: Use double type instead of dblparam_t. 2006-03-14 Andrey Kiselev * libtiff/tif_dirread.c: Do not check the PlanarConfig tag presence in TIFFReadDirectory, because it is always set at the start of function and we allow TIFFs without that tag set. 2005-03-13 Andrey Kiselev * libtiff 3.8.1 released. 2006-03-07 Andrey Kiselev * libtiff/tif_dirread.c: Fixed error reporting in TIFFFetchAnyArray() function as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 * libtiff/tif_dirread.c: More wise check for integer overflow condition as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 * libtiff/{tif_jpeg.c, tif_pixarlog.c, tif_fax3.c, tif_zip.c}: Properly restore setfield/getfield methods in cleanup functions. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 2006-03-03 Andrey Kiselev * libtiff/{tif_predict.c, tif_predict.h}: Added new function TIFFPredictorCleanup() to restore parent decode/encode/field methods. * libtiff/{tif_lzw.c, tif_pixarlog.c, tif_zip.c}: Use TIFFPredictorCleanup() in codec cleanup methods. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 * libtiff/tif_dirread.c: Fixed integer overflow condition in TIFFFetchData() function. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 2006-03-01 Andrey Kiselev * libtiff/tif_ojpeg.c: Set the ReferenceBlackWhite with the TIFFSetField() method, not directly. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1043 * tools/ppm2tiff.c: Added support for PBM files as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1044 2006-02-27 Andrey Kiselev * libtiff/tif_write.c: Small code rearrangement in TIFFWriteScanline() to avoid crash as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1081. 2006-02-26 Andrey Kiselev * tools/tiff2pdf.c: Functions t2p_sample_rgbaa_to_rgb() and t2p_sample_rgba_to_rgb() was used in place of each other, that was resulted in problems with RGBA images with associated alpha. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1097 2006-02-23 Andrey Kiselev * libtiff/tif_dirwrite.c: Properly write TIFFTAG_DOTRANGE tag as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1088. * libtiff/tif_print.c: Properly read TIFFTAG_PAGENUMBER, TIFFTAG_HALFTONEHINTS, TIFFTAG_YCBCRSUBSAMPLING and TIFFTAG_DOTRANGE tags as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1088. * tools/tiff2ps.c: Properly scale all the pages when converting multipage TIFF with /width/height/center options set. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1080 2006-02-15 Andrey Kiselev * tools/tiff2pdf.c: Do not create output file until all option checks will be done. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1072 * tools/bmp2tiff.c: Added ability to create multipage TIFFs from the list of input files as per bug: http://bugzilla.remotesensing.org/show_bug.cgi?id=1077 2006-02-09 Andrey Kiselev * libtiff/tif_tile.c: Fix error reporting in TIFFCheckTile() as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1063. * tools/tiffgt.c: Avoid crashing in case of image unsupported by TIFFRGBAImage interface. * libtiff/tif_color.c: Avoid overflow in case of wrong input as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1065. 2006-02-07 Frank Warmerdam * tools/tiff2pdf.c: Fixed support for non-YCbCr encoded JPEG compressed TIFF files, per submission from Dan Cobra. 2006-02-07 Andrey Kiselev * libtiff/{tif_dirread.c, tif_packbits.c, tif_win32.c}: Properly cast values to avoid warnings. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1033. * libtiff/tif_dirinfo.c: Use TIFF_NOTYPE instead of 0 when appropriate. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1033. * libtiff/tif_aux.c: Fixed type of temporary variable in _TIFFCheckMalloc() as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1033. 2006-02-06 Andrey Kiselev * libtiff/tif_aux.c: Return static array when fetching default YCbCrCoefficients (another problem, reported a the http://bugzilla.remotesensing.org/show_bug.cgi?id=1029 entry). 2006-02-03 Andrey Kiselev * libtiff/tif_dir.c: Special handling for PageNumber, HalftoneHints, YCbCrSubsampling and DotRange tags as per bugs http://bugzilla.remotesensing.org/show_bug.cgi?id=1029 http://bugzilla.remotesensing.org/show_bug.cgi?id=1034 * libtiff/tif_dirread.c: Use _TIFFGetExifFieldInfo() instead of _TIFFGetFieldInfo() in TIFFReadEXIFDirectory() call as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1026. 2006-01-23 Andrey Kiselev * libtool related stuff updated from the 2.1a branch. 2006-01-11 Frank Warmerdam * tools/bmp2tiff,pal2rgb,ppm2tiff,ras2tiff,raw2tiff,sgi2tiff, tiff2bw,tiffcp: Fixed jpeg option processing so -c jpeg:r:50 works properly as per bug: http://bugzilla.remotesensing.org/show_bug.cgi?id=1025 2006-01-09 Bob Friesenhahn * configure.ac: Fix with_default_strip_size comparison as reported by Norihiko Murase. 2006-01-08 Bob Friesenhahn * test/Makefile.am (LIBTIFF): Due to linking against libtiff incorrectly, tests were not actually testing the uninstalled libtiff. Now they are. 2006-01-04 Andrey Kiselev * libtiff/tif_dirinfo.c: Change definitions for TIFFTAG_ICCPROFILE, TIFFTAG_PHOTOSHOP, TIFFTAG_RICHTIFFIPTC, TIFFTAG_XMLPACKET: readcount should be uint32 value. 2006-01-02 Bob Friesenhahn * html/man/Makefile.am (htmldoc): Fix htmldoc rule so that it can be used if build directory is not the same as source directory. * man/{TIFFGetField.3tiff, TIFFSetField.3tiff}: Documented TIFFTAG_PHOTOSHOP, TIFFTAG_RICHTIFFIPTC, and TIFFTAG_XMLPACKET, and re-sorted tag names in alphabetical order. 2005-12-29 Andrey Kiselev * libtiff 3.8.0 released. 2005-12-28 Bob Friesenhahn * tools/bmp2tiff.c (main): Fixed warning regarding returning inconsistent types from a condition. * tools/tiffcmp.c (CheckLongTag): Eliminate warning due to printf format. * tools/bmp2tiff.c: Reduce compilation warnings on big-endian CPUs. 2005-12-28 Joris Van Damme * html/{index.html, support.hml, libtiff.html}: Cleaned up HTML 2005-12-27 Andrey Kiselev * libtiff/tiffio.h: Added VC_EXTRALEAN definition before including windows.h, to reduce the compile time. 2005-12-26 Bob Friesenhahn * libtiff/tif_jpeg.c: Improve compilation under MinGW. 2005-12-26 Andrey Kiselev * libtiff/{tif_dir.c, tif_dir.h, tif_dirread.c, tif_dirinfo.c}: tiffFieldInfo and exifFieldInfo arrays definitions moved back to tif_dirinfo.c; added _TIFFGetFieldInfo() and _TIFFGetExifFieldInfo() private functions to retrieve FieldInfo arrays. 2005-12-24 Bob Friesenhahn * html/build.html: Added some additional instructions for when building using MSVC under Windows. Also fixed two HTML syntax errors and used HTML Tidy to tidy up the HTML syntax and formatting. 2005-12-24 Andrey Kiselev * libtiff/{tif_aux.c, tif_dir.c, tif_dir.h, tif_dirwrite.c, tif_print.c, tif_getimage.c}: Make InkSet, NumberOfInks, DotRange and StoNits tags custom. 2005-12-23 Andrey Kiselev * libtiff/{tif_aux.c, tif_dir.c, tif_dir.h, tif_print.c}: Make WhitePoint tag custom. * libtiff/{tif_dir.h, tiff.h}: More EXIF tags added. 2005-12-23 Joris Van Damme * libtiff/tiffio.h: fixed typo that potentially resulted in redefininition of USE_WIN32_FILEIO * libtiff/*: Added more 'dual-mode' error handling: Done TIFFWarning calls in core LibTiff. 2005-12-21 Andrey Kiselev * libtiff/{tif_dir.c, tif_dir.h, tif_print.c}: Make RichTIFFIPTC, Photoshop and ICCProfile tags custom. 2005-12-21 Joris Van Damme * libtiff/*, contrib/*: Added 'dual-mode' error handling, enabling newer code to get context indicator in error handler and still remain compatible with older code: Done TIFFError calls everywhere except in tools 2005-12-20 Andrey Kiselev * tools/tiffcp.c: Added many error reporting messages; fixed integer overflow as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=789 2005-12-16 Frank Warmerdam * contrib/addtiffo/*: Major upgrade by Joris to support subsampled YCbCr images in jpeg compressed TIFF files. 2005-12-14 Andrey Kiselev * tools/tiffcp.c: Return non-zero status when reading fails (again). 2005-12-13 Andrey Kiselev * tools/tiffcp.c: Return non-zero status when reading fails. 2005-12-12 Andrey Kiselev * libtiff/{tif_dir.h, tiff.h}: Added more EXIF tags. 2005-12-09 Andrey Kiselev * libtiff/{tif_dir.c, tif_dir.h, tif_print.c}: Make XMLPacket tag custom. * tools/tiffinfo.c: Print EXIF directory contents if exist. * libtiff/tiff.h: Few EXIF tag numbers added. * libtiff/{tif_dirinfo.c, tif_dirread.c, tif_dir.h, tif_dir.c, tiffio.h}: Preliminary support to read custom directories. New functions: TIFFReadCustomDirectory() and TIFFReadEXIFDirectory(). 2005-12-07 Andrey Kiselev * libtiff/{tif_dirinfo.c, tif_dirread.c, tif_dir.h, tif_dir.c}: More work to implement custom directory read support. * libtiff/{tif_aux.c, tif_dirinfo.c, tif_dirread.c, tif_dir.h, tif_dir.c, tif_print.c}: Make YCbCrCoefficients and ReferenceBlackWhite tags custom. 2005-12-05 Andrey Kiselev * libtiff/tif_dirread.c: One more workaround for broken StripByteCounts tag. Handle the case when StripByteCounts array filled with completely wrong values. 2005-11-30 Andrey Kiselev * libtiff/tif_dirinfo.c: Release file descriptor in case of failure in the TIFFOpenW() function as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1003 * libtiff/tif_dirinfo.c: Correctly yse bsearch() and lfind() functions as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1008 2005-11-20 Frank Warmerdam * tif_open.c, tiff.h, tiffdump.c: Incorporate preliminary support for MS MDI format. http://bugzilla.remotesensing.org/show_bug.cgi?id=1002 * .cvsignore: many files added, and a few update according to suggestion of Brad HArds on tiff mailing list. 2005-11-03 Frank Warmerdam * libtiff/libtiff.def, tiffiop.h, tiffio.h: Made TIFFFreeDirectory public. 2005-10-31 Andrey Kiselev * tools/fax2tiff.c: Properly calculate sizes of temporary arrays as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=943 * tools/fax2tiff.c: Added option '-r' to set RowsPerStrip parameter as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=944 * tools/tiffdump.c: Fixed typeshift and typemask arrays initialization problem as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=946 * tools/bmp2tiff.c: Fixed possible integer overflow error as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=965 * libtiff/tif_dirinfo.c: Make XResolution, YResolution and ResolutionUnit tags modifiable during write process. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=977 * tools/tiffsplit.c: Copy fax related fields over splitted parts as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=983 2005-10-21 Frank Warmerdam * tif_dirread.c: Don't try and split single strips into "0" strips in ChopUpSingleUncompressedStrip. This happens in some degenerate cases (like 1x1 files with stripbytecounts==0 (gtsmall.jp2 embed tiff) 2005-10-20 Joris Van Damme * tif_fax3.c: changed 'at scanline ...' style warning/errors with incorrect use of tif_row, to 'at line ... of strip/tile ...' style 2005-10-15 Frank Warmerdam * tif_write.c: fixed setting of planarconfig as per bug report on the mailing list from Joris. 2005-10-07 Andrey Kiselev * configure.ac, configure, nmake.opt, libtiff/{tif_config.h, tif_dirread.c}: Make the default strip size configurable via the --with-default-strip-size and STRIP_SIZE_DEFAULT options. 2005-09-30 Bob Friesenhahn * html/support.html: Fixed link to documentation on Greg Ward's LogLuv TIFF format. 2005-09-28 Andrey Kiselev * tools/tiffdump.c: Fixed crash when reading malformed tags. 2005-09-20 Andrey Kiselev * tools/tiff2pdf.c: Added missed 'break' statement as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=932 2005-09-12 Andrey Kiselev * libtiff 3.7.4 released. * {configure, configure.ac, Makefile.am, autogen.sh}: Applied patch from Patrick Welche (all scripts moved in the 'config' and 'm4' directories). 2005-09-12 Frank Warmerdam * libtiff/tif_open.c: reintroduce seek to avoid problem on solaris. 2005-09-05 Frank Warmerdam * libtiff/tif_dir.c: When prefreeing tv->value in TIFFSetFieldV also set it to NULL to avoid double free when re-setting custom string fields as per: http://bugzilla.remotesensing.org/show_bug.cgi?id=922 2005-08-12 Frank Warmerdam * libtiff/tif_print.c: avoid signed/unsigned warning. * libtiff/tif_dirread.c: removed unused variable. 2005-07-30 Frank Warmerdam * libtiff/tif_dir.c: Fixed up support for swapping "double complex" values (128 bits as 2 64 bits doubles). GDAL gcore tests now pass on bigendian (macosx) system. 2005-07-28 Andrey Kiselev * libtiff/{tif_aux.c, tif_dirread.c, tif_fax3.c, tiffiop.h}: Rename CheckMalloc() function to _TIFFCheckMalloc() and make it available globally as an internal helper routine. 2005-07-27 Andrey Kiselev * libtiff/tif_dir.c: More improvements in the "pass by value" part of the custom tags handling code. 2005-07-26 Andrey Kiselev * libtiff/{tif_dirread.c, tif_dirinfo.c}: Do not upcast BYTEs to SHORTs in the TIFFFetchByteArray(). Remove TIFFFetchExtraSamples() function, use TIFFFetchNormalTag() instead as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=831 Remove TIFFFetchExtraSamples() function, use TIFFFetchNormalTag() instead. * libtiff/tiffconf.h.in: One more attempt to fix the AIX bug http://bugzilla.remotesensing.org/show_bug.cgi?id=39 2005-07-25 Andrey Kiselev * libtiff/tif_print.c: Fixed printing of the BYTE and SBYTE arrays. * tools/tiffdump.c: Added support for TIFF_IFD datatype. 2005-07-21 Andrey Kiselev * libtiff/tif_write.c: Do not check the PlanarConfiguration field in the TIFFWriteCheck() function in case of single band images (as per TIFF spec). 2005-07-12 Andrey Kiselev * SConstruct, libtiff/SConstruct: Added the first very preliminary support for SCons software building tool (http://www.scons.org/). This is experimental infrastructure and it will exist along with the autotools mechanics. 2005-07-07 Andrey Kiselev * port/{getopt.c, strcasecmp.c, strtoul.c}: Update modules from the NetBSD source tree (the old 4-clause BSD license changed to the new 3-clause one). * configure.ac, port/lfind.c, libtiff/tiffiop.h: Added lfind() replacement module. * port/dummy.c: Make the dummy function static. 2005-07-06 Andrey Kiselev * tools/tiffcp.c: Fixed WhitePoint tag copying. * libtiff/{tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_print.c}: Make FieldOfViewCotangent, MatrixWorldToScreen, MatrixWorldToCamera, ImageFullWidth, ImageFullLength and PrimaryChromaticities tags custom. 2005-07-04 Andrey Kiselev * libtiff 3.7.3 released. * configure, configure.ac: Do not use empty -R option when linking with --enable-rpath. 2005-07-01 Andrey Kiselev * libtiff/{tiffiop.h, tif_open.c}: Added open option 'h' to avoid reading the first IFD when needed. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=875 * libtiff/tif_color.c: Better use of TIFFmin() macro to avoid side effects. 2005-06-23 Andrey Kiselev * tools/tiff2pdf.c: Print two characters per loop in the t2p_write_pdf_trailer(). As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=594 * tools/tiffgt.c: Use MacOS X OpenGL framework when appropriate. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=844 * acinclude.m4: Updated to latest OpenGL test macros versions. * libtiff/tiff.h: Use correct int size on Sparc 64bit/Sun compiler platform. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=855 2005-06-14 Andrey Kiselev * libtiff/tif_dirinfo.c: Added support for ClipPath, XClipPathUnits and YClipPathUnits tags. 2005-06-07 Andrey Kiselev * contrib/addtiffo/tif_ovrcache.c: Properly extract tile/strip size; use pixel sized shift in contigous case. 2005-06-06 Andrey Kiselev * contrib/addtiffo/{tif_overview.c, tif_ovrcache.c, tif_ovrcache.h}: Make overviews working for contiguos images. 2005-06-03 Andrey Kiselev * libtiff/tif_open.c: Replace runtime endianess check with the compile time one. * libtiff/tif_predict.c: Floating point predictor now works on big-endian hosts. 2005-06-01 Andrey Kiselev * libtiff/tif_dir.c: Use _TIFFsetString() function when read custom ASCII values. * libtiff/{tif_dirinfo.c, tif_dir.h, tif_dir.c, tif_print.c}: Make DocumentName, Artist, HostComputer, ImageDescription, Make, Model, Copyright, DateTime, PageName, TextureFormat, TextureWrapModes and TargetPrinter tags custom. * libtiff/tif_jpeg.c: Cleanup the codec state depending on TIFF_CODERSETUP flag (to fix memry leaks). * libtiff/tif_jpeg.c: Initialize JPEGTables array with zero after allocating. 2005-05-26 Andrey Kiselev * configure.ac, libtiff/Makefile.am: Added workaround for OpenBSD/MirOS soname problem as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=838 * libtiff/tif_dirwrite.c: Use tdir_count when calling TIFFCvtNativeToIEEEDouble() in the TIFFWriteDoubleArray() function as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=845 2005-05-25 Andrey Kiselev * tools/ppm2tiff.c: Fixed format string when read PPM file header with the fscanf() function. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=861 * libtiff/{tif_dirinfo.c, tif_print.c}: TIFFFetchByteArray() returns uint16 array when fetching the BYTE and SBYTE filds, so we should consider result as pointer to uint16 array and not as array of chars. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=831 * libtiff/tif_dir.c: More efficient custom tags retrieval as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=830 * libtiff/tif_win32.c: Use FILE_SHARE_READ | FILE_SHARE_WRITE share mode in CreateFile() call as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=829 * libtiff/Makefile.am: Fixed parallel compilation of the libtiff and libtiffxx libraries as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=826 * contrib/addtiffo/{tif_overview.c, tif_ovrcache.h}: Sinchronized with GDAL. 2005-05-23 Frank Warmerdam * libtiff/tif_jpeg.c: Substantial fix for addtiffo problems with JPEG encoded TIFF files. Pre-allocate lots of space for jpegtables in directory. 2005-05-22 Frank Warmerdam * libtiff/tif_dirread.c: Changed the code that computes stripbytecount[0] if it appears bogus to ignore if stripoffset[0] is zero. This is a common case with GDAL indicating a "null" tile/strip. 2005-05-17 Andrey Kiselev * tools/tiffsplit.c: Check for JPEGTables tag presence before copying. 2005-05-06 Frank Warmerdam * libtiff/tif_dirread.c: Applied similar change to TIFFFetchPerSampleLongs and TIFFFetchPerSampleAnys. http://bugzilla.remotesensing.org/show_bug.cgi?id=843 * libtiff/tif_jpeg.c: added LIB_JPEG_MK1 support in JPEGDecodeRaw(). 2005-05-06 Andrey Kiselev * tools/tiff2pdfr.c, man/tiff2pdf.1: Calculate the tile width properly; added new option '-b' to use interpolation in output PDF files (Bruno Ledoux). 2005-05-05 Frank Warmerdam * libtiff/tif_dirread.c: Ensure that broken files with too many values in PerSampleShorts work ok instead of crashing. http://bugzilla.remotesensing.org/show_bug.cgi?id=843 2005-04-27 Andrey Kiselev * tools/tiffdither.c: Copy the PhotometricInterpretation tag from the input file. 2005-04-15 Andrey Kiselev * libtiff/tif_predict.c: Added ability to encode floating point predictor, as per TIFF Technical Note 3. 2005-04-14 Andrey Kiselev * libtiff/{tif_predict.h, tif_predict.c}: Added ability to decode floating point predictor, as per TIFF Technical Note 3. 2005-04-13 Andrey Kiselev * libtiff/{tiffio.h, tiffiop.h, tif_dir.c, tif_read.c, tif_swab.c}: Added _TIFFSwab24BitData() and TIFFSwabArrayOfLong() functions used to swap 24-bit floating point values. * libtiff/tiff.h: Added predictor constants. 2005-04-08 Andrey Kiselev * libtiff/{tiffiop.h, tif_dir.c}: Use uint32 type for appropriate values in _TIFFVSetField() function. Inspired by the bug http://bugzilla.remotesensing.org/show_bug.cgi?id=816 * man/TIFFSetField.3tiff: Fixed definition of the TIFFTAG_INKNAMES tag as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=816 2005-03-30 Andrey Kiselev * libtiff/tif_open.c: Do not read header in case the output file should be truncated (Ron). * libtiff/{tif_dirinfo.c, tif_config.h.vc}: Use lfind() instead of bsearch() in _TIFFFindFieldInfoByName() function (Ron). * libtiff/{tiff.h, tif_dirinfo.c}: Fixes in EXIF tag ordering (Ron). 2005-03-22 Andrey Kiselev * configure.ac, libtiff/Makefile.am: Use libtool machinery to pass rpath option. 2005-03-21 Andrey Kiselev * libtiff/{tif_dir.c, tif_print.c}: Handle all data types in custom tags. 2005-03-18 Andrey Kiselev * libtiff/dirinfo.c: Added DNG tags. * libtiff/{tif_dir.c, tif_print.c}: More improvements in custom tag handling code. * libtiff/tiff.h: More comments; added missed DNG tag (LensInfo); added DNG 1.1.0.0 tags. * tools/tif2pdf.c: Fixed problem with alpha channel handling as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=794 * man/TIFFGetField.3tiff: Add a note about autoregistered tags. 2005-03-17 Andrey Kiselev * nmake.opt: Build with Win32 CRT library by default. * tools/tiff2ps.c: Fixed typo in page size handling code. * libtiff/{tif_dir.c, tif_print.c}: Support for custom tags, passed by value. * libtiff/{tiff.h, tif_dirinfo.c, tiffiop.h}: Added EXIF related tags. 2005-03-15 Andrey Kiselev * libtiff 3.7.2 released. 2005-03-09 Andrey Kiselev * tools/tiffcmp.c: Added ability to compare the 32-bit integer and floating point data; complain on unsupported bit depths. 2005-03-05 Andrey Kiselev * tif_stream.cxx: Use ios namespace instead of ios_base to support GCC 2.95. * libtiff/{tiff.h, tif_fax3.tif, tif_jpeg.c}: Applied correct patch from Lee Howard for HylaFax DCS tag (see http://bugzilla.remotesensing.org/show_bug.cgi?id=771) 2005-03-04 Andrey Kiselev * configure, configure.ac: Use -rpath option instead of -R as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=732 * libtiff/{tiff.h, tif_fax3.tif, tif_jpeg.c}: Applied patch from Lee Howard to support a new tag TIFFTAG_FAXDCS (34911) used in HylaFax software. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=771 * nmake.opt, html/build.html: Add more comments, change the config file organization a bit as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=764 * tools/tiffcmp.c: Use properly sized buffer in short arrays comparison as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=785 2005-03-03 Andrey Kiselev * libtiff/tif_dirread.c: More logic to guess missed strip size as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=705 * tools/fax2ps.c: Replace insecure mktemp() function with the tmpfile() as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=786 2005-02-04 Andrey Kiselev * libtiff/tiff.h: Changed the int8 definition to be always signed char as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=727 * libtiff/tiffio.h: Move TIFFOpenW() function into the extern "C"{} block as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=763 2005-02-03 Bob Friesenhahn * tools/tiffgt.c: Fix problem on big-endian CPUs so that images display more correctly. Images display brighter than they should on a Sun workstation. 2005-02-03 Andrey Kiselev * libtiff/tif_dirread.c: Estimate strip size in case of wrong or suspicious values in the tags. As per bugs http://bugzilla.remotesensing.org/show_bug.cgi?id=705 and http://bugzilla.remotesensing.org/show_bug.cgi?id=320 * tools/tiff2ps.c: Fixed problem with page sizes as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=742 2005-01-31 Bob Friesenhahn * libtiff/tiff.h (TIFFTAG_TILEWIDTH): Corrected description. (TIFFTAG_TILELENGTH): Corrected description. 2005-01-30 Andrey Kiselev * configure.ac: Fixes for --with-docdir option as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=759 * libtiff/tif_open.c: Remove unnesessary TIFFSeekFile() call as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=756 * libtiff/tif_stream.cxx: Fixes for C++ stream interface from Michael Rinne and Edward Lam. 2005-01-15 Andrey Kiselev * configure.ac: Make the documentation directory location configurable via the --with-docdir option (as suggested by Jeremy C. Reed). * libtiff/tif_color.c: Use double as the second argument of pow() function in TIFFCIELabToRGBInit(). As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=741 * libtiff/tif_pixarlog.c: Avoid warnings when converting float to integer as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=740 * libtiff/tif_getimage.c: Always fill the error message buffer in TIFFRGBAImageBegin() as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=739 2005-01-12 Andrey Kiselev * libtiff/tif_jpeg.c: Added ability to read/write the fax specific TIFFTAG_FAXRECVPARAMS, TIFFTAG_FAXSUBADDRESS and TIFFTAG_FAXRECVTIME tags as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=736 * libtiff/tif_win32.c: Fixed message formatting in functions Win32WarningHandler() and Win32ErrorHandler() as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=735 * tools/tiff2ps.c: Interpret the -w and -h options independently. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=689 2005-01-11 Andrey Kiselev * libtiff/tiffio.h: Move the color conversion routines in the 'extern "C"' section as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=727 * libtiff/tiff.h: Restore back the workaround for AIX Visual Age C compiler to avoid double definition of BSD types as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=39 * libtiff/Makefile.am: Place the C++ stream API in the separate library called libtiffxx to avoid unneeded dependencies. Probably there will be more C++ API in the future. As per bugs http://bugzilla.remotesensing.org/show_bug.cgi?id=733 and http://bugzilla.remotesensing.org/show_bug.cgi?id=730 2005-01-05 Andrey Kiselev * tools/tiffdump.c: Fixed problem when read broken TIFFs with the wrong tag counts (Dmitry V. Levin, Martin Pitt). * configure.ac: Replace --disable-c++ with the --disable-cxx option as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=730 2004-12-25 Andrey Kiselev * libtiff/tif_getimage.c: More fixes for multiple-alpha-channelled RGB-images as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=713 * tools/tiffset.c: Convert character option to integer value as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=725 2004-12-20 Andrey Kiselev * libtiff 3.7.1 released. * html/tiffset.1.html: Add missed manual page as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=678 * libtiff/tiff.h: Revert back libtiff data type definitions as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=687 2004-12-19 Andrey Kiselev * libtiff/tif_dirread.c: Do not forget about TIFF_VARIABLE2 when checking for tag count in TIFFReadDirectory() function. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=713 * libtiff/{tif_dirread.c, tif_fax3.c}: More argument checking in CheckMallock() function. * libtiff/tif_getimage.c: Support for multiple-alpha-channelled RGB-images as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=718 2004-12-15 Frank Warmerdam * libtiff/tif_getimage.c: #define A1 bracketing for clean build on SunPro compiler. 2004-12-11 Bob Friesenhahn * autogen.sh: aclocal and autoheader should be executed after libtoolize. Also add '-I .' to aclocal invocation to check current directory for macros. 2004-12-10 Andrey Kiselev * libtiff/tif_dirwrite.c: Always write TIFFTAG_SUBIFD using LONG type as per bugs http://bugzilla.remotesensing.org/show_bug.cgi?id=703 and http://bugzilla.remotesensing.org/show_bug.cgi?id=704 2004-12-04 Andrey Kiselev * nmake.opt: Link with the user32.lib in windowed mode. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=697 * libtiff/tif_win32.c: Use char* strings instead of TCHAR in windowed mode as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=697 * libtiff/tif_config.in.vc: Removed unneded definitions for read/open/close/lseek functions to fix the http://bugzilla.remotesensing.org/show_bug.cgi?id=680 2004-12-03 Andrey Kiselev * libtiff/{tif_dir.c, tif_dirread.c}: Remove TIFFReassignTagToIgnore() call from the TIFFReadDirectory() function. TIFFReassignTagToIgnore must be removed in the future, as it was never used properly. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=692 2004-11-30 Bob Friesenhahn * libtiff/tif_jpeg.c: Added a work-around in order to allow compilation with the heavily modified version of libjpeg delivered with Cygwin. 2004-11-29 Andrey Kiselev * libtiff/tif_dir.c: Properly handle tags, which have the uint32 counts. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=693 * tools/fax2ps.c: Be able to extract the first page (#0). As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=690 2004-11-28 Andrey Kiselev * libtiff/tif_unix.c: Make UNIX module compilable (and usable) on Windows. * nmake.opt: Add missed DLLNAME variable. 2004-11-26 Frank Warmerdam * libtiff/makefile.vc: make it easier to rename the libtiff DLL. 2004-11-24 Andrey Kiselev * man/libtiff.3tiff: Improvements in the "LIST OF ROUTINES" table as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=545 * man/tiffset.1: Added manual page for tiffset tool written by Jay Berkenbilt. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=678 2004-11-23 Frank Warmerdam * libtiff/tif_error.c: fixed TIFFerror call to be TIFFError. 2004-11-21 Frank Warmerdam * html/document.html: Updated Adobe web links as per email from Joris. 2004-11-21 Andrey Kiselev * libtiff/{tiffio.hxx, tiffio.h}: C++ stream interface moved to new file tiffio.hxx. We don't have any C++ in tiffio.h, those who want to use C++ streams should #include . 2004-11-13 Andrey Kiselev * libtiff/tiff.h: Added Adobe DNG tags. * libtiff/tif_win32.c: Typo fixed. * libtiff/{tif_stream.cxx, tiffio.h}: C++ stream interface updated to be compliant with the latest standard. Appropriate additions in makefiles now completed. 2004-11-11 Andrey Kiselev * tools/tiffset.c, libtiff/tif_dirinfo.c: Properly handle the different tag types. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=600 2004-11-10 Andrey Kiselev * libtiff/tif_aux.c: Set the appropriate ReferenceBlackWhite array for YCbCr image which lacks that tag (noted by Hans Petter Selasky). 2004-11-09 Andrey Kiselev * libtiff/tif_color.c: Division by zero fixed (Hans Petter Selasky). 2004-11-07 Andrey Kiselev * libtiff/{tif_stream.cxx, tiffio.h}: Added C++ stream interface contributed by Edward Lam (see http://bugzilla.remotesensing.org/show_bug.cgi?id=654 for details). Though no changes in any makefiles yet. 2004-11-05 Frank Warmerdam * libtiff/tif_open.c: Removed close() in TIFFClientOpen() if file is bad. This is the callers responsibility. http://bugzilla.remotesensing.org/show_bug.cgi?id=651 2004-11-05 Andrey Kiselev * libtiff/{tiffio.h, tif_win32.c, libtiff.def}: Added TIFFOpenW() function to work with the double byte strings (used to represent filenames in some locales). As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=625 * libtiff/tif_dirread.c: Fixed problem when fetching BitsPerSample and Compression tags of type LONG from broken TIFFS as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=662 * libtiff/tif_dirinfo.c: Fixed definition for TIFFTAG_RICHTIFFIPTC, the writecount should have uint32 type. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=662 * libtiff/tif_write.c: Fixed wrong if() statement in TIFFAppendToStrip() function as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=660 2004-11-04 Andrey Kiselev * libtiff/tif_dirinfo.c: Change definition for TIFFTAG_EXTRASAMPLES field. The caller should supply a count when setting this field. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=648 * libtiff/{tif_jpeg.c, tif_ojpeg.c}: TIFFTAG_JPEGTABLES should have uint32 count. Use this type everywhere. 2004-11-03 Frank Warmerdam * libtiff/tif_next.c: avoid use of u_long and u_char types. Bug 653. 2004-11-02 Frank Warmerdam * tools/tiff2rgba.c: removed extra newlines in usage message. 2004-10-30 Andrey Kiselev * libtiff/tif_dirwrite.c: Improvements in tag writing code. * tools/tiff2ps.c: Fixed wrong variable data type when read Position tags (Tristan Hill). 2004-10-30 Frank Warmerdam * libtiff/tiffiop.h: added fallback definition of assert() if we don't have assert.h. 2004-10-29 Andrey Kiselev * libtiff/tif_fax3.c: Fixed case with the wrong decode routines choosing when the incorrect Group4Options tag set. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=323 * libtiff/tif_dirwrite.c: Fixed problem with passing count variable of wrong type when writing the TIFF_BYTE/TIFF_SBYTE tags in TIFFWriteNormalTag(). 2004-10-28 Andrey Kiselev * tools/tiff2ps.c: Fixed wrong variable data type when read Resolution tags (Peter Fales). * tools/{bmp2tiff.c, raw2tiff.c}: Get rid of stream I/O functions. 2004-10-28 Frank Warmerdam * tools/tiff2pdf.c: added casts to avoid warnings. * libtiff/libtiff.def: Added several more entry points required to link fax2tiff.c against the DLL on windows. 2004-10-27 Andrey Kiselev * configure, configure.ac: Added --enable-rpath option to embed linker paths into library binary. 2004-10-26 Andrey Kiselev * tools/tiffset.c: Check the malloc return value (Dmitry V. Levin). * libtiff/{tif_strip.c, tif_tile.c}: Zero division problem fixed (Vladimir Nadvornik, Dmitry V. Levin). 2004-10-16 Andrey Kiselev * libtiff 3.7.0 released. 2004-10-15 Bob Friesenhahn * libtiff/tif_jpeg.c: There seems to be no need to include stdio.h in this file so its inclusion is removed. Including stdio.h sometimes incurs an INT32 typedef conflict between MinGW's basetsd.h and libjpeg's jmorecfg.h. 2004-10-15 Andrey Kiselev * man/bmp2tiff.1: Added manual page for bmp2tiff utility. 2004-10-13 Bob Friesenhahn * tools/tiffcmp.c (leof): Renamed from 'eof' in order to avoid conflict noticed under MinGW. * ltmain.sh: Fix for MinGW compilation. 2004-10-13 Frank Warmerdam * man/tiffsplit.1: Fixed to indicate using aaa-zzz, not aa-zz. http://bugzilla.remotesensing.org/show_bug.cgi?id=635 2004-10-12 Andrey Kiselev * libtiff/{tif_dirread.c, tif_jpeg.c, tif_luv.c, tif_ojpeg.c, tif_pixarlog.c, tif_write.c}: Handle the zero strip/tile sizes properly (Dmitry V. Levin, Marcus Meissner). 2004-10-11 Andrey Kiselev * libtiff/tif_dirinfo.c: Type of the TIFFTAG_SUBIFD field changed to TIFF_IFD. 2004-10-10 Andrey Kiselev * tools/bmp2tif.c: Check the space allocation results. 2004-10-09 Andrey Kiselev * libtiff/tif_dir.c: Initialize td_tilewidth and td_tilelength fields of the TIFFDirectory structure with the 0 instead of -1 to avoid confusing integer overflows in TIFFTileRowSize() for striped images. * tools/tiff2pdf.c: Fixed TransferFunction tag handling reported by Ross A. Finlayson. * libtiff/tif_dir.c: Fixed custom tags handling as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=629 2004-10-08 Frank Warmerdam * libtiff/tif_dirinfo.c: Fix bug with tif_foundfield and reallocation of tif_fieldinfo. http://bugzilla.remotesensing.org/show_bug.cgi?id=630 2004-10-04 Bob Friesenhahn * contrib/iptcutil/README: Added the missing README which goes along with iptcutil. 2004-10-03 Andrey Kiselev * libtiff/tif_compress.c: Improved error reporting in TIFFGetConfiguredCODECs() (Dmitry V. Levin). 2004-10-02 Andrey Kiselev * libtiff 3.7.0beta2 released. * libtiff/{tif_aux.c, tif_compress.c, tif_dirinfo.c, tif_dirwrite.c, tif_extension.c, tif_fax3.c, tif_luv.c, tif_packbits.c, tif_pixarlog.c, tif_write.c}: Added checks for failed memory allocations and integer overflows (Dmitry V. Levin). * libtiff/tiff.h: Missed TIFF_BIGTIFF_VERSION constant added. 2004-10-01 Frank Warmerdam * libtiff/tif_open.c: added a more informative message if a BigTIFF file is opened. 2004-09-30 Frank Warmerdam * libtiff/tif_dirinfo.c: changed type of XMLPacket (tag 700) to TIFFTAG_BYTE instead of TIFFTAG_UNDEFINED to comply with the info in the Adobe XMP Specification. 2004-09-29 Andrey Kiselev * libtiff/{tif_jpeg.c, tif_pixarlog.c}: Use _TIFFmemset() instead of memset(). * libtiff/{tif_dirread.c, tif_strip.c, tif_tile.c}: Applied patches from Dmitry V. Levin to fix possible integer overflow problems. 2004-09-28 Andrey Kiselev * libtiff/tif_getimage.c: Check for allocated buffers before clearing (Dmitry V. Levin). 2004-09-26 Andrey Kiselev * libtiff/{tif_dir.h, tif_dir.c, tif_dirread.c, tif_write.c}: Optimize checking for the strip bounds. * libtiff/{tif_dirread.c, tif_strip.c}: TIFFScanlineSize() and TIFFRasterScanlineSize() functions report zero in the case of integer overflow now. Properly handle this case in TIFFReadDirectory() (patches from Dmitry V. Levin). 2004-09-25 Andrey Kiselev * libtiff/{tif_dirinfo.c, tif_strip.c, tif_tile.c}: Use TIFFhowmany8() macro where appropriate. * tools/tiff2bw.c: Write ImageWidth/Height tags to output file, as noted by Gennady Khokhorin. * libtiff/tif_dirread.c: Always check the return values, returned by the _TIFFmalloc() (Dmitry V. Levin). * libtiff/tif_dir.c: Fixed possible integer overflow _TIFFset*Array() functions (Dmitry V. Levin). * libtiff/{tif_dirread.c, tif_dir.c, tif_write.c}: Potential memory leak fixed in TIFFReadDirectory(), _TIFFVSetField(), TIFFGrowStrips() (found by Dmitry V. Levin). 2004-09-24 Andrey Kiselev * libtiff/{tiffio.h, tif_compress.c}: Added TIFFGetConfiguredCODECs() to get the list of configured codecs. * libtiff/{tiffiop.h, tif_dirread.c}: More overflow fixes from Dmitry V. Levin. 2004-09-23 Andrey Kiselev * libtiff/tif_dirread.c: Applied patch from Dmitry V. Levin to fix possible integer overflow in CheckMalloc() function. 2004-09-22 Andrey Kiselev * libtiff/{tiffiop.h, tif_strip.c}: Use TIFFhowmany8() macro instead of plain TIFFhowmany() where appropriate. 2004-09-21 Andrey Kiselev * libtiff/tif_getimage.c: Initialize arrays after space allocation. 2004-09-19 Andrey Kiselev * libtiff 3.7.0beta released. * libtiff/{tif_luv.c, tif_next.c, tif_thunder.c}: Several buffer overruns fixed, as noted by Chris Evans. 2004-09-14 Bob Friesenhahn * commit: Added a script to make it more convenient to commit updates. The CVS commit message is extracted from this ChangeLog file. 2004-09-14 Andrey Kiselev * configure.ac, configure, aclocal.m4, libtiff/{mkspans.c, tif_fax3.c, tif_getimage.c, tif_luv.c, tif_lzw.c, tif_ojpeg.c, tif_packbits.c, tif_predict.c, tif_read.c, tif_swab.c, tif_thunder.c, tif_write.c, tif_dir.c, tif_dirread.c, tif_dirwrite.c, tif_jpeg.c, tif_dirinfo.c, tif_vms.c, tif_print.c, tif_strip.c, tif_tile.c, tif_dir.h, tif_config.h.in, tiffiop.h}: Get rid of BSD data types (u_char, u_short, u_int, u_long). 2004-09-13 Bob Friesenhahn * libtiff/tiff.h: Fix column tagging. Reference current Adobe XMP specification. Reference libtiff bug tracking system to submit private tag additions. 2004-09-12 Bob Friesenhahn * tools/tiffgt.c: Include "tif_config.h". * configure.ac: Use AM_PROG_CC_C_O since it is now needed to build tiffgt. This results in the 'compile' script being added to the project. * tools/Makefile.am (tiffgt_CFLAGS): Add extra build options required to find OpenGL headers necessary to build tiffgt. Also ensure that the libtiff that we built is used rather than some other libtiff installed on the system. 2004-09-12 Andrey Kiselev * configure.ac, acinclude.m4, aclocal.m4: New macros to detect GLUT libraries. 2004-09-11 Bob Friesenhahn * configure.ac: Pass library configuration defines via tif_config.h rather than extending CPPFLAGS. Configure a libtiff/tiffconf.h in order to satisfy application requirements (not used by library build). Do not define _POSIX_C_SOURCE=2 since this causes failure to build on systems which properly respect this request. * libtiff/tiffconf.h.in: New file to act as the template for the configured tiffconf.h * libtiff/files.lst (HDRS): Install the configured tiffconf.h. 2004-09-10 Frank Warmerdam * html/internals.html: Split off a discussion of adding new tags into addingtags.html. 2004-09-10 Andrey Kiselev * test/{ascii_tag.c, long_tag.c}: Preliminary test suite added. * tools/tiff2pdf.c: Fixed reading TransferFunction tag as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=590 * libtiff/tif_print.c: Fixes in InkNames and NumberOfInks reporting. * libtiff/tif_dirread.c: Don't reject to read tags of the SamplesPerPixel size when the tag count is greater than number of samples as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=576 * libtiff/tiff.h: Use _TIFF_DATA_TYPEDEFS_ guardian to switch off defining int8/uint8/... etc. types. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=607 2004-09-09 Frank Warmerdam * tools/tiff2ps.c, tools/tiffmedian.c: fiddle with include files to avoid compile warnings about getopt() and a few other things. 2004-09-02 Andrey Kiselev * libtiff/tif_dirread.c: Use memcpy() function instead of pointer assigning magic in TIFFFetchFloat(). 2004-09-01 Andrey Kiselev * libtiff/{tiffio.h, tif_open.c}: Applied patches from Joris Van Damme to avoid requirement for tiffiop.h inclusion in some applications. See here http://www.asmail.be/msg0054799560.html for details. * tools/fax2tiff.c: Use the new functions in the code. 2004-08-25 Andrey Kiselev * tools/tiff2pdf.c: Initialize arrays properly. * tools/tiff2ps.c: Avoid zero division in setupPageState() function; properly initialize array in PSDataBW(). 2004-08-24 Andrey Kiselev * tools/tiff2pdf.c: More fixes for bug http://bugzilla.remotesensing.org/show_bug.cgi?id=590 from Ross Finlayson. 2004-08-23 Andrey Kiselev * tools/tiff2ps.c: Fixed problem with uninitialized values. * libtiff/tif_dir.c: Initialize tif_foundfield data member in the TIFFDefaultDirectory() (in addition to 2004-08-19 fix). * tools/tiff2pdf.c: Fixed a bunch of problems as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=590 2004-08-20 Andrey Kiselev * tools/tiff2pdf.c: Applied patch from Ross Finlayson that checks that the input file has compression, photometric interpretation, etcetra, tags or if not than a more descriptive error is returned. * libtiff/tif_dirread.c: Fixed problem in TIFFReadDirectory() in the code, responsible for tag data type checking. 2004-08-19 Andrey Kiselev * libtiff/{tiffiop.h, tif_dirinfo.c}: Fixed problem with the static variable as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=593 2004-08-16 Andrey Kiselev * tools/ras2tiff.c: Fixed issue with missed big-endian checks as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=586 2004-08-01 Andrey Kiselev * libtiff/{tif_config.h.in, tif_config.h.vc}: config.h.in and config.h.vc files renamed in the tif_config.h.in and tif_config.h.vc. 2004-07-24 Andrey Kiselev * libtiff/tif_lzw.c: LZW compression code is merged back from the separate package. All libtiff tools are updated to not advertise an abcence of LZW support. 2004-07-12 Andrey Kiselev * libtiff/tiffio.h: Revert thandle_t back to void* type. 2004-07-11 Andrey Kiselev * libtiff/{tif_read.c, tif_tile.c, tif_strip.c}: Fixes in error messages, as suggested by Bernd Herd. 2004-07-03 Andrey Kiselev * libtiff/tif_dir.c: Call TIFFError() instead of producing warnings when setting custom tags by value. Reported by Eric Fieleke. 2004-06-14 Andrey Kiselev * tools/bmp2tiff.c: Add missed RawsPerStrip setting. 2004-06-08 Andrey Kiselev * tools/bmp2tiff.c: Added new utility to convert Windows BMP files into TIFFs. 2004-06-07 Andrey Kiselev * libtiff 3.7.0alpha released. 2004-06-06 Andrey Kiselev * libtiff/{tiff.h, tif_dirwrite.c, tif_fax3.c, tif_packbits.c,}: Get rid of ugly 64-bit hacks, replace them with the clever (autoconf based ) ones :-). * libtiff/tiffio.h: Define thandle_t as int, not void* (may cause problems in 64-bit environment). 2004-06-05 Andrey Kiselev * tools/tiffset.c: tiffset now can set any libtiff supported tags. Tags can be supplied by the mnemonic name or number. * libtiff/{tiffio.h, tif_dir.h, tif_dirinfo.c,}: Added two new functions TIFFFindFieldInfoByName() and TIFFFieldWithName(). 2004-05-27 Andrey Kiselev * libtiff/tif_ojpeg.c: Fixed problem with duplicated SOI and SOF markers as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=581 2004-05-24 Andrey Kiselev * tools/tiffsplit.c: Don't forget to copy Photometric Interpretation tag. 2004-05-20 Andrey Kiselev * libtiff/{tif_open.c, tiffio.h}: New function added: TIFFIsBigEndian(). Function returns nonzero if given was file written in big-endian order. * tools/tiffsplit.c: Fixed problem with unproperly written multibyte files. Now output files will be written using the same byte order flag as in the input image. See http://bugzilla.remotesensing.org/show_bug.cgi?id=574 for details. 2004-05-19 Frank Warmerdam * libtiff/tif_print.c: added (untested) support for printing SSHORT, SLONG and SRATIONAL fields. * tools/tiffcp.c: close output file on normal exit. 2004-05-17 Andrey Kiselev * libtiff/tif_fax3.c: Avoid reading CCITT compression options if compression type mismatches. See http://bugzilla.remotesensing.org/show_bug.cgi?id=565 2004-04-30 Andrey Kiselev * libtiff/tif_strip.c: Never return 0 from the TIFFNumberOfStrips(). 2004-04-29 Andrey Kiselev * libtiff/tif_dirread.c: Workaround for broken TIFF writers which store single SampleFormat value for multisampled images. See http://bugzilla.remotesensing.org/show_bug.cgi?id=562 2004-04-25 Andrey Kiselev * configure.ac, libtiff/{tiff.h, config.h.in}: Added tests for int8, int16 and int32 types to avoid complains on some compilers. Details at http://bugzilla.remotesensing.org/show_bug.cgi?id=39 2004-04-20 Andrey Kiselev * tools/tiff2pdf.c: Fixed problem with unaligned access as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=555 2004-04-14 Andrey Kiselev * libtiff/tif_write.c: Allow in-place updating of the compressed images (don't work properly with all codecs). For details see GDAL bug http://bugzilla.remotesensing.org/show_bug.cgi?id=534 2004-04-06 Andrey Kiselev * libtiff/tif_jpeg.c: Workaround for wrong sampling factors used in the Intergarph JPEG compressed TIFF images as per bug: http://bugzilla.remotesensing.org/show_bug.cgi?id=532 2004-04-04 Frank Warmerdam * libtiff/tif_open.c: close clientdata if TIFFClientOpen() fails via bad2. 2004-03-26 Andrey Kiselev * tools/tiffcp.c: Properly set Photometric Interpretation in case of JPEG compression of grayscale images. * tools/tiffcp.c: Don't emit warnings when Orientation tag does not present in the input image. 2004-03-19 Andrey Kiselev * {many}: The first attempt to switch to autotools. 2004-03-03 Andrey Kiselev * libtiff/tif_open.c: Use dummy mmap/munmap functions in TIFFClientOpen() when the appropriate client functions was not supplied by user. 2004-03-02 Frank Warmerdam * tools/ycbcr.c: fixed main() declaration as per: http://bugzilla.remotesensing.org/show_bug.cgi?id=513 2004-02-26 Andrey Kiselev * tools/tiffsplit.c: Copy JPEGTables tag contents for JPEG compressed images. Reported by Artem Mirolubov. * libtiff/tif_dirread.c: Fixed problem with handling TIFF_UNDEFINED tag type in TIFFFetchNormalTag() as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=508 2004-02-17 Frank Warmerdam * libtiff/tif_codec.c: Fixed typo in TIFFInitPackBits name as per: http://bugzilla.remotesensing.org/show_bug.cgi?id=494 2004-02-05 Andrey Kiselev * libtiff/tif_fax3.c: Fixed problem with CCITT encoding modes as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=483 But we need more work on fax codec to support update mode. 2004-01-30 Frank Warmerdam * libtiff/libtiff.def: Added TIFFCurrentDirOffset, TIFFWriteCheck, TIFFRGBAImageOK, and TIFFNumberOfDirectories as suggested by Scott Reynolds. 2004-01-29 Andrey Kiselev * libtiff/tiff.h: Fixed tag definitions for TIFFTAG_YCLIPPATHUNITS and TIFFTAG_INDEXED as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=475 * libtiff/{tif_win32.c, tif_unix.c}: Check whether the pointer is NULL before proceeding further as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=474 Check results, returned by the TIFFFdOpen() before returning and close file if TIFFFdOpen() failed as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=468 * libtiff/tif_open.c: More fixes for http://bugzilla.remotesensing.org/show_bug.cgi?id=468 2004-01-28 Andrey Kiselev * libtiff/{libtiff.def, tif_close.c, tiffio.h, tif_open.c}: Separate TIFFCleanup() from the TIFFClose() in order to fix the bug http://bugzilla.remotesensing.org/show_bug.cgi?id=468 * tools/tiffcp.c: Fixed problem with wrong interpretation of the InkNames tag as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=466 Memory leak fixed. 2004-01-21 Frank Warmerdam * libtiff/tif_dirwrite.c: Fixed handling of writable ASCII tags that are field_passcount=TRUE properly. Arguably anonymous custom tags should be declared as passcount=FALSE, but I don't want to change that without a careful review. 2004-01-20 Andrey Kiselev * libtiff/tif_write.c: Fixed reporting size of the buffer in case of stripped image in TIFFWriteBufferSetup(). As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=460 2004-01-11 Andrey Kiselev * libtiff/tif_dir.c: Incomplete cleanup in TIFFFreeDirectory(), patch from Gerben Koopmans. * libtiff/tif_dirread.c: Check field_passcount value before setting the value of undefined type, patch from Gerben Koopmans. 2004-01-02 Andrey Kiselev * tools/tiffcp.c: Fixed problem with wrong Photometric setting for non-RGB images. 2003-12-31 Andrey Kiselev * libtiff/tif_win32.c: Fixed problem with _TIFFrealloc() when the NULL pointer passed. Patch supplied by Larry Grill. * libtiff/{tiff.h, tif_fax3.c}:Fixes for AMD 64 platform as suggested by Jeremy C. Reed. 2003-12-26 Andrey Kiselev * libtiff 3.6.1 released. 2003-12-24 Andrey Kiselev * config.guess, config.sub: Updated from the recent upstream. 2003-12-22 Andrey Kiselev * libtiff/{tif_color, tif_getimage.c, tiffio.h}, man/TIFFcolor.3t: More cleanups in color conversion interface, added appropriate manual page. 2003-12-19 Andrey Kiselev * libtiff/{tif_extension.c, tif_dirinfo.c, tiff.h}: Warnings fixed as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=357 * tools/tiff2ps.c: Added support for alpha channel. Fixes http://bugzilla.remotesensing.org/show_bug.cgi?id=428 * libtiff/{libtiff.def, tif_color.c, tif_getimage.c, tiffio.h}: Interface for Lab->RGB color conversion is finally cleaned up. Added support for ReferenceBlackWhite tag handling when converted from YCbCr color space. The latter closes http://bugzilla.remotesensing.org/show_bug.cgi?id=120 2003-12-07 Andrey Kiselev * libtiff/{tif_getimage.c, tiffio.h}: Avoid warnings. * libtiff/makefile.vc, tools/makefile.vc: Support for IJG JPEG library. 2003-12-06 Andrey Kiselev * libtiff/{tif_getimage.c, tif_aux.c}: Read WhitePoint tag from the file and properly use it for CIE Lab->RGB transform. 2003-12-04 Andrey Kiselev * libtiff/{tif_getimage.c, tif_color.c, tiffio.h}: YCbCr->RGB conversion routines now in the tif_color.c module. New function TIFFYCbCrtoRGB() available in TIFF API. * libtiff/tif_dirwrite.c: Handle TIFF_IFD tag type correctly. 2003-12-03 Andrey Kiselev * libtiff/{tif_getimage.c, tif_color.c, tiffio.h}: Improvements in CIE Lab conversion code. Start moving YCbCr stuff to the tif_color.c module. * libtiff/{tif_getimage.c, tiffio.h}, man{TIFFReadRGBAImage.3t, TIFFReadRGBAStrip.3t, TIFFReadRGBATile.3t, TIFFRGBAImage.3t}: Finally resolved problems with orientation handling. TIFFRGBAImage interface now properly supports all possible orientations, i.e. images will be flipped both in horizontal and vertical directions if required. 'Known bugs' section now removed from the appropriate manual pages. Closed bug entry: http://bugzilla.remotesensing.org/show_bug.cgi?id=322 2003-12-02 Andrey Kiselev * libtiff/tif_dir.c: Fixed order of the parameters in TIFFError() function calls as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=440 2003-11-28 Ross Finlayson * tools/tiff2pdf.c: Some bugs fixed. 2003-11-27 Andrey Kiselev * libtiff/tif_luv.c: Fixed bug in 48-bit to 24-bit conversion routine, reported by Antonio Scuri. * man/tiff2pdf.1: Few improvements in page layout. * Makefile.in, /man/Makefile.in, /html/man/tiff2pdf.1.html: Added support fpr tiff2pdf manual page. 2003-11-26 Ross Finlayson * /man/tiff2pdf.1: File added to repository. 2003-11-26 Andrey Kiselev * Makefile.in, /tools/{Makefile.in, makefile.vc}: Added support fpr tiff2pdf utility. 2003-11-25 Ross Finlayson * /tools/tiff2pdf.c: File added to repository. 2003-11-22 Andrey Kiselev * /tools/raw2tiff.c: sqrtf() replaced with sqrt(). 2003-11-21 Andrey Kiselev * /tools/raw2tiff.c: #include removed. * tools/{Makefile.in, tiffgt.c}: Unmaintained and platform dependent sgigt utility removed and replaced with the completely rewritten portable tiffgt tool (depend on OpenGL and GLUT). Initial revision, there is a lot of things to improve. * libtiff/tif_ojpeg.c: TIFFVGetField() function now can properly extract the fields from the OJPEG files. Patch supplied by Ross Finlayson. * libtiff/{tiffio.h, tif_codec.c}, man/{libtiff.3t, TIFFcodec.3t}: Added new function TIFFIsCODECConfigured(), suggested by Ross Finlayson. 2003-11-18 Andrey Kiselev * libtiff/tif_dirinfo.c: Implemented binary search in _TIFFMergeFieldInfo(). Patch supplied by Ross Finlayson. * libtiff/tif_dir.h: _TIFFFindOrRegisterdInfo declaration replaced with _TIFFFindOrRegisterFieldInfo as reported by Ross Finlayson. 2003-11-17 Frank Warmerdam * tif_dirread.c: do not mark all anonymously defined tags to be IGNOREd. 2003-11-17 Andrey Kiselev * contrib/pds/{tif_pdsdirread.c, tif_pdsdirwrite.c}: Use TIFFDataWidth() function insted of tiffDataWidth array. 2003-11-16 Andrey Kiselev * libtiff/{tiff.h, tif_dirinfo.c}: Added support for IFD (13) datatype, intruduced in "Adobe PageMaker TIFF Tech. Notes". 2003-11-15 Frank Warmerdam * Makefile.in: fixed missing backslash for tif_color.c in list. 2003-11-13 Andrey Kiselev * libtiff/{tif_color.c, tif_getimage.c, tiffio.h, Makefile.in}: New color space conversion code: CIE L*a*b* 1976 images now supported by the TIFFRGBAImage interface. All introduced routines go to new module tif_color.c. Eventually all color conversion functions should be moved there. 2003-11-12 Andrey Kiselev * tools/{ras2tiff.c, rasterfile.h}: Properly determine SUN Rasterfiles with the reverse byte order (it is reported by the magic header field). Problem reported by Andreas Wiesmann. * tools/raw2tiff.c, man/raw2tiff.1: Few improvements in correlation calculation function. Guessing mechanics now documented in manual page. 2003-11-11 Andrey Kiselev * tools/raw2tiff.c: Implemented image size guessing using correlation coefficient calculation between two neighbour lines. 2003-11-09 Frank Warmerdam * libtiff/tif_tile.c: remove spurious use of "s" (sample) in the planarconfig_contig case in TIFFComputeTile(). http://bugzilla.remotesensing.org/show_bug.cgi?id=387 2003-11-09 Andrey Kiselev * libtiff/tiffiop.h: New macros: TIFFmax, TIFFmin and TIFFrint. 2003-11-07 Andrey Kiselev * libtiff/{tiffio.h, tif_strip.c}, man/{TIFFstrip.3t, libtiff.3t}: Added TIFFRawStripSize() function as suggested by Chris Hanson. 2003-11-03 Andrey Kiselev * libtiff/{tif_lzw.c, tif_fax3.c}: Proper support for update mode as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=424 2003-10-29 Andrey Kiselev * libtiff/libtiff.def: Added TIFFReadRGBAImageOriented. * html/build.html: Added note about GNU make requirement. 2003-10-25 Andrey Kiselev * Makefile.in: Fixes in using MAKEFLAGS as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=418 * port/install.sh.in: Option -p added to the mkdir command to create all directory tree structure before installing. 2003-10-18 Andrey Kiselev * /tools/tiff2ps.c: #include replaced with the #include . 2003-10-16 Andrey Kiselev * Makefile.in: Add an absolute path to the test_pics.sh call. 2003-10-12 Andrey Kiselev * libtiff/tiffcomp.h: #define _BSDTYPES_DEFINED when defining BSD typedefs. 2003-10-09 Andrey Kiselev * configure, libtiff/{Makefile.in, mkversion.c}: Relative buildings fixed. * tools/Makefile.in: Added "-I../libtiff" to the tiffset building rule. 2003-10-07 Andrey Kiselev * Makefile.in: Added missed v3.6.0.html. * libtiff/tiffio.h: Typo fixed: ORIENTATION_BOTTOMLEFT replaced with ORIENTATION_BOTLEFT. 2003-10-04 Andrey Kiselev * 3.6.0 final release. 2003-10-03 Andrey Kiselev * libtiff/{tif_getimage.c, tiffio.h}, man/TIFFReadRGBAImage.3t: New function TIFFReadRGBAImageOriented() implemented to retrieve raster array with user-specified origin position as suggested by Jason Frank. See http://bugzilla.remotesensing.org/show_bug.cgi?id=322 for details. * tools/tiff2rgba.c: Switched to use TIFFReadRGBAImageOriented() instead of TIFFReadRGBAImage(). * tools/tiff2ps.c: Fixed possible endless loop as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=404 2003-09-30 Andrey Kiselev * libtiff/tif_dirread.c: Check field counter against number of fields in order to fix http://bugzilla.remotesensing.org/show_bug.cgi?id=366 * libtiff/tif_fax3.c: Fix wrong line numbering as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=342 2003-09-25 Andrey Kiselev * libtiff/{tiffiop.h, tif_dirread.c, tif_dir.c, tif_open.c, tif_close.c}: Store a list of opened IFD to prevent looping as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=383 2003-09-23 Andrey Kiselev * libtiff/tif_dirread.c: More fixes for EstimateStripByteCounts(). See http://bugzilla.remotesensing.org/show_bug.cgi?id=358 2003-08-21 Andrey Kiselev * tools/tiffmedian.c: int declaration replaced with the uint32 to support large images as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=382 2003-08-12 Andrey Kiselev * libtiff/Makefile.in: Fixed problem with building in different directory. * tools/tiff2ps.c: Added missing #include . * libtiff/tif_dirwrite.c: More fixes for custom tags code from Ashley Dreier. 2003-08-07 Andrey Kiselev * tools/tiff2ps.c: Added page size setting when creating PS Level 2. Patch submitted by Balatoni Denes (with corrections from Tom Kacvinsky). * tools/tiff2ps.c: Fixed PS comment emitted when FlateDecode is being used. Reported by Tom Kacvinsky. * libtiff/tif_dirwrite.c: Fixed problem with custom tags writing, reported by Ashley Dreier. * libtiff/tif_print.c: Fixed problem with float tags reading, support for printing RATIONAL and BYTE tags added. 2003-08-05 Andrey Kiselev * libtiff/tif_lzw.c: Move LZW codec state block allocation back to TIFFInitLZW(), because its initialization in LZWSetupDecode() cause problems with predictor initialization. Remove O_RDONLY check during state block allocation to be able open LZW compressed files in update mode. Problem exist for libtiff version of the tif_lzw.c module. One from lzw-compression-kit hasn't such troubles. 2003-08-04 Frank Warmerdam * libtiff/tif_write.c: modified tif_write.c so that the various encoded write functions use tif_postdecode() to apply byte order swapping (swab) to the application passed data buffer if the same would be done when reading. This allows us to write pixel data with more than 8 bits per sample to existing files of a non-native byte order. One side effect of this change is the applications buffer itself is altered in this case by the act of writing. http://bugzilla.remotesensing.org/show_bug.cgi?id=171 2003-07-25 Frank Warmerdam * libtiff/tif_open.c: avoid signed/unsigned casting warning initializing typemask as per patch from J.A. Strother. * tools/tiffcp.c: fixed signed/unsigned casting warning. * libtiff/tif_print.c: dos2unix conversion. * tools/tiffsplit.c: increased the maximum number of pages that can be split. Patch provided by Andrew J. Montalenti. 2003-07-11 Andrey Kiselev * tools/raw2tiff.c: Added option `-p' to explicitly select color space of input image data. Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=364 2003-07-08 Frank Warmerdam * tif_aux.c, tif_codec.c, tif_dir.c, tif_dirread.c, tif_extension.c, tif_fax3.c, tif_getimage.c, tif_luv.c, tif_lzw.c, tif_next.c, tif_packbits.c, tif_predict.c, tif_print.c, tif_swab.c, tif_thunder.c: avoid casting warning at /W4. 2003-07-03 Andrey Kiselev * tools/thumbnail.c: Memory leak fixed as reported by Robert S. Kissel. 2003-06-30 Andrey Kiselev * libtiff/tif_pixarlog.c: Unused variables removed. * libtiff/{tif_dirread.c, tif_dir.c}: Fixed problem with EstimateStripByteCounts() as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=358 * libtiff/{tif_dirwrite.c, tif_packbits.c}: Fixed compilation on 64-bit architectures as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=357 * libtiff/tif_dirinfo.c: TIFFDataWidth() returns 0 in case of unknown data type. 2003-06-19 Frank Warmerdam * libtiff/tif_print.c: fixed some serious bugs when printing custom tags ... almost certain to crash. * libtiff/tif_dirread.c: Don't ignore custom fields that are autodefined. Not sure how this got to be like this. 2003-06-18 Andrey Kiselev * 3.6.0 Beta2 released. * tools/tiffcmp.c, man/tiffcmp.1: Fixed problem with unused data comparing as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=349 `-z' option now can be used to set the number of reported different bytes. 2003-06-09 Andrey Kiselev * tools/tiffcp.c, man/tiffcp.1: Added possibility to specify value -1 to -r option to get the entire image as one strip. See http://bugzilla.remotesensing.org/show_bug.cgi?id=343 for details. 2003-06-04 Andrey Kiselev * tools/tiffcp.c: Set the correct RowsPerStrip and PageNumber values as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=343 2003-05-27 Frank Warmerdam * libtiff/tif_jpeg.c: modified segment_height calculation to always be a full height tile for tiled images. Also changed error to just be a warning. 2003-05-25 Andrey Kiselev * tools/fax2tiff.c: Page numbering fixed, as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=341 2003-05-20 Andrey Kiselev * contrib/ojpeg/{Makefile.in, jdhuff.h, jinclude.h, ojpeg.c, README}, configure, Makefile.in: Switched back to the old behaviour. Likely better solution should be found for OJPEG support. 2003-05-11 Andrey Kiselev * libtiff/mkversion.c: Fixed problem with wrong string size when reading RELEASE-DATE file. 2003-05-07 Andrey Kiselev * tools/tiff2ps.c: Fixed bug in Ascii85EncodeBlock() function: array index was out of range. 2003-05-06 Andrey Kiselev * contrib/ojpeg/{Makefile.in, jdhuff.h, jinclude.h, ojpeg.c, README}, configure, Makefile.in: Improved libtiff compilation with OJPEG support. Now no need for patching IJG JPEG library, hack requred by libtiff will be compiled and used in-place. Implemented with suggestion and help from Bill Allombert, Debian's libjpeg maintainer. * libtiff/tif_aux.c: Properly handle TIFFTAG_PREDICTOR in TIFFVGetFieldDefaulted() function. 2003-05-05 Andrey Kiselev * tools/ppm2tiff.c: PPM header parser improved: now able to skip comments. * tools/tiffdither.c: Fixed problem with bit fill order tag setting: was not copied from source image. * libtiff/getimage.c: Workaround for some images without correct info about alpha channel as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=331 2003-04-29 Andrey Kiselev * tools/tiff2ps.c, man/tiff2ps.1: Add ability to generate PS Level 3. It basically allows one to use the /flateDecode filter for ZIP compressed TIFF images. Patch supplied by Tom Kacvinsky. Fixes http://bugzilla.remotesensing.org/show_bug.cgi?id=328 * tools/tiff2ps.c: Force deadzone printing when EPS output specified as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=325 2003-04-17 Andrey Kiselev * libtiff/tif_dirread.c: Removed additional check for StripByteCounts due to problems with multidirectory images. Quality of error messages improved. 2003-04-16 Andrey Kiselev * tools/tiffcp.c: Fixed problem with colorspace conversion for JPEG encoded images. See bug entries http://bugzilla.remotesensing.org/show_bug.cgi?id=275 and http://bugzilla.remotesensing.org/show_bug.cgi?id=23 * libtiff/tif_dirread.c: Additional check for StripByteCounts correctness. Fixes http://bugzilla.remotesensing.org/show_bug.cgi?id=320 2003-03-12 Andrey Kiselev * tools/{fax2ps.c, fax2tiff.c, gif2tiff.c, pal2rgb.c, ppm2tiff.c, ras2tiff.c, raw2tiff.c, rgb2ycbcr.c, thumbnail.c, tiff2bw.c, tiff2ps.c, tiff2rgba.c, tiffcp.c, tiffdither.c, tiffinfo.c, tiffmedian.c}: Added library version reporting facility to all tools. 2003-03-06 Frank Warmerdam * port/install.sh.in: Fixed problems with install producing paths like ///usr/local/lib on cygwin. 2003-02-27 Andrey Kiselev * tools/fax2tiff.c, man/fax2tiff.1: New switch (-X) to set width of raw input page. Patch supplied by Julien Gaulmin. See http://bugzilla.remotesensing.org/show_bug.cgi?id=293 for details. 2003-02-26 Frank Warmerdam * libtiff/tif_dir.c: fixed up the tif_postdecode settings responsible for byte swapping complex image data. * libtiff/tif_lzw.c: fixed so that decoder state isn't allocated till LZWSetupDecode(). Needed to read LZW files in "r+" mode. 2003-02-07 Andrey Kiselev * tools/ppm2tiff.c: Fixed problem with too many arguments. 2003-02-04 Andrey Kiselev * tools/raw2tiff.c: Memory leak fixed. 2003-02-03 Andrey Kiselev * tools/fax2tiff.c, man/fax2tiff.1: Applied patch from Julien Gaulmin (thanks, Julien!). More switches for fax2tiff tool for better control of input and output. Details at http://bugzilla.remotesensing.org/show_bug.cgi?id=272 2003-02-03 Frank Warmerdam * libtiff/tif_jpeg.c: Modified to defer initialization of jpeg library so that we can check if there is already any tile/strip data before deciding between creating a compressor or a decompressor. 2003-01-31 Frank Warmerdam * libtiff/tif_write.c: TIFFWriteCheck() now fails if the image is a pre-existing compressed image. That is, image writing to pre-existing compressed images is not allowed. * libtiff/tif_open.c: Removed error if opening a compressed file in update mode. http://bugzilla.remotesensing.org/show_bug.cgi?id=198 2003-01-31 Andrey Kiselev * config.guess, config.sub: Updated to recent upstream versions. 2003-01-15 Frank Warmerdam * cut 3.6.0 Beta release. 2002-12-20 Andrey Kiselev * tools/fax2ps.c, man/fax2ps.1: Page size was determined in wrong way as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=239 2002-12-17 Frank Warmerdam * libtiff/tif_dirread.c: Allow wrong sized arrays in TIFFFetchStripThing(). http://bugzilla.remotesensing.org/show_bug.cgi?id=49 2002-12-02 Frank Warmerdam * libtiff/tif_dir.c: fix problem with test on td_customValueCount. Was using realloc even first time. Fix by Igor Venevtsev. 2002-11-30 Frank Warmerdam * libtiff/tif_dir.c: fixed bug with resetting an existing custom field value. * libtiff/tif_dir.c: Fixed potential problem with ascii "custom" tags in TIFFVGetField() ... added missing break. 2002-10-14 Frank Warmerdam * tools/tiff2ps.c: fixes a problem where "tiff2ps -1e" did not make the scanline buffer long enough when writing rgb triplets. The scanline needs to be 3 X the number of dots or else it will contain an incomplete triplet and programs that try to separate the eps by redefining the colorimage operator will get messed up. Patch supplied by William Bader. * Makefile.in: added tif_extension.c to file list as per http://bugzilla.remotesensing.org/show_bug.cgi?id=218. 2002-10-11 Andrey Kiselev * configure, config.site, libtiff/{tif_unix.c, Makefile.in}: Fix for large files (>2GiB) supporting. New option in the config.site: LARGEFILE="yes". Should be enough for I/O of the large files. 2002-10-10 Frank Warmerdam * libtiff/html/v3.6.0.html: new release notes. * libtiff/index.html: removed faq, cvs snapshot cruft. Added email link for Andrey. Pointer to v3.6.0.html. * libtiff/Makefile.in: added direct rule for tiffvers.h for release. 2002-10-07 Andrey Kiselev * tools/tiff2ps.c, man/tiff2ps.1: Applied patch form Sebastian Eken (thanks, Sebastian!). New switches: -b # for a bottom margin of # inches -c center image -l # for a left margin of # inches -r rotate the image by 180 degrees New features merged with code for shrinking/overlapping. Previously added -c and -n switches (for overriding PS units) renamed in -x and -y respectively. http://bugzilla.remotesensing.org/show_bug.cgi?id=200 * html/man/*.html: Updated from actual manual pages. 2002-10-06 Frank Warmerdam * libtiff/tif_jpeg.c: fixed problem with boolean defined with wrong size on windows. Use #define boolean hack. http://bugzilla.remotesensing.org/show_bug.cgi?id=188 * libtiff/tiff.h: Don't do special type handling in tiff.h unless USING_VISUALAGE is defined. http://bugzilla.remotesensing.org/show_bug.cgi?id=39 2002-10-03 Frank Warmerdam * libtiff/tiff.h: added COMPRESSION_JP2000. 2002-10-02 Andrey Kiselev * libtiff/tif_dirread.c: Another fix for the fetching SBYTE arrays by the TIFFFetchByteArray() function. Should finally resolve http://bugzilla.remotesensing.org/show_bug.cgi?id=52 * configure: Set -DPIXARLOG_SUPPORT option along with -DZIP_SUPPORT * html/Makefile.in: New targets added: html and groffhtml for producing HTML representations of the manual pages automatically. html target uses man2html tool, groffhtml uses groff tool. 2002-09-29 Frank Warmerdam * configure, libtiff/Makefile.in: Added SCO OpenServer 5.0.6 support from John H. DuBois III. 2002-09-15 Andrey Kiselev * Makefile.in, /man/{raw2tiff.1, Makefile.in, libtiff.3}: Added manual page for raw2tiff(1) tool. 2002-09-12 Andrey Kiselev * /libtiff/{tiffio.h, tif_dir.h}: TIFFDataWidth() declaration moved to the tiffio.h header file. * Makefile.in, /man/{TIFFDataWidth.3t, Makefile.in, libtiff.3}: Added manual page for TIFFDataWidth() function 2002-09-08 Frank Warmerdam * libtiff/tif_dirread.c: Expand v[2] to v[4] in TIFFFetchShortPair() as per http://bugzilla.remotesensing.org/show_bug.cgi?id=196. * tools/tiff2ps.c: Don't emit BeginData/EndData DSC comments since we are unable to properly include the amount to skip. http://bugzilla.remotesensing.org/show_bug.cgi?id=80 2002-09-02 Andrey Kiselev * /libtiff/tif_dirread.c: Fixed problem with SBYTE type data fetching in TIFFFetchByteArray(). Problem described at http://bugzilla.remotesensing.org/show_bug.cgi?id=52 2002-08-22 Andrey Kiselev * /libtiff/tif_dirinfo.c: Further additions to free custom fields in _TIFFSetupFieldInfo() function. See http://bugzilla.remotesensing.org/show_bug.cgi?id=169 for details. * /libtiff/tif_lzw.c: Additional consistency checking added in LZWDecode() and LZWDecodeCompat(). Fixes http://bugzilla.remotesensing.org/show_bug.cgi?id=190 and http://bugzilla.remotesensing.org/show_bug.cgi?id=100 * /libtiff/tif_lzw.c: Added check for valid code lengths in LZWDecode() and LZWDecodeCompat(). Fixes http://bugzilla.remotesensing.org/show_bug.cgi?id=115 2002-08-16 Andrey Kiselev * /libtiff/{Makefile.vc, libtiff.def}: Missed declarations added. 2002-08-15 Frank Warmerdam * tif_getimage.c: Ensure that TIFFRGBAImageBegin() returns the return code from the underlying pick function. http://bugzilla.remotesensing.org/show_bug.cgi?id=177 * tif_dir.h: changed FIELD_CODEC to 66 from 64 to avoid overlap with FIELD_CUSTOM as mentioned in bug 169. * tif_close.c: added logic to free dynamically created anonymous field definitions to correct a small memory leak. http://bugzilla.remotesensing.org/show_bug.cgi?id=169 2002-08-10 Andrey Kiselev * /tools/{raw2tiff.c, Makefile.in, Makefile.lcc, Makefile.vc}: New tool: raw2tiff --- raw images to TIFF converter. No manual page yet. 2002-07-31 Frank Warmerdam * libtiff/tif_jpeg.c: Fixed problem with setting of nrows in JPEGDecode() as per bugzilla bug (issue 1): http://bugzilla.remotesensing.org/show_bug.cgi?id=129 * libtiff/{tif_jpeg.c,tif_strip.c,tif_print.c}: Hacked tif_jpeg.c to fetch TIFFTAG_YCBCRSUBSAMPLING from the jpeg data stream if it isn't present in the tiff tags. http://bugzilla.remotesensing.org/show_bug.cgi?id=168 * libtiff/tif_read.c, libtiff/tif_write.c: TIFFReadScanline() and TIFFWriteScanline() now set tif_row explicitly in case the codec has fooled with the value. http://bugzilla.remotesensing.org/show_bug.cgi?id=129 2002-06-22 Andrey Kiselev * /tools/tiff2ps.c: Added workaround for some software that may crash when last strip of image contains fewer number of scanlines than specified by the `/Height' variable. See http://bugzilla.remotesensing.org/show_bug.cgi?id=164 for explanation. 2002-06-21 Andrey Kiselev * tools/tiff2ps, man/tiff2ps.1: New functionality for tiff2ps utility: splitting long images in several pages. See http://bugzilla.remotesensing.org/show_bug.cgi?id=142 for explanation. Patch granted by John Williams . 2002-06-11 Frank Warmerdam * libtiff/contrib/win95: renamed to contrib/win_dib. Added new Tiffile.cpp example of converting TIFF files into a DIB on Win32. This one is described in: http://bugzilla.remotesensing.org/show_bug.cgi?id=143 * libtiff/tif_ojpeg.c: Major upgrade from Scott. See details at: http://bugzilla.remotesensing.org/show_bug.cgi?id=156 2002-05-10 Andrey Kiselev * tools/tiff2ps: New commandline switches to override resolution units obtained from the input file. Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=131 2002-04-26 Andrey Kiselev * libtiff/libtiff.def: Added missed declaration. 2002-04-22 Andrey Kiselev * tools/fax2tiff.c: Updated to reflect latest changes in libtiff. Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=125 2002-04-20 Andrey Kiselev * libtiff/tif_open.c: Pointers to custom procedures in TIFFClientOpen() are checked to be not NULL-pointers. 2002-04-18 Andrey Kiselev * libtiff/libtiff.def: Added missed declarations. * libtiff/tif_pixarlog.c: Updated for using tif_tagmethods structure. 2002-04-16 Andrey Kiselev * libtiff/tif_lzw.c: Additional checks for data integrity introduced. Should finally close http://bugzilla.remotesensing.org/show_bug.cgi?id=100 2002-04-10 Andrey Kiselev * tools/tiff2ps: Division by zero fixed. Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=88 2002-04-09 Andrey Kiselev * libtiff/: tif_dirwrite.c, tif_write.c, tiffio.h: TIFFCheckpointDirectory() routine added. Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=124 * man/: TIFFWriteDirectory.3t, Makefile.in: Added description for the new function. 2002-04-08 Andrey Kiselev * libtiff/: tif_codec.c, tif_compress.c, tiffiop.h: Introduced additional members tif->tif_decodestatus and tif->tif_encodestatus for correct handling of unconfigured codecs (we should not try to read data or to define data size without correct codecs). * libtiff/tif_getimage.c: The way of codecs checking in TIFFRGBAImageOK changed. Now it has used tif->tif_decodestatus and tif->tif_encodestatus. Should fix http://bugzilla.remotesensing.org/show_bug.cgi?id=119 (in case of __cvs_8.tif test image). * libtiff/: tif_dirinfo.c, tif_dirread.c: Somebody makes a bug in tif_dirread.c when TIFFCreateAnonFieldInfo was introduced. Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=119 in case of _cvs_00000-00.tif, _cvs_00000-01.tif and _cvs_00000-02.tif. 2002-04-04 Andrey Kiselev * libtiff/: tif_lzw.c: Assertions in LZWDecode and LZWDecodeCompat replaced by warnings. Now libtiff should read corrupted LZW-compressed files by skipping bad strips. Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=100 2002-04-03 Frank Warmerdam * libtiff/tif_dirwrite.c: Removed some dead code. * libtiff/*: Cleanup some warnings. * libtiff/tif_dir.c: Fixed bug with count returned by TIFFGetField() for variable length FIELD_CUSTOM values. Was int * but should be u_short *. 2002-04-01 Andrey Kiselev * tools/: tifcp.c: Added support for 'Orientation' tag in tiffcp utility (at cpStripToTile routine). 2002-03-27 Frank Warmerdam * tif_dirread.c: avoid div-by-zero if rowbytes is zero in chop func. http://bugzilla.remotesensing.org/show_bug.cgi?id=111 * tif_print.c: Fixed so that ASCII FIELD_CUSTOM values with passcount set FALSE can be printed (such as TIFFTAG_SOFTWARE). * libtiff/tif_dir.c,tif_dirinfo.c,tif_dir.h,tif_ojpeg.c: modified so that TIFFTAG_SOFTWARE uses FIELD_CUSTOM as an example. 2002-03-26 Dwight Kelly * libtiff/: tiff.h, tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_dirread.c, tif_dirwrite.c: Added get/put code for new tag XMLPACKET as defined in Adobe XMP Technote. Added missing INKSET tag value from TIFF 6.0 spec INKSET_MULTIINK (=2). Added missing tags from Adobe TIFF technotes: CLIPPATH, XCLIPPATHUNITS, YCLIPPATHUNITS, OPIIMAGEID, OPIPROXY and INDEXED. Added PHOTOMETRIC tag value from TIFF technote 4 ICCLAB (=9). 2002-03-26 Andrey Kiselev * libtiff/: tif_getimage.c: TIFFReadRGBAStrip and TIFFReadRGBATile now also uses TIFFRGBAImageOK before reading. This is additional fix for http://bugzilla.remotesensing.org/show_bug.cgi?id=110 2002-03-25 Andrey Kiselev * libtiff/: tif_getimage.c: Additional check for supported codecs added in TIFFRGBAImageOK and TIFFReadRGBAImage now uses TIFFRGBAImageOK before reading. Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=110 2002-03-15 Andrey Kiselev * libtiff/: tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_dirread.c, tif_dirwrite.c: Added routine TIFFDataWidth for detrmining TIFFDataType sizes instead of working with tiffDataWidth array directly. Should prevent out-of-borders bugs in case of unknown or broken data types. EstimateStripByteCounts routine modified, so it won't work when tags with uknown sizes founded. Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=109 2002-03-13 Andrey Kiselev * libtiff/tif_getimage.c: Added support for correct handling `Orientation' tag in gtTileContig. Should be added in other gt* functions as well, but I have not images for testing yet. Partially resolves http://bugzilla.remotesensing.org/show_bug.cgi?id=23 2002-03-10 Andrey Kiselev * libtiff/: tif_dirinfo.c, tif_dirwrite.c: Added possibility to read broken TIFFs with LONG type used for TIFFTAG_COMPRESSION, TIFFTAG_BITSPERSAMPLE, TIFFTAG_PHOTOMETRIC. Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=99 2002-03-08 Andrey Kiselev * libtiff/Makefile.in, tools/Makefile.in: Shared library will not be stripped when installing, utility binaries will do. Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=93 2002-02-28 Frank Warmerdam * man/TIFFGetField: fixed type of TIFFTAG_COPYRIGHT. * man/libtiff.3t: added copyright tag info. 2002-02-11 Frank Warmerdam * libtiff/{tiff.h,tif_fax3.c}: Add support for __arch64__. http://bugzilla.remotesensing.org/show_bug.cgi?id=94 * man/Makefile.in: Patch DESTDIR handling http://bugzilla.remotesensing.org/show_bug.cgi?id=95 * configure: OpenBSD changes for Sparc64 and DSO version. http://bugzilla.remotesensing.org/show_bug.cgi?id=96 2002-02-05 Frank Warmerdam * config.site/configure: added support for OJPEG=yes option to enable OJPEG support from config.site. 2002-01-27 Frank Warmerdam * html/document.html: fixed links for TIFf 6 docs. 2002-01-18 Frank Warmerdam * config.guess, config.sub: Updated from ftp.gnu.org/pub/config. * libtiff/tif_read.c: Fixed TIFFReadEncodedStrip() to fail if the decodestrip function returns anything not greater than zero as per http://bugzilla.remotesensing.org/show_bug.cgi?id=97 * configure: Modify CheckForBigEndian so it can work in a cross compiled situation. 2002-01-16 Frank Warmerdam * tools/tiffdump.c: include TIFFTAG_JPEGTABLES in tag list. * tools/tiffset.c: fix bug in error reporting. * tools/tiffcp.c: fix several warnings that show up with -Wall. 2002-01-04 Frank Warmerdam * libtiff/tif_jpeg.c: fixed computation of segment_width for tiles files to avoid error about it not matching the cinfo.d.image_width values ("JPEGPreDecode: Improper JPEG strip/tile size.") for ITIFF files. Apparently the problem was incorporated since 3.5.5, presumably during the OJPEG/JPEG work recently. 2001-12-15 Frank Warmerdam * configure, libtiff/Makefile.in: Changes for building on MacOS 10.1. http://bugzilla.remotesensing.org/show_bug.cgi?id=94 * libtiff/tif_getimage.c: If DEFAULT_EXTRASAMPLE_AS_ALPHA is 1 (defined in tiffconf.h - 1 by default) then the RGBA interface will assume that a fourth extra sample is ASSOCALPHA if the EXTRASAMPLE value isn't set for it. This changes the behaviour of the library, but makes it work better with RGBA files produced by lots of applications that don't mark the alpha values properly. http://bugzilla.remotesensing.org/show_bug.cgi?id=93 http://bugzilla.remotesensing.org/show_bug.cgi?id=65 2001-12-12 Frank Warmerdam * libtiff/tif_jpeg.c: allow jpeg data stream sampling values to override those from tiff directory. This makes this work with ImageGear generated files. 2001-12-07 Frank Warmerdam * html/Makefile.in: added missing images per bug 92. * port/Makefile.in: fixed clean target per bug 92. 2001-11-28 Frank Warmerdam * Reissue 3.5.7 release. * libtiff/mkversion.c: Fix output of TIFF_VERSION to be YYYYMMDD so that it is increasing over time. * Makefile.in: Ensure that tiffvers.h is regenerated in the make release target. * Makefile.in: added libtiff/tiffvers.h to the release file list. 2001-11-23 Frank Warmerdam * added html/v3.5.7.html, updated html/index.html. * Makefile.in: added contrib/addtiffo/tif_ovrcache.{c,h}. 2001-11-15 Frank Warmerdam * configure: fixed test for -lm. 2001-11-02 Frank Warmerdam * Added PHOTOMETRIC_ITULAB as per bug 90. http://bugzilla.remotesensing.org/show_bug.cgi?id=90 2001-10-10 Frank Warmerdam * libtiff/tiff.h: I have created COMPRESSION_CCITT_T4, COMPRESSION_CCITT_T6, TIFFTAG_T4OPTIONS and TIFFTAG_T6OPTIONS aliases in keeping with TIFF 6.0 standard in tiff.h http://bugzilla.remotesensing.org/show_bug.cgi?id=83 2001-09-26 Frank Warmerdam * libtiff/tif_dirwrite.c: added TIFFRewriteDirectory() function. Updated TIFFWriteDirectory man page to include TIFFRewriteDirectory. 2001-09-24 Frank Warmerdam * libtiff/tif_lzw.c: Avoid MS VC++ 5.0 optimization bug. http://bugzilla.remotesensing.org/show_bug.cgi?id=78 * libtiff/tif_lzw.c: added dummy LZWSetupEncode() to report an error about LZW not being available. * libtiff/tif_dir.c: propagate failure to initialize compression back from TIFFSetField() as an error status, so applications can detect failure. * libtiff/tif_dir.c: removed the auto replacement of COMPRESSION_LZW with COMPRESSION_NONE in _TIFFVSetField(). * Removed Makefile, tools/Makefile, port/install.sh, man/Makefile from CVS as they are all supposed to be auto-generated by configure. 2001-09-22 Frank Warmerdam * libtiff/tif_ojpeg.c: new update from Scott. 2001-09-09 Frank Warmerdam * libtif/tif_fax3.c: Removed #ifdef PURIFY logic, and modified to always use the "safe" version, even if there is a very slight cost in performance. http://bugzilla.remotesensing.org/show_bug.cgi?id=54 * libtiff/Makefile.in: Fixed @DSOSUB_VERSION to be @DSOSUF_VERSION@ in two places. * libtiff/tif_getimage.c: Fixed problem with reading strips or tiles that don't start on a tile boundary. Fix contributed by Josep Vallverdu (from HP), and further described in bug 47. http://bugzilla.remotesensing.org/show_bug.cgi?id=47 * tools/tiff2ps.c: added OJPEG YCbCr to RGB support. * libtiff/tif_ojpeg.c: Applied substantial patch from Scott. 2001-09-06 Frank Warmerdam * libtiff/tif_packbits.c: fixed memory overrun error. http://bugzilla.remotesensing.org/show_bug.cgi?id=77 2001-08-31 Frank Warmerdam * libtiff/tif_getimage.c: relax handling of contig case where there are extra samples that are supposed to be ignored. This should now work for 8bit greyscale or palletted images. http://bugzilla.remotesensing.org/show_bug.cgi?id=75 2001-08-28 Frank Warmerdam * libtiff/tif_getimage.c: Don't complain for CMYK (separated) images with more than four samples per pixel. See: http://bugzilla.remotesensing.org/show_bug.cgi?id=73 2001-08-10 Frank Warmerdam * libtiff/tif_getimage.c: Use memmove() instead of TIFFmemcpy() in TIFFReadRGBATile() to avoid issues in cases of overlapping buffers. See Bug 69 in Bugzilla. http://bugzilla.remotesensing.org/show_bug.cgi?id=69 * tools/tiff2rgba.c: fixed getopt() call so that -b works again. 2001-08-09 Frank Warmerdam * libtiff/tiff.h, libtiff/tif_fax3.c: added check for __LP64__ when checking for 64 bit architectures as per bugzilla bug 67. 2001-07-27 Frank Warmerdam * man/Makefile.in: add TIFFClientOpen link as per debian submitted bug 66. 2001-07-20 Frank Warmerdam * libtiff/tif_jpeg.c: Define HAVE_BOOLEAN on windows if RPCNDR.H has been included. 2001-07-19 Frank Warmerdam * libtiff/tif_open.c: Seek back to zero after failed read, before writing header. 2001-07-18 Frank Warmerdam * libtiff/tif_ojpeg.c: updates from Scott. Handles colors much better. Now depends on having patched libjpeg as per patch in contrib/ojpeg/*. 2001-07-17 Frank Warmerdam * */Makefile.in: added DESTDIR support. http://bugzilla.remotesensing.org/show_bug.cgi?id=60 2001-07-16 Frank Warmerdam * configure, libtiff/Makefile.in: applied OpenBSD patches as per: http://bugzilla.remotesensing.org/show_bug.cgi?id=61 2001-06-28 Frank Warmerdam * libtiff/tif_getimage.c: Fixed so that failure is properly reported by gtTileContig, gtStripContig, gtTileSeparate and gtStripSeparate. See http://bugzilla.remotesensing.org/show_bug.cgi?id=51 * tiffcmp.c: Fixed multi samples per pixel support for ContigCompare. Updated bug section of tiffcmp.1 to note tiled file issues. See http://bugzilla.remotesensing.org/show_bug.cgi?id=53 2001-06-22 Frank Warmerdam * configure: Changes for DSO generation on AIX provided by John Marquart . * configure, libtiff/Makeifle.in: Modified to build DSOs properly on Darwin thanks to Robert Krajewski (rpk@alum.mit.edu) and Keisuke Fujii (fujiik@jlcuxf.kek.jp). 2001-06-13 Frank Warmerdam * tools/tiff2rgba.c: added -n flag to avoid emitting alpha component. * man/tiff2rgba.1: new 2001-05-22 Frank Warmerdam * Added tiffset and tif_ojpeg to the dist lists in Makefile.in. 2001-05-13 Frank Warmerdam * libtiff/tools/thumbnail.c: changed default output compression to packbits from LZW since LZW isn't generally available. 2001-05-12 Frank Warmerdam * libtiff/tif_ojpeg.c: New. libtiff/tif_jpeg.c, tiffconf.h, tif_getimage.c: changes related to OJPEG support. Scott Marovich supplied OJPEG support. 2001-05-11 Frank Warmerdam * tiff.h: removed, it duplicates libtiff/tiff.h. 2001-05-08 Frank Warmerdam * libtiff/tif_dirinfo.c: moved pixar and copyright flags to ensure everything is in order. * libtiff/libtiff.def: added TIFFCreateDirectory and TIFFDefaultStripSize as per: http://bugzilla.remotesensing.org/show_bug.cgi?id=46 2001-05-02 Frank Warmerdam * libtiff/tif_dirinfo.c: Modified the TIFF_BYTE definition for TIFFTAG_PHOTOSHOP to use a writecount of TIFF_VARIABLE2 (-3) to force use of uint32 counts instead of short counts. * libtiff/tif_dirwrite.c: Added support for TIFF_VARIABLE2 in the case of writing TIFF_BYTE/TIFF_SBYTE fields. http://bugzilla.remotesensing.org/show_bug.cgi?id=43 2001-05-01 Frank Warmerdam * libtiff/tif_dirinfo.c: removed duplicate TIFFTAG_PHOTOSHOP as per bug report http://bugzilla.remotesensing.org/show_bug.cgi?id=44 2001-04-05 Frank Warmerdam * tiffio.h: removed C++ style comment. * configure: fixed up SCRIPT_SH/SHELL handling. * Makefile.in: Fixed SCRIPT_SH/SHELL handling. * config.guess: documented more variables as per bug 40. 2001-04-03 Frank Warmerdam * configure, *Makefile.in: Various changes to improve configuration for HP/UX specifically, and also in general. They include: - Try to handle /usr/bin/sh instead of /bin/sh where necessary. - Upgrade to HP/UX 10.x+ compiler, linker and dso options. - Fixed mmap() test to avoid MMAP_FIXED ... it isn't available on HP - Use -${MAKEFLAGS} in sub makes from makefiles. http://bugzilla.remotesensing.org/show_bug.cgi?id=40 2001-04-02 Frank Warmerdam * libtiff/tiff.h: Applied hac to try and resolve the problem with the inttypes.h include file on AIX. See http://bugzilla.remotesensing.org/show_bug.cgi?id=39 * VERSION: update to 3.5.7 beta in preparation for release. * configure/config.site: modified to check if -lm is needed for MACHDEPLIBS if not supplied by config.site. Needed for Darwin. * config.guess: updated wholesale to an FSF version apparently from 1998 (as opposed to 1994). This is mainly inspired by providing for MacOS X support. 2001-03-29 Frank Warmerdam * configure, Makefile.in, etc: added support for OPTIMIZER being set from config.site. 2001-03-28 Frank Warmerdam * fax2ps.c: Helge (libtiff at oldach.net) submitted fix: Here's a fix for fax2ps that corrects behaviour for non-Letter paper sizes. It fixes two problems: Without scaling (-S) the fax is now centered on the page size specified with -H and/or -W. Before, fax2ps was using an obscure and practially useless algorithm to allocate the image relative to Letter sized paper which sometime sled to useless whitespace on the paper, while at the same time cutting of the faxes printable area at the opposite border. Second, scaling now preserves aspect ratio, which makes unusual faxes (in particular short ones) print properly. See http://bugzilla.remotesensing.org/show_bug.cgi?id=35 * tiff2ps.c/tiff2ps.1: Substantial changes to tiff2ps by Bruce A. Mallett. See check message for detailed information on all the changes, including a faster encoder, fixes for level 2 PostScript, and support for the imagemask operator. 2001-03-27 Frank Warmerdam * libtiff/tiffio.h: Changed "#if LOGLUV_PUBLIC" to "#ifdef LOGLUV_PUBLIC" so it will work with VisualAge on AIX. http://bugzilla.remotesensing.org/show_bug.cgi?id=39 2001-03-16 Frank Warmerdam * tif_dirinfo.c: moved definition of copyright tag in field list. Apparently they have to be in sorted order by tag id. 2001-03-13 Frank Warmerdam * tif_getimage.c: Added support for 16bit minisblack/miniswhite images in RGBA interface. 2001-03-02 Frank Warmerdam * Added TIFFTAG_COPYRIGHT support. 2001-02-19 Frank Warmerdam * Brent Roman contributed updated tiffcp utility (and tiffcp.1) with support for extracting subimages with the ,n syntax, and also adding the -b bias removal flag. 2001-02-16 Frank Warmerdam * libtiff/libtiff.def: Brent Roman submitted new version adding serveral missing entry points. * libtiff/tif_dirinfo.c: don't declare tiffFieldInfo static on VMS. Some sort of weird VMS thing. http://bugzilla.remotesensing.org/show_bug.cgi?id=31 * tif_luv.c/tiff.h/tiffio.h: New version of TIFF LogLuv (SGILOG) modules contributed by Greg Ward (greg@shutterfly.com). He writes: 1) I improved the gamut-mapping function in tif_luv.c for imaginary colors, because some images were being super-saturated on the input side and this resulted in some strange color shifts in the output. 2) I added a psuedotag in tiff.h to control random dithering during LogLuv encoding. This is turned off by default for 32-bit LogLuv and on for 24-bit LogLuv output. Dithering improves the average color accuracy over the image. 3) I added a #define for LOG_LUV_PUBLIC, which is enabled by default in tiffio.h, to expose internal routines for converting between LogLuv and XYZ coordinates. This is helpful for writing more efficient, specialized conversion routines, especially for reading LogLuv files. Changes applied with minor edits. 2001-01-23 Frank Warmerdam * tif_fax3.c: keep rw_mode flag internal to fax3 state to remember whether we are encoding or decoding. This is to ensure graceful recovery if TIFFClientOpen() discovers an attempt to open a compressed file for "r+" access, and subsequently close it, as it resets the tif_mode flag to O_RDONLY in this case to avoid writes, confusing the compressor's concept of whether it is in encode or decode mode. 2001-01-08 Mike Welles * Makefile.in: Now cleaning up after itself after creating the .tar.gz and .zip 2001-01-07 Frank Warmerdam * html/libtiff.html: Fixed arguments in example for TIFFRGBAImageGet() as per bug report by Patrick Connor. 2000-12-28 Frank Warmerdam * Added RELEASE-DATE file to release file list. * Fixed libtiff/makefile.vc to make tiffvers.h not version.h. 2000-12-22 Mike Welles * added link to CVS mirror from index.html * updated html/internals.html to note that LZW compression is not supported by default. 2000-12-22 Frank Warmerdam * updated html/libtiff.html to not point at Niles' old JPL web site for the man pages, point at www.libtiff.org. 2000-12-21 Frank Warmerdam * libtiff/tif_apple.c: Applied "Carbon" support patches supplied by Leonard Rosenthol . May interfere with correct building on older systems. If so, please let me know. 2000-12-19 Mike Welles * Took out LZW Encoding from tif_lzw.c * Created HOWTO-RELEASE * Created html/v3.5.6.html * updated index.html 2000-12-01 Frank Warmerdam * Added patches for EOFB support in tif_fax3.c and tif_fax3.h. Patches supplied by Frank Cringle Example file at: ftp://ftp.remotesensing.org/pub/libtiff/eofb_396.tif 2000-11-24 Frank Warmerdam * libtiff/Makefile.in: Added an installPrivateHdrs and install-private target so that the private headers required by libgeotiff can be installed with the others. They are not installed by default. * libtiff/Makefile.in: Added @MACHLIBDEPS@ to LINUXdso and GNULDdso targets so libtiff.so will be built with an explicit dependency on libm.so. * libtiff/Makefile.in: Use softlinks to link libtiff.so.3 to libtiff.so.3.5.5. * libtiff/Makefile.in & configure: Remove all references to the ALPHA file, or ALPHA version logic. Added stuff about DIST_POINT in place of DIST_TYPE and the alpha release number stuff. 2000-11-22 Frank Warmerdam * I have applied a patch from Steffen Moeller to the configure script so that it now accepts the --prefix, and --exec-prefix directives. 2000-11-13 Frank Warmerdam * I have made a variety of modifications in an effort to ensure the TIFFLIB_VERSION macro is automatically generated from the RELEASE-DATE file which seems to be updated regularly. o mkversion.c now reads RELEASE-DATE and emits TIFFLIB_VERSION in version include file. o renamed version.h to tiffvers.h because we now have to install it with the public libtiff include files. o include tiffvers.h in tiffio.h. o updated tif_version.c to use tiffvers.h. o Updated Makefile.in accordingly. * As per http://bugzilla.remotesensing.org/show_bug.cgi?id=25 I have updated the win32 detection rules in tiffcomp.h. 2000-10-20 Frank Warmerdam * tif_getimage.c: Fixed RGBA translation for YCbCr images for which the strip/tile width and height aren't multiples of the sampling size. See http://bugzilla.remotesensing.org/show_bug.cgi?id=20 Some patches from Rick LaMont of Dot C Software. * Modified tif_packbits.c encoder to avoid compressing more data than provided if rowsize doesn't factor into provided data (such as occurs for YCbCr). 2000-10-19 Frank Warmerdam * tools/rgb2ycbcr.c: fixed output strip size to account for vertical roundup if rows_per_strip not a multiple of vertical sample size. 2000-10-16 Frank Warmerdam * tif_dir.c: Clear TIFF_ISTILED flag in TIFFDefaultDirectory as per http://bugzilla.remotesensing.org/show_bug.cgi?id=18 from vandrove@vc.cvut.cz. * Modified tif_packbits.c decoding to avoid overrunning the output buffer, and to issue a warning if data needs to be discarded. See http://bugzilla.remotesensing.org/show_bug.cgi?id=18 2000-10-12 Frank Warmerdam * Modified tiff2bw to ensure portions add to 100%, and that white is properly recovered. See bug http://bugzilla.remotesensing.org/show_bug.cgi?id=15 Patch c/o Stanislav Brabec 2000-09-30 Frank Warmerdam * Modified TIFFClientOpen() to emit an error on an attempt to open a comperessed file for update (O_RDWR/r+) access. This is because the compressor/decompressor code gets very confused when the mode is O_RDWR, assuming this means writing only. See bug http://bugzilla.remotesensing.org/show_bug.cgi?id=13 2000-09-27 Frank Warmerdam * Added GNULDdso target an`d switched linux and freebsd to use it. 2000-09-26 Frank Warmerdam * Applied patch for 0x0000 sequences in tif_fax3.h's definition of EXPAND1D() as per bug 11 (from Roman). 2000-09-25 Frank Warmerdam * Fixed tiffcomp.h to avoid win32 stuff if unix #defined, to improve cygwin compatibility. * Applied patch from Roman Shpount to tif_fax3.c. This seems to be a proper fix to the buffer sizing problem. See http://bugzilla.remotesensing.org/show_bug.cgi?id=11 * Fixed tif_getimage.c to fix overrun bug with YCbCr images without downsampling. http://bugzilla.remotesensing.org/show_bug.cgi?id=10 Thanks to Nick Lamb for reporting the bug and proving the patch. 2000-09-18 Frank Warmerdam * Fixed tif_jpeg.c so avoid destroying the decompressor before we are done access data thanks to bug report from: Michael Eckstein . * Reverted tif_flush change. 2000-09-14 Frank Warmerdam * tif_flush.c: Changed so that TIFFFlushData() doesn't return an error when TIFF_BEENWRITING is not set. This ensures that the directory contents can still be flushed by TIFFFlush(). 2000-08-14 Frank Warmerdam * tif_open.c: Don't set MMAP for O_RDWR files. * tif_open.c: Set STRIPCHOP_DEFAULT for O_RDWR as well as O_RDONLY so that files opened for update can be strip chopped too. * tif_read.c: fixed up bug with files missing rowsperstrip and the strips per separation fix done a few weeks ago. 2000-07-17 Frank Warmerdam * Tentatively added support for SAMPLEFORMAT_COMPLEXIEEEFP, and SAMPLEFORMAT_COMPLEXINT. 2000-07-13 Mike Welles * index.html, bugs.html: added bugzilla info. 2000-07-12 Frank Warmerdam * tif_read.c: fix subtle bug with determining the number of rows for strips that are the last strip in a separation but not the last strip of all in TIFFReadEncodedStrip(). * Applied 16/32 bit fix to tif_fax3.c. Fix supplied by Peter Skarpetis 2000-06-15 Frank Warmerdam * Modified tiffio.h logic with regard to including windows.h. It won't include it when building with __CYGWIN__. 2000-05-11 Frank Warmerdam * README: update to mention www.libtiff.org, don't list Sam's old email address. * configure: Fixed DSO test for Linux as per patch from Jan Van Buggenhout . 2000-04-21 Frank Warmerdam * libtiff/tif_dirread.c: Don't use estimate strip byte count for one tile/strip images with an offset, and byte count of zero. These could be "unpopulated" images. 2000-04-18 Frank Warmerdam * contrib/addtiffo: Added "averaging" resampling option. * tools/tiffsplit.c: Copy TIFFTAG_SAMPLEFORMAT. Tue Apr 18 16:18:08 2000 Frank Warmerdam * tools/Makefile.in: Modified to install properly on SGI. 2000-04-12 Mike Welles * configure: Fixed stupid mistake in libc6 test on Linux 2000-04-04 Mike Welles * tif_win32.c: Applied patch to fix overreads and ovverwrites caught by BoundsChecker. From Arvan Pritchard (untested). * tif_getimage.c: Applied patch to silence VC6 warnings. From Arvan Pritchard * tif_lzw.c: Applied patch to silence VC6 warnings. From Arvan Pritchard 2000-03-28 Frank Warmerdam * Added contrib/stream (stream io) code submitted by Avi Bleiweiss. 2000-03-28 Frank Warmerdam *** 3.5.5 release *** * fax2ps: Fixed mixup of width and height in bounding box statement as per submission by Nalin Dahyabhai . 2000-03-27 Mike Welles * fax2ps: Modified printruns to take uint32 instead of uint16. Patch courtesy of Bernt Herd 2000-03-20 Mike Welles * configure: added test for libc6 for linux targets. Bug reported by Stanislav Brabec * Added 3.5 docs to html/Makefile.in. Thanks to Stanislav Brabec * configure: fixed bugs in sed scripts (applied sed script s:/@:s;@:;s:/s;;:;: to configure). fix submitted to Stanislav Brabec * tools/iptcutil was not in files list, and wasn't being added to tar archive. Updated Makefile.in. 2000-03-17 Frank Warmerdam * tif_fax3.c: Fixed serious bug introduced during the uint16->uint32 conversion for the run arrays. 2000-03-03 Frank Warmerdam * Set td_sampleformat default to SAMPLEFORMAT_UINT instead of SAMPLEFORMAT_VOID in TIFFDefaultDirectory() in tif_dir.c. 2000-03-02 Frank Warmerdam * Added "GetDefaulted" support for TIFFTAG_SAMPLEFORMAT in tif_aux.c. * Patched tif_fax3.c so that dsp->runs is allocated a bit bigger to avoid overruns encountered with frle_bug.tif. Tue Feb 15 22:01:05 2000 Frank Warmerdam * Fixed tools/tiffcmp so that stopondiff testing works. Patch care of Joseph Orost . 2000-01-28 * Modified tif_unix.c to support 2-4GB seeks if USE_64BIT_API is set to 1, and added default (off) setting in tiffconf.h. This should eventually be set by the configure script somehow. The original work on all these 2-4GB changes was done by Peter Smith (psmith@creo.com). * Modified tif_win32.c to support 2-4GB seeks. * tentatively changed toff_t to be unsigned instead of signed to facilitate support for 2-4GB files. * Updated a variety of files to use toff_t. Fixed some mixups between toff_t and tsize_t. Fri Jan 28 10:13:49 2000 Frank Warmerdam * Largely reimplemented contrib/addtiffo to avoid temp files, updating the TIFF file in place. Fixed a few other bugs to. * Set tif_rawdatasize to zero when freeing raw data buffer in TIFFWriteDirectory(). * Enabled "REWRITE_HACK" in tif_write.c by default. * Fix bug in tif_write.c when switching between reading one directory and writing to another. * Made TIFFWriteCheck() public, and added TIFFCreateDirectory() Wed Jan 5 12:37:48 2000 Frank Warmerdam * Added TIFFmemory(3t) functions to libtiff.def. Tue Jan 4 13:39:00 2000 Frank Warmerdam * Added libtiff/libtiff.def to TIFFILES distribution list. Mon Dec 27 12:13:39 EST 1999 Mike Welles * Created lzw compression kit, as a new module (libtiff-lzw-compression-kit). * Altered descriptions in tools to reflect "by default" lzw not supported * Updated index.html to note lzw compression kit. Tue Dec 21 14:01:51 1999 Frank Warmerdam * Added fax3sm_winnt.c to distribution list in Makefile.in. Tue Dec 21 11:04:45 EST 1999 Mike Welles *** 3.5.4 release *** * Aadded Pixar tag support. Contributed by Phil Beffery * Made one more change to tif_dir.c for removal of LZW compression. Also added notice when LZW compression invoked. * Changed default compression in tools to TIFF_PACKBITS, and changed usage descriptions in tools to reflect removal of LZW compression Mon Dec 20 18:39:02 EST 1999 Mike Welles * Fixed bug that caused LZW (non) compression to segfault. Added warning about LZW compression removed being removed, and why. * Added nostrip to install in tools/Makefile.in so that debugging symbols are kept. Tue Dec 7 12:04:47 EST 1999 Mike Welles * Added patch from Ivo Penzar , supporting Adobe ZIP deflate. Untested. Sat Dec 4 15:47:11 1999 Frank Warmerdam * Made Packbits the default compression in tools/tiff2rgba.c instead of LZW. Tue Nov 30 14:41:43 1999 Frank Warmerdam *** 3.5.3. release *** * Added tif_luv to contrib/djgpp/Makefile.lib. Tue Nov 30 14:15:32 EST 1999 Mike Welles * Added zip creation to relase makefile target * Added html for TIFFWriteTile.3t man page. Tue Nov 30 09:20:16 1999 Frank Warmerdam * Added some changes to tif_write.c to support rewriting existing fixed sized tiles and strips. Code mods disabled by default, only enabled if REWRITE_HACK is defined for now. Mon Nov 29 11:43:42 1999 Frank Warmerdam * Added TIFFWriteTile.3t man page. Sun Nov 28 20:36:18 1999 Frank Warmerdam * Added notes on use of makefile.vc in build.html, and fixed email subscription address. 199-11-28 Mike Welles * Fixed apocalypse-inducing y2k bug in contrib/ras/ras2tiff.c * Did some casts cleaning up to reduce compiler warnings in tif_fax3.c, from Bruce Carmeron -- modifications of changes made by Frank (sun cc still complained on cast). * Added tiffconf.h to install target per request from Bill Radcliffe : "We need a way for ImageMagick to know features have been compiled into the TIFF library in order to handle things properly". Sat Nov 27 16:49:21 1999 Frank Warmerdam * fixed various VC++ warnings as suggested by Gilles Vollant . Wed Nov 24 12:08:16 1999 Frank Warmerdam * Modified TIFFquery.3t man pages info on TIFFIsByteSwapped() to not imply applications are responsible for image data swapping. 1999-11-22 Mike Welles * HTML-ized the man pages, added to html/man * Removed LZW Compression to comply with Unisys patent extortion. 1999-09-29 Mike Welles * Corrected one remaining 16 -> 32 bit value in tif_fax3.c, From Ivo Penzar 1999-09-26 Mike Welles *** 3.5.2 release *** * Corrected alpha versioning. * Removed distinction between alpha and release targets in Makefile.in. * added release.stamp target, which tags cvs tree, and updates "RELEASE-DATE" * added releasediff target, which diffs tree with source as of date in "RELEASE-DATE" * Ticked up version to 3.5.2 (alpha 01 -- but I think we'll moving away from alpha/non-alpha distinctions). * updated html to reflect release 1999-09-23 * Set O_BINARY for tif_unix.c open() ... used on cygwin for instance. * Added CYGWIN case in configure. Fri Sep 17 00:13:51 CEST 1999 Mike Welles * Applied Francois Dagand's patch to handle fax decompression bug. (sizes >= 65536 were failing) Tue Sep 14 21:31:43 1999 Frank Warmerdam * Applied "a" mode fix to tif_win32.c/TIFFOpen() as suggested by Christopher Lawton Wed Sep 8 08:19:18 1999 Frank Warmerdam * Added IRIX/gcc, and OSF/1 4.x support on behalf of Albert Chin-A-Young * Added TIFFReassignTagToIgnore() API on behalf of Bruce Cameron . Man page still pending. Wed Aug 25 11:39:07 1999 Frank Warmerdam * Added test target in Makefile, test_pics.sh script and pics/*.rpt files to provide for a rudimentary testsuite. * Added contrib/tags back from old distribution ... fixed up a bit. 1999-08-16 * Added simple makefile.vc makefiles for building with MS VC++ on Windows NT/98/95 in console mode. Stuff in contrib/win* make give better solutions for some users. Mon Aug 16 21:52:11 1999 Frank Warmerdam * Added addtiffo (add overviews to a TIFF file) in contrib. Didn't put it in tools since part of it is in C++. 1999-08-16 Michael L. Welles * Updated html/index.html with anon CVS instructions. Mon Aug 16 13:18:41 1999 Frank Warmerdam * pre-remove so link before softlink in LINUXdso action in libtiff/Makefile.in to avoid failure on LINUXdso builds other than the first. * Fixed problem with cvtcmap() in tif_getimage.c modifying the colormaps owned by the TIFF handle itself when trying to fixup wrong (eight bit) colormaps. Corrected by maintaining a private copy of the colormap. * Added TIFFReadRGBATile()/TIFFReadRGBAStrip() support in tif_getimage.c. * CVS Repository placed at remotesensing.org. ChangeLog added. tiff-4.0.3/autogen.sh0000755000212300117540000000017011245532177011375 00000000000000#!/bin/sh set -x libtoolize --force --copy aclocal -I ./m4 autoheader automake --foreign --add-missing --copy autoconf tiff-4.0.3/nmake.opt0000644000212300117540000001436510444122722011215 00000000000000# $Id: nmake.opt,v 1.18 2006/06/07 16:33:45 dron Exp $ # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Compile time parameters for MS Visual C++ compiler. # You may edit this file to specify building options. # ###### Edit the following lines to choose a feature set you need. ####### # # # Select WINMODE_CONSOLE to build a library which reports errors to stderr, or # WINMODE_WINDOWED to build such that errors are reported via MessageBox(). # WINMODE_CONSOLE = 1 #WINMODE_WINDOWED = 1 # # Comment out the following lines to disable internal codecs. # # Support for CCITT Group 3 & 4 algorithms CCITT_SUPPORT = 1 # Support for Macintosh PackBits algorithm PACKBITS_SUPPORT = 1 # Support for LZW algorithm LZW_SUPPORT = 1 # Support for ThunderScan 4-bit RLE algorithm THUNDER_SUPPORT = 1 # Support for NeXT 2-bit RLE algorithm NEXT_SUPPORT = 1 # Support for LogLuv high dynamic range encoding LOGLUV_SUPPORT = 1 # # Uncomment and edit following lines to enable JPEG support. # #JPEG_SUPPORT = 1 #JPEGDIR = d:/projects/jpeg-6b #JPEG_INCLUDE = -I$(JPEGDIR) #JPEG_LIB = $(JPEGDIR)/Release/jpeg.lib # # Uncomment and edit following lines to enable ZIP support # (required for Deflate compression and Pixar log-format) # #ZIP_SUPPORT = 1 #ZLIBDIR = d:/projects/zlib-1.2.1 #ZLIB_INCLUDE = -I$(ZLIBDIR) #ZLIB_LIB = $(ZLIBDIR)/zlib.lib # # Uncomment and edit following lines to enable ISO JBIG support # #JBIG_SUPPORT = 1 #JBIGDIR = d:/projects/jbigkit #JBIG_INCLUDE = -I$(JBIGDIR)/libjbig #JBIG_LIB = $(JBIGDIR)/libjbig/jbig.lib # # Uncomment following line to enable Pixar log-format algorithm # (Zlib required). # #PIXARLOG_SUPPORT = 1 # # Comment out the following lines to disable strip chopping # (whether or not to convert single-strip uncompressed images to mutiple # strips of specified size to reduce memory usage). Default strip size # is 8192 bytes, it can be configured via the STRIP_SIZE_DEFAULT parameter # STRIPCHOP_SUPPORT = 1 STRIP_SIZE_DEFAULT = 8192 # # Comment out the following lines to disable treating the fourth sample with # no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA # files but don't mark the alpha properly. # EXTRASAMPLE_AS_ALPHA_SUPPORT = 1 # # Comment out the following lines to disable picking up YCbCr subsampling # info from the JPEG data stream to support files lacking the tag. # See Bug 168 in Bugzilla, and JPEGFixupTestSubsampling() for details. # CHECK_JPEG_YCBCR_SUBSAMPLING = 1 # ####################### Compiler related options. ####################### # # # Pick debug or optimized build flags. We default to an optimized build # with no debugging information. # NOTE: /EHsc option required if you want to build the C++ stream API # OPTFLAGS = /Ox /MD /EHsc /W3 /D_CRT_SECURE_NO_DEPRECATE #OPTFLAGS = /Zi # # Uncomment following line to enable using Windows Common RunTime Library # instead of Windows specific system calls. See notes on top of tif_unix.c # module for details. # USE_WIN_CRT_LIB = 1 # Compiler specific options. You may probably want to adjust compilation # parameters in CFLAGS variable. Refer to your compiler documentation # for the option reference. # MAKE = nmake /nologo CC = cl /nologo CXX = cl /nologo AR = lib /nologo LD = link /nologo CFLAGS = $(OPTFLAGS) $(INCL) $(EXTRAFLAGS) CXXFLAGS = $(OPTFLAGS) $(INCL) $(EXTRAFLAGS) EXTRAFLAGS = LIBS = # Name of the output shared library DLLNAME = libtiff.dll # ########### There is nothing to edit below this line normally. ########### # # Set the native cpu bit order EXTRAFLAGS = -DFILLODER_LSB2MSB $(EXTRAFLAGS) !IFDEF WINMODE_WINDOWED EXTRAFLAGS = -DTIF_PLATFORM_WINDOWED $(EXTRAFLAGS) LIBS = user32.lib $(LIBS) !ELSE EXTRAFLAGS = -DTIF_PLATFORM_CONSOLE $(EXTRAFLAGS) !ENDIF # Codec stuff !IFDEF CCITT_SUPPORT EXTRAFLAGS = -DCCITT_SUPPORT $(EXTRAFLAGS) !ENDIF !IFDEF PACKBITS_SUPPORT EXTRAFLAGS = -DPACKBITS_SUPPORT $(EXTRAFLAGS) !ENDIF !IFDEF LZW_SUPPORT EXTRAFLAGS = -DLZW_SUPPORT $(EXTRAFLAGS) !ENDIF !IFDEF THUNDER_SUPPORT EXTRAFLAGS = -DTHUNDER_SUPPORT $(EXTRAFLAGS) !ENDIF !IFDEF NEXT_SUPPORT EXTRAFLAGS = -DNEXT_SUPPORT $(EXTRAFLAGS) !ENDIF !IFDEF LOGLUV_SUPPORT EXTRAFLAGS = -DLOGLUV_SUPPORT $(EXTRAFLAGS) !ENDIF !IFDEF JPEG_SUPPORT LIBS = $(LIBS) $(JPEG_LIB) EXTRAFLAGS = -DJPEG_SUPPORT -DOJPEG_SUPPORT $(EXTRAFLAGS) !ENDIF !IFDEF ZIP_SUPPORT LIBS = $(LIBS) $(ZLIB_LIB) EXTRAFLAGS = -DZIP_SUPPORT $(EXTRAFLAGS) !IFDEF PIXARLOG_SUPPORT EXTRAFLAGS = -DPIXARLOG_SUPPORT $(EXTRAFLAGS) !ENDIF !ENDIF !IFDEF JBIG_SUPPORT LIBS = $(LIBS) $(JBIG_LIB) EXTRAFLAGS = -DJBIG_SUPPORT $(EXTRAFLAGS) !ENDIF !IFDEF STRIPCHOP_SUPPORT EXTRAFLAGS = -DSTRIPCHOP_DEFAULT=TIFF_STRIPCHOP -DSTRIP_SIZE_DEFAULT=$(STRIP_SIZE_DEFAULT) $(EXTRAFLAGS) !ENDIF !IFDEF EXTRASAMPLE_AS_ALPHA_SUPPORT EXTRAFLAGS = -DDEFAULT_EXTRASAMPLE_AS_ALPHA $(EXTRAFLAGS) !ENDIF !IFDEF CHECK_JPEG_YCBCR_SUBSAMPLING EXTRAFLAGS = -DCHECK_JPEG_YCBCR_SUBSAMPLING $(EXTRAFLAGS) !ENDIF !IFDEF USE_WIN_CRT_LIB EXTRAFLAGS = -DAVOID_WIN32_FILEIO $(EXTRAFLAGS) !ELSE EXTRAFLAGS = -DUSE_WIN32_FILEIO $(EXTRAFLAGS) !ENDIF tiff-4.0.3/README0000644000212300117540000000450011720016727010251 00000000000000$Header: /cvs/maptools/cvsroot/libtiff/README,v 1.7 2012-02-18 21:53:27 bfriesen Exp $ TIFF Software Distribution -------------------------- This file is just a placeholder; all the documentation is now in HTML in the html directory. To view the documentation point your favorite WWW viewer at html/index.html; e.g. firefox html/index.html If you don't have an HTML viewer then you can read the HTML source or fetch a PostScript version of this documentation from the directory ftp://ftp.remotesensing.org/pub/libtiff/ If you can't hack either of these options then basically what you want to do is: % ./configure % make % su # make install More information, email contacts, and mailing list information can be found online at http://www.remotesensing.org/libtiff/. Use and Copyright ----------------- Silicon Graphics has seen fit to allow us to give this work away. It is free. There is no support or guarantee of any sort as to its operations, correctness, or whatever. If you do anything useful with all or parts of it you need to honor the copyright notices. I would also be interested in knowing about it and, hopefully, be acknowledged. The legal way of saying that is: Copyright (c) 1988-1997 Sam Leffler Copyright (c) 1991-1997 Silicon Graphics, Inc. Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that (i) the above copyright notices and this permission notice appear in all copies of the software and related documentation, and (ii) the names of Sam Leffler and Silicon Graphics may not be used in any advertising or publicity relating to the software without the specific, prior written permission of Sam Leffler and Silicon Graphics. THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. tiff-4.0.3/TODO0000644000212300117540000000064007551210013010051 00000000000000# $Header: /cvs/libtiff/TODO,v 1.6 2002/10/10 05:28:43 warmerda Exp $ o gif2tiff segaulting on selected images o tiffcmp read data by strip/tile instead of scanline o YCbCr sampling support o extracate colorspace conversion support o look at isolating all codecs from TIFF library o JPEG colormode order dependency problem o Write documentation on how do extend tags, and how the custom field stuff all works. tiff-4.0.3/COPYRIGHT0000644000212300117540000000217206747424642010703 00000000000000Copyright (c) 1988-1997 Sam Leffler Copyright (c) 1991-1997 Silicon Graphics, Inc. Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that (i) the above copyright notices and this permission notice appear in all copies of the software and related documentation, and (ii) the names of Sam Leffler and Silicon Graphics may not be used in any advertising or publicity relating to the software without the specific, prior written permission of Sam Leffler and Silicon Graphics. THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. tiff-4.0.3/libtiff-4.pc.in0000644000212300117540000000037311474267240012112 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libtiff Description: Tag Image File Format (TIFF) library. Version: @VERSION@ Libs: -L${libdir} -ltiff Libs.private: @tiff_libs_private@ Cflags: -I${includedir} tiff-4.0.3/libtiff/0000755000212300117540000000000012027361330011063 500000000000000tiff-4.0.3/libtiff/tif_jpeg.c0000644000212300117540000020413011775631344012754 00000000000000/* $Id: tif_jpeg.c,v 1.111 2012-07-06 18:48:04 bfriesen Exp $ */ /* * Copyright (c) 1994-1997 Sam Leffler * Copyright (c) 1994-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN #include "tiffiop.h" #ifdef JPEG_SUPPORT /* * TIFF Library * * JPEG Compression support per TIFF Technical Note #2 * (*not* per the original TIFF 6.0 spec). * * This file is simply an interface to the libjpeg library written by * the Independent JPEG Group. You need release 5 or later of the IJG * code, which you can find on the Internet at ftp.uu.net:/graphics/jpeg/. * * Contributed by Tom Lane . */ #include int TIFFFillStrip(TIFF* tif, uint32 strip); int TIFFFillTile(TIFF* tif, uint32 tile); int TIFFReInitJPEG_12( TIFF *tif, int scheme, int is_encode ); /* We undefine FAR to avoid conflict with JPEG definition */ #ifdef FAR #undef FAR #endif /* Libjpeg's jmorecfg.h defines INT16 and INT32, but only if XMD_H is not defined. Unfortunately, the MinGW and Borland compilers include a typedef for INT32, which causes a conflict. MSVC does not include a conficting typedef given the headers which are included. */ #if defined(__BORLANDC__) || defined(__MINGW32__) # define XMD_H 1 #endif /* The windows RPCNDR.H file defines boolean, but defines it with the unsigned char size. You should compile JPEG library using appropriate definitions in jconfig.h header, but many users compile library in wrong way. That causes errors of the following type: "JPEGLib: JPEG parameter struct mismatch: library thinks size is 432, caller expects 464" For such users we wil fix the problem here. See install.doc file from the JPEG library distribution for details. */ /* Define "boolean" as unsigned char, not int, per Windows custom. */ #if defined(__WIN32__) && !defined(__MINGW32__) # ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ typedef unsigned char boolean; # endif # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ #endif #include "jpeglib.h" #include "jerror.h" /* * Do we want to do special processing suitable for when JSAMPLE is a * 16bit value? */ #if defined(JPEG_LIB_MK1) # define JPEG_LIB_MK1_OR_12BIT 1 #elif BITS_IN_JSAMPLE == 12 # define JPEG_LIB_MK1_OR_12BIT 1 #endif /* * We are using width_in_blocks which is supposed to be private to * libjpeg. Unfortunately, the libjpeg delivered with Cygwin has * renamed this member to width_in_data_units. Since the header has * also renamed a define, use that unique define name in order to * detect the problem header and adjust to suit. */ #if defined(D_MAX_DATA_UNITS_IN_MCU) #define width_in_blocks width_in_data_units #endif /* * On some machines it may be worthwhile to use _setjmp or sigsetjmp * in place of plain setjmp. These macros will make it easier. */ #define SETJMP(jbuf) setjmp(jbuf) #define LONGJMP(jbuf,code) longjmp(jbuf,code) #define JMP_BUF jmp_buf typedef struct jpeg_destination_mgr jpeg_destination_mgr; typedef struct jpeg_source_mgr jpeg_source_mgr; typedef struct jpeg_error_mgr jpeg_error_mgr; /* * State block for each open TIFF file using * libjpeg to do JPEG compression/decompression. * * libjpeg's visible state is either a jpeg_compress_struct * or jpeg_decompress_struct depending on which way we * are going. comm can be used to refer to the fields * which are common to both. * * NB: cinfo is required to be the first member of JPEGState, * so we can safely cast JPEGState* -> jpeg_xxx_struct* * and vice versa! */ typedef struct { union { struct jpeg_compress_struct c; struct jpeg_decompress_struct d; struct jpeg_common_struct comm; } cinfo; /* NB: must be first */ int cinfo_initialized; jpeg_error_mgr err; /* libjpeg error manager */ JMP_BUF exit_jmpbuf; /* for catching libjpeg failures */ /* * The following two members could be a union, but * they're small enough that it's not worth the effort. */ jpeg_destination_mgr dest; /* data dest for compression */ jpeg_source_mgr src; /* data source for decompression */ /* private state */ TIFF* tif; /* back link needed by some code */ uint16 photometric; /* copy of PhotometricInterpretation */ uint16 h_sampling; /* luminance sampling factors */ uint16 v_sampling; tmsize_t bytesperline; /* decompressed bytes per scanline */ /* pointers to intermediate buffers when processing downsampled data */ JSAMPARRAY ds_buffer[MAX_COMPONENTS]; int scancount; /* number of "scanlines" accumulated */ int samplesperclump; TIFFVGetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ TIFFPrintMethod printdir; /* super-class method */ TIFFStripMethod defsparent; /* super-class method */ TIFFTileMethod deftparent; /* super-class method */ /* pseudo-tag fields */ void* jpegtables; /* JPEGTables tag value, or NULL */ uint32 jpegtables_length; /* number of bytes in same */ int jpegquality; /* Compression quality level */ int jpegcolormode; /* Auto RGB<=>YCbCr convert? */ int jpegtablesmode; /* What to put in JPEGTables */ int ycbcrsampling_fetched; } JPEGState; #define JState(tif) ((JPEGState*)(tif)->tif_data) static int JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s); static int JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s); static int JPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s); static int JPEGEncodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s); static int JPEGInitializeLibJPEG(TIFF * tif, int decode ); static int DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s); #define FIELD_JPEGTABLES (FIELD_CODEC+0) static const TIFFField jpegFields[] = { { TIFFTAG_JPEGTABLES, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_C32_UINT8, FIELD_JPEGTABLES, FALSE, TRUE, "JPEGTables", NULL }, { TIFFTAG_JPEGQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL }, { TIFFTAG_JPEGCOLORMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL }, { TIFFTAG_JPEGTABLESMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL } }; /* * libjpeg interface layer. * * We use setjmp/longjmp to return control to libtiff * when a fatal error is encountered within the JPEG * library. We also direct libjpeg error and warning * messages through the appropriate libtiff handlers. */ /* * Error handling routines (these replace corresponding * IJG routines from jerror.c). These are used for both * compression and decompression. */ static void TIFFjpeg_error_exit(j_common_ptr cinfo) { JPEGState *sp = (JPEGState *) cinfo; /* NB: cinfo assumed first */ char buffer[JMSG_LENGTH_MAX]; (*cinfo->err->format_message) (cinfo, buffer); TIFFErrorExt(sp->tif->tif_clientdata, "JPEGLib", "%s", buffer); /* display the error message */ jpeg_abort(cinfo); /* clean up libjpeg state */ LONGJMP(sp->exit_jmpbuf, 1); /* return to libtiff caller */ } /* * This routine is invoked only for warning messages, * since error_exit does its own thing and trace_level * is never set > 0. */ static void TIFFjpeg_output_message(j_common_ptr cinfo) { char buffer[JMSG_LENGTH_MAX]; (*cinfo->err->format_message) (cinfo, buffer); TIFFWarningExt(((JPEGState *) cinfo)->tif->tif_clientdata, "JPEGLib", "%s", buffer); } /* * Interface routines. This layer of routines exists * primarily to limit side-effects from using setjmp. * Also, normal/error returns are converted into return * values per libtiff practice. */ #define CALLJPEG(sp, fail, op) (SETJMP((sp)->exit_jmpbuf) ? (fail) : (op)) #define CALLVJPEG(sp, op) CALLJPEG(sp, 0, ((op),1)) static int TIFFjpeg_create_compress(JPEGState* sp) { /* initialize JPEG error handling */ sp->cinfo.c.err = jpeg_std_error(&sp->err); sp->err.error_exit = TIFFjpeg_error_exit; sp->err.output_message = TIFFjpeg_output_message; return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c)); } static int TIFFjpeg_create_decompress(JPEGState* sp) { /* initialize JPEG error handling */ sp->cinfo.d.err = jpeg_std_error(&sp->err); sp->err.error_exit = TIFFjpeg_error_exit; sp->err.output_message = TIFFjpeg_output_message; return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d)); } static int TIFFjpeg_set_defaults(JPEGState* sp) { return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c)); } static int TIFFjpeg_set_colorspace(JPEGState* sp, J_COLOR_SPACE colorspace) { return CALLVJPEG(sp, jpeg_set_colorspace(&sp->cinfo.c, colorspace)); } static int TIFFjpeg_set_quality(JPEGState* sp, int quality, boolean force_baseline) { return CALLVJPEG(sp, jpeg_set_quality(&sp->cinfo.c, quality, force_baseline)); } static int TIFFjpeg_suppress_tables(JPEGState* sp, boolean suppress) { return CALLVJPEG(sp, jpeg_suppress_tables(&sp->cinfo.c, suppress)); } static int TIFFjpeg_start_compress(JPEGState* sp, boolean write_all_tables) { return CALLVJPEG(sp, jpeg_start_compress(&sp->cinfo.c, write_all_tables)); } static int TIFFjpeg_write_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int num_lines) { return CALLJPEG(sp, -1, (int) jpeg_write_scanlines(&sp->cinfo.c, scanlines, (JDIMENSION) num_lines)); } static int TIFFjpeg_write_raw_data(JPEGState* sp, JSAMPIMAGE data, int num_lines) { return CALLJPEG(sp, -1, (int) jpeg_write_raw_data(&sp->cinfo.c, data, (JDIMENSION) num_lines)); } static int TIFFjpeg_finish_compress(JPEGState* sp) { return CALLVJPEG(sp, jpeg_finish_compress(&sp->cinfo.c)); } static int TIFFjpeg_write_tables(JPEGState* sp) { return CALLVJPEG(sp, jpeg_write_tables(&sp->cinfo.c)); } static int TIFFjpeg_read_header(JPEGState* sp, boolean require_image) { return CALLJPEG(sp, -1, jpeg_read_header(&sp->cinfo.d, require_image)); } static int TIFFjpeg_start_decompress(JPEGState* sp) { return CALLVJPEG(sp, jpeg_start_decompress(&sp->cinfo.d)); } static int TIFFjpeg_read_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int max_lines) { return CALLJPEG(sp, -1, (int) jpeg_read_scanlines(&sp->cinfo.d, scanlines, (JDIMENSION) max_lines)); } static int TIFFjpeg_read_raw_data(JPEGState* sp, JSAMPIMAGE data, int max_lines) { return CALLJPEG(sp, -1, (int) jpeg_read_raw_data(&sp->cinfo.d, data, (JDIMENSION) max_lines)); } static int TIFFjpeg_finish_decompress(JPEGState* sp) { return CALLJPEG(sp, -1, (int) jpeg_finish_decompress(&sp->cinfo.d)); } static int TIFFjpeg_abort(JPEGState* sp) { return CALLVJPEG(sp, jpeg_abort(&sp->cinfo.comm)); } static int TIFFjpeg_destroy(JPEGState* sp) { return CALLVJPEG(sp, jpeg_destroy(&sp->cinfo.comm)); } static JSAMPARRAY TIFFjpeg_alloc_sarray(JPEGState* sp, int pool_id, JDIMENSION samplesperrow, JDIMENSION numrows) { return CALLJPEG(sp, (JSAMPARRAY) NULL, (*sp->cinfo.comm.mem->alloc_sarray) (&sp->cinfo.comm, pool_id, samplesperrow, numrows)); } /* * JPEG library destination data manager. * These routines direct compressed data from libjpeg into the * libtiff output buffer. */ static void std_init_destination(j_compress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; TIFF* tif = sp->tif; sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata; sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize; } static boolean std_empty_output_buffer(j_compress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; TIFF* tif = sp->tif; /* the entire buffer has been filled */ tif->tif_rawcc = tif->tif_rawdatasize; #ifdef IPPJ_HUFF /* * The Intel IPP performance library does not necessarily fill up * the whole output buffer on each pass, so only dump out the parts * that have been filled. * http://trac.osgeo.org/gdal/wiki/JpegIPP */ if ( sp->dest.free_in_buffer >= 0 ) { tif->tif_rawcc = tif->tif_rawdatasize - sp->dest.free_in_buffer; } #endif TIFFFlushData1(tif); sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata; sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize; return (TRUE); } static void std_term_destination(j_compress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; TIFF* tif = sp->tif; tif->tif_rawcp = (uint8*) sp->dest.next_output_byte; tif->tif_rawcc = tif->tif_rawdatasize - (tmsize_t) sp->dest.free_in_buffer; /* NB: libtiff does the final buffer flush */ } static void TIFFjpeg_data_dest(JPEGState* sp, TIFF* tif) { (void) tif; sp->cinfo.c.dest = &sp->dest; sp->dest.init_destination = std_init_destination; sp->dest.empty_output_buffer = std_empty_output_buffer; sp->dest.term_destination = std_term_destination; } /* * Alternate destination manager for outputting to JPEGTables field. */ static void tables_init_destination(j_compress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; /* while building, jpegtables_length is allocated buffer size */ sp->dest.next_output_byte = (JOCTET*) sp->jpegtables; sp->dest.free_in_buffer = (size_t) sp->jpegtables_length; } static boolean tables_empty_output_buffer(j_compress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; void* newbuf; /* the entire buffer has been filled; enlarge it by 1000 bytes */ newbuf = _TIFFrealloc((void*) sp->jpegtables, (tmsize_t) (sp->jpegtables_length + 1000)); if (newbuf == NULL) ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 100); sp->dest.next_output_byte = (JOCTET*) newbuf + sp->jpegtables_length; sp->dest.free_in_buffer = (size_t) 1000; sp->jpegtables = newbuf; sp->jpegtables_length += 1000; return (TRUE); } static void tables_term_destination(j_compress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; /* set tables length to number of bytes actually emitted */ sp->jpegtables_length -= (uint32) sp->dest.free_in_buffer; } static int TIFFjpeg_tables_dest(JPEGState* sp, TIFF* tif) { (void) tif; /* * Allocate a working buffer for building tables. * Initial size is 1000 bytes, which is usually adequate. */ if (sp->jpegtables) _TIFFfree(sp->jpegtables); sp->jpegtables_length = 1000; sp->jpegtables = (void*) _TIFFmalloc((tmsize_t) sp->jpegtables_length); if (sp->jpegtables == NULL) { sp->jpegtables_length = 0; TIFFErrorExt(sp->tif->tif_clientdata, "TIFFjpeg_tables_dest", "No space for JPEGTables"); return (0); } sp->cinfo.c.dest = &sp->dest; sp->dest.init_destination = tables_init_destination; sp->dest.empty_output_buffer = tables_empty_output_buffer; sp->dest.term_destination = tables_term_destination; return (1); } /* * JPEG library source data manager. * These routines supply compressed data to libjpeg. */ static void std_init_source(j_decompress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; TIFF* tif = sp->tif; sp->src.next_input_byte = (const JOCTET*) tif->tif_rawdata; sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc; } static boolean std_fill_input_buffer(j_decompress_ptr cinfo) { JPEGState* sp = (JPEGState* ) cinfo; static const JOCTET dummy_EOI[2] = { 0xFF, JPEG_EOI }; #ifdef IPPJ_HUFF /* * The Intel IPP performance library does not necessarily read the whole * input buffer in one pass, so it is possible to get here with data * yet to read. * * We just return without doing anything, until the entire buffer has * been read. * http://trac.osgeo.org/gdal/wiki/JpegIPP */ if( sp->src.bytes_in_buffer > 0 ) { return (TRUE); } #endif /* * Normally the whole strip/tile is read and so we don't need to do * a fill. In the case of CHUNKY_STRIP_READ_SUPPORT we might not have * all the data, but the rawdata is refreshed between scanlines and * we push this into the io machinery in JPEGDecode(). * http://trac.osgeo.org/gdal/ticket/3894 */ WARNMS(cinfo, JWRN_JPEG_EOF); /* insert a fake EOI marker */ sp->src.next_input_byte = dummy_EOI; sp->src.bytes_in_buffer = 2; return (TRUE); } static void std_skip_input_data(j_decompress_ptr cinfo, long num_bytes) { JPEGState* sp = (JPEGState*) cinfo; if (num_bytes > 0) { if ((size_t)num_bytes > sp->src.bytes_in_buffer) { /* oops, buffer overrun */ (void) std_fill_input_buffer(cinfo); } else { sp->src.next_input_byte += (size_t) num_bytes; sp->src.bytes_in_buffer -= (size_t) num_bytes; } } } static void std_term_source(j_decompress_ptr cinfo) { /* No work necessary here */ (void) cinfo; } static void TIFFjpeg_data_src(JPEGState* sp, TIFF* tif) { (void) tif; sp->cinfo.d.src = &sp->src; sp->src.init_source = std_init_source; sp->src.fill_input_buffer = std_fill_input_buffer; sp->src.skip_input_data = std_skip_input_data; sp->src.resync_to_restart = jpeg_resync_to_restart; sp->src.term_source = std_term_source; sp->src.bytes_in_buffer = 0; /* for safety */ sp->src.next_input_byte = NULL; } /* * Alternate source manager for reading from JPEGTables. * We can share all the code except for the init routine. */ static void tables_init_source(j_decompress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; sp->src.next_input_byte = (const JOCTET*) sp->jpegtables; sp->src.bytes_in_buffer = (size_t) sp->jpegtables_length; } static void TIFFjpeg_tables_src(JPEGState* sp, TIFF* tif) { TIFFjpeg_data_src(sp, tif); sp->src.init_source = tables_init_source; } /* * Allocate downsampled-data buffers needed for downsampled I/O. * We use values computed in jpeg_start_compress or jpeg_start_decompress. * We use libjpeg's allocator so that buffers will be released automatically * when done with strip/tile. * This is also a handy place to compute samplesperclump, bytesperline. */ static int alloc_downsampled_buffers(TIFF* tif, jpeg_component_info* comp_info, int num_components) { JPEGState* sp = JState(tif); int ci; jpeg_component_info* compptr; JSAMPARRAY buf; int samples_per_clump = 0; for (ci = 0, compptr = comp_info; ci < num_components; ci++, compptr++) { samples_per_clump += compptr->h_samp_factor * compptr->v_samp_factor; buf = TIFFjpeg_alloc_sarray(sp, JPOOL_IMAGE, compptr->width_in_blocks * DCTSIZE, (JDIMENSION) (compptr->v_samp_factor*DCTSIZE)); if (buf == NULL) return (0); sp->ds_buffer[ci] = buf; } sp->samplesperclump = samples_per_clump; return (1); } /* * JPEG Decoding. */ #ifdef CHECK_JPEG_YCBCR_SUBSAMPLING #define JPEG_MARKER_SOF0 0xC0 #define JPEG_MARKER_SOF1 0xC1 #define JPEG_MARKER_SOF3 0xC3 #define JPEG_MARKER_DHT 0xC4 #define JPEG_MARKER_SOI 0xD8 #define JPEG_MARKER_SOS 0xDA #define JPEG_MARKER_DQT 0xDB #define JPEG_MARKER_DRI 0xDD #define JPEG_MARKER_APP0 0xE0 #define JPEG_MARKER_COM 0xFE struct JPEGFixupTagsSubsamplingData { TIFF* tif; void* buffer; uint32 buffersize; uint8* buffercurrentbyte; uint32 bufferbytesleft; uint64 fileoffset; uint64 filebytesleft; uint8 filepositioned; }; static void JPEGFixupTagsSubsampling(TIFF* tif); static int JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData* data); static int JPEGFixupTagsSubsamplingReadByte(struct JPEGFixupTagsSubsamplingData* data, uint8* result); static int JPEGFixupTagsSubsamplingReadWord(struct JPEGFixupTagsSubsamplingData* data, uint16* result); static void JPEGFixupTagsSubsamplingSkip(struct JPEGFixupTagsSubsamplingData* data, uint16 skiplength); #endif static int JPEGFixupTags(TIFF* tif) { #ifdef CHECK_JPEG_YCBCR_SUBSAMPLING if ((tif->tif_dir.td_photometric==PHOTOMETRIC_YCBCR)&& (tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)&& (tif->tif_dir.td_samplesperpixel==3)) JPEGFixupTagsSubsampling(tif); #endif return(1); } #ifdef CHECK_JPEG_YCBCR_SUBSAMPLING static void JPEGFixupTagsSubsampling(TIFF* tif) { /* * Some JPEG-in-TIFF produces do not emit the YCBCRSUBSAMPLING values in * the TIFF tags, but still use non-default (2,2) values within the jpeg * data stream itself. In order for TIFF applications to work properly * - for instance to get the strip buffer size right - it is imperative * that the subsampling be available before we start reading the image * data normally. This function will attempt to analyze the first strip in * order to get the sampling values from the jpeg data stream. * * Note that JPEGPreDeocode() will produce a fairly loud warning when the * discovered sampling does not match the default sampling (2,2) or whatever * was actually in the tiff tags. * * See the bug in bugzilla for details: * * http://bugzilla.remotesensing.org/show_bug.cgi?id=168 * * Frank Warmerdam, July 2002 * Joris Van Damme, May 2007 */ static const char module[] = "JPEGFixupTagsSubsampling"; struct JPEGFixupTagsSubsamplingData m; _TIFFFillStriles( tif ); if( tif->tif_dir.td_stripbytecount == NULL || tif->tif_dir.td_stripbytecount[0] == 0 ) { /* Do not even try to check if the first strip/tile does not yet exist, as occurs when GDAL has created a new NULL file for instance. */ return; } m.tif=tif; m.buffersize=2048; m.buffer=_TIFFmalloc(m.buffersize); if (m.buffer==NULL) { TIFFWarningExt(tif->tif_clientdata,module, "Unable to allocate memory for auto-correcting of subsampling values; auto-correcting skipped"); return; } m.buffercurrentbyte=NULL; m.bufferbytesleft=0; m.fileoffset=tif->tif_dir.td_stripoffset[0]; m.filepositioned=0; m.filebytesleft=tif->tif_dir.td_stripbytecount[0]; if (!JPEGFixupTagsSubsamplingSec(&m)) TIFFWarningExt(tif->tif_clientdata,module, "Unable to auto-correct subsampling values, likely corrupt JPEG compressed data in first strip/tile; auto-correcting skipped"); _TIFFfree(m.buffer); } static int JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData* data) { static const char module[] = "JPEGFixupTagsSubsamplingSec"; uint8 m; while (1) { while (1) { if (!JPEGFixupTagsSubsamplingReadByte(data,&m)) return(0); if (m==255) break; } while (1) { if (!JPEGFixupTagsSubsamplingReadByte(data,&m)) return(0); if (m!=255) break; } switch (m) { case JPEG_MARKER_SOI: /* this type of marker has no data and should be skipped */ break; case JPEG_MARKER_COM: case JPEG_MARKER_APP0: case JPEG_MARKER_APP0+1: case JPEG_MARKER_APP0+2: case JPEG_MARKER_APP0+3: case JPEG_MARKER_APP0+4: case JPEG_MARKER_APP0+5: case JPEG_MARKER_APP0+6: case JPEG_MARKER_APP0+7: case JPEG_MARKER_APP0+8: case JPEG_MARKER_APP0+9: case JPEG_MARKER_APP0+10: case JPEG_MARKER_APP0+11: case JPEG_MARKER_APP0+12: case JPEG_MARKER_APP0+13: case JPEG_MARKER_APP0+14: case JPEG_MARKER_APP0+15: case JPEG_MARKER_DQT: case JPEG_MARKER_SOS: case JPEG_MARKER_DHT: case JPEG_MARKER_DRI: /* this type of marker has data, but it has no use to us and should be skipped */ { uint16 n; if (!JPEGFixupTagsSubsamplingReadWord(data,&n)) return(0); if (n<2) return(0); n-=2; if (n>0) JPEGFixupTagsSubsamplingSkip(data,n); } break; case JPEG_MARKER_SOF0: case JPEG_MARKER_SOF1: /* this marker contains the subsampling factors we're scanning for */ { uint16 n; uint16 o; uint8 p; uint8 ph,pv; if (!JPEGFixupTagsSubsamplingReadWord(data,&n)) return(0); if (n!=8+data->tif->tif_dir.td_samplesperpixel*3) return(0); JPEGFixupTagsSubsamplingSkip(data,7); if (!JPEGFixupTagsSubsamplingReadByte(data,&p)) return(0); ph=(p>>4); pv=(p&15); JPEGFixupTagsSubsamplingSkip(data,1); for (o=1; otif->tif_dir.td_samplesperpixel; o++) { JPEGFixupTagsSubsamplingSkip(data,1); if (!JPEGFixupTagsSubsamplingReadByte(data,&p)) return(0); if (p!=0x11) { TIFFWarningExt(data->tif->tif_clientdata,module, "Subsampling values inside JPEG compressed data have no TIFF equivalent, auto-correction of TIFF subsampling values failed"); return(1); } JPEGFixupTagsSubsamplingSkip(data,1); } if (((ph!=1)&&(ph!=2)&&(ph!=4))||((pv!=1)&&(pv!=2)&&(pv!=4))) { TIFFWarningExt(data->tif->tif_clientdata,module, "Subsampling values inside JPEG compressed data have no TIFF equivalent, auto-correction of TIFF subsampling values failed"); return(1); } if ((ph!=data->tif->tif_dir.td_ycbcrsubsampling[0])||(pv!=data->tif->tif_dir.td_ycbcrsubsampling[1])) { TIFFWarningExt(data->tif->tif_clientdata,module, "Auto-corrected former TIFF subsampling values [%d,%d] to match subsampling values inside JPEG compressed data [%d,%d]", (int)data->tif->tif_dir.td_ycbcrsubsampling[0], (int)data->tif->tif_dir.td_ycbcrsubsampling[1], (int)ph,(int)pv); data->tif->tif_dir.td_ycbcrsubsampling[0]=ph; data->tif->tif_dir.td_ycbcrsubsampling[1]=pv; } } return(1); default: return(0); } } } static int JPEGFixupTagsSubsamplingReadByte(struct JPEGFixupTagsSubsamplingData* data, uint8* result) { if (data->bufferbytesleft==0) { uint32 m; if (data->filebytesleft==0) return(0); if (!data->filepositioned) { TIFFSeekFile(data->tif,data->fileoffset,SEEK_SET); data->filepositioned=1; } m=data->buffersize; if ((uint64)m>data->filebytesleft) m=(uint32)data->filebytesleft; assert(m<0x80000000UL); if (TIFFReadFile(data->tif,data->buffer,(tmsize_t)m)!=(tmsize_t)m) return(0); data->buffercurrentbyte=data->buffer; data->bufferbytesleft=m; data->fileoffset+=m; data->filebytesleft-=m; } *result=*data->buffercurrentbyte; data->buffercurrentbyte++; data->bufferbytesleft--; return(1); } static int JPEGFixupTagsSubsamplingReadWord(struct JPEGFixupTagsSubsamplingData* data, uint16* result) { uint8 ma; uint8 mb; if (!JPEGFixupTagsSubsamplingReadByte(data,&ma)) return(0); if (!JPEGFixupTagsSubsamplingReadByte(data,&mb)) return(0); *result=(ma<<8)|mb; return(1); } static void JPEGFixupTagsSubsamplingSkip(struct JPEGFixupTagsSubsamplingData* data, uint16 skiplength) { if ((uint32)skiplength<=data->bufferbytesleft) { data->buffercurrentbyte+=skiplength; data->bufferbytesleft-=skiplength; } else { uint16 m; m=skiplength-data->bufferbytesleft; if (m<=data->filebytesleft) { data->bufferbytesleft=0; data->fileoffset+=m; data->filebytesleft-=m; data->filepositioned=0; } else { data->bufferbytesleft=0; data->filebytesleft=0; } } } #endif static int JPEGSetupDecode(TIFF* tif) { JPEGState* sp = JState(tif); TIFFDirectory *td = &tif->tif_dir; #if defined(JPEG_DUAL_MODE_8_12) && !defined(TIFFInitJPEG) if( tif->tif_dir.td_bitspersample == 12 ) return TIFFReInitJPEG_12( tif, COMPRESSION_JPEG, 0 ); #endif JPEGInitializeLibJPEG( tif, TRUE ); assert(sp != NULL); assert(sp->cinfo.comm.is_decompressor); /* Read JPEGTables if it is present */ if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) { TIFFjpeg_tables_src(sp, tif); if(TIFFjpeg_read_header(sp,FALSE) != JPEG_HEADER_TABLES_ONLY) { TIFFErrorExt(tif->tif_clientdata, "JPEGSetupDecode", "Bogus JPEGTables field"); return (0); } } /* Grab parameters that are same for all strips/tiles */ sp->photometric = td->td_photometric; switch (sp->photometric) { case PHOTOMETRIC_YCBCR: sp->h_sampling = td->td_ycbcrsubsampling[0]; sp->v_sampling = td->td_ycbcrsubsampling[1]; break; default: /* TIFF 6.0 forbids subsampling of all other color spaces */ sp->h_sampling = 1; sp->v_sampling = 1; break; } /* Set up for reading normal data */ TIFFjpeg_data_src(sp, tif); tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */ return (1); } /* * Set up for decoding a strip or tile. */ static int JPEGPreDecode(TIFF* tif, uint16 s) { JPEGState *sp = JState(tif); TIFFDirectory *td = &tif->tif_dir; static const char module[] = "JPEGPreDecode"; uint32 segment_width, segment_height; int downsampled_output; int ci; assert(sp != NULL); if (sp->cinfo.comm.is_decompressor == 0) { tif->tif_setupdecode( tif ); } assert(sp->cinfo.comm.is_decompressor); /* * Reset decoder state from any previous strip/tile, * in case application didn't read the whole strip. */ if (!TIFFjpeg_abort(sp)) return (0); /* * Read the header for this strip/tile. */ if (TIFFjpeg_read_header(sp, TRUE) != JPEG_HEADER_OK) return (0); tif->tif_rawcp = (uint8*) sp->src.next_input_byte; tif->tif_rawcc = sp->src.bytes_in_buffer; /* * Check image parameters and set decompression parameters. */ segment_width = td->td_imagewidth; segment_height = td->td_imagelength - tif->tif_row; if (isTiled(tif)) { segment_width = td->td_tilewidth; segment_height = td->td_tilelength; sp->bytesperline = TIFFTileRowSize(tif); } else { if (segment_height > td->td_rowsperstrip) segment_height = td->td_rowsperstrip; sp->bytesperline = TIFFScanlineSize(tif); } if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) { /* * For PC 2, scale down the expected strip/tile size * to match a downsampled component */ segment_width = TIFFhowmany_32(segment_width, sp->h_sampling); segment_height = TIFFhowmany_32(segment_height, sp->v_sampling); } if (sp->cinfo.d.image_width < segment_width || sp->cinfo.d.image_height < segment_height) { TIFFWarningExt(tif->tif_clientdata, module, "Improper JPEG strip/tile size, " "expected %dx%d, got %dx%d", segment_width, segment_height, sp->cinfo.d.image_width, sp->cinfo.d.image_height); } if (sp->cinfo.d.image_width > segment_width || sp->cinfo.d.image_height > segment_height) { /* * This case could be dangerous, if the strip or tile size has * been reported as less than the amount of data jpeg will * return, some potential security issues arise. Catch this * case and error out. */ TIFFErrorExt(tif->tif_clientdata, module, "JPEG strip/tile size exceeds expected dimensions," " expected %dx%d, got %dx%d", segment_width, segment_height, sp->cinfo.d.image_width, sp->cinfo.d.image_height); return (0); } if (sp->cinfo.d.num_components != (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel : 1)) { TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG component count"); return (0); } #ifdef JPEG_LIB_MK1 if (12 != td->td_bitspersample && 8 != td->td_bitspersample) { TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG data precision"); return (0); } sp->cinfo.d.data_precision = td->td_bitspersample; sp->cinfo.d.bits_in_jsample = td->td_bitspersample; #else if (sp->cinfo.d.data_precision != td->td_bitspersample) { TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG data precision"); return (0); } #endif if (td->td_planarconfig == PLANARCONFIG_CONTIG) { /* Component 0 should have expected sampling factors */ if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling || sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling) { TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors %d,%d\n" "Apparently should be %d,%d.", sp->cinfo.d.comp_info[0].h_samp_factor, sp->cinfo.d.comp_info[0].v_samp_factor, sp->h_sampling, sp->v_sampling); return (0); } /* Rest should have sampling factors 1,1 */ for (ci = 1; ci < sp->cinfo.d.num_components; ci++) { if (sp->cinfo.d.comp_info[ci].h_samp_factor != 1 || sp->cinfo.d.comp_info[ci].v_samp_factor != 1) { TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors"); return (0); } } } else { /* PC 2's single component should have sampling factors 1,1 */ if (sp->cinfo.d.comp_info[0].h_samp_factor != 1 || sp->cinfo.d.comp_info[0].v_samp_factor != 1) { TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors"); return (0); } } downsampled_output = FALSE; if (td->td_planarconfig == PLANARCONFIG_CONTIG && sp->photometric == PHOTOMETRIC_YCBCR && sp->jpegcolormode == JPEGCOLORMODE_RGB) { /* Convert YCbCr to RGB */ sp->cinfo.d.jpeg_color_space = JCS_YCbCr; sp->cinfo.d.out_color_space = JCS_RGB; } else { /* Suppress colorspace handling */ sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN; sp->cinfo.d.out_color_space = JCS_UNKNOWN; if (td->td_planarconfig == PLANARCONFIG_CONTIG && (sp->h_sampling != 1 || sp->v_sampling != 1)) downsampled_output = TRUE; /* XXX what about up-sampling? */ } if (downsampled_output) { /* Need to use raw-data interface to libjpeg */ sp->cinfo.d.raw_data_out = TRUE; #if JPEG_LIB_VERSION >= 70 sp->cinfo.d.do_fancy_upsampling = FALSE; #endif /* JPEG_LIB_VERSION >= 70 */ tif->tif_decoderow = DecodeRowError; tif->tif_decodestrip = JPEGDecodeRaw; tif->tif_decodetile = JPEGDecodeRaw; } else { /* Use normal interface to libjpeg */ sp->cinfo.d.raw_data_out = FALSE; tif->tif_decoderow = JPEGDecode; tif->tif_decodestrip = JPEGDecode; tif->tif_decodetile = JPEGDecode; } /* Start JPEG decompressor */ if (!TIFFjpeg_start_decompress(sp)) return (0); /* Allocate downsampled-data buffers if needed */ if (downsampled_output) { if (!alloc_downsampled_buffers(tif, sp->cinfo.d.comp_info, sp->cinfo.d.num_components)) return (0); sp->scancount = DCTSIZE; /* mark buffer empty */ } return (1); } /* * Decode a chunk of pixels. * "Standard" case: returned data is not downsampled. */ /*ARGSUSED*/ static int JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) { JPEGState *sp = JState(tif); tmsize_t nrows; (void) s; /* ** Update available information, buffer may have been refilled ** between decode requests */ sp->src.next_input_byte = (const JOCTET*) tif->tif_rawcp; sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc; if( sp->bytesperline == 0 ) return 0; nrows = cc / sp->bytesperline; if (cc % sp->bytesperline) TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline not read"); if( nrows > (tmsize_t) sp->cinfo.d.image_height ) nrows = sp->cinfo.d.image_height; /* data is expected to be read in multiples of a scanline */ if (nrows) { JSAMPROW line_work_buf = NULL; /* * For 6B, only use temporary buffer for 12 bit imagery. * For Mk1 always use it. */ #if !defined(JPEG_LIB_MK1) if( sp->cinfo.d.data_precision == 12 ) #endif { line_work_buf = (JSAMPROW) _TIFFmalloc(sizeof(short) * sp->cinfo.d.output_width * sp->cinfo.d.num_components ); } do { if( line_work_buf != NULL ) { /* * In the MK1 case, we aways read into a 16bit buffer, and then * pack down to 12bit or 8bit. In 6B case we only read into 16 * bit buffer for 12bit data, which we need to repack. */ if (TIFFjpeg_read_scanlines(sp, &line_work_buf, 1) != 1) return (0); if( sp->cinfo.d.data_precision == 12 ) { int value_pairs = (sp->cinfo.d.output_width * sp->cinfo.d.num_components) / 2; int iPair; for( iPair = 0; iPair < value_pairs; iPair++ ) { unsigned char *out_ptr = ((unsigned char *) buf) + iPair * 3; JSAMPLE *in_ptr = line_work_buf + iPair * 2; out_ptr[0] = (in_ptr[0] & 0xff0) >> 4; out_ptr[1] = ((in_ptr[0] & 0xf) << 4) | ((in_ptr[1] & 0xf00) >> 8); out_ptr[2] = ((in_ptr[1] & 0xff) >> 0); } } else if( sp->cinfo.d.data_precision == 8 ) { int value_count = (sp->cinfo.d.output_width * sp->cinfo.d.num_components); int iValue; for( iValue = 0; iValue < value_count; iValue++ ) { ((unsigned char *) buf)[iValue] = line_work_buf[iValue] & 0xff; } } } else { /* * In the libjpeg6b 8bit case. We read directly into the * TIFF buffer. */ JSAMPROW bufptr = (JSAMPROW)buf; if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1) return (0); } ++tif->tif_row; buf += sp->bytesperline; cc -= sp->bytesperline; } while (--nrows > 0); if( line_work_buf != NULL ) _TIFFfree( line_work_buf ); } /* Update information on consumed data */ tif->tif_rawcp = (uint8*) sp->src.next_input_byte; tif->tif_rawcc = sp->src.bytes_in_buffer; /* Close down the decompressor if we've finished the strip or tile. */ return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height || TIFFjpeg_finish_decompress(sp); } /*ARGSUSED*/ static int DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) { (void) buf; (void) cc; (void) s; TIFFErrorExt(tif->tif_clientdata, "TIFFReadScanline", "scanline oriented access is not supported for downsampled JPEG compressed images, consider enabling TIFF_JPEGCOLORMODE as JPEGCOLORMODE_RGB." ); return 0; } /* * Decode a chunk of pixels. * Returned data is downsampled per sampling factors. */ /*ARGSUSED*/ static int JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) { JPEGState *sp = JState(tif); tmsize_t nrows; (void) s; /* data is expected to be read in multiples of a scanline */ if ( (nrows = sp->cinfo.d.image_height) ) { /* Cb,Cr both have sampling factors 1, so this is correct */ JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width; int samples_per_clump = sp->samplesperclump; #if defined(JPEG_LIB_MK1_OR_12BIT) unsigned short* tmpbuf = _TIFFmalloc(sizeof(unsigned short) * sp->cinfo.d.output_width * sp->cinfo.d.num_components); if(tmpbuf==NULL) { TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw", "Out of memory"); return 0; } #endif do { jpeg_component_info *compptr; int ci, clumpoffset; if( cc < sp->bytesperline ) { TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw", "application buffer not large enough for all data."); return 0; } /* Reload downsampled-data buffer if needed */ if (sp->scancount >= DCTSIZE) { int n = sp->cinfo.d.max_v_samp_factor * DCTSIZE; if (TIFFjpeg_read_raw_data(sp, sp->ds_buffer, n) != n) return (0); sp->scancount = 0; } /* * Fastest way to unseparate data is to make one pass * over the scanline for each row of each component. */ clumpoffset = 0; /* first sample in clump */ for (ci = 0, compptr = sp->cinfo.d.comp_info; ci < sp->cinfo.d.num_components; ci++, compptr++) { int hsamp = compptr->h_samp_factor; int vsamp = compptr->v_samp_factor; int ypos; for (ypos = 0; ypos < vsamp; ypos++) { JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos]; JDIMENSION nclump; #if defined(JPEG_LIB_MK1_OR_12BIT) JSAMPLE *outptr = (JSAMPLE*)tmpbuf + clumpoffset; #else JSAMPLE *outptr = (JSAMPLE*)buf + clumpoffset; if (cc < (tmsize_t) (clumpoffset + samples_per_clump*(clumps_per_line-1) + hsamp)) { TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw", "application buffer not large enough for all data, possible subsampling issue"); return 0; } #endif if (hsamp == 1) { /* fast path for at least Cb and Cr */ for (nclump = clumps_per_line; nclump-- > 0; ) { outptr[0] = *inptr++; outptr += samples_per_clump; } } else { int xpos; /* general case */ for (nclump = clumps_per_line; nclump-- > 0; ) { for (xpos = 0; xpos < hsamp; xpos++) outptr[xpos] = *inptr++; outptr += samples_per_clump; } } clumpoffset += hsamp; } } #if defined(JPEG_LIB_MK1_OR_12BIT) { if (sp->cinfo.d.data_precision == 8) { int i=0; int len = sp->cinfo.d.output_width * sp->cinfo.d.num_components; for (i=0; icinfo.d.output_width * sp->cinfo.d.num_components) / 2; int iPair; for( iPair = 0; iPair < value_pairs; iPair++ ) { unsigned char *out_ptr = ((unsigned char *) buf) + iPair * 3; JSAMPLE *in_ptr = (JSAMPLE *) (tmpbuf + iPair * 2); out_ptr[0] = (in_ptr[0] & 0xff0) >> 4; out_ptr[1] = ((in_ptr[0] & 0xf) << 4) | ((in_ptr[1] & 0xf00) >> 8); out_ptr[2] = ((in_ptr[1] & 0xff) >> 0); } } } #endif sp->scancount ++; tif->tif_row += sp->v_sampling; buf += sp->bytesperline; cc -= sp->bytesperline; nrows -= sp->v_sampling; } while (nrows > 0); #if defined(JPEG_LIB_MK1_OR_12BIT) _TIFFfree(tmpbuf); #endif } /* Close down the decompressor if done. */ return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height || TIFFjpeg_finish_decompress(sp); } /* * JPEG Encoding. */ static void unsuppress_quant_table (JPEGState* sp, int tblno) { JQUANT_TBL* qtbl; if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL) qtbl->sent_table = FALSE; } static void unsuppress_huff_table (JPEGState* sp, int tblno) { JHUFF_TBL* htbl; if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL) htbl->sent_table = FALSE; if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL) htbl->sent_table = FALSE; } static int prepare_JPEGTables(TIFF* tif) { JPEGState* sp = JState(tif); /* Initialize quant tables for current quality setting */ if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) return (0); /* Mark only the tables we want for output */ /* NB: chrominance tables are currently used only with YCbCr */ if (!TIFFjpeg_suppress_tables(sp, TRUE)) return (0); if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) { unsuppress_quant_table(sp, 0); if (sp->photometric == PHOTOMETRIC_YCBCR) unsuppress_quant_table(sp, 1); } if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) { unsuppress_huff_table(sp, 0); if (sp->photometric == PHOTOMETRIC_YCBCR) unsuppress_huff_table(sp, 1); } /* Direct libjpeg output into jpegtables */ if (!TIFFjpeg_tables_dest(sp, tif)) return (0); /* Emit tables-only datastream */ if (!TIFFjpeg_write_tables(sp)) return (0); return (1); } static int JPEGSetupEncode(TIFF* tif) { JPEGState* sp = JState(tif); TIFFDirectory *td = &tif->tif_dir; static const char module[] = "JPEGSetupEncode"; #if defined(JPEG_DUAL_MODE_8_12) && !defined(TIFFInitJPEG) if( tif->tif_dir.td_bitspersample == 12 ) return TIFFReInitJPEG_12( tif, COMPRESSION_JPEG, 1 ); #endif JPEGInitializeLibJPEG( tif, FALSE ); assert(sp != NULL); assert(!sp->cinfo.comm.is_decompressor); /* * Initialize all JPEG parameters to default values. * Note that jpeg_set_defaults needs legal values for * in_color_space and input_components. */ sp->cinfo.c.in_color_space = JCS_UNKNOWN; sp->cinfo.c.input_components = 1; if (!TIFFjpeg_set_defaults(sp)) return (0); /* Set per-file parameters */ sp->photometric = td->td_photometric; switch (sp->photometric) { case PHOTOMETRIC_YCBCR: sp->h_sampling = td->td_ycbcrsubsampling[0]; sp->v_sampling = td->td_ycbcrsubsampling[1]; /* * A ReferenceBlackWhite field *must* be present since the * default value is inappropriate for YCbCr. Fill in the * proper value if application didn't set it. */ { float *ref; if (!TIFFGetField(tif, TIFFTAG_REFERENCEBLACKWHITE, &ref)) { float refbw[6]; long top = 1L << td->td_bitspersample; refbw[0] = 0; refbw[1] = (float)(top-1L); refbw[2] = (float)(top>>1); refbw[3] = refbw[1]; refbw[4] = refbw[2]; refbw[5] = refbw[1]; TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE, refbw); } } break; case PHOTOMETRIC_PALETTE: /* disallowed by Tech Note */ case PHOTOMETRIC_MASK: TIFFErrorExt(tif->tif_clientdata, module, "PhotometricInterpretation %d not allowed for JPEG", (int) sp->photometric); return (0); default: /* TIFF 6.0 forbids subsampling of all other color spaces */ sp->h_sampling = 1; sp->v_sampling = 1; break; } /* Verify miscellaneous parameters */ /* * This would need work if libtiff ever supports different * depths for different components, or if libjpeg ever supports * run-time selection of depth. Neither is imminent. */ #ifdef JPEG_LIB_MK1 /* BITS_IN_JSAMPLE now permits 8 and 12 --- dgilbert */ if (td->td_bitspersample != 8 && td->td_bitspersample != 12) #else if (td->td_bitspersample != BITS_IN_JSAMPLE ) #endif { TIFFErrorExt(tif->tif_clientdata, module, "BitsPerSample %d not allowed for JPEG", (int) td->td_bitspersample); return (0); } sp->cinfo.c.data_precision = td->td_bitspersample; #ifdef JPEG_LIB_MK1 sp->cinfo.c.bits_in_jsample = td->td_bitspersample; #endif if (isTiled(tif)) { if ((td->td_tilelength % (sp->v_sampling * DCTSIZE)) != 0) { TIFFErrorExt(tif->tif_clientdata, module, "JPEG tile height must be multiple of %d", sp->v_sampling * DCTSIZE); return (0); } if ((td->td_tilewidth % (sp->h_sampling * DCTSIZE)) != 0) { TIFFErrorExt(tif->tif_clientdata, module, "JPEG tile width must be multiple of %d", sp->h_sampling * DCTSIZE); return (0); } } else { if (td->td_rowsperstrip < td->td_imagelength && (td->td_rowsperstrip % (sp->v_sampling * DCTSIZE)) != 0) { TIFFErrorExt(tif->tif_clientdata, module, "RowsPerStrip must be multiple of %d for JPEG", sp->v_sampling * DCTSIZE); return (0); } } /* Create a JPEGTables field if appropriate */ if (sp->jpegtablesmode & (JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF)) { if( sp->jpegtables == NULL || memcmp(sp->jpegtables,"\0\0\0\0\0\0\0\0\0",8) == 0 ) { if (!prepare_JPEGTables(tif)) return (0); /* Mark the field present */ /* Can't use TIFFSetField since BEENWRITING is already set! */ tif->tif_flags |= TIFF_DIRTYDIRECT; TIFFSetFieldBit(tif, FIELD_JPEGTABLES); } } else { /* We do not support application-supplied JPEGTables, */ /* so mark the field not present */ TIFFClrFieldBit(tif, FIELD_JPEGTABLES); } /* Direct libjpeg output to libtiff's output buffer */ TIFFjpeg_data_dest(sp, tif); return (1); } /* * Set encoding state at the start of a strip or tile. */ static int JPEGPreEncode(TIFF* tif, uint16 s) { JPEGState *sp = JState(tif); TIFFDirectory *td = &tif->tif_dir; static const char module[] = "JPEGPreEncode"; uint32 segment_width, segment_height; int downsampled_input; assert(sp != NULL); if (sp->cinfo.comm.is_decompressor == 1) { tif->tif_setupencode( tif ); } assert(!sp->cinfo.comm.is_decompressor); /* * Set encoding parameters for this strip/tile. */ if (isTiled(tif)) { segment_width = td->td_tilewidth; segment_height = td->td_tilelength; sp->bytesperline = TIFFTileRowSize(tif); } else { segment_width = td->td_imagewidth; segment_height = td->td_imagelength - tif->tif_row; if (segment_height > td->td_rowsperstrip) segment_height = td->td_rowsperstrip; sp->bytesperline = TIFFScanlineSize(tif); } if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) { /* for PC 2, scale down the strip/tile size * to match a downsampled component */ segment_width = TIFFhowmany_32(segment_width, sp->h_sampling); segment_height = TIFFhowmany_32(segment_height, sp->v_sampling); } if (segment_width > 65535 || segment_height > 65535) { TIFFErrorExt(tif->tif_clientdata, module, "Strip/tile too large for JPEG"); return (0); } sp->cinfo.c.image_width = segment_width; sp->cinfo.c.image_height = segment_height; downsampled_input = FALSE; if (td->td_planarconfig == PLANARCONFIG_CONTIG) { sp->cinfo.c.input_components = td->td_samplesperpixel; if (sp->photometric == PHOTOMETRIC_YCBCR) { if (sp->jpegcolormode == JPEGCOLORMODE_RGB) { sp->cinfo.c.in_color_space = JCS_RGB; } else { sp->cinfo.c.in_color_space = JCS_YCbCr; if (sp->h_sampling != 1 || sp->v_sampling != 1) downsampled_input = TRUE; } if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr)) return (0); /* * Set Y sampling factors; * we assume jpeg_set_colorspace() set the rest to 1 */ sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling; sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling; } else { if ((td->td_photometric == PHOTOMETRIC_MINISWHITE || td->td_photometric == PHOTOMETRIC_MINISBLACK) && td->td_samplesperpixel == 1) sp->cinfo.c.in_color_space = JCS_GRAYSCALE; else if (td->td_photometric == PHOTOMETRIC_RGB && td->td_samplesperpixel == 3) sp->cinfo.c.in_color_space = JCS_RGB; else if (td->td_photometric == PHOTOMETRIC_SEPARATED && td->td_samplesperpixel == 4) sp->cinfo.c.in_color_space = JCS_CMYK; else sp->cinfo.c.in_color_space = JCS_UNKNOWN; if (!TIFFjpeg_set_colorspace(sp, sp->cinfo.c.in_color_space)) return (0); /* jpeg_set_colorspace set all sampling factors to 1 */ } } else { sp->cinfo.c.input_components = 1; sp->cinfo.c.in_color_space = JCS_UNKNOWN; if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN)) return (0); sp->cinfo.c.comp_info[0].component_id = s; /* jpeg_set_colorspace() set sampling factors to 1 */ if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) { sp->cinfo.c.comp_info[0].quant_tbl_no = 1; sp->cinfo.c.comp_info[0].dc_tbl_no = 1; sp->cinfo.c.comp_info[0].ac_tbl_no = 1; } } /* ensure libjpeg won't write any extraneous markers */ sp->cinfo.c.write_JFIF_header = FALSE; sp->cinfo.c.write_Adobe_marker = FALSE; /* set up table handling correctly */ if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) return (0); if (! (sp->jpegtablesmode & JPEGTABLESMODE_QUANT)) { unsuppress_quant_table(sp, 0); unsuppress_quant_table(sp, 1); } if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) sp->cinfo.c.optimize_coding = FALSE; else sp->cinfo.c.optimize_coding = TRUE; if (downsampled_input) { /* Need to use raw-data interface to libjpeg */ sp->cinfo.c.raw_data_in = TRUE; tif->tif_encoderow = JPEGEncodeRaw; tif->tif_encodestrip = JPEGEncodeRaw; tif->tif_encodetile = JPEGEncodeRaw; } else { /* Use normal interface to libjpeg */ sp->cinfo.c.raw_data_in = FALSE; tif->tif_encoderow = JPEGEncode; tif->tif_encodestrip = JPEGEncode; tif->tif_encodetile = JPEGEncode; } /* Start JPEG compressor */ if (!TIFFjpeg_start_compress(sp, FALSE)) return (0); /* Allocate downsampled-data buffers if needed */ if (downsampled_input) { if (!alloc_downsampled_buffers(tif, sp->cinfo.c.comp_info, sp->cinfo.c.num_components)) return (0); } sp->scancount = 0; return (1); } /* * Encode a chunk of pixels. * "Standard" case: incoming data is not downsampled. */ static int JPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) { JPEGState *sp = JState(tif); tmsize_t nrows; JSAMPROW bufptr[1]; short *line16 = NULL; int line16_count = 0; (void) s; assert(sp != NULL); /* data is expected to be supplied in multiples of a scanline */ nrows = cc / sp->bytesperline; if (cc % sp->bytesperline) TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline discarded"); /* The last strip will be limited to image size */ if( !isTiled(tif) && tif->tif_row+nrows > tif->tif_dir.td_imagelength ) nrows = tif->tif_dir.td_imagelength - tif->tif_row; if( sp->cinfo.c.data_precision == 12 ) { line16_count = (sp->bytesperline * 2) / 3; line16 = (short *) _TIFFmalloc(sizeof(short) * line16_count); // FIXME: undiagnosed malloc failure } while (nrows-- > 0) { if( sp->cinfo.c.data_precision == 12 ) { int value_pairs = line16_count / 2; int iPair; bufptr[0] = (JSAMPROW) line16; for( iPair = 0; iPair < value_pairs; iPair++ ) { unsigned char *in_ptr = ((unsigned char *) buf) + iPair * 3; JSAMPLE *out_ptr = (JSAMPLE *) (line16 + iPair * 2); out_ptr[0] = (in_ptr[0] << 4) | ((in_ptr[1] & 0xf0) >> 4); out_ptr[1] = ((in_ptr[1] & 0x0f) << 8) | in_ptr[2]; } } else { bufptr[0] = (JSAMPROW) buf; } if (TIFFjpeg_write_scanlines(sp, bufptr, 1) != 1) return (0); if (nrows > 0) tif->tif_row++; buf += sp->bytesperline; } if( sp->cinfo.c.data_precision == 12 ) { _TIFFfree( line16 ); } return (1); } /* * Encode a chunk of pixels. * Incoming data is expected to be downsampled per sampling factors. */ static int JPEGEncodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) { JPEGState *sp = JState(tif); JSAMPLE* inptr; JSAMPLE* outptr; tmsize_t nrows; JDIMENSION clumps_per_line, nclump; int clumpoffset, ci, xpos, ypos; jpeg_component_info* compptr; int samples_per_clump = sp->samplesperclump; tmsize_t bytesperclumpline; (void) s; assert(sp != NULL); /* data is expected to be supplied in multiples of a clumpline */ /* a clumpline is equivalent to v_sampling desubsampled scanlines */ /* TODO: the following calculation of bytesperclumpline, should substitute calculation of sp->bytesperline, except that it is per v_sampling lines */ bytesperclumpline = (((sp->cinfo.c.image_width+sp->h_sampling-1)/sp->h_sampling) *(sp->h_sampling*sp->v_sampling+2)*sp->cinfo.c.data_precision+7) /8; nrows = ( cc / bytesperclumpline ) * sp->v_sampling; if (cc % bytesperclumpline) TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline discarded"); /* Cb,Cr both have sampling factors 1, so this is correct */ clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width; while (nrows > 0) { /* * Fastest way to separate the data is to make one pass * over the scanline for each row of each component. */ clumpoffset = 0; /* first sample in clump */ for (ci = 0, compptr = sp->cinfo.c.comp_info; ci < sp->cinfo.c.num_components; ci++, compptr++) { int hsamp = compptr->h_samp_factor; int vsamp = compptr->v_samp_factor; int padding = (int) (compptr->width_in_blocks * DCTSIZE - clumps_per_line * hsamp); for (ypos = 0; ypos < vsamp; ypos++) { inptr = ((JSAMPLE*) buf) + clumpoffset; outptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos]; if (hsamp == 1) { /* fast path for at least Cb and Cr */ for (nclump = clumps_per_line; nclump-- > 0; ) { *outptr++ = inptr[0]; inptr += samples_per_clump; } } else { /* general case */ for (nclump = clumps_per_line; nclump-- > 0; ) { for (xpos = 0; xpos < hsamp; xpos++) *outptr++ = inptr[xpos]; inptr += samples_per_clump; } } /* pad each scanline as needed */ for (xpos = 0; xpos < padding; xpos++) { *outptr = outptr[-1]; outptr++; } clumpoffset += hsamp; } } sp->scancount++; if (sp->scancount >= DCTSIZE) { int n = sp->cinfo.c.max_v_samp_factor * DCTSIZE; if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n) return (0); sp->scancount = 0; } tif->tif_row += sp->v_sampling; buf += bytesperclumpline; nrows -= sp->v_sampling; } return (1); } /* * Finish up at the end of a strip or tile. */ static int JPEGPostEncode(TIFF* tif) { JPEGState *sp = JState(tif); if (sp->scancount > 0) { /* * Need to emit a partial bufferload of downsampled data. * Pad the data vertically. */ int ci, ypos, n; jpeg_component_info* compptr; for (ci = 0, compptr = sp->cinfo.c.comp_info; ci < sp->cinfo.c.num_components; ci++, compptr++) { int vsamp = compptr->v_samp_factor; tmsize_t row_width = compptr->width_in_blocks * DCTSIZE * sizeof(JSAMPLE); for (ypos = sp->scancount * vsamp; ypos < DCTSIZE * vsamp; ypos++) { _TIFFmemcpy((void*)sp->ds_buffer[ci][ypos], (void*)sp->ds_buffer[ci][ypos-1], row_width); } } n = sp->cinfo.c.max_v_samp_factor * DCTSIZE; if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n) return (0); } return (TIFFjpeg_finish_compress(JState(tif))); } static void JPEGCleanup(TIFF* tif) { JPEGState *sp = JState(tif); assert(sp != 0); tif->tif_tagmethods.vgetfield = sp->vgetparent; tif->tif_tagmethods.vsetfield = sp->vsetparent; tif->tif_tagmethods.printdir = sp->printdir; if( sp != NULL ) { if( sp->cinfo_initialized ) TIFFjpeg_destroy(sp); /* release libjpeg resources */ if (sp->jpegtables) /* tag value */ _TIFFfree(sp->jpegtables); } _TIFFfree(tif->tif_data); /* release local state */ tif->tif_data = NULL; _TIFFSetDefaultCompressionState(tif); } static void JPEGResetUpsampled( TIFF* tif ) { JPEGState* sp = JState(tif); TIFFDirectory* td = &tif->tif_dir; /* * Mark whether returned data is up-sampled or not so TIFFStripSize * and TIFFTileSize return values that reflect the true amount of * data. */ tif->tif_flags &= ~TIFF_UPSAMPLED; if (td->td_planarconfig == PLANARCONFIG_CONTIG) { if (td->td_photometric == PHOTOMETRIC_YCBCR && sp->jpegcolormode == JPEGCOLORMODE_RGB) { tif->tif_flags |= TIFF_UPSAMPLED; } else { #ifdef notdef if (td->td_ycbcrsubsampling[0] != 1 || td->td_ycbcrsubsampling[1] != 1) ; /* XXX what about up-sampling? */ #endif } } /* * Must recalculate cached tile size in case sampling state changed. * Should we really be doing this now if image size isn't set? */ if( tif->tif_tilesize > 0 ) tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tmsize_t)(-1); if( tif->tif_scanlinesize > 0 ) tif->tif_scanlinesize = TIFFScanlineSize(tif); } static int JPEGVSetField(TIFF* tif, uint32 tag, va_list ap) { JPEGState* sp = JState(tif); const TIFFField* fip; uint32 v32; assert(sp != NULL); switch (tag) { case TIFFTAG_JPEGTABLES: v32 = (uint32) va_arg(ap, uint32); if (v32 == 0) { /* XXX */ return (0); } _TIFFsetByteArray(&sp->jpegtables, va_arg(ap, void*), (long) v32); sp->jpegtables_length = v32; TIFFSetFieldBit(tif, FIELD_JPEGTABLES); break; case TIFFTAG_JPEGQUALITY: sp->jpegquality = (int) va_arg(ap, int); return (1); /* pseudo tag */ case TIFFTAG_JPEGCOLORMODE: sp->jpegcolormode = (int) va_arg(ap, int); JPEGResetUpsampled( tif ); return (1); /* pseudo tag */ case TIFFTAG_PHOTOMETRIC: { int ret_value = (*sp->vsetparent)(tif, tag, ap); JPEGResetUpsampled( tif ); return ret_value; } case TIFFTAG_JPEGTABLESMODE: sp->jpegtablesmode = (int) va_arg(ap, int); return (1); /* pseudo tag */ case TIFFTAG_YCBCRSUBSAMPLING: /* mark the fact that we have a real ycbcrsubsampling! */ sp->ycbcrsampling_fetched = 1; /* should we be recomputing upsampling info here? */ return (*sp->vsetparent)(tif, tag, ap); default: return (*sp->vsetparent)(tif, tag, ap); } if ((fip = TIFFFieldWithTag(tif, tag))) { TIFFSetFieldBit(tif, fip->field_bit); } else { return (0); } tif->tif_flags |= TIFF_DIRTYDIRECT; return (1); } static int JPEGVGetField(TIFF* tif, uint32 tag, va_list ap) { JPEGState* sp = JState(tif); assert(sp != NULL); switch (tag) { case TIFFTAG_JPEGTABLES: *va_arg(ap, uint32*) = sp->jpegtables_length; *va_arg(ap, void**) = sp->jpegtables; break; case TIFFTAG_JPEGQUALITY: *va_arg(ap, int*) = sp->jpegquality; break; case TIFFTAG_JPEGCOLORMODE: *va_arg(ap, int*) = sp->jpegcolormode; break; case TIFFTAG_JPEGTABLESMODE: *va_arg(ap, int*) = sp->jpegtablesmode; break; default: return (*sp->vgetparent)(tif, tag, ap); } return (1); } static void JPEGPrintDir(TIFF* tif, FILE* fd, long flags) { JPEGState* sp = JState(tif); assert(sp != NULL); (void) flags; if( sp != NULL ) { if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) fprintf(fd, " JPEG Tables: (%lu bytes)\n", (unsigned long) sp->jpegtables_length); if (sp->printdir) (*sp->printdir)(tif, fd, flags); } } static uint32 JPEGDefaultStripSize(TIFF* tif, uint32 s) { JPEGState* sp = JState(tif); TIFFDirectory *td = &tif->tif_dir; s = (*sp->defsparent)(tif, s); if (s < td->td_imagelength) s = TIFFroundup_32(s, td->td_ycbcrsubsampling[1] * DCTSIZE); return (s); } static void JPEGDefaultTileSize(TIFF* tif, uint32* tw, uint32* th) { JPEGState* sp = JState(tif); TIFFDirectory *td = &tif->tif_dir; (*sp->deftparent)(tif, tw, th); *tw = TIFFroundup_32(*tw, td->td_ycbcrsubsampling[0] * DCTSIZE); *th = TIFFroundup_32(*th, td->td_ycbcrsubsampling[1] * DCTSIZE); } /* * The JPEG library initialized used to be done in TIFFInitJPEG(), but * now that we allow a TIFF file to be opened in update mode it is necessary * to have some way of deciding whether compression or decompression is * desired other than looking at tif->tif_mode. We accomplish this by * examining {TILE/STRIP}BYTECOUNTS to see if there is a non-zero entry. * If so, we assume decompression is desired. * * This is tricky, because TIFFInitJPEG() is called while the directory is * being read, and generally speaking the BYTECOUNTS tag won't have been read * at that point. So we try to defer jpeg library initialization till we * do have that tag ... basically any access that might require the compressor * or decompressor that occurs after the reading of the directory. * * In an ideal world compressors or decompressors would be setup * at the point where a single tile or strip was accessed (for read or write) * so that stuff like update of missing tiles, or replacement of tiles could * be done. However, we aren't trying to crack that nut just yet ... * * NFW, Feb 3rd, 2003. */ static int JPEGInitializeLibJPEG( TIFF * tif, int decompress ) { JPEGState* sp = JState(tif); if(sp->cinfo_initialized) { if( !decompress && sp->cinfo.comm.is_decompressor ) TIFFjpeg_destroy( sp ); else if( decompress && !sp->cinfo.comm.is_decompressor ) TIFFjpeg_destroy( sp ); else return 1; sp->cinfo_initialized = 0; } /* * Initialize libjpeg. */ if ( decompress ) { if (!TIFFjpeg_create_decompress(sp)) return (0); } else { if (!TIFFjpeg_create_compress(sp)) return (0); } sp->cinfo_initialized = TRUE; return 1; } int TIFFInitJPEG(TIFF* tif, int scheme) { JPEGState* sp; assert(scheme == COMPRESSION_JPEG); /* * Merge codec-specific tag information. */ if (!_TIFFMergeFields(tif, jpegFields, TIFFArrayCount(jpegFields))) { TIFFErrorExt(tif->tif_clientdata, "TIFFInitJPEG", "Merging JPEG codec-specific tags failed"); return 0; } /* * Allocate state block so tag methods have storage to record values. */ tif->tif_data = (uint8*) _TIFFmalloc(sizeof (JPEGState)); if (tif->tif_data == NULL) { TIFFErrorExt(tif->tif_clientdata, "TIFFInitJPEG", "No space for JPEG state block"); return 0; } _TIFFmemset(tif->tif_data, 0, sizeof(JPEGState)); sp = JState(tif); sp->tif = tif; /* back link */ /* * Override parent get/set field methods. */ sp->vgetparent = tif->tif_tagmethods.vgetfield; tif->tif_tagmethods.vgetfield = JPEGVGetField; /* hook for codec tags */ sp->vsetparent = tif->tif_tagmethods.vsetfield; tif->tif_tagmethods.vsetfield = JPEGVSetField; /* hook for codec tags */ sp->printdir = tif->tif_tagmethods.printdir; tif->tif_tagmethods.printdir = JPEGPrintDir; /* hook for codec tags */ /* Default values for codec-specific fields */ sp->jpegtables = NULL; sp->jpegtables_length = 0; sp->jpegquality = 75; /* Default IJG quality */ sp->jpegcolormode = JPEGCOLORMODE_RAW; sp->jpegtablesmode = JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF; sp->ycbcrsampling_fetched = 0; /* * Install codec methods. */ tif->tif_fixuptags = JPEGFixupTags; tif->tif_setupdecode = JPEGSetupDecode; tif->tif_predecode = JPEGPreDecode; tif->tif_decoderow = JPEGDecode; tif->tif_decodestrip = JPEGDecode; tif->tif_decodetile = JPEGDecode; tif->tif_setupencode = JPEGSetupEncode; tif->tif_preencode = JPEGPreEncode; tif->tif_postencode = JPEGPostEncode; tif->tif_encoderow = JPEGEncode; tif->tif_encodestrip = JPEGEncode; tif->tif_encodetile = JPEGEncode; tif->tif_cleanup = JPEGCleanup; sp->defsparent = tif->tif_defstripsize; tif->tif_defstripsize = JPEGDefaultStripSize; sp->deftparent = tif->tif_deftilesize; tif->tif_deftilesize = JPEGDefaultTileSize; tif->tif_flags |= TIFF_NOBITREV; /* no bit reversal, please */ sp->cinfo_initialized = FALSE; /* ** Create a JPEGTables field if no directory has yet been created. ** We do this just to ensure that sufficient space is reserved for ** the JPEGTables field. It will be properly created the right ** size later. */ if( tif->tif_diroff == 0 ) { #define SIZE_OF_JPEGTABLES 2000 /* The following line assumes incorrectly that all JPEG-in-TIFF files will have a JPEGTABLES tag generated and causes null-filled JPEGTABLES tags to be written when the JPEG data is placed with TIFFWriteRawStrip. The field bit should be set, anyway, later when actual JPEGTABLES header is generated, so removing it here hopefully is harmless. TIFFSetFieldBit(tif, FIELD_JPEGTABLES); */ sp->jpegtables_length = SIZE_OF_JPEGTABLES; sp->jpegtables = (void *) _TIFFmalloc(sp->jpegtables_length); // FIXME: NULL-deref after malloc failure _TIFFmemset(sp->jpegtables, 0, SIZE_OF_JPEGTABLES); #undef SIZE_OF_JPEGTABLES } return 1; } #endif /* JPEG_SUPPORT */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tiffconf.h.in0000644000212300117540000000605610640313263013367 00000000000000/* Configuration defines for installed libtiff. This file maintained for backward compatibility. Do not use definitions from this file in your programs. */ #ifndef _TIFFCONF_ #define _TIFFCONF_ /* Signed 16-bit type */ #undef TIFF_INT16_T /* Signed 32-bit type */ #undef TIFF_INT32_T /* Signed 64-bit type */ #undef TIFF_INT64_T /* Signed 8-bit type */ #undef TIFF_INT8_T /* Unsigned 16-bit type */ #undef TIFF_UINT16_T /* Unsigned 32-bit type */ #undef TIFF_UINT32_T /* Unsigned 64-bit type */ #undef TIFF_UINT64_T /* Unsigned 8-bit type */ #undef TIFF_UINT8_T /* Signed size type */ #undef TIFF_SSIZE_T /* Pointer difference type */ #undef TIFF_PTRDIFF_T /* Define to 1 if the system has the type `int16'. */ #undef HAVE_INT16 /* Define to 1 if the system has the type `int32'. */ #undef HAVE_INT32 /* Define to 1 if the system has the type `int8'. */ #undef HAVE_INT8 /* Compatibility stuff. */ /* Define as 0 or 1 according to the floating point format suported by the machine */ #undef HAVE_IEEEFP /* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ #undef HOST_FILLORDER /* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian (Intel) */ #undef HOST_BIGENDIAN /* Support CCITT Group 3 & 4 algorithms */ #undef CCITT_SUPPORT /* Support JPEG compression (requires IJG JPEG library) */ #undef JPEG_SUPPORT /* Support JBIG compression (requires JBIG-KIT library) */ #undef JBIG_SUPPORT /* Support LogLuv high dynamic range encoding */ #undef LOGLUV_SUPPORT /* Support LZW algorithm */ #undef LZW_SUPPORT /* Support NeXT 2-bit RLE algorithm */ #undef NEXT_SUPPORT /* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation fails with unpatched IJG JPEG library) */ #undef OJPEG_SUPPORT /* Support Macintosh PackBits algorithm */ #undef PACKBITS_SUPPORT /* Support Pixar log-format algorithm (requires Zlib) */ #undef PIXARLOG_SUPPORT /* Support ThunderScan 4-bit RLE algorithm */ #undef THUNDER_SUPPORT /* Support Deflate compression */ #undef ZIP_SUPPORT /* Support strip chopping (whether or not to convert single-strip uncompressed images to mutiple strips of ~8Kb to reduce memory usage) */ #undef STRIPCHOP_DEFAULT /* Enable SubIFD tag (330) support */ #undef SUBIFD_SUPPORT /* Treat extra sample as alpha (default enabled). The RGBA interface will treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA files but don't mark the alpha properly. */ #undef DEFAULT_EXTRASAMPLE_AS_ALPHA /* Pick up YCbCr subsampling info from the JPEG data stream to support files lacking the tag (default enabled). */ #undef CHECK_JPEG_YCBCR_SUBSAMPLING /* Support MS MDI magic number files as TIFF */ #undef MDI_SUPPORT /* * Feature support definitions. * XXX: These macros are obsoleted. Don't use them in your apps! * Macros stays here for backward compatibility and should be always defined. */ #define COLORIMETRY_SUPPORT #define YCBCR_SUPPORT #define CMYK_SUPPORT #define ICC_SUPPORT #define PHOTOSHOP_SUPPORT #define IPTC_SUPPORT #endif /* _TIFFCONF_ */ tiff-4.0.3/libtiff/tif_flush.c0000644000212300117540000000777111360147110013143 00000000000000/* $Id: tif_flush.c,v 1.9 2010-03-31 06:40:10 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. */ #include "tiffiop.h" int TIFFFlush(TIFF* tif) { if( tif->tif_mode == O_RDONLY ) return 1; if (!TIFFFlushData(tif)) return (0); /* In update (r+) mode we try to detect the case where only the strip/tile map has been altered, and we try to rewrite only that portion of the directory without making any other changes */ if( (tif->tif_flags & TIFF_DIRTYSTRIP) && !(tif->tif_flags & TIFF_DIRTYDIRECT) && tif->tif_mode == O_RDWR ) { uint64 *offsets=NULL, *sizes=NULL; if( TIFFIsTiled(tif) ) { if( TIFFGetField( tif, TIFFTAG_TILEOFFSETS, &offsets ) && TIFFGetField( tif, TIFFTAG_TILEBYTECOUNTS, &sizes ) && _TIFFRewriteField( tif, TIFFTAG_TILEOFFSETS, TIFF_LONG8, tif->tif_dir.td_nstrips, offsets ) && _TIFFRewriteField( tif, TIFFTAG_TILEBYTECOUNTS, TIFF_LONG8, tif->tif_dir.td_nstrips, sizes ) ) { tif->tif_flags &= ~TIFF_DIRTYSTRIP; tif->tif_flags &= ~TIFF_BEENWRITING; return 1; } } else { if( TIFFGetField( tif, TIFFTAG_STRIPOFFSETS, &offsets ) && TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &sizes ) && _TIFFRewriteField( tif, TIFFTAG_STRIPOFFSETS, TIFF_LONG8, tif->tif_dir.td_nstrips, offsets ) && _TIFFRewriteField( tif, TIFFTAG_STRIPBYTECOUNTS, TIFF_LONG8, tif->tif_dir.td_nstrips, sizes ) ) { tif->tif_flags &= ~TIFF_DIRTYSTRIP; tif->tif_flags &= ~TIFF_BEENWRITING; return 1; } } } if ((tif->tif_flags & (TIFF_DIRTYDIRECT|TIFF_DIRTYSTRIP)) && !TIFFRewriteDirectory(tif)) return (0); return (1); } /* * Flush buffered data to the file. * * Frank Warmerdam'2000: I modified this to return 1 if TIFF_BEENWRITING * is not set, so that TIFFFlush() will proceed to write out the directory. * The documentation says returning 1 is an error indicator, but not having * been writing isn't exactly a an error. Hopefully this doesn't cause * problems for other people. */ int TIFFFlushData(TIFF* tif) { if ((tif->tif_flags & TIFF_BEENWRITING) == 0) return (1); if (tif->tif_flags & TIFF_POSTENCODE) { tif->tif_flags &= ~TIFF_POSTENCODE; if (!(*tif->tif_postencode)(tif)) return (0); } return (TIFFFlushData1(tif)); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tiffconf.wince.h0000644000212300117540000000642211345765561014102 00000000000000/* $Id: tiffconf.wince.h,v 1.3 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Windows CE platform tiffconf.wince.h * Created by Mateusz Loskot (mateusz@loskot.net) * * NOTE: Requires WCELIBCEX library with wceex_* functions, * It's an extension to C library on Windows CE platform. * For example, HAVE_STDIO_H definition indicates there are * following files available: * stdio.h - from Windows CE / Windows Mobile SDK * wce_stdio.h - from WCELIBCEX library */ /* Configuration defines for installed libtiff. This file maintained for backward compatibility. Do not use definitions from this file in your programs. */ #ifndef _WIN32_WCE # error This version of tif_config.h header is dedicated for Windows CE platform! #endif #ifndef _TIFFCONF_ #define _TIFFCONF_ /* Define to 1 if the system has the type `int16'. */ /* #undef HAVE_INT16 */ /* Define to 1 if the system has the type `int32'. */ /* #undef HAVE_INT32 */ /* Define to 1 if the system has the type `int8'. */ /* #undef HAVE_INT8 */ /* The size of a `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* Compatibility stuff. */ /* Define as 0 or 1 according to the floating point format suported by the machine */ #define HAVE_IEEEFP 1 /* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ #define HOST_FILLORDER FILLORDER_LSB2MSB /* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian (Intel) */ #define HOST_BIGENDIAN 0 /* Support CCITT Group 3 & 4 algorithms */ #define CCITT_SUPPORT 1 /* Support JPEG compression (requires IJG JPEG library) */ /* #undef JPEG_SUPPORT */ /* Support LogLuv high dynamic range encoding */ #define LOGLUV_SUPPORT 1 /* Support LZW algorithm */ #define LZW_SUPPORT 1 /* Support NeXT 2-bit RLE algorithm */ #define NEXT_SUPPORT 1 /* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation fails with unpatched IJG JPEG library) */ /* #undef OJPEG_SUPPORT */ /* Support Macintosh PackBits algorithm */ #define PACKBITS_SUPPORT 1 /* Support Pixar log-format algorithm (requires Zlib) */ /* #undef PIXARLOG_SUPPORT */ /* Support ThunderScan 4-bit RLE algorithm */ #define THUNDER_SUPPORT 1 /* Support Deflate compression */ /* #undef ZIP_SUPPORT */ /* Support strip chopping (whether or not to convert single-strip uncompressed images to mutiple strips of ~8Kb to reduce memory usage) */ #define STRIPCHOP_DEFAULT TIFF_STRIPCHOP /* Enable SubIFD tag (330) support */ #define SUBIFD_SUPPORT 1 /* Treat extra sample as alpha (default enabled). The RGBA interface will treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA files but don't mark the alpha properly. */ #define DEFAULT_EXTRASAMPLE_AS_ALPHA 1 /* Pick up YCbCr subsampling info from the JPEG data stream to support files lacking the tag (default enabled). */ #define CHECK_JPEG_YCBCR_SUBSAMPLING 1 /* * Feature support definitions. * XXX: These macros are obsoleted. Don't use them in your apps! * Macros stays here for backward compatibility and should be always defined. */ #define COLORIMETRY_SUPPORT #define YCBCR_SUPPORT #define CMYK_SUPPORT #define ICC_SUPPORT #define PHOTOSHOP_SUPPORT #define IPTC_SUPPORT #endif /* _TIFFCONF_ */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tiffconf.vc.h0000644000212300117540000000766011345765045013407 00000000000000/* Configuration defines for installed libtiff. This file maintained for backward compatibility. Do not use definitions from this file in your programs. */ #ifndef _TIFFCONF_ #define _TIFFCONF_ /* Define to 1 if the system has the type `int16'. */ /* #undef HAVE_INT16 */ /* Define to 1 if the system has the type `int32'. */ /* #undef HAVE_INT32 */ /* Define to 1 if the system has the type `int8'. */ /* #undef HAVE_INT8 */ /* The size of a `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* Signed 8-bit type */ #define TIFF_INT8_T signed char /* Unsigned 8-bit type */ #define TIFF_UINT8_T unsigned char /* Signed 16-bit type */ #define TIFF_INT16_T signed short /* Unsigned 16-bit type */ #define TIFF_UINT16_T unsigned short /* Signed 32-bit type formatter */ #define TIFF_INT32_FORMAT "%d" /* Signed 32-bit type */ #define TIFF_INT32_T signed int /* Unsigned 32-bit type formatter */ #define TIFF_UINT32_FORMAT "%u" /* Unsigned 32-bit type */ #define TIFF_UINT32_T unsigned int /* Signed 64-bit type formatter */ #define TIFF_INT64_FORMAT "%I64d" /* Signed 64-bit type */ #define TIFF_INT64_T signed __int64 /* Unsigned 64-bit type formatter */ #define TIFF_UINT64_FORMAT "%I64u" /* Unsigned 64-bit type */ #define TIFF_UINT64_T unsigned __int64 /* Signed size type */ #if defined(_WIN64) #define TIFF_SSIZE_T signed __int64 #else #define TIFF_SSIZE_T signed int #endif /* Signed size type formatter */ #if defined(_WIN64) #define TIFF_SSIZE_FORMAT "%I64d" #else #define TIFF_SSIZE_FORMAT "%ld" #endif /* Pointer difference type */ #define TIFF_PTRDIFF_T long /* Compatibility stuff. */ /* Define as 0 or 1 according to the floating point format suported by the machine */ #define HAVE_IEEEFP 1 /* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ #define HOST_FILLORDER FILLORDER_LSB2MSB /* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian (Intel) */ #define HOST_BIGENDIAN 0 /* Support CCITT Group 3 & 4 algorithms */ #define CCITT_SUPPORT 1 /* Support JPEG compression (requires IJG JPEG library) */ /* #undef JPEG_SUPPORT */ /* Support JBIG compression (requires JBIG-KIT library) */ /* #undef JBIG_SUPPORT */ /* Support LogLuv high dynamic range encoding */ #define LOGLUV_SUPPORT 1 /* Support LZW algorithm */ #define LZW_SUPPORT 1 /* Support NeXT 2-bit RLE algorithm */ #define NEXT_SUPPORT 1 /* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation fails with unpatched IJG JPEG library) */ /* #undef OJPEG_SUPPORT */ /* Support Macintosh PackBits algorithm */ #define PACKBITS_SUPPORT 1 /* Support Pixar log-format algorithm (requires Zlib) */ /* #undef PIXARLOG_SUPPORT */ /* Support ThunderScan 4-bit RLE algorithm */ #define THUNDER_SUPPORT 1 /* Support Deflate compression */ /* #undef ZIP_SUPPORT */ /* Support strip chopping (whether or not to convert single-strip uncompressed images to mutiple strips of ~8Kb to reduce memory usage) */ #define STRIPCHOP_DEFAULT TIFF_STRIPCHOP /* Enable SubIFD tag (330) support */ #define SUBIFD_SUPPORT 1 /* Treat extra sample as alpha (default enabled). The RGBA interface will treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA files but don't mark the alpha properly. */ #define DEFAULT_EXTRASAMPLE_AS_ALPHA 1 /* Pick up YCbCr subsampling info from the JPEG data stream to support files lacking the tag (default enabled). */ #define CHECK_JPEG_YCBCR_SUBSAMPLING 1 /* Support MS MDI magic number files as TIFF */ /* #undef MDI_SUPPORT */ /* * Feature support definitions. * XXX: These macros are obsoleted. Don't use them in your apps! * Macros stays here for backward compatibility and should be always defined. */ #define COLORIMETRY_SUPPORT #define YCBCR_SUPPORT #define CMYK_SUPPORT #define ICC_SUPPORT #define PHOTOSHOP_SUPPORT #define IPTC_SUPPORT #endif /* _TIFFCONF_ */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/SConstruct0000644000212300117540000000422310573703021013037 00000000000000# $Id: SConstruct,v 1.4 2007/02/24 15:03:50 dron Exp $ # Tag Image File Format (TIFF) Software # # Copyright (C) 2005, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # This file contains rules to build software with the SCons tool # (see the http://www.scons.org/ for details on SCons). # Import globally defined options Import([ 'env', 'idir_lib' ]) SRCS = [ \ 'tif_aux.c', \ 'tif_close.c', \ 'tif_codec.c', \ 'tif_color.c', \ 'tif_compress.c', \ 'tif_dir.c', \ 'tif_dirinfo.c', \ 'tif_dirread.c', \ 'tif_dirwrite.c', \ 'tif_dumpmode.c', \ 'tif_error.c', \ 'tif_extension.c', \ 'tif_fax3.c', \ 'tif_fax3sm.c', \ 'tif_flush.c', \ 'tif_getimage.c', \ 'tif_jbig.c', \ 'tif_jpeg.c', \ 'tif_luv.c', \ 'tif_lzw.c', \ 'tif_next.c', \ 'tif_ojpeg.c', \ 'tif_open.c', \ 'tif_packbits.c', \ 'tif_pixarlog.c', \ 'tif_predict.c', \ 'tif_print.c', \ 'tif_read.c', \ 'tif_strip.c', \ 'tif_swab.c', \ 'tif_thunder.c', \ 'tif_tile.c', \ 'tif_unix.c', \ 'tif_version.c', \ 'tif_warning.c', \ 'tif_write.c', \ 'tif_zip.c' ] StaticLibrary('tiff', SRCS) SharedLibrary('tiff', SRCS) tiff-4.0.3/libtiff/tif_jpeg_12.c0000644000212300117540000000313411345765044013255 00000000000000 #include "tiffiop.h" #if defined(JPEG_DUAL_MODE_8_12) # define TIFFInitJPEG TIFFInitJPEG_12 # include LIBJPEG_12_PATH # include "tif_jpeg.c" int TIFFReInitJPEG_12( TIFF *tif, int scheme, int is_encode ) { JPEGState* sp; assert(scheme == COMPRESSION_JPEG); sp = JState(tif); sp->tif = tif; /* back link */ /* * Override parent get/set field methods. */ tif->tif_tagmethods.vgetfield = JPEGVGetField; /* hook for codec tags */ tif->tif_tagmethods.vsetfield = JPEGVSetField; /* hook for codec tags */ tif->tif_tagmethods.printdir = JPEGPrintDir; /* hook for codec tags */ /* * Install codec methods. */ tif->tif_fixuptags = JPEGFixupTags; tif->tif_setupdecode = JPEGSetupDecode; tif->tif_predecode = JPEGPreDecode; tif->tif_decoderow = JPEGDecode; tif->tif_decodestrip = JPEGDecode; tif->tif_decodetile = JPEGDecode; tif->tif_setupencode = JPEGSetupEncode; tif->tif_preencode = JPEGPreEncode; tif->tif_postencode = JPEGPostEncode; tif->tif_encoderow = JPEGEncode; tif->tif_encodestrip = JPEGEncode; tif->tif_encodetile = JPEGEncode; tif->tif_cleanup = JPEGCleanup; tif->tif_defstripsize = JPEGDefaultStripSize; tif->tif_deftilesize = JPEGDefaultTileSize; tif->tif_flags |= TIFF_NOBITREV; /* no bit reversal, please */ sp->cinfo_initialized = FALSE; if( is_encode ) return JPEGSetupEncode(tif); else return JPEGSetupDecode(tif); } #endif /* defined(JPEG_DUAL_MODE_8_12) */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_extension.c0000644000212300117540000000626511345765560014055 00000000000000/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_extension.c,v 1.7 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Various routines support external extension of the tag set, and other * application extension capabilities. */ #include "tiffiop.h" int TIFFGetTagListCount( TIFF *tif ) { TIFFDirectory* td = &tif->tif_dir; return td->td_customValueCount; } uint32 TIFFGetTagListEntry( TIFF *tif, int tag_index ) { TIFFDirectory* td = &tif->tif_dir; if( tag_index < 0 || tag_index >= td->td_customValueCount ) return (uint32)(-1); else return td->td_customValues[tag_index].info->field_tag; } /* ** This provides read/write access to the TIFFTagMethods within the TIFF ** structure to application code without giving access to the private ** TIFF structure. */ TIFFTagMethods *TIFFAccessTagMethods( TIFF *tif ) { return &(tif->tif_tagmethods); } void *TIFFGetClientInfo( TIFF *tif, const char *name ) { TIFFClientInfoLink *link = tif->tif_clientinfo; while( link != NULL && strcmp(link->name,name) != 0 ) link = link->next; if( link != NULL ) return link->data; else return NULL; } void TIFFSetClientInfo( TIFF *tif, void *data, const char *name ) { TIFFClientInfoLink *link = tif->tif_clientinfo; /* ** Do we have an existing link with this name? If so, just ** set it. */ while( link != NULL && strcmp(link->name,name) != 0 ) link = link->next; if( link != NULL ) { link->data = data; return; } /* ** Create a new link. */ link = (TIFFClientInfoLink *) _TIFFmalloc(sizeof(TIFFClientInfoLink)); assert (link != NULL); link->next = tif->tif_clientinfo; link->name = (char *) _TIFFmalloc((tmsize_t)(strlen(name)+1)); assert (link->name != NULL); strcpy(link->name, name); link->data = data; tif->tif_clientinfo = link; } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_packbits.c0000644000212300117540000001636211775114347013636 00000000000000/* $Id: tif_packbits.c,v 1.22 2012-06-20 05:25:33 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef PACKBITS_SUPPORT /* * TIFF Library. * * PackBits Compression Algorithm Support */ #include static int PackBitsPreEncode(TIFF* tif, uint16 s) { (void) s; if (!(tif->tif_data = (uint8*)_TIFFmalloc(sizeof(tmsize_t)))) return (0); /* * Calculate the scanline/tile-width size in bytes. */ if (isTiled(tif)) *(tmsize_t*)tif->tif_data = TIFFTileRowSize(tif); else *(tmsize_t*)tif->tif_data = TIFFScanlineSize(tif); return (1); } static int PackBitsPostEncode(TIFF* tif) { if (tif->tif_data) _TIFFfree(tif->tif_data); return (1); } /* * Encode a run of pixels. */ static int PackBitsEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) { unsigned char* bp = (unsigned char*) buf; uint8* op; uint8* ep; uint8* lastliteral; long n, slop; int b; enum { BASE, LITERAL, RUN, LITERAL_RUN } state; (void) s; op = tif->tif_rawcp; ep = tif->tif_rawdata + tif->tif_rawdatasize; state = BASE; lastliteral = 0; while (cc > 0) { /* * Find the longest string of identical bytes. */ b = *bp++, cc--, n = 1; for (; cc > 0 && b == *bp; cc--, bp++) n++; again: if (op + 2 >= ep) { /* insure space for new data */ /* * Be careful about writing the last * literal. Must write up to that point * and then copy the remainder to the * front of the buffer. */ if (state == LITERAL || state == LITERAL_RUN) { slop = (long)(op - lastliteral); tif->tif_rawcc += (tmsize_t)(lastliteral - tif->tif_rawcp); if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; while (slop-- > 0) *op++ = *lastliteral++; lastliteral = tif->tif_rawcp; } else { tif->tif_rawcc += (tmsize_t)(op - tif->tif_rawcp); if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; } } switch (state) { case BASE: /* initial state, set run/literal */ if (n > 1) { state = RUN; if (n > 128) { *op++ = (uint8) -127; *op++ = (uint8) b; n -= 128; goto again; } *op++ = (uint8)(-(n-1)); *op++ = (uint8) b; } else { lastliteral = op; *op++ = 0; *op++ = (uint8) b; state = LITERAL; } break; case LITERAL: /* last object was literal string */ if (n > 1) { state = LITERAL_RUN; if (n > 128) { *op++ = (uint8) -127; *op++ = (uint8) b; n -= 128; goto again; } *op++ = (uint8)(-(n-1)); /* encode run */ *op++ = (uint8) b; } else { /* extend literal */ if (++(*lastliteral) == 127) state = BASE; *op++ = (uint8) b; } break; case RUN: /* last object was run */ if (n > 1) { if (n > 128) { *op++ = (uint8) -127; *op++ = (uint8) b; n -= 128; goto again; } *op++ = (uint8)(-(n-1)); *op++ = (uint8) b; } else { lastliteral = op; *op++ = 0; *op++ = (uint8) b; state = LITERAL; } break; case LITERAL_RUN: /* literal followed by a run */ /* * Check to see if previous run should * be converted to a literal, in which * case we convert literal-run-literal * to a single literal. */ if (n == 1 && op[-2] == (uint8) -1 && *lastliteral < 126) { state = (((*lastliteral) += 2) == 127 ? BASE : LITERAL); op[-2] = op[-1]; /* replicate */ } else state = RUN; goto again; } } tif->tif_rawcc += (tmsize_t)(op - tif->tif_rawcp); tif->tif_rawcp = op; return (1); } /* * Encode a rectangular chunk of pixels. We break it up * into row-sized pieces to insure that encoded runs do * not span rows. Otherwise, there can be problems with * the decoder if data is read, for example, by scanlines * when it was encoded by strips. */ static int PackBitsEncodeChunk(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { tmsize_t rowsize = *(tmsize_t*)tif->tif_data; while (cc > 0) { tmsize_t chunk = rowsize; if( cc < chunk ) chunk = cc; if (PackBitsEncode(tif, bp, chunk, s) < 0) return (-1); bp += chunk; cc -= chunk; } return (1); } static int PackBitsDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s) { static const char module[] = "PackBitsDecode"; char *bp; tmsize_t cc; long n; int b; (void) s; bp = (char*) tif->tif_rawcp; cc = tif->tif_rawcc; while (cc > 0 && occ > 0) { n = (long) *bp++, cc--; /* * Watch out for compilers that * don't sign extend chars... */ if (n >= 128) n -= 256; if (n < 0) { /* replicate next byte -n+1 times */ if (n == -128) /* nop */ continue; n = -n + 1; if( occ < (tmsize_t)n ) { TIFFWarningExt(tif->tif_clientdata, module, "Discarding %lu bytes to avoid buffer overrun", (unsigned long) ((tmsize_t)n - occ)); n = (long)occ; } occ -= n; b = *bp++, cc--; while (n-- > 0) *op++ = (uint8) b; } else { /* copy next n+1 bytes literally */ if (occ < (tmsize_t)(n + 1)) { TIFFWarningExt(tif->tif_clientdata, module, "Discarding %lu bytes to avoid buffer overrun", (unsigned long) ((tmsize_t)n - occ + 1)); n = (long)occ - 1; } if (cc < (tmsize_t) (n+1)) { TIFFWarningExt(tif->tif_clientdata, module, "Terminating PackBitsDecode due to lack of data."); break; } _TIFFmemcpy(op, bp, ++n); op += n; occ -= n; bp += n; cc -= n; } } tif->tif_rawcp = (uint8*) bp; tif->tif_rawcc = cc; if (occ > 0) { TIFFErrorExt(tif->tif_clientdata, module, "Not enough data for scanline %lu", (unsigned long) tif->tif_row); return (0); } return (1); } int TIFFInitPackBits(TIFF* tif, int scheme) { (void) scheme; tif->tif_decoderow = PackBitsDecode; tif->tif_decodestrip = PackBitsDecode; tif->tif_decodetile = PackBitsDecode; tif->tif_preencode = PackBitsPreEncode; tif->tif_postencode = PackBitsPostEncode; tif->tif_encoderow = PackBitsEncode; tif->tif_encodestrip = PackBitsEncodeChunk; tif->tif_encodetile = PackBitsEncodeChunk; return (1); } #endif /* PACKBITS_SUPPORT */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_config.wince.h0000644000212300117540000000347411345765560014416 00000000000000/* $Id: tif_config.wince.h,v 1.3 2010-03-10 18:56:48 bfriesen Exp $ */ /* * TIFF library configuration header for Windows CE platform. */ #ifndef _WIN32_WCE # error This version of tif_config.h header is dedicated for Windows CE platform! #endif /* Define to 1 if you have the header file. */ #define HAVE_ASSERT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define as 0 or 1 according to the floating point format suported by the machine */ #define HAVE_IEEEFP 1 /* Define to 1 if you have the `jbg_newlen' function. */ #define HAVE_JBG_NEWLEN 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #define HAVE_IO_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SEARCH_H 1 /* Define to 1 if you have the `setmode' function. */ #define HAVE_SETMODE 1 /* Define to 1 if you have the `bsearch' function. */ #define HAVE_BSEARCH 1 #define bsearch wceex_bsearch /* Define to 1 if you have the `lfind' function. */ #define HAVE_LFIND 1 #define lfind wceex_lfind /* The size of a `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* Set the native cpu bit order */ #define HOST_FILLORDER FILLORDER_LSB2MSB /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ /* #undef WORDS_BIGENDIAN */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus # ifndef inline # define inline __inline # endif #endif /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_thunder.c0000644000212300117540000001441611545706361013503 00000000000000/* $Id: tif_thunder.c,v 1.12 2011-04-02 20:54:09 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #include #ifdef THUNDER_SUPPORT /* * TIFF Library. * * ThunderScan 4-bit Compression Algorithm Support */ /* * ThunderScan uses an encoding scheme designed for * 4-bit pixel values. Data is encoded in bytes, with * each byte split into a 2-bit code word and a 6-bit * data value. The encoding gives raw data, runs of * pixels, or pixel values encoded as a delta from the * previous pixel value. For the latter, either 2-bit * or 3-bit delta values are used, with the deltas packed * into a single byte. */ #define THUNDER_DATA 0x3f /* mask for 6-bit data */ #define THUNDER_CODE 0xc0 /* mask for 2-bit code word */ /* code values */ #define THUNDER_RUN 0x00 /* run of pixels w/ encoded count */ #define THUNDER_2BITDELTAS 0x40 /* 3 pixels w/ encoded 2-bit deltas */ #define DELTA2_SKIP 2 /* skip code for 2-bit deltas */ #define THUNDER_3BITDELTAS 0x80 /* 2 pixels w/ encoded 3-bit deltas */ #define DELTA3_SKIP 4 /* skip code for 3-bit deltas */ #define THUNDER_RAW 0xc0 /* raw data encoded */ static const int twobitdeltas[4] = { 0, 1, 0, -1 }; static const int threebitdeltas[8] = { 0, 1, 2, 3, 0, -3, -2, -1 }; #define SETPIXEL(op, v) { \ lastpixel = (v) & 0xf; \ if ( npixels < maxpixels ) \ { \ if (npixels++ & 1) \ *op++ |= lastpixel; \ else \ op[0] = (uint8) (lastpixel << 4); \ } \ } static int ThunderSetupDecode(TIFF* tif) { static const char module[] = "ThunderSetupDecode"; if( tif->tif_dir.td_bitspersample != 4 ) { TIFFErrorExt(tif->tif_clientdata, module, "Wrong bitspersample value (%d), Thunder decoder only supports 4bits per sample.", (int) tif->tif_dir.td_bitspersample ); return 0; } return (1); } static int ThunderDecode(TIFF* tif, uint8* op, tmsize_t maxpixels) { static const char module[] = "ThunderDecode"; register unsigned char *bp; register tmsize_t cc; unsigned int lastpixel; tmsize_t npixels; bp = (unsigned char *)tif->tif_rawcp; cc = tif->tif_rawcc; lastpixel = 0; npixels = 0; while (cc > 0 && npixels < maxpixels) { int n, delta; n = *bp++, cc--; switch (n & THUNDER_CODE) { case THUNDER_RUN: /* pixel run */ /* * Replicate the last pixel n times, * where n is the lower-order 6 bits. */ if (npixels & 1) { op[0] |= lastpixel; lastpixel = *op++; npixels++; n--; } else lastpixel |= lastpixel << 4; npixels += n; if (npixels < maxpixels) { for (; n > 0; n -= 2) *op++ = (uint8) lastpixel; } if (n == -1) *--op &= 0xf0; lastpixel &= 0xf; break; case THUNDER_2BITDELTAS: /* 2-bit deltas */ if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP) SETPIXEL(op, lastpixel + twobitdeltas[delta]); if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP) SETPIXEL(op, lastpixel + twobitdeltas[delta]); if ((delta = (n & 3)) != DELTA2_SKIP) SETPIXEL(op, lastpixel + twobitdeltas[delta]); break; case THUNDER_3BITDELTAS: /* 3-bit deltas */ if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP) SETPIXEL(op, lastpixel + threebitdeltas[delta]); if ((delta = (n & 7)) != DELTA3_SKIP) SETPIXEL(op, lastpixel + threebitdeltas[delta]); break; case THUNDER_RAW: /* raw data */ SETPIXEL(op, n); break; } } tif->tif_rawcp = (uint8*) bp; tif->tif_rawcc = cc; if (npixels != maxpixels) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "%s data at scanline %lu (%I64u != %I64u)", npixels < maxpixels ? "Not enough" : "Too much", (unsigned long) tif->tif_row, (unsigned __int64) npixels, (unsigned __int64) maxpixels); #else TIFFErrorExt(tif->tif_clientdata, module, "%s data at scanline %lu (%llu != %llu)", npixels < maxpixels ? "Not enough" : "Too much", (unsigned long) tif->tif_row, (unsigned long long) npixels, (unsigned long long) maxpixels); #endif return (0); } return (1); } static int ThunderDecodeRow(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) { static const char module[] = "ThunderDecodeRow"; uint8* row = buf; (void) s; if (occ % tif->tif_scanlinesize) { TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read"); return (0); } while (occ > 0) { if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth)) return (0); occ -= tif->tif_scanlinesize; row += tif->tif_scanlinesize; } return (1); } int TIFFInitThunderScan(TIFF* tif, int scheme) { (void) scheme; tif->tif_setupdecode = ThunderSetupDecode; tif->tif_decoderow = ThunderDecodeRow; tif->tif_decodestrip = ThunderDecodeRow; return (1); } #endif /* THUNDER_SUPPORT */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_stream.cxx0000644000212300117540000002644111501546110013670 00000000000000/* $Id: tif_stream.cxx,v 1.11 2010-12-11 23:12:29 faxguy Exp $ */ /* * Copyright (c) 1988-1996 Sam Leffler * Copyright (c) 1991-1996 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library UNIX-specific Routines. */ #include "tiffiop.h" #include #ifndef __VMS using namespace std; #endif /* ISO C++ uses a 'std::streamsize' type to define counts. This makes it similar to, (but perhaps not the same as) size_t. The std::ios::pos_type is used to represent stream positions as used by tellg(), tellp(), seekg(), and seekp(). This makes it similar to (but perhaps not the same as) 'off_t'. The std::ios::streampos type is used for character streams, but is documented to not be an integral type anymore, so it should *not* be assigned to an integral type. The std::ios::off_type is used to specify relative offsets needed by the variants of seekg() and seekp() which accept a relative offset argument. Useful prototype knowledge: Obtain read position ios::pos_type basic_istream::tellg() Set read position basic_istream& basic_istream::seekg(ios::pos_type) basic_istream& basic_istream::seekg(ios::off_type, ios_base::seekdir) Read data basic_istream& istream::read(char *str, streamsize count) Number of characters read in last unformatted read streamsize istream::gcount(); Obtain write position ios::pos_type basic_ostream::tellp() Set write position basic_ostream& basic_ostream::seekp(ios::pos_type) basic_ostream& basic_ostream::seekp(ios::off_type, ios_base::seekdir) Write data basic_ostream& ostream::write(const char *str, streamsize count) */ struct tiffis_data; struct tiffos_data; extern "C" { static tmsize_t _tiffosReadProc(thandle_t, void*, tmsize_t); static tmsize_t _tiffisReadProc(thandle_t fd, void* buf, tmsize_t size); static tmsize_t _tiffosWriteProc(thandle_t fd, void* buf, tmsize_t size); static tmsize_t _tiffisWriteProc(thandle_t, void*, tmsize_t); static uint64 _tiffosSeekProc(thandle_t fd, uint64 off, int whence); static uint64 _tiffisSeekProc(thandle_t fd, uint64 off, int whence); static uint64 _tiffosSizeProc(thandle_t fd); static uint64 _tiffisSizeProc(thandle_t fd); static int _tiffosCloseProc(thandle_t fd); static int _tiffisCloseProc(thandle_t fd); static int _tiffDummyMapProc(thandle_t , void** base, toff_t* size ); static void _tiffDummyUnmapProc(thandle_t , void* base, toff_t size ); static TIFF* _tiffStreamOpen(const char* name, const char* mode, void *fd); struct tiffis_data { istream *stream; ios::pos_type start_pos; }; struct tiffos_data { ostream *stream; ios::pos_type start_pos; }; static tmsize_t _tiffosReadProc(thandle_t, void*, tmsize_t) { return 0; } static tmsize_t _tiffisReadProc(thandle_t fd, void* buf, tmsize_t size) { tiffis_data *data = reinterpret_cast(fd); // Verify that type does not overflow. streamsize request_size = size; if (static_cast(request_size) != size) return static_cast(-1); data->stream->read((char *) buf, request_size); return static_cast(data->stream->gcount()); } static tmsize_t _tiffosWriteProc(thandle_t fd, void* buf, tmsize_t size) { tiffos_data *data = reinterpret_cast(fd); ostream *os = data->stream; ios::pos_type pos = os->tellp(); // Verify that type does not overflow. streamsize request_size = size; if (static_cast(request_size) != size) return static_cast(-1); os->write(reinterpret_cast(buf), request_size); return static_cast(os->tellp() - pos); } static tmsize_t _tiffisWriteProc(thandle_t, void*, tmsize_t) { return 0; } static uint64 _tiffosSeekProc(thandle_t fd, uint64 off, int whence) { tiffos_data *data = reinterpret_cast(fd); ostream *os = data->stream; // if the stream has already failed, don't do anything if( os->fail() ) return static_cast(-1); switch(whence) { case SEEK_SET: { // Compute 64-bit offset uint64 new_offset = static_cast(data->start_pos) + off; // Verify that value does not overflow ios::off_type offset = static_cast(new_offset); if (static_cast(offset) != new_offset) return static_cast(-1); os->seekp(offset, ios::beg); break; } case SEEK_CUR: { // Verify that value does not overflow ios::off_type offset = static_cast(off); if (static_cast(offset) != off) return static_cast(-1); os->seekp(offset, ios::cur); break; } case SEEK_END: { // Verify that value does not overflow ios::off_type offset = static_cast(off); if (static_cast(offset) != off) return static_cast(-1); os->seekp(offset, ios::end); break; } } // Attempt to workaround problems with seeking past the end of the // stream. ofstream doesn't have a problem with this but // ostrstream/ostringstream does. In that situation, add intermediate // '\0' characters. if( os->fail() ) { #ifdef __VMS int old_state; #else ios::iostate old_state; #endif ios::pos_type origin; old_state = os->rdstate(); // reset the fail bit or else tellp() won't work below os->clear(os->rdstate() & ~ios::failbit); switch( whence ) { case SEEK_SET: default: origin = data->start_pos; break; case SEEK_CUR: origin = os->tellp(); break; case SEEK_END: os->seekp(0, ios::end); origin = os->tellp(); break; } // restore original stream state os->clear(old_state); // only do something if desired seek position is valid if( (static_cast(origin) + off) > static_cast(data->start_pos) ) { uint64 num_fill; // clear the fail bit os->clear(os->rdstate() & ~ios::failbit); // extend the stream to the expected size os->seekp(0, ios::end); num_fill = (static_cast(origin)) + off - os->tellp(); for( uint64 i = 0; i < num_fill; i++ ) os->put('\0'); // retry the seek os->seekp(static_cast(static_cast(origin) + off), ios::beg); } } return static_cast(os->tellp()); } static uint64 _tiffisSeekProc(thandle_t fd, uint64 off, int whence) { tiffis_data *data = reinterpret_cast(fd); switch(whence) { case SEEK_SET: { // Compute 64-bit offset uint64 new_offset = static_cast(data->start_pos) + off; // Verify that value does not overflow ios::off_type offset = static_cast(new_offset); if (static_cast(offset) != new_offset) return static_cast(-1); data->stream->seekg(offset, ios::beg); break; } case SEEK_CUR: { // Verify that value does not overflow ios::off_type offset = static_cast(off); if (static_cast(offset) != off) return static_cast(-1); data->stream->seekg(offset, ios::cur); break; } case SEEK_END: { // Verify that value does not overflow ios::off_type offset = static_cast(off); if (static_cast(offset) != off) return static_cast(-1); data->stream->seekg(offset, ios::end); break; } } return (uint64) (data->stream->tellg() - data->start_pos); } static uint64 _tiffosSizeProc(thandle_t fd) { tiffos_data *data = reinterpret_cast(fd); ostream *os = data->stream; ios::pos_type pos = os->tellp(); ios::pos_type len; os->seekp(0, ios::end); len = os->tellp(); os->seekp(pos); return (uint64) len; } static uint64 _tiffisSizeProc(thandle_t fd) { tiffis_data *data = reinterpret_cast(fd); ios::pos_type pos = data->stream->tellg(); ios::pos_type len; data->stream->seekg(0, ios::end); len = data->stream->tellg(); data->stream->seekg(pos); return (uint64) len; } static int _tiffosCloseProc(thandle_t fd) { // Our stream was not allocated by us, so it shouldn't be closed by us. delete reinterpret_cast(fd); return 0; } static int _tiffisCloseProc(thandle_t fd) { // Our stream was not allocated by us, so it shouldn't be closed by us. delete reinterpret_cast(fd); return 0; } static int _tiffDummyMapProc(thandle_t , void** base, toff_t* size ) { return (0); } static void _tiffDummyUnmapProc(thandle_t , void* base, toff_t size ) { } /* * Open a TIFF file descriptor for read/writing. */ static TIFF* _tiffStreamOpen(const char* name, const char* mode, void *fd) { TIFF* tif; if( strchr(mode, 'w') ) { tiffos_data *data = new tiffos_data; data->stream = reinterpret_cast(fd); data->start_pos = data->stream->tellp(); // Open for writing. tif = TIFFClientOpen(name, mode, reinterpret_cast(data), _tiffosReadProc, _tiffosWriteProc, _tiffosSeekProc, _tiffosCloseProc, _tiffosSizeProc, _tiffDummyMapProc, _tiffDummyUnmapProc); } else { tiffis_data *data = new tiffis_data; data->stream = reinterpret_cast(fd); data->start_pos = data->stream->tellg(); // Open for reading. tif = TIFFClientOpen(name, mode, reinterpret_cast(data), _tiffisReadProc, _tiffisWriteProc, _tiffisSeekProc, _tiffisCloseProc, _tiffisSizeProc, _tiffDummyMapProc, _tiffDummyUnmapProc); } return (tif); } } /* extern "C" */ TIFF* TIFFStreamOpen(const char* name, ostream *os) { // If os is either a ostrstream or ostringstream, and has no data // written to it yet, then tellp() will return -1 which will break us. // We workaround this by writing out a dummy character and // then seek back to the beginning. if( !os->fail() && static_cast(os->tellp()) < 0 ) { *os << '\0'; os->seekp(0); } // NB: We don't support mapped files with streams so add 'm' return _tiffStreamOpen(name, "wm", os); } TIFF* TIFFStreamOpen(const char* name, istream *is) { // NB: We don't support mapped files with streams so add 'm' return _tiffStreamOpen(name, "rm", is); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* Local Variables: mode: c indent-tabs-mode: true c-basic-offset: 8 End: */ tiff-4.0.3/libtiff/tif_ojpeg.c0000644000212300117540000022620411763656233013142 00000000000000/* $Id: tif_ojpeg.c,v 1.56 2012-05-24 03:15:18 fwarmerdam Exp $ */ /* WARNING: The type of JPEG encapsulation defined by the TIFF Version 6.0 specification is now totally obsolete and deprecated for new applications and images. This file was was created solely in order to read unconverted images still present on some users' computer systems. It will never be extended to write such files. Writing new-style JPEG compressed TIFFs is implemented in tif_jpeg.c. The code is carefully crafted to robustly read all gathered JPEG-in-TIFF testfiles, and anticipate as much as possible all other... But still, it may fail on some. If you encounter problems, please report them on the TIFF mailing list and/or to Joris Van Damme . Please read the file called "TIFF Technical Note #2" if you need to be convinced this compression scheme is bad and breaks TIFF. That document is linked to from the LibTiff site and from AWare Systems' TIFF section . It is also absorbed in Adobe's specification supplements, marked "draft" up to this day, but supported by the TIFF community. This file interfaces with Release 6B of the JPEG Library written by the Independent JPEG Group. Previous versions of this file required a hack inside the LibJpeg library. This version no longer requires that. Remember to remove the hack if you update from the old version. Copyright (c) Joris Van Damme Copyright (c) AWare Systems The licence agreement for this file is the same as the rest of the LibTiff library. IN NO EVENT SHALL JORIS VAN DAMME OR AWARE SYSTEMS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Joris Van Damme and/or AWare Systems may be available for custom developement. If you like what you see, and need anything similar or related, contact . */ /* What is what, and what is not? This decoder starts with an input stream, that is essentially the JpegInterchangeFormat stream, if any, followed by the strile data, if any. This stream is read in OJPEGReadByte and related functions. It analyzes the start of this stream, until it encounters non-marker data, i.e. compressed image data. Some of the header markers it sees have no actual content, like the SOI marker, and APP/COM markers that really shouldn't even be there. Some other markers do have content, and the valuable bits and pieces of information in these markers are saved, checking all to verify that the stream is more or less within expected bounds. This happens inside the OJPEGReadHeaderInfoSecStreamXxx functions. Some OJPEG imagery contains no valid JPEG header markers. This situation is picked up on if we've seen no SOF marker when we're at the start of the compressed image data. In this case, the tables are read from JpegXxxTables tags, and the other bits and pieces of information is initialized to its most basic value. This is implemented in the OJPEGReadHeaderInfoSecTablesXxx functions. When this is complete, a good and valid JPEG header can be assembled, and this is passed through to LibJpeg. When that's done, the remainder of the input stream, i.e. the compressed image data, can be passed through unchanged. This is done in OJPEGWriteStream functions. LibTiff rightly expects to know the subsampling values before decompression. Just like in new-style JPEG-in-TIFF, though, or even more so, actually, the YCbCrsubsampling tag is notoriously unreliable. To correct these tag values with the ones inside the JPEG stream, the first part of the input stream is pre-scanned in OJPEGSubsamplingCorrect, making no note of any other data, reporting no warnings or errors, up to the point where either these values are read, or it's clear they aren't there. This means that some of the data is read twice, but we feel speed in correcting these values is important enough to warrant this sacrifice. Allthough there is currently no define or other configuration mechanism to disable this behaviour, the actual header scanning is build to robustly respond with error report if it should encounter an uncorrected mismatch of subsampling values. See OJPEGReadHeaderInfoSecStreamSof. The restart interval and restart markers are the most tricky part... The restart interval can be specified in a tag. It can also be set inside the input JPEG stream. It can be used inside the input JPEG stream. If reading from strile data, we've consistenly discovered the need to insert restart markers in between the different striles, as is also probably the most likely interpretation of the original TIFF 6.0 specification. With all this setting of interval, and actual use of markers that is not predictable at the time of valid JPEG header assembly, the restart thing may turn out the Achilles heel of this implementation. Fortunately, most OJPEG writer vendors succeed in reading back what they write, which may be the reason why we've been able to discover ways that seem to work. Some special provision is made for planarconfig separate OJPEG files. These seem to consistently contain header info, a SOS marker, a plane, SOS marker, plane, SOS, and plane. This may or may not be a valid JPEG configuration, we don't know and don't care. We want LibTiff to be able to access the planes individually, without huge buffering inside LibJpeg, anyway. So we compose headers to feed to LibJpeg, in this case, that allow us to pass a single plane such that LibJpeg sees a valid single-channel JPEG stream. Locating subsequent SOS markers, and thus subsequent planes, is done inside OJPEGReadSecondarySos. The benefit of the scheme is... that it works, basically. We know of no other that does. It works without checking software tag, or otherwise going about things in an OJPEG flavor specific manner. Instead, it is a single scheme, that covers the cases with and without JpegInterchangeFormat, with and without striles, with part of the header in JpegInterchangeFormat and remainder in first strile, etc. It is forgiving and robust, may likely work with OJPEG flavors we've not seen yet, and makes most out of the data. Another nice side-effect is that a complete JPEG single valid stream is build if planarconfig is not separate (vast majority). We may one day use that to build converters to JPEG, and/or to new-style JPEG compression inside TIFF. A dissadvantage is the lack of random access to the individual striles. This is the reason for much of the complicated restart-and-position stuff inside OJPEGPreDecode. Applications would do well accessing all striles in order, as this will result in a single sequential scan of the input stream, and no restarting of LibJpeg decoding session. */ #define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN #include "tiffiop.h" #ifdef OJPEG_SUPPORT /* Configuration defines here are: * JPEG_ENCAP_EXTERNAL: The normal way to call libjpeg, uses longjump. In some environments, * like eg LibTiffDelphi, this is not possible. For this reason, the actual calls to * libjpeg, with longjump stuff, are encapsulated in dedicated functions. When * JPEG_ENCAP_EXTERNAL is defined, these encapsulating functions are declared external * to this unit, and can be defined elsewhere to use stuff other then longjump. * The default mode, without JPEG_ENCAP_EXTERNAL, implements the call encapsulators * here, internally, with normal longjump. * SETJMP, LONGJMP, JMP_BUF: On some machines/environments a longjump equivalent is * conviniently available, but still it may be worthwhile to use _setjmp or sigsetjmp * in place of plain setjmp. These macros will make it easier. It is useless * to fiddle with these if you define JPEG_ENCAP_EXTERNAL. * OJPEG_BUFFER: Define the size of the desired buffer here. Should be small enough so as to guarantee * instant processing, optimal streaming and optimal use of processor cache, but also big * enough so as to not result in significant call overhead. It should be at least a few * bytes to accomodate some structures (this is verified in asserts), but it would not be * sensible to make it this small anyway, and it should be at most 64K since it is indexed * with uint16. We recommend 2K. * EGYPTIANWALK: You could also define EGYPTIANWALK here, but it is not used anywhere and has * absolutely no effect. That is why most people insist the EGYPTIANWALK is a bit silly. */ /* define LIBJPEG_ENCAP_EXTERNAL */ #define SETJMP(jbuf) setjmp(jbuf) #define LONGJMP(jbuf,code) longjmp(jbuf,code) #define JMP_BUF jmp_buf #define OJPEG_BUFFER 2048 /* define EGYPTIANWALK */ #define JPEG_MARKER_SOF0 0xC0 #define JPEG_MARKER_SOF1 0xC1 #define JPEG_MARKER_SOF3 0xC3 #define JPEG_MARKER_DHT 0xC4 #define JPEG_MARKER_RST0 0XD0 #define JPEG_MARKER_SOI 0xD8 #define JPEG_MARKER_EOI 0xD9 #define JPEG_MARKER_SOS 0xDA #define JPEG_MARKER_DQT 0xDB #define JPEG_MARKER_DRI 0xDD #define JPEG_MARKER_APP0 0xE0 #define JPEG_MARKER_COM 0xFE #define FIELD_OJPEG_JPEGINTERCHANGEFORMAT (FIELD_CODEC+0) #define FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH (FIELD_CODEC+1) #define FIELD_OJPEG_JPEGQTABLES (FIELD_CODEC+2) #define FIELD_OJPEG_JPEGDCTABLES (FIELD_CODEC+3) #define FIELD_OJPEG_JPEGACTABLES (FIELD_CODEC+4) #define FIELD_OJPEG_JPEGPROC (FIELD_CODEC+5) #define FIELD_OJPEG_JPEGRESTARTINTERVAL (FIELD_CODEC+6) static const TIFFField ojpegFields[] = { {TIFFTAG_JPEGIFOFFSET,1,1,TIFF_LONG8,0,TIFF_SETGET_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMAT,TRUE,FALSE,"JpegInterchangeFormat",NULL}, {TIFFTAG_JPEGIFBYTECOUNT,1,1,TIFF_LONG8,0,TIFF_SETGET_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH,TRUE,FALSE,"JpegInterchangeFormatLength",NULL}, {TIFFTAG_JPEGQTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGQTABLES,FALSE,TRUE,"JpegQTables",NULL}, {TIFFTAG_JPEGDCTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGDCTABLES,FALSE,TRUE,"JpegDcTables",NULL}, {TIFFTAG_JPEGACTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGACTABLES,FALSE,TRUE,"JpegAcTables",NULL}, {TIFFTAG_JPEGPROC,1,1,TIFF_SHORT,0,TIFF_SETGET_UINT16,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGPROC,FALSE,FALSE,"JpegProc",NULL}, {TIFFTAG_JPEGRESTARTINTERVAL,1,1,TIFF_SHORT,0,TIFF_SETGET_UINT16,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGRESTARTINTERVAL,FALSE,FALSE,"JpegRestartInterval",NULL}, }; #ifndef LIBJPEG_ENCAP_EXTERNAL #include #endif /* We undefine FAR to avoid conflict with JPEG definition */ #ifdef FAR #undef FAR #endif /* Libjpeg's jmorecfg.h defines INT16 and INT32, but only if XMD_H is not defined. Unfortunately, the MinGW and Borland compilers include a typedef for INT32, which causes a conflict. MSVC does not include a conficting typedef given the headers which are included. */ #if defined(__BORLANDC__) || defined(__MINGW32__) # define XMD_H 1 #endif /* Define "boolean" as unsigned char, not int, per Windows custom. */ #if defined(__WIN32__) && !defined(__MINGW32__) # ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ typedef unsigned char boolean; # endif # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ #endif #include "jpeglib.h" #include "jerror.h" typedef struct jpeg_error_mgr jpeg_error_mgr; typedef struct jpeg_common_struct jpeg_common_struct; typedef struct jpeg_decompress_struct jpeg_decompress_struct; typedef struct jpeg_source_mgr jpeg_source_mgr; typedef enum { osibsNotSetYet, osibsJpegInterchangeFormat, osibsStrile, osibsEof } OJPEGStateInBufferSource; typedef enum { ososSoi, ososQTable0,ososQTable1,ososQTable2,ososQTable3, ososDcTable0,ososDcTable1,ososDcTable2,ososDcTable3, ososAcTable0,ososAcTable1,ososAcTable2,ososAcTable3, ososDri, ososSof, ososSos, ososCompressed, ososRst, ososEoi } OJPEGStateOutState; typedef struct { TIFF* tif; #ifndef LIBJPEG_ENCAP_EXTERNAL JMP_BUF exit_jmpbuf; #endif TIFFVGetMethod vgetparent; TIFFVSetMethod vsetparent; TIFFPrintMethod printdir; uint64 file_size; uint32 image_width; uint32 image_length; uint32 strile_width; uint32 strile_length; uint32 strile_length_total; uint8 samples_per_pixel; uint8 plane_sample_offset; uint8 samples_per_pixel_per_plane; uint64 jpeg_interchange_format; uint64 jpeg_interchange_format_length; uint8 jpeg_proc; uint8 subsamplingcorrect; uint8 subsamplingcorrect_done; uint8 subsampling_tag; uint8 subsampling_hor; uint8 subsampling_ver; uint8 subsampling_force_desubsampling_inside_decompression; uint8 qtable_offset_count; uint8 dctable_offset_count; uint8 actable_offset_count; uint64 qtable_offset[3]; uint64 dctable_offset[3]; uint64 actable_offset[3]; uint8* qtable[4]; uint8* dctable[4]; uint8* actable[4]; uint16 restart_interval; uint8 restart_index; uint8 sof_log; uint8 sof_marker_id; uint32 sof_x; uint32 sof_y; uint8 sof_c[3]; uint8 sof_hv[3]; uint8 sof_tq[3]; uint8 sos_cs[3]; uint8 sos_tda[3]; struct { uint8 log; OJPEGStateInBufferSource in_buffer_source; uint32 in_buffer_next_strile; uint64 in_buffer_file_pos; uint64 in_buffer_file_togo; } sos_end[3]; uint8 readheader_done; uint8 writeheader_done; uint16 write_cursample; uint32 write_curstrile; uint8 libjpeg_session_active; uint8 libjpeg_jpeg_query_style; jpeg_error_mgr libjpeg_jpeg_error_mgr; jpeg_decompress_struct libjpeg_jpeg_decompress_struct; jpeg_source_mgr libjpeg_jpeg_source_mgr; uint8 subsampling_convert_log; uint32 subsampling_convert_ylinelen; uint32 subsampling_convert_ylines; uint32 subsampling_convert_clinelen; uint32 subsampling_convert_clines; uint32 subsampling_convert_ybuflen; uint32 subsampling_convert_cbuflen; uint32 subsampling_convert_ycbcrbuflen; uint8* subsampling_convert_ycbcrbuf; uint8* subsampling_convert_ybuf; uint8* subsampling_convert_cbbuf; uint8* subsampling_convert_crbuf; uint32 subsampling_convert_ycbcrimagelen; uint8** subsampling_convert_ycbcrimage; uint32 subsampling_convert_clinelenout; uint32 subsampling_convert_state; uint32 bytes_per_line; /* if the codec outputs subsampled data, a 'line' in bytes_per_line */ uint32 lines_per_strile; /* and lines_per_strile means subsampling_ver desubsampled rows */ OJPEGStateInBufferSource in_buffer_source; uint32 in_buffer_next_strile; uint32 in_buffer_strile_count; uint64 in_buffer_file_pos; uint8 in_buffer_file_pos_log; uint64 in_buffer_file_togo; uint16 in_buffer_togo; uint8* in_buffer_cur; uint8 in_buffer[OJPEG_BUFFER]; OJPEGStateOutState out_state; uint8 out_buffer[OJPEG_BUFFER]; uint8* skip_buffer; } OJPEGState; static int OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap); static int OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap); static void OJPEGPrintDir(TIFF* tif, FILE* fd, long flags); static int OJPEGFixupTags(TIFF* tif); static int OJPEGSetupDecode(TIFF* tif); static int OJPEGPreDecode(TIFF* tif, uint16 s); static int OJPEGPreDecodeSkipRaw(TIFF* tif); static int OJPEGPreDecodeSkipScanlines(TIFF* tif); static int OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s); static int OJPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc); static int OJPEGDecodeScanlines(TIFF* tif, uint8* buf, tmsize_t cc); static void OJPEGPostDecode(TIFF* tif, uint8* buf, tmsize_t cc); static int OJPEGSetupEncode(TIFF* tif); static int OJPEGPreEncode(TIFF* tif, uint16 s); static int OJPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s); static int OJPEGPostEncode(TIFF* tif); static void OJPEGCleanup(TIFF* tif); static void OJPEGSubsamplingCorrect(TIFF* tif); static int OJPEGReadHeaderInfo(TIFF* tif); static int OJPEGReadSecondarySos(TIFF* tif, uint16 s); static int OJPEGWriteHeaderInfo(TIFF* tif); static void OJPEGLibjpegSessionAbort(TIFF* tif); static int OJPEGReadHeaderInfoSec(TIFF* tif); static int OJPEGReadHeaderInfoSecStreamDri(TIFF* tif); static int OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif); static int OJPEGReadHeaderInfoSecStreamDht(TIFF* tif); static int OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id); static int OJPEGReadHeaderInfoSecStreamSos(TIFF* tif); static int OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif); static int OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif); static int OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif); static int OJPEGReadBufferFill(OJPEGState* sp); static int OJPEGReadByte(OJPEGState* sp, uint8* byte); static int OJPEGReadBytePeek(OJPEGState* sp, uint8* byte); static void OJPEGReadByteAdvance(OJPEGState* sp); static int OJPEGReadWord(OJPEGState* sp, uint16* word); static int OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem); static void OJPEGReadSkip(OJPEGState* sp, uint16 len); static int OJPEGWriteStream(TIFF* tif, void** mem, uint32* len); static void OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len); static void OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len); static void OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len); static void OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len); static void OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len); static void OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len); static void OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len); static int OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len); static void OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len); static void OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len); #ifdef LIBJPEG_ENCAP_EXTERNAL extern int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo); extern int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image); extern int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo); extern int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines); extern int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines); extern void jpeg_encap_unwind(TIFF* tif); #else static int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* j); static int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image); static int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo); static int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines); static int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines); static void jpeg_encap_unwind(TIFF* tif); #endif static void OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo); static void OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo); static void OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo); static boolean OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo); static void OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes); static boolean OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired); static void OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo); int TIFFInitOJPEG(TIFF* tif, int scheme) { static const char module[]="TIFFInitOJPEG"; OJPEGState* sp; assert(scheme==COMPRESSION_OJPEG); /* * Merge codec-specific tag information. */ if (!_TIFFMergeFields(tif, ojpegFields, TIFFArrayCount(ojpegFields))) { TIFFErrorExt(tif->tif_clientdata, module, "Merging Old JPEG codec-specific tags failed"); return 0; } /* state block */ sp=_TIFFmalloc(sizeof(OJPEGState)); if (sp==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"No space for OJPEG state block"); return(0); } _TIFFmemset(sp,0,sizeof(OJPEGState)); sp->tif=tif; sp->jpeg_proc=1; sp->subsampling_hor=2; sp->subsampling_ver=2; TIFFSetField(tif,TIFFTAG_YCBCRSUBSAMPLING,2,2); /* tif codec methods */ tif->tif_fixuptags=OJPEGFixupTags; tif->tif_setupdecode=OJPEGSetupDecode; tif->tif_predecode=OJPEGPreDecode; tif->tif_postdecode=OJPEGPostDecode; tif->tif_decoderow=OJPEGDecode; tif->tif_decodestrip=OJPEGDecode; tif->tif_decodetile=OJPEGDecode; tif->tif_setupencode=OJPEGSetupEncode; tif->tif_preencode=OJPEGPreEncode; tif->tif_postencode=OJPEGPostEncode; tif->tif_encoderow=OJPEGEncode; tif->tif_encodestrip=OJPEGEncode; tif->tif_encodetile=OJPEGEncode; tif->tif_cleanup=OJPEGCleanup; tif->tif_data=(uint8*)sp; /* tif tag methods */ sp->vgetparent=tif->tif_tagmethods.vgetfield; tif->tif_tagmethods.vgetfield=OJPEGVGetField; sp->vsetparent=tif->tif_tagmethods.vsetfield; tif->tif_tagmethods.vsetfield=OJPEGVSetField; sp->printdir=tif->tif_tagmethods.printdir; tif->tif_tagmethods.printdir=OJPEGPrintDir; /* Some OJPEG files don't have strip or tile offsets or bytecounts tags. Some others do, but have totally meaningless or corrupt values in these tags. In these cases, the JpegInterchangeFormat stream is reliable. In any case, this decoder reads the compressed data itself, from the most reliable locations, and we need to notify encapsulating LibTiff not to read raw strips or tiles for us. */ tif->tif_flags|=TIFF_NOREADRAW; return(1); } static int OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap) { OJPEGState* sp=(OJPEGState*)tif->tif_data; switch(tag) { case TIFFTAG_JPEGIFOFFSET: *va_arg(ap,uint64*)=(uint64)sp->jpeg_interchange_format; break; case TIFFTAG_JPEGIFBYTECOUNT: *va_arg(ap,uint64*)=(uint64)sp->jpeg_interchange_format_length; break; case TIFFTAG_YCBCRSUBSAMPLING: if (sp->subsamplingcorrect_done==0) OJPEGSubsamplingCorrect(tif); *va_arg(ap,uint16*)=(uint16)sp->subsampling_hor; *va_arg(ap,uint16*)=(uint16)sp->subsampling_ver; break; case TIFFTAG_JPEGQTABLES: *va_arg(ap,uint32*)=(uint32)sp->qtable_offset_count; *va_arg(ap,void**)=(void*)sp->qtable_offset; break; case TIFFTAG_JPEGDCTABLES: *va_arg(ap,uint32*)=(uint32)sp->dctable_offset_count; *va_arg(ap,void**)=(void*)sp->dctable_offset; break; case TIFFTAG_JPEGACTABLES: *va_arg(ap,uint32*)=(uint32)sp->actable_offset_count; *va_arg(ap,void**)=(void*)sp->actable_offset; break; case TIFFTAG_JPEGPROC: *va_arg(ap,uint16*)=(uint16)sp->jpeg_proc; break; case TIFFTAG_JPEGRESTARTINTERVAL: *va_arg(ap,uint16*)=sp->restart_interval; break; default: return (*sp->vgetparent)(tif,tag,ap); } return (1); } static int OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap) { static const char module[]="OJPEGVSetField"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint32 ma; uint64* mb; uint32 n; switch(tag) { case TIFFTAG_JPEGIFOFFSET: sp->jpeg_interchange_format=(uint64)va_arg(ap,uint64); break; case TIFFTAG_JPEGIFBYTECOUNT: sp->jpeg_interchange_format_length=(uint64)va_arg(ap,uint64); break; case TIFFTAG_YCBCRSUBSAMPLING: sp->subsampling_tag=1; sp->subsampling_hor=(uint8)va_arg(ap,uint16_vap); sp->subsampling_ver=(uint8)va_arg(ap,uint16_vap); tif->tif_dir.td_ycbcrsubsampling[0]=sp->subsampling_hor; tif->tif_dir.td_ycbcrsubsampling[1]=sp->subsampling_ver; break; case TIFFTAG_JPEGQTABLES: ma=(uint32)va_arg(ap,uint32); if (ma!=0) { if (ma>3) { TIFFErrorExt(tif->tif_clientdata,module,"JpegQTables tag has incorrect count"); return(0); } sp->qtable_offset_count=(uint8)ma; mb=(uint64*)va_arg(ap,uint64*); for (n=0; nqtable_offset[n]=mb[n]; } break; case TIFFTAG_JPEGDCTABLES: ma=(uint32)va_arg(ap,uint32); if (ma!=0) { if (ma>3) { TIFFErrorExt(tif->tif_clientdata,module,"JpegDcTables tag has incorrect count"); return(0); } sp->dctable_offset_count=(uint8)ma; mb=(uint64*)va_arg(ap,uint64*); for (n=0; ndctable_offset[n]=mb[n]; } break; case TIFFTAG_JPEGACTABLES: ma=(uint32)va_arg(ap,uint32); if (ma!=0) { if (ma>3) { TIFFErrorExt(tif->tif_clientdata,module,"JpegAcTables tag has incorrect count"); return(0); } sp->actable_offset_count=(uint8)ma; mb=(uint64*)va_arg(ap,uint64*); for (n=0; nactable_offset[n]=mb[n]; } break; case TIFFTAG_JPEGPROC: sp->jpeg_proc=(uint8)va_arg(ap,uint16_vap); break; case TIFFTAG_JPEGRESTARTINTERVAL: sp->restart_interval=(uint16)va_arg(ap,uint16_vap); break; default: return (*sp->vsetparent)(tif,tag,ap); } TIFFSetFieldBit(tif,TIFFFieldWithTag(tif,tag)->field_bit); tif->tif_flags|=TIFF_DIRTYDIRECT; return(1); } static void OJPEGPrintDir(TIFF* tif, FILE* fd, long flags) { OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8 m; (void)flags; assert(sp!=NULL); if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMAT)) fprintf(fd," JpegInterchangeFormat: " TIFF_UINT64_FORMAT "\n",(TIFF_UINT64_T)sp->jpeg_interchange_format); if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH)) fprintf(fd," JpegInterchangeFormatLength: " TIFF_UINT64_FORMAT "\n",(TIFF_UINT64_T)sp->jpeg_interchange_format_length); if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGQTABLES)) { fprintf(fd," JpegQTables:"); for (m=0; mqtable_offset_count; m++) fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->qtable_offset[m]); fprintf(fd,"\n"); } if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGDCTABLES)) { fprintf(fd," JpegDcTables:"); for (m=0; mdctable_offset_count; m++) fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->dctable_offset[m]); fprintf(fd,"\n"); } if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGACTABLES)) { fprintf(fd," JpegAcTables:"); for (m=0; mactable_offset_count; m++) fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->actable_offset[m]); fprintf(fd,"\n"); } if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGPROC)) fprintf(fd," JpegProc: %u\n",(unsigned int)sp->jpeg_proc); if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGRESTARTINTERVAL)) fprintf(fd," JpegRestartInterval: %u\n",(unsigned int)sp->restart_interval); if (sp->printdir) (*sp->printdir)(tif, fd, flags); } static int OJPEGFixupTags(TIFF* tif) { (void) tif; return(1); } static int OJPEGSetupDecode(TIFF* tif) { static const char module[]="OJPEGSetupDecode"; TIFFWarningExt(tif->tif_clientdata,module,"Depreciated and troublesome old-style JPEG compression mode, please convert to new-style JPEG compression and notify vendor of writing software"); return(1); } static int OJPEGPreDecode(TIFF* tif, uint16 s) { OJPEGState* sp=(OJPEGState*)tif->tif_data; uint32 m; if (sp->subsamplingcorrect_done==0) OJPEGSubsamplingCorrect(tif); if (sp->readheader_done==0) { if (OJPEGReadHeaderInfo(tif)==0) return(0); } if (sp->sos_end[s].log==0) { if (OJPEGReadSecondarySos(tif,s)==0) return(0); } if isTiled(tif) m=tif->tif_curtile; else m=tif->tif_curstrip; if ((sp->writeheader_done!=0) && ((sp->write_cursample!=s) || (sp->write_curstrile>m))) { if (sp->libjpeg_session_active!=0) OJPEGLibjpegSessionAbort(tif); sp->writeheader_done=0; } if (sp->writeheader_done==0) { sp->plane_sample_offset=(uint8)s; sp->write_cursample=s; sp->write_curstrile=s*tif->tif_dir.td_stripsperimage; if ((sp->in_buffer_file_pos_log==0) || (sp->in_buffer_file_pos-sp->in_buffer_togo!=sp->sos_end[s].in_buffer_file_pos)) { sp->in_buffer_source=sp->sos_end[s].in_buffer_source; sp->in_buffer_next_strile=sp->sos_end[s].in_buffer_next_strile; sp->in_buffer_file_pos=sp->sos_end[s].in_buffer_file_pos; sp->in_buffer_file_pos_log=0; sp->in_buffer_file_togo=sp->sos_end[s].in_buffer_file_togo; sp->in_buffer_togo=0; sp->in_buffer_cur=0; } if (OJPEGWriteHeaderInfo(tif)==0) return(0); } while (sp->write_curstrilelibjpeg_jpeg_query_style==0) { if (OJPEGPreDecodeSkipRaw(tif)==0) return(0); } else { if (OJPEGPreDecodeSkipScanlines(tif)==0) return(0); } sp->write_curstrile++; } return(1); } static int OJPEGPreDecodeSkipRaw(TIFF* tif) { OJPEGState* sp=(OJPEGState*)tif->tif_data; uint32 m; m=sp->lines_per_strile; if (sp->subsampling_convert_state!=0) { if (sp->subsampling_convert_clines-sp->subsampling_convert_state>=m) { sp->subsampling_convert_state+=m; if (sp->subsampling_convert_state==sp->subsampling_convert_clines) sp->subsampling_convert_state=0; return(1); } m-=sp->subsampling_convert_clines-sp->subsampling_convert_state; sp->subsampling_convert_state=0; } while (m>=sp->subsampling_convert_clines) { if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0) return(0); m-=sp->subsampling_convert_clines; } if (m>0) { if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0) return(0); sp->subsampling_convert_state=m; } return(1); } static int OJPEGPreDecodeSkipScanlines(TIFF* tif) { static const char module[]="OJPEGPreDecodeSkipScanlines"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint32 m; if (sp->skip_buffer==NULL) { sp->skip_buffer=_TIFFmalloc(sp->bytes_per_line); if (sp->skip_buffer==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } } for (m=0; mlines_per_strile; m++) { if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),&sp->skip_buffer,1)==0) return(0); } return(1); } static int OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) { OJPEGState* sp=(OJPEGState*)tif->tif_data; (void)s; if (sp->libjpeg_jpeg_query_style==0) { if (OJPEGDecodeRaw(tif,buf,cc)==0) return(0); } else { if (OJPEGDecodeScanlines(tif,buf,cc)==0) return(0); } return(1); } static int OJPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc) { static const char module[]="OJPEGDecodeRaw"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8* m; tmsize_t n; uint8* oy; uint8* ocb; uint8* ocr; uint8* p; uint32 q; uint8* r; uint8 sx,sy; if (cc%sp->bytes_per_line!=0) { TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not read"); return(0); } assert(cc>0); m=buf; n=cc; do { if (sp->subsampling_convert_state==0) { if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0) return(0); } oy=sp->subsampling_convert_ybuf+sp->subsampling_convert_state*sp->subsampling_ver*sp->subsampling_convert_ylinelen; ocb=sp->subsampling_convert_cbbuf+sp->subsampling_convert_state*sp->subsampling_convert_clinelen; ocr=sp->subsampling_convert_crbuf+sp->subsampling_convert_state*sp->subsampling_convert_clinelen; p=m; for (q=0; qsubsampling_convert_clinelenout; q++) { r=oy; for (sy=0; sysubsampling_ver; sy++) { for (sx=0; sxsubsampling_hor; sx++) *p++=*r++; r+=sp->subsampling_convert_ylinelen-sp->subsampling_hor; } oy+=sp->subsampling_hor; *p++=*ocb++; *p++=*ocr++; } sp->subsampling_convert_state++; if (sp->subsampling_convert_state==sp->subsampling_convert_clines) sp->subsampling_convert_state=0; m+=sp->bytes_per_line; n-=sp->bytes_per_line; } while(n>0); return(1); } static int OJPEGDecodeScanlines(TIFF* tif, uint8* buf, tmsize_t cc) { static const char module[]="OJPEGDecodeScanlines"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8* m; tmsize_t n; if (cc%sp->bytes_per_line!=0) { TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not read"); return(0); } assert(cc>0); m=buf; n=cc; do { if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),&m,1)==0) return(0); m+=sp->bytes_per_line; n-=sp->bytes_per_line; } while(n>0); return(1); } static void OJPEGPostDecode(TIFF* tif, uint8* buf, tmsize_t cc) { OJPEGState* sp=(OJPEGState*)tif->tif_data; (void)buf; (void)cc; sp->write_curstrile++; if (sp->write_curstrile%tif->tif_dir.td_stripsperimage==0) { assert(sp->libjpeg_session_active!=0); OJPEGLibjpegSessionAbort(tif); sp->writeheader_done=0; } } static int OJPEGSetupEncode(TIFF* tif) { static const char module[]="OJPEGSetupEncode"; TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead"); return(0); } static int OJPEGPreEncode(TIFF* tif, uint16 s) { static const char module[]="OJPEGPreEncode"; (void)s; TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead"); return(0); } static int OJPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) { static const char module[]="OJPEGEncode"; (void)buf; (void)cc; (void)s; TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead"); return(0); } static int OJPEGPostEncode(TIFF* tif) { static const char module[]="OJPEGPostEncode"; TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead"); return(0); } static void OJPEGCleanup(TIFF* tif) { OJPEGState* sp=(OJPEGState*)tif->tif_data; if (sp!=0) { tif->tif_tagmethods.vgetfield=sp->vgetparent; tif->tif_tagmethods.vsetfield=sp->vsetparent; tif->tif_tagmethods.printdir=sp->printdir; if (sp->qtable[0]!=0) _TIFFfree(sp->qtable[0]); if (sp->qtable[1]!=0) _TIFFfree(sp->qtable[1]); if (sp->qtable[2]!=0) _TIFFfree(sp->qtable[2]); if (sp->qtable[3]!=0) _TIFFfree(sp->qtable[3]); if (sp->dctable[0]!=0) _TIFFfree(sp->dctable[0]); if (sp->dctable[1]!=0) _TIFFfree(sp->dctable[1]); if (sp->dctable[2]!=0) _TIFFfree(sp->dctable[2]); if (sp->dctable[3]!=0) _TIFFfree(sp->dctable[3]); if (sp->actable[0]!=0) _TIFFfree(sp->actable[0]); if (sp->actable[1]!=0) _TIFFfree(sp->actable[1]); if (sp->actable[2]!=0) _TIFFfree(sp->actable[2]); if (sp->actable[3]!=0) _TIFFfree(sp->actable[3]); if (sp->libjpeg_session_active!=0) OJPEGLibjpegSessionAbort(tif); if (sp->subsampling_convert_ycbcrbuf!=0) _TIFFfree(sp->subsampling_convert_ycbcrbuf); if (sp->subsampling_convert_ycbcrimage!=0) _TIFFfree(sp->subsampling_convert_ycbcrimage); if (sp->skip_buffer!=0) _TIFFfree(sp->skip_buffer); _TIFFfree(sp); tif->tif_data=NULL; _TIFFSetDefaultCompressionState(tif); } } static void OJPEGSubsamplingCorrect(TIFF* tif) { static const char module[]="OJPEGSubsamplingCorrect"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8 mh; uint8 mv; _TIFFFillStriles( tif ); assert(sp->subsamplingcorrect_done==0); if ((tif->tif_dir.td_samplesperpixel!=3) || ((tif->tif_dir.td_photometric!=PHOTOMETRIC_YCBCR) && (tif->tif_dir.td_photometric!=PHOTOMETRIC_ITULAB))) { if (sp->subsampling_tag!=0) TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag not appropriate for this Photometric and/or SamplesPerPixel"); sp->subsampling_hor=1; sp->subsampling_ver=1; sp->subsampling_force_desubsampling_inside_decompression=0; } else { sp->subsamplingcorrect_done=1; mh=sp->subsampling_hor; mv=sp->subsampling_ver; sp->subsamplingcorrect=1; OJPEGReadHeaderInfoSec(tif); if (sp->subsampling_force_desubsampling_inside_decompression!=0) { sp->subsampling_hor=1; sp->subsampling_ver=1; } sp->subsamplingcorrect=0; if (((sp->subsampling_hor!=mh) || (sp->subsampling_ver!=mv)) && (sp->subsampling_force_desubsampling_inside_decompression==0)) { if (sp->subsampling_tag==0) TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag is not set, yet subsampling inside JPEG data [%d,%d] does not match default values [2,2]; assuming subsampling inside JPEG data is correct",sp->subsampling_hor,sp->subsampling_ver); else TIFFWarningExt(tif->tif_clientdata,module,"Subsampling inside JPEG data [%d,%d] does not match subsampling tag values [%d,%d]; assuming subsampling inside JPEG data is correct",sp->subsampling_hor,sp->subsampling_ver,mh,mv); } if (sp->subsampling_force_desubsampling_inside_decompression!=0) { if (sp->subsampling_tag==0) TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag is not set, yet subsampling inside JPEG data does not match default values [2,2] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression"); else TIFFWarningExt(tif->tif_clientdata,module,"Subsampling inside JPEG data does not match subsampling tag values [%d,%d] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression",mh,mv); } if (sp->subsampling_force_desubsampling_inside_decompression==0) { if (sp->subsampling_horsubsampling_ver) TIFFWarningExt(tif->tif_clientdata,module,"Subsampling values [%d,%d] are not allowed in TIFF",sp->subsampling_hor,sp->subsampling_ver); } } sp->subsamplingcorrect_done=1; } static int OJPEGReadHeaderInfo(TIFF* tif) { static const char module[]="OJPEGReadHeaderInfo"; OJPEGState* sp=(OJPEGState*)tif->tif_data; assert(sp->readheader_done==0); sp->image_width=tif->tif_dir.td_imagewidth; sp->image_length=tif->tif_dir.td_imagelength; if isTiled(tif) { sp->strile_width=tif->tif_dir.td_tilewidth; sp->strile_length=tif->tif_dir.td_tilelength; sp->strile_length_total=((sp->image_length+sp->strile_length-1)/sp->strile_length)*sp->strile_length; } else { sp->strile_width=sp->image_width; sp->strile_length=tif->tif_dir.td_rowsperstrip; sp->strile_length_total=sp->image_length; } if (tif->tif_dir.td_samplesperpixel==1) { sp->samples_per_pixel=1; sp->plane_sample_offset=0; sp->samples_per_pixel_per_plane=sp->samples_per_pixel; sp->subsampling_hor=1; sp->subsampling_ver=1; } else { if (tif->tif_dir.td_samplesperpixel!=3) { TIFFErrorExt(tif->tif_clientdata,module,"SamplesPerPixel %d not supported for this compression scheme",sp->samples_per_pixel); return(0); } sp->samples_per_pixel=3; sp->plane_sample_offset=0; if (tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG) sp->samples_per_pixel_per_plane=3; else sp->samples_per_pixel_per_plane=1; } if (sp->strile_lengthimage_length) { if (sp->strile_length%(sp->subsampling_ver*8)!=0) { TIFFErrorExt(tif->tif_clientdata,module,"Incompatible vertical subsampling and image strip/tile length"); return(0); } sp->restart_interval=((sp->strile_width+sp->subsampling_hor*8-1)/(sp->subsampling_hor*8))*(sp->strile_length/(sp->subsampling_ver*8)); } if (OJPEGReadHeaderInfoSec(tif)==0) return(0); sp->sos_end[0].log=1; sp->sos_end[0].in_buffer_source=sp->in_buffer_source; sp->sos_end[0].in_buffer_next_strile=sp->in_buffer_next_strile; sp->sos_end[0].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_togo; sp->sos_end[0].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer_togo; sp->readheader_done=1; return(1); } static int OJPEGReadSecondarySos(TIFF* tif, uint16 s) { OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8 m; assert(s>0); assert(s<3); assert(sp->sos_end[0].log!=0); assert(sp->sos_end[s].log==0); sp->plane_sample_offset=s-1; while(sp->sos_end[sp->plane_sample_offset].log==0) sp->plane_sample_offset--; sp->in_buffer_source=sp->sos_end[sp->plane_sample_offset].in_buffer_source; sp->in_buffer_next_strile=sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile; sp->in_buffer_file_pos=sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos; sp->in_buffer_file_pos_log=0; sp->in_buffer_file_togo=sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo; sp->in_buffer_togo=0; sp->in_buffer_cur=0; while(sp->plane_sample_offsetplane_sample_offset++; if (OJPEGReadHeaderInfoSecStreamSos(tif)==0) return(0); sp->sos_end[sp->plane_sample_offset].log=1; sp->sos_end[sp->plane_sample_offset].in_buffer_source=sp->in_buffer_source; sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile=sp->in_buffer_next_strile; sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_togo; sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer_togo; } return(1); } static int OJPEGWriteHeaderInfo(TIFF* tif) { static const char module[]="OJPEGWriteHeaderInfo"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8** m; uint32 n; /* if a previous attempt failed, don't try again */ if (sp->libjpeg_session_active != 0) return 0; sp->out_state=ososSoi; sp->restart_index=0; jpeg_std_error(&(sp->libjpeg_jpeg_error_mgr)); sp->libjpeg_jpeg_error_mgr.output_message=OJPEGLibjpegJpegErrorMgrOutputMessage; sp->libjpeg_jpeg_error_mgr.error_exit=OJPEGLibjpegJpegErrorMgrErrorExit; sp->libjpeg_jpeg_decompress_struct.err=&(sp->libjpeg_jpeg_error_mgr); sp->libjpeg_jpeg_decompress_struct.client_data=(void*)tif; if (jpeg_create_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0) return(0); sp->libjpeg_session_active=1; sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=0; sp->libjpeg_jpeg_source_mgr.init_source=OJPEGLibjpegJpegSourceMgrInitSource; sp->libjpeg_jpeg_source_mgr.fill_input_buffer=OJPEGLibjpegJpegSourceMgrFillInputBuffer; sp->libjpeg_jpeg_source_mgr.skip_input_data=OJPEGLibjpegJpegSourceMgrSkipInputData; sp->libjpeg_jpeg_source_mgr.resync_to_restart=OJPEGLibjpegJpegSourceMgrResyncToRestart; sp->libjpeg_jpeg_source_mgr.term_source=OJPEGLibjpegJpegSourceMgrTermSource; sp->libjpeg_jpeg_decompress_struct.src=&(sp->libjpeg_jpeg_source_mgr); if (jpeg_read_header_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),1)==0) return(0); if ((sp->subsampling_force_desubsampling_inside_decompression==0) && (sp->samples_per_pixel_per_plane>1)) { sp->libjpeg_jpeg_decompress_struct.raw_data_out=1; #if JPEG_LIB_VERSION >= 70 sp->libjpeg_jpeg_decompress_struct.do_fancy_upsampling=FALSE; #endif sp->libjpeg_jpeg_query_style=0; if (sp->subsampling_convert_log==0) { assert(sp->subsampling_convert_ycbcrbuf==0); assert(sp->subsampling_convert_ycbcrimage==0); sp->subsampling_convert_ylinelen=((sp->strile_width+sp->subsampling_hor*8-1)/(sp->subsampling_hor*8)*sp->subsampling_hor*8); sp->subsampling_convert_ylines=sp->subsampling_ver*8; sp->subsampling_convert_clinelen=sp->subsampling_convert_ylinelen/sp->subsampling_hor; sp->subsampling_convert_clines=8; sp->subsampling_convert_ybuflen=sp->subsampling_convert_ylinelen*sp->subsampling_convert_ylines; sp->subsampling_convert_cbuflen=sp->subsampling_convert_clinelen*sp->subsampling_convert_clines; sp->subsampling_convert_ycbcrbuflen=sp->subsampling_convert_ybuflen+2*sp->subsampling_convert_cbuflen; sp->subsampling_convert_ycbcrbuf=_TIFFmalloc(sp->subsampling_convert_ycbcrbuflen); if (sp->subsampling_convert_ycbcrbuf==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } sp->subsampling_convert_ybuf=sp->subsampling_convert_ycbcrbuf; sp->subsampling_convert_cbbuf=sp->subsampling_convert_ybuf+sp->subsampling_convert_ybuflen; sp->subsampling_convert_crbuf=sp->subsampling_convert_cbbuf+sp->subsampling_convert_cbuflen; sp->subsampling_convert_ycbcrimagelen=3+sp->subsampling_convert_ylines+2*sp->subsampling_convert_clines; sp->subsampling_convert_ycbcrimage=_TIFFmalloc(sp->subsampling_convert_ycbcrimagelen*sizeof(uint8*)); if (sp->subsampling_convert_ycbcrimage==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } m=sp->subsampling_convert_ycbcrimage; *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3); *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->subsampling_convert_ylines); *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->subsampling_convert_ylines+sp->subsampling_convert_clines); for (n=0; nsubsampling_convert_ylines; n++) *m++=sp->subsampling_convert_ybuf+n*sp->subsampling_convert_ylinelen; for (n=0; nsubsampling_convert_clines; n++) *m++=sp->subsampling_convert_cbbuf+n*sp->subsampling_convert_clinelen; for (n=0; nsubsampling_convert_clines; n++) *m++=sp->subsampling_convert_crbuf+n*sp->subsampling_convert_clinelen; sp->subsampling_convert_clinelenout=((sp->strile_width+sp->subsampling_hor-1)/sp->subsampling_hor); sp->subsampling_convert_state=0; sp->bytes_per_line=sp->subsampling_convert_clinelenout*(sp->subsampling_ver*sp->subsampling_hor+2); sp->lines_per_strile=((sp->strile_length+sp->subsampling_ver-1)/sp->subsampling_ver); sp->subsampling_convert_log=1; } } else { sp->libjpeg_jpeg_decompress_struct.jpeg_color_space=JCS_UNKNOWN; sp->libjpeg_jpeg_decompress_struct.out_color_space=JCS_UNKNOWN; sp->libjpeg_jpeg_query_style=1; sp->bytes_per_line=sp->samples_per_pixel_per_plane*sp->strile_width; sp->lines_per_strile=sp->strile_length; } if (jpeg_start_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0) return(0); sp->writeheader_done=1; return(1); } static void OJPEGLibjpegSessionAbort(TIFF* tif) { OJPEGState* sp=(OJPEGState*)tif->tif_data; assert(sp->libjpeg_session_active!=0); jpeg_destroy((jpeg_common_struct*)(&(sp->libjpeg_jpeg_decompress_struct))); sp->libjpeg_session_active=0; } static int OJPEGReadHeaderInfoSec(TIFF* tif) { static const char module[]="OJPEGReadHeaderInfoSec"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8 m; uint16 n; uint8 o; if (sp->file_size==0) sp->file_size=TIFFGetFileSize(tif); if (sp->jpeg_interchange_format!=0) { if (sp->jpeg_interchange_format>=sp->file_size) { sp->jpeg_interchange_format=0; sp->jpeg_interchange_format_length=0; } else { if ((sp->jpeg_interchange_format_length==0) || (sp->jpeg_interchange_format+sp->jpeg_interchange_format_length>sp->file_size)) sp->jpeg_interchange_format_length=sp->file_size-sp->jpeg_interchange_format; } } sp->in_buffer_source=osibsNotSetYet; sp->in_buffer_next_strile=0; sp->in_buffer_strile_count=tif->tif_dir.td_nstrips; sp->in_buffer_file_togo=0; sp->in_buffer_togo=0; do { if (OJPEGReadBytePeek(sp,&m)==0) return(0); if (m!=255) break; OJPEGReadByteAdvance(sp); do { if (OJPEGReadByte(sp,&m)==0) return(0); } while(m==255); switch(m) { case JPEG_MARKER_SOI: /* this type of marker has no data, and should be skipped */ break; case JPEG_MARKER_COM: case JPEG_MARKER_APP0: case JPEG_MARKER_APP0+1: case JPEG_MARKER_APP0+2: case JPEG_MARKER_APP0+3: case JPEG_MARKER_APP0+4: case JPEG_MARKER_APP0+5: case JPEG_MARKER_APP0+6: case JPEG_MARKER_APP0+7: case JPEG_MARKER_APP0+8: case JPEG_MARKER_APP0+9: case JPEG_MARKER_APP0+10: case JPEG_MARKER_APP0+11: case JPEG_MARKER_APP0+12: case JPEG_MARKER_APP0+13: case JPEG_MARKER_APP0+14: case JPEG_MARKER_APP0+15: /* this type of marker has data, but it has no use to us (and no place here) and should be skipped */ if (OJPEGReadWord(sp,&n)==0) return(0); if (n<2) { if (sp->subsamplingcorrect==0) TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data"); return(0); } if (n>2) OJPEGReadSkip(sp,n-2); break; case JPEG_MARKER_DRI: if (OJPEGReadHeaderInfoSecStreamDri(tif)==0) return(0); break; case JPEG_MARKER_DQT: if (OJPEGReadHeaderInfoSecStreamDqt(tif)==0) return(0); break; case JPEG_MARKER_DHT: if (OJPEGReadHeaderInfoSecStreamDht(tif)==0) return(0); break; case JPEG_MARKER_SOF0: case JPEG_MARKER_SOF1: case JPEG_MARKER_SOF3: if (OJPEGReadHeaderInfoSecStreamSof(tif,m)==0) return(0); if (sp->subsamplingcorrect!=0) return(1); break; case JPEG_MARKER_SOS: if (sp->subsamplingcorrect!=0) return(1); assert(sp->plane_sample_offset==0); if (OJPEGReadHeaderInfoSecStreamSos(tif)==0) return(0); break; default: TIFFErrorExt(tif->tif_clientdata,module,"Unknown marker type %d in JPEG data",m); return(0); } } while(m!=JPEG_MARKER_SOS); if (sp->subsamplingcorrect) return(1); if (sp->sof_log==0) { if (OJPEGReadHeaderInfoSecTablesQTable(tif)==0) return(0); sp->sof_marker_id=JPEG_MARKER_SOF0; for (o=0; osamples_per_pixel; o++) sp->sof_c[o]=o; sp->sof_hv[0]=((sp->subsampling_hor<<4)|sp->subsampling_ver); for (o=1; osamples_per_pixel; o++) sp->sof_hv[o]=17; sp->sof_x=sp->strile_width; sp->sof_y=sp->strile_length_total; sp->sof_log=1; if (OJPEGReadHeaderInfoSecTablesDcTable(tif)==0) return(0); if (OJPEGReadHeaderInfoSecTablesAcTable(tif)==0) return(0); for (o=1; osamples_per_pixel; o++) sp->sos_cs[o]=o; } return(1); } static int OJPEGReadHeaderInfoSecStreamDri(TIFF* tif) { /* this could easilly cause trouble in some cases... but no such cases have occured sofar */ static const char module[]="OJPEGReadHeaderInfoSecStreamDri"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint16 m; if (OJPEGReadWord(sp,&m)==0) return(0); if (m!=4) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DRI marker in JPEG data"); return(0); } if (OJPEGReadWord(sp,&m)==0) return(0); sp->restart_interval=m; return(1); } static int OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif) { /* this is a table marker, and it is to be saved as a whole for exact pushing on the jpeg stream later on */ static const char module[]="OJPEGReadHeaderInfoSecStreamDqt"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint16 m; uint32 na; uint8* nb; uint8 o; if (OJPEGReadWord(sp,&m)==0) return(0); if (m<=2) { if (sp->subsamplingcorrect==0) TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data"); return(0); } if (sp->subsamplingcorrect!=0) OJPEGReadSkip(sp,m-2); else { m-=2; do { if (m<65) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data"); return(0); } na=sizeof(uint32)+69; nb=_TIFFmalloc(na); if (nb==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } *(uint32*)nb=na; nb[sizeof(uint32)]=255; nb[sizeof(uint32)+1]=JPEG_MARKER_DQT; nb[sizeof(uint32)+2]=0; nb[sizeof(uint32)+3]=67; if (OJPEGReadBlock(sp,65,&nb[sizeof(uint32)+4])==0) { _TIFFfree(nb); return(0); } o=nb[sizeof(uint32)+4]&15; if (3tif_clientdata,module,"Corrupt DQT marker in JPEG data"); _TIFFfree(nb); return(0); } if (sp->qtable[o]!=0) _TIFFfree(sp->qtable[o]); sp->qtable[o]=nb; m-=65; } while(m>0); } return(1); } static int OJPEGReadHeaderInfoSecStreamDht(TIFF* tif) { /* this is a table marker, and it is to be saved as a whole for exact pushing on the jpeg stream later on */ /* TODO: the following assumes there is only one table in this marker... but i'm not quite sure that assumption is guaranteed correct */ static const char module[]="OJPEGReadHeaderInfoSecStreamDht"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint16 m; uint32 na; uint8* nb; uint8 o; if (OJPEGReadWord(sp,&m)==0) return(0); if (m<=2) { if (sp->subsamplingcorrect==0) TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data"); return(0); } if (sp->subsamplingcorrect!=0) { OJPEGReadSkip(sp,m-2); } else { na=sizeof(uint32)+2+m; nb=_TIFFmalloc(na); if (nb==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } *(uint32*)nb=na; nb[sizeof(uint32)]=255; nb[sizeof(uint32)+1]=JPEG_MARKER_DHT; nb[sizeof(uint32)+2]=(m>>8); nb[sizeof(uint32)+3]=(m&255); if (OJPEGReadBlock(sp,m-2,&nb[sizeof(uint32)+4])==0) return(0); o=nb[sizeof(uint32)+4]; if ((o&240)==0) { if (3tif_clientdata,module,"Corrupt DHT marker in JPEG data"); return(0); } if (sp->dctable[o]!=0) _TIFFfree(sp->dctable[o]); sp->dctable[o]=nb; } else { if ((o&240)!=16) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data"); return(0); } o&=15; if (3tif_clientdata,module,"Corrupt DHT marker in JPEG data"); return(0); } if (sp->actable[o]!=0) _TIFFfree(sp->actable[o]); sp->actable[o]=nb; } } return(1); } static int OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id) { /* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */ static const char module[]="OJPEGReadHeaderInfoSecStreamSof"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint16 m; uint16 n; uint8 o; uint16 p; uint16 q; if (sp->sof_log!=0) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data"); return(0); } if (sp->subsamplingcorrect==0) sp->sof_marker_id=marker_id; /* Lf: data length */ if (OJPEGReadWord(sp,&m)==0) return(0); if (m<11) { if (sp->subsamplingcorrect==0) TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data"); return(0); } m-=8; if (m%3!=0) { if (sp->subsamplingcorrect==0) TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data"); return(0); } n=m/3; if (sp->subsamplingcorrect==0) { if (n!=sp->samples_per_pixel) { TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected number of samples"); return(0); } } /* P: Sample precision */ if (OJPEGReadByte(sp,&o)==0) return(0); if (o!=8) { if (sp->subsamplingcorrect==0) TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected number of bits per sample"); return(0); } /* Y: Number of lines, X: Number of samples per line */ if (sp->subsamplingcorrect) OJPEGReadSkip(sp,4); else { /* Y: Number of lines */ if (OJPEGReadWord(sp,&p)==0) return(0); if (((uint32)pimage_length) && ((uint32)pstrile_length_total)) { TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected height"); return(0); } sp->sof_y=p; /* X: Number of samples per line */ if (OJPEGReadWord(sp,&p)==0) return(0); if (((uint32)pimage_width) && ((uint32)pstrile_width)) { TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected width"); return(0); } if ((uint32)p>sp->strile_width) { TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data image width exceeds expected image width"); return(0); } sp->sof_x=p; } /* Nf: Number of image components in frame */ if (OJPEGReadByte(sp,&o)==0) return(0); if (o!=n) { if (sp->subsamplingcorrect==0) TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data"); return(0); } /* per component stuff */ /* TODO: double-check that flow implies that n cannot be as big as to make us overflow sof_c, sof_hv and sof_tq arrays */ for (q=0; qsubsamplingcorrect==0) sp->sof_c[q]=o; /* H: Horizontal sampling factor, and V: Vertical sampling factor */ if (OJPEGReadByte(sp,&o)==0) return(0); if (sp->subsamplingcorrect!=0) { if (q==0) { sp->subsampling_hor=(o>>4); sp->subsampling_ver=(o&15); if (((sp->subsampling_hor!=1) && (sp->subsampling_hor!=2) && (sp->subsampling_hor!=4)) || ((sp->subsampling_ver!=1) && (sp->subsampling_ver!=2) && (sp->subsampling_ver!=4))) sp->subsampling_force_desubsampling_inside_decompression=1; } else { if (o!=17) sp->subsampling_force_desubsampling_inside_decompression=1; } } else { sp->sof_hv[q]=o; if (sp->subsampling_force_desubsampling_inside_decompression==0) { if (q==0) { if (o!=((sp->subsampling_hor<<4)|sp->subsampling_ver)) { TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected subsampling values"); return(0); } } else { if (o!=17) { TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected subsampling values"); return(0); } } } } /* Tq: Quantization table destination selector */ if (OJPEGReadByte(sp,&o)==0) return(0); if (sp->subsamplingcorrect==0) sp->sof_tq[q]=o; } if (sp->subsamplingcorrect==0) sp->sof_log=1; return(1); } static int OJPEGReadHeaderInfoSecStreamSos(TIFF* tif) { /* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */ static const char module[]="OJPEGReadHeaderInfoSecStreamSos"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint16 m; uint8 n; uint8 o; assert(sp->subsamplingcorrect==0); if (sp->sof_log==0) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data"); return(0); } /* Ls */ if (OJPEGReadWord(sp,&m)==0) return(0); if (m!=6+sp->samples_per_pixel_per_plane*2) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data"); return(0); } /* Ns */ if (OJPEGReadByte(sp,&n)==0) return(0); if (n!=sp->samples_per_pixel_per_plane) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data"); return(0); } /* Cs, Td, and Ta */ for (o=0; osamples_per_pixel_per_plane; o++) { /* Cs */ if (OJPEGReadByte(sp,&n)==0) return(0); sp->sos_cs[sp->plane_sample_offset+o]=n; /* Td and Ta */ if (OJPEGReadByte(sp,&n)==0) return(0); sp->sos_tda[sp->plane_sample_offset+o]=n; } /* skip Ss, Se, Ah, en Al -> no check, as per Tom Lane recommendation, as per LibJpeg source */ OJPEGReadSkip(sp,3); return(1); } static int OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif) { static const char module[]="OJPEGReadHeaderInfoSecTablesQTable"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8 m; uint8 n; uint32 oa; uint8* ob; uint32 p; if (sp->qtable_offset[0]==0) { TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables"); return(0); } sp->in_buffer_file_pos_log=0; for (m=0; msamples_per_pixel; m++) { if ((sp->qtable_offset[m]!=0) && ((m==0) || (sp->qtable_offset[m]!=sp->qtable_offset[m-1]))) { for (n=0; nqtable_offset[m]==sp->qtable_offset[n]) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegQTables tag value"); return(0); } } oa=sizeof(uint32)+69; ob=_TIFFmalloc(oa); if (ob==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } *(uint32*)ob=oa; ob[sizeof(uint32)]=255; ob[sizeof(uint32)+1]=JPEG_MARKER_DQT; ob[sizeof(uint32)+2]=0; ob[sizeof(uint32)+3]=67; ob[sizeof(uint32)+4]=m; TIFFSeekFile(tif,sp->qtable_offset[m],SEEK_SET); p=TIFFReadFile(tif,&ob[sizeof(uint32)+5],64); if (p!=64) return(0); sp->qtable[m]=ob; sp->sof_tq[m]=m; } else sp->sof_tq[m]=sp->sof_tq[m-1]; } return(1); } static int OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif) { static const char module[]="OJPEGReadHeaderInfoSecTablesDcTable"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8 m; uint8 n; uint8 o[16]; uint32 p; uint32 q; uint32 ra; uint8* rb; if (sp->dctable_offset[0]==0) { TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables"); return(0); } sp->in_buffer_file_pos_log=0; for (m=0; msamples_per_pixel; m++) { if ((sp->dctable_offset[m]!=0) && ((m==0) || (sp->dctable_offset[m]!=sp->dctable_offset[m-1]))) { for (n=0; ndctable_offset[m]==sp->dctable_offset[n]) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegDcTables tag value"); return(0); } } TIFFSeekFile(tif,sp->dctable_offset[m],SEEK_SET); p=TIFFReadFile(tif,o,16); if (p!=16) return(0); q=0; for (n=0; n<16; n++) q+=o[n]; ra=sizeof(uint32)+21+q; rb=_TIFFmalloc(ra); if (rb==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } *(uint32*)rb=ra; rb[sizeof(uint32)]=255; rb[sizeof(uint32)+1]=JPEG_MARKER_DHT; rb[sizeof(uint32)+2]=((19+q)>>8); rb[sizeof(uint32)+3]=((19+q)&255); rb[sizeof(uint32)+4]=m; for (n=0; n<16; n++) rb[sizeof(uint32)+5+n]=o[n]; p=TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); if (p!=q) return(0); sp->dctable[m]=rb; sp->sos_tda[m]=(m<<4); } else sp->sos_tda[m]=sp->sos_tda[m-1]; } return(1); } static int OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif) { static const char module[]="OJPEGReadHeaderInfoSecTablesAcTable"; OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8 m; uint8 n; uint8 o[16]; uint32 p; uint32 q; uint32 ra; uint8* rb; if (sp->actable_offset[0]==0) { TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables"); return(0); } sp->in_buffer_file_pos_log=0; for (m=0; msamples_per_pixel; m++) { if ((sp->actable_offset[m]!=0) && ((m==0) || (sp->actable_offset[m]!=sp->actable_offset[m-1]))) { for (n=0; nactable_offset[m]==sp->actable_offset[n]) { TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegAcTables tag value"); return(0); } } TIFFSeekFile(tif,sp->actable_offset[m],SEEK_SET); p=TIFFReadFile(tif,o,16); if (p!=16) return(0); q=0; for (n=0; n<16; n++) q+=o[n]; ra=sizeof(uint32)+21+q; rb=_TIFFmalloc(ra); if (rb==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } *(uint32*)rb=ra; rb[sizeof(uint32)]=255; rb[sizeof(uint32)+1]=JPEG_MARKER_DHT; rb[sizeof(uint32)+2]=((19+q)>>8); rb[sizeof(uint32)+3]=((19+q)&255); rb[sizeof(uint32)+4]=(16|m); for (n=0; n<16; n++) rb[sizeof(uint32)+5+n]=o[n]; p=TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); if (p!=q) return(0); sp->actable[m]=rb; sp->sos_tda[m]=(sp->sos_tda[m]|m); } else sp->sos_tda[m]=(sp->sos_tda[m]|(sp->sos_tda[m-1]&15)); } return(1); } static int OJPEGReadBufferFill(OJPEGState* sp) { uint16 m; tmsize_t n; /* TODO: double-check: when subsamplingcorrect is set, no call to TIFFErrorExt or TIFFWarningExt should be made * in any other case, seek or read errors should be passed through */ do { if (sp->in_buffer_file_togo!=0) { if (sp->in_buffer_file_pos_log==0) { TIFFSeekFile(sp->tif,sp->in_buffer_file_pos,SEEK_SET); sp->in_buffer_file_pos_log=1; } m=OJPEG_BUFFER; if ((uint64)m>sp->in_buffer_file_togo) m=(uint16)sp->in_buffer_file_togo; n=TIFFReadFile(sp->tif,sp->in_buffer,(tmsize_t)m); if (n==0) return(0); assert(n>0); assert(n<=OJPEG_BUFFER); assert(n<65536); assert((uint64)n<=sp->in_buffer_file_togo); m=(uint16)n; sp->in_buffer_togo=m; sp->in_buffer_cur=sp->in_buffer; sp->in_buffer_file_togo-=m; sp->in_buffer_file_pos+=m; break; } sp->in_buffer_file_pos_log=0; switch(sp->in_buffer_source) { case osibsNotSetYet: if (sp->jpeg_interchange_format!=0) { sp->in_buffer_file_pos=sp->jpeg_interchange_format; sp->in_buffer_file_togo=sp->jpeg_interchange_format_length; } sp->in_buffer_source=osibsJpegInterchangeFormat; break; case osibsJpegInterchangeFormat: sp->in_buffer_source=osibsStrile; case osibsStrile: if (!_TIFFFillStriles( sp->tif ) || sp->tif->tif_dir.td_stripoffset == NULL || sp->tif->tif_dir.td_stripbytecount == NULL) return 0; if (sp->in_buffer_next_strile==sp->in_buffer_strile_count) sp->in_buffer_source=osibsEof; else { sp->in_buffer_file_pos=sp->tif->tif_dir.td_stripoffset[sp->in_buffer_next_strile]; if (sp->in_buffer_file_pos!=0) { if (sp->in_buffer_file_pos>=sp->file_size) sp->in_buffer_file_pos=0; else if (sp->tif->tif_dir.td_stripbytecount==NULL) sp->in_buffer_file_togo=sp->file_size-sp->in_buffer_file_pos; else { if (sp->tif->tif_dir.td_stripbytecount == 0) { TIFFErrorExt(sp->tif->tif_clientdata,sp->tif->tif_name,"Strip byte counts are missing"); return(0); } sp->in_buffer_file_togo=sp->tif->tif_dir.td_stripbytecount[sp->in_buffer_next_strile]; if (sp->in_buffer_file_togo==0) sp->in_buffer_file_pos=0; else if (sp->in_buffer_file_pos+sp->in_buffer_file_togo>sp->file_size) sp->in_buffer_file_togo=sp->file_size-sp->in_buffer_file_pos; } } sp->in_buffer_next_strile++; } break; default: return(0); } } while (1); return(1); } static int OJPEGReadByte(OJPEGState* sp, uint8* byte) { if (sp->in_buffer_togo==0) { if (OJPEGReadBufferFill(sp)==0) return(0); assert(sp->in_buffer_togo>0); } *byte=*(sp->in_buffer_cur); sp->in_buffer_cur++; sp->in_buffer_togo--; return(1); } static int OJPEGReadBytePeek(OJPEGState* sp, uint8* byte) { if (sp->in_buffer_togo==0) { if (OJPEGReadBufferFill(sp)==0) return(0); assert(sp->in_buffer_togo>0); } *byte=*(sp->in_buffer_cur); return(1); } static void OJPEGReadByteAdvance(OJPEGState* sp) { assert(sp->in_buffer_togo>0); sp->in_buffer_cur++; sp->in_buffer_togo--; } static int OJPEGReadWord(OJPEGState* sp, uint16* word) { uint8 m; if (OJPEGReadByte(sp,&m)==0) return(0); *word=(m<<8); if (OJPEGReadByte(sp,&m)==0) return(0); *word|=m; return(1); } static int OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem) { uint16 mlen; uint8* mmem; uint16 n; assert(len>0); mlen=len; mmem=mem; do { if (sp->in_buffer_togo==0) { if (OJPEGReadBufferFill(sp)==0) return(0); assert(sp->in_buffer_togo>0); } n=mlen; if (n>sp->in_buffer_togo) n=sp->in_buffer_togo; _TIFFmemcpy(mmem,sp->in_buffer_cur,n); sp->in_buffer_cur+=n; sp->in_buffer_togo-=n; mlen-=n; mmem+=n; } while(mlen>0); return(1); } static void OJPEGReadSkip(OJPEGState* sp, uint16 len) { uint16 m; uint16 n; m=len; n=m; if (n>sp->in_buffer_togo) n=sp->in_buffer_togo; sp->in_buffer_cur+=n; sp->in_buffer_togo-=n; m-=n; if (m>0) { assert(sp->in_buffer_togo==0); n=m; if ((uint64)n>sp->in_buffer_file_togo) n=(uint16)sp->in_buffer_file_togo; sp->in_buffer_file_pos+=n; sp->in_buffer_file_togo-=n; sp->in_buffer_file_pos_log=0; /* we don't skip past jpeginterchangeformat/strile block... * if that is asked from us, we're dealing with totally bazurk * data anyway, and we've not seen this happening on any * testfile, so we might as well likely cause some other * meaningless error to be passed at some later time */ } } static int OJPEGWriteStream(TIFF* tif, void** mem, uint32* len) { OJPEGState* sp=(OJPEGState*)tif->tif_data; *len=0; do { assert(sp->out_state<=ososEoi); switch(sp->out_state) { case ososSoi: OJPEGWriteStreamSoi(tif,mem,len); break; case ososQTable0: OJPEGWriteStreamQTable(tif,0,mem,len); break; case ososQTable1: OJPEGWriteStreamQTable(tif,1,mem,len); break; case ososQTable2: OJPEGWriteStreamQTable(tif,2,mem,len); break; case ososQTable3: OJPEGWriteStreamQTable(tif,3,mem,len); break; case ososDcTable0: OJPEGWriteStreamDcTable(tif,0,mem,len); break; case ososDcTable1: OJPEGWriteStreamDcTable(tif,1,mem,len); break; case ososDcTable2: OJPEGWriteStreamDcTable(tif,2,mem,len); break; case ososDcTable3: OJPEGWriteStreamDcTable(tif,3,mem,len); break; case ososAcTable0: OJPEGWriteStreamAcTable(tif,0,mem,len); break; case ososAcTable1: OJPEGWriteStreamAcTable(tif,1,mem,len); break; case ososAcTable2: OJPEGWriteStreamAcTable(tif,2,mem,len); break; case ososAcTable3: OJPEGWriteStreamAcTable(tif,3,mem,len); break; case ososDri: OJPEGWriteStreamDri(tif,mem,len); break; case ososSof: OJPEGWriteStreamSof(tif,mem,len); break; case ososSos: OJPEGWriteStreamSos(tif,mem,len); break; case ososCompressed: if (OJPEGWriteStreamCompressed(tif,mem,len)==0) return(0); break; case ososRst: OJPEGWriteStreamRst(tif,mem,len); break; case ososEoi: OJPEGWriteStreamEoi(tif,mem,len); break; } } while (*len==0); return(1); } static void OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len) { OJPEGState* sp=(OJPEGState*)tif->tif_data; assert(OJPEG_BUFFER>=2); sp->out_buffer[0]=255; sp->out_buffer[1]=JPEG_MARKER_SOI; *len=2; *mem=(void*)sp->out_buffer; sp->out_state++; } static void OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len) { OJPEGState* sp=(OJPEGState*)tif->tif_data; if (sp->qtable[table_index]!=0) { *mem=(void*)(sp->qtable[table_index]+sizeof(uint32)); *len=*((uint32*)sp->qtable[table_index])-sizeof(uint32); } sp->out_state++; } static void OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len) { OJPEGState* sp=(OJPEGState*)tif->tif_data; if (sp->dctable[table_index]!=0) { *mem=(void*)(sp->dctable[table_index]+sizeof(uint32)); *len=*((uint32*)sp->dctable[table_index])-sizeof(uint32); } sp->out_state++; } static void OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len) { OJPEGState* sp=(OJPEGState*)tif->tif_data; if (sp->actable[table_index]!=0) { *mem=(void*)(sp->actable[table_index]+sizeof(uint32)); *len=*((uint32*)sp->actable[table_index])-sizeof(uint32); } sp->out_state++; } static void OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len) { OJPEGState* sp=(OJPEGState*)tif->tif_data; assert(OJPEG_BUFFER>=6); if (sp->restart_interval!=0) { sp->out_buffer[0]=255; sp->out_buffer[1]=JPEG_MARKER_DRI; sp->out_buffer[2]=0; sp->out_buffer[3]=4; sp->out_buffer[4]=(sp->restart_interval>>8); sp->out_buffer[5]=(sp->restart_interval&255); *len=6; *mem=(void*)sp->out_buffer; } sp->out_state++; } static void OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len) { OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8 m; assert(OJPEG_BUFFER>=2+8+sp->samples_per_pixel_per_plane*3); assert(255>=8+sp->samples_per_pixel_per_plane*3); sp->out_buffer[0]=255; sp->out_buffer[1]=sp->sof_marker_id; /* Lf */ sp->out_buffer[2]=0; sp->out_buffer[3]=8+sp->samples_per_pixel_per_plane*3; /* P */ sp->out_buffer[4]=8; /* Y */ sp->out_buffer[5]=(sp->sof_y>>8); sp->out_buffer[6]=(sp->sof_y&255); /* X */ sp->out_buffer[7]=(sp->sof_x>>8); sp->out_buffer[8]=(sp->sof_x&255); /* Nf */ sp->out_buffer[9]=sp->samples_per_pixel_per_plane; for (m=0; msamples_per_pixel_per_plane; m++) { /* C */ sp->out_buffer[10+m*3]=sp->sof_c[sp->plane_sample_offset+m]; /* H and V */ sp->out_buffer[10+m*3+1]=sp->sof_hv[sp->plane_sample_offset+m]; /* Tq */ sp->out_buffer[10+m*3+2]=sp->sof_tq[sp->plane_sample_offset+m]; } *len=10+sp->samples_per_pixel_per_plane*3; *mem=(void*)sp->out_buffer; sp->out_state++; } static void OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len) { OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8 m; assert(OJPEG_BUFFER>=2+6+sp->samples_per_pixel_per_plane*2); assert(255>=6+sp->samples_per_pixel_per_plane*2); sp->out_buffer[0]=255; sp->out_buffer[1]=JPEG_MARKER_SOS; /* Ls */ sp->out_buffer[2]=0; sp->out_buffer[3]=6+sp->samples_per_pixel_per_plane*2; /* Ns */ sp->out_buffer[4]=sp->samples_per_pixel_per_plane; for (m=0; msamples_per_pixel_per_plane; m++) { /* Cs */ sp->out_buffer[5+m*2]=sp->sos_cs[sp->plane_sample_offset+m]; /* Td and Ta */ sp->out_buffer[5+m*2+1]=sp->sos_tda[sp->plane_sample_offset+m]; } /* Ss */ sp->out_buffer[5+sp->samples_per_pixel_per_plane*2]=0; /* Se */ sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+1]=63; /* Ah and Al */ sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+2]=0; *len=8+sp->samples_per_pixel_per_plane*2; *mem=(void*)sp->out_buffer; sp->out_state++; } static int OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len) { OJPEGState* sp=(OJPEGState*)tif->tif_data; if (sp->in_buffer_togo==0) { if (OJPEGReadBufferFill(sp)==0) return(0); assert(sp->in_buffer_togo>0); } *len=sp->in_buffer_togo; *mem=(void*)sp->in_buffer_cur; sp->in_buffer_togo=0; if (sp->in_buffer_file_togo==0) { switch(sp->in_buffer_source) { case osibsStrile: if (sp->in_buffer_next_strilein_buffer_strile_count) sp->out_state=ososRst; else sp->out_state=ososEoi; break; case osibsEof: sp->out_state=ososEoi; break; default: break; } } return(1); } static void OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len) { OJPEGState* sp=(OJPEGState*)tif->tif_data; assert(OJPEG_BUFFER>=2); sp->out_buffer[0]=255; sp->out_buffer[1]=JPEG_MARKER_RST0+sp->restart_index; sp->restart_index++; if (sp->restart_index==8) sp->restart_index=0; *len=2; *mem=(void*)sp->out_buffer; sp->out_state=ososCompressed; } static void OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len) { OJPEGState* sp=(OJPEGState*)tif->tif_data; assert(OJPEG_BUFFER>=2); sp->out_buffer[0]=255; sp->out_buffer[1]=JPEG_MARKER_EOI; *len=2; *mem=(void*)sp->out_buffer; } #ifndef LIBJPEG_ENCAP_EXTERNAL static int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo) { return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_create_decompress(cinfo),1)); } #endif #ifndef LIBJPEG_ENCAP_EXTERNAL static int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image) { return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_header(cinfo,require_image),1)); } #endif #ifndef LIBJPEG_ENCAP_EXTERNAL static int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo) { return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_start_decompress(cinfo),1)); } #endif #ifndef LIBJPEG_ENCAP_EXTERNAL static int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines) { return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_scanlines(cinfo,scanlines,max_lines),1)); } #endif #ifndef LIBJPEG_ENCAP_EXTERNAL static int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines) { return(SETJMP(sp->exit_jmpbuf)?0:(jpeg_read_raw_data(cinfo,data,max_lines),1)); } #endif #ifndef LIBJPEG_ENCAP_EXTERNAL static void jpeg_encap_unwind(TIFF* tif) { OJPEGState* sp=(OJPEGState*)tif->tif_data; LONGJMP(sp->exit_jmpbuf,1); } #endif static void OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo) { char buffer[JMSG_LENGTH_MAX]; (*cinfo->err->format_message)(cinfo,buffer); TIFFWarningExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s",buffer); } static void OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo) { char buffer[JMSG_LENGTH_MAX]; (*cinfo->err->format_message)(cinfo,buffer); TIFFErrorExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s",buffer); jpeg_encap_unwind((TIFF*)(cinfo->client_data)); } static void OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo) { (void)cinfo; } static boolean OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo) { TIFF* tif=(TIFF*)cinfo->client_data; OJPEGState* sp=(OJPEGState*)tif->tif_data; void* mem=0; uint32 len=0U; if (OJPEGWriteStream(tif,&mem,&len)==0) { TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Premature end of JPEG data"); jpeg_encap_unwind(tif); } sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=len; sp->libjpeg_jpeg_source_mgr.next_input_byte=mem; return(1); } static void OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes) { TIFF* tif=(TIFF*)cinfo->client_data; (void)num_bytes; TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error"); jpeg_encap_unwind(tif); } static boolean OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired) { TIFF* tif=(TIFF*)cinfo->client_data; (void)desired; TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error"); jpeg_encap_unwind(tif); return(0); } static void OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo) { (void)cinfo; } #endif /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/Makefile.am0000644000212300117540000000714311707054507013055 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. LIBPORT = $(top_builddir)/port/libport.la LIBTIFF = $(top_builddir)/libtiff/libtiff.la libtiffincludedir = $(includedir) EXTRA_DIST = Makefile.vc \ SConstruct \ tif_config.h-vms \ tif_config.vc.h \ tif_config.wince.h \ tiffconf.vc.h \ tiffconf.wince.h \ libtiff.def \ libtiff.map \ libtiffxx.map libtiffinclude_HEADERS = \ tiff.h \ tiffio.h \ tiffvers.h if HAVE_CXX libtiffinclude_HEADERS += tiffio.hxx endif noinst_HEADERS = \ t4.h \ tif_dir.h \ tif_predict.h \ tiffiop.h \ uvcode.h nodist_libtiffinclude_HEADERS = \ tiffconf.h libtiff_la_SOURCES = \ tif_aux.c \ tif_close.c \ tif_codec.c \ tif_color.c \ tif_compress.c \ tif_dir.c \ tif_dirinfo.c \ tif_dirread.c \ tif_dirwrite.c \ tif_dumpmode.c \ tif_error.c \ tif_extension.c \ tif_fax3.c \ tif_fax3sm.c \ tif_flush.c \ tif_getimage.c \ tif_jbig.c \ tif_jpeg.c \ tif_jpeg_12.c \ tif_luv.c \ tif_lzma.c \ tif_lzw.c \ tif_next.c \ tif_ojpeg.c \ tif_open.c \ tif_packbits.c \ tif_pixarlog.c \ tif_predict.c \ tif_print.c \ tif_read.c \ tif_strip.c \ tif_swab.c \ tif_thunder.c \ tif_tile.c \ tif_version.c \ tif_warning.c \ tif_write.c \ tif_zip.c libtiffxx_la_SOURCES = \ tif_stream.cxx if WIN32_IO EXTRA_DIST += tif_unix.c libtiff_la_SOURCES += tif_win32.c else EXTRA_DIST += tif_win32.c libtiff_la_SOURCES += tif_unix.c endif lib_LTLIBRARIES = libtiff.la if HAVE_CXX lib_LTLIBRARIES += libtiffxx.la endif libtiff_la_LDFLAGS = \ -no-undefined \ -version-info $(LIBTIFF_VERSION_INFO) if HAVE_RPATH libtiff_la_LDFLAGS += $(LIBDIR) endif if HAVE_LD_VERSION_SCRIPT libtiff_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libtiff.map endif libtiff_la_LIBADD = $(LIBPORT) libtiffxx_la_LDFLAGS = \ -no-undefined \ -version-info $(LIBTIFF_VERSION_INFO) if HAVE_RPATH libtiffxx_la_LDFLAGS += $(LIBDIR) endif if HAVE_LD_VERSION_SCRIPT libtiffxx_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libtiffxx.map endif libtiffxx_la_LIBADD = $(LIBTIFF) $(LIBPORT) libtiffxx_la_DEPENDENCIES = libtiff.la # # The finite state machine tables used by the G3/G4 decoders # are generated by the mkg3states program. On systems without # make these rules have to be manually carried out. # noinst_PROGRAMS = mkg3states mkg3states_SOURCES = mkg3states.c tif_fax3.h mkg3states_LDADD = $(LIBPORT) faxtable: mkg3states (rm -f tif_fax3sm.c && ./mkg3states -b -c const tif_fax3sm.c) tiff-4.0.3/libtiff/tif_open.c0000644000212300117540000004313511500032606012754 00000000000000/* $Id: tif_open.c,v 1.46 2010-12-06 16:54:54 faxguy Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. */ #include "tiffiop.h" /* * Dummy functions to fill the omitted client procedures. */ static int _tiffDummyMapProc(thandle_t fd, void** pbase, toff_t* psize) { (void) fd; (void) pbase; (void) psize; return (0); } static void _tiffDummyUnmapProc(thandle_t fd, void* base, toff_t size) { (void) fd; (void) base; (void) size; } int _TIFFgetMode(const char* mode, const char* module) { int m = -1; switch (mode[0]) { case 'r': m = O_RDONLY; if (mode[1] == '+') m = O_RDWR; break; case 'w': case 'a': m = O_RDWR|O_CREAT; if (mode[0] == 'w') m |= O_TRUNC; break; default: TIFFErrorExt(0, module, "\"%s\": Bad mode", mode); break; } return (m); } TIFF* TIFFClientOpen( const char* name, const char* mode, thandle_t clientdata, TIFFReadWriteProc readproc, TIFFReadWriteProc writeproc, TIFFSeekProc seekproc, TIFFCloseProc closeproc, TIFFSizeProc sizeproc, TIFFMapFileProc mapproc, TIFFUnmapFileProc unmapproc ) { static const char module[] = "TIFFClientOpen"; TIFF *tif; int m; const char* cp; /* The following are configuration checks. They should be redundant, but should not * compile to any actual code in an optimised release build anyway. If any of them * fail, (makefile-based or other) configuration is not correct */ assert(sizeof(uint8)==1); assert(sizeof(int8)==1); assert(sizeof(uint16)==2); assert(sizeof(int16)==2); assert(sizeof(uint32)==4); assert(sizeof(int32)==4); assert(sizeof(uint64)==8); assert(sizeof(int64)==8); assert(sizeof(tmsize_t)==sizeof(void*)); { union{ uint8 a8[2]; uint16 a16; } n; n.a8[0]=1; n.a8[1]=0; #ifdef WORDS_BIGENDIAN assert(n.a16==256); #else assert(n.a16==1); #endif } m = _TIFFgetMode(mode, module); if (m == -1) goto bad2; tif = (TIFF *)_TIFFmalloc((tmsize_t)(sizeof (TIFF) + strlen(name) + 1)); if (tif == NULL) { TIFFErrorExt(clientdata, module, "%s: Out of memory (TIFF structure)", name); goto bad2; } _TIFFmemset(tif, 0, sizeof (*tif)); tif->tif_name = (char *)tif + sizeof (TIFF); strcpy(tif->tif_name, name); tif->tif_mode = m &~ (O_CREAT|O_TRUNC); tif->tif_curdir = (uint16) -1; /* non-existent directory */ tif->tif_curoff = 0; tif->tif_curstrip = (uint32) -1; /* invalid strip */ tif->tif_row = (uint32) -1; /* read/write pre-increment */ tif->tif_clientdata = clientdata; if (!readproc || !writeproc || !seekproc || !closeproc || !sizeproc) { TIFFErrorExt(clientdata, module, "One of the client procedures is NULL pointer."); goto bad2; } tif->tif_readproc = readproc; tif->tif_writeproc = writeproc; tif->tif_seekproc = seekproc; tif->tif_closeproc = closeproc; tif->tif_sizeproc = sizeproc; if (mapproc) tif->tif_mapproc = mapproc; else tif->tif_mapproc = _tiffDummyMapProc; if (unmapproc) tif->tif_unmapproc = unmapproc; else tif->tif_unmapproc = _tiffDummyUnmapProc; _TIFFSetDefaultCompressionState(tif); /* setup default state */ /* * Default is to return data MSB2LSB and enable the * use of memory-mapped files and strip chopping when * a file is opened read-only. */ tif->tif_flags = FILLORDER_MSB2LSB; if (m == O_RDONLY ) tif->tif_flags |= TIFF_MAPPED; #ifdef STRIPCHOP_DEFAULT if (m == O_RDONLY || m == O_RDWR) tif->tif_flags |= STRIPCHOP_DEFAULT; #endif /* * Process library-specific flags in the open mode string. * The following flags may be used to control intrinsic library * behaviour that may or may not be desirable (usually for * compatibility with some application that claims to support * TIFF but only supports some braindead idea of what the * vendor thinks TIFF is): * * 'l' use little-endian byte order for creating a file * 'b' use big-endian byte order for creating a file * 'L' read/write information using LSB2MSB bit order * 'B' read/write information using MSB2LSB bit order * 'H' read/write information using host bit order * 'M' enable use of memory-mapped files when supported * 'm' disable use of memory-mapped files * 'C' enable strip chopping support when reading * 'c' disable strip chopping support * 'h' read TIFF header only, do not load the first IFD * '4' ClassicTIFF for creating a file (default) * '8' BigTIFF for creating a file * * The use of the 'l' and 'b' flags is strongly discouraged. * These flags are provided solely because numerous vendors, * typically on the PC, do not correctly support TIFF; they * only support the Intel little-endian byte order. This * support is not configured by default because it supports * the violation of the TIFF spec that says that readers *MUST* * support both byte orders. It is strongly recommended that * you not use this feature except to deal with busted apps * that write invalid TIFF. And even in those cases you should * bang on the vendors to fix their software. * * The 'L', 'B', and 'H' flags are intended for applications * that can optimize operations on data by using a particular * bit order. By default the library returns data in MSB2LSB * bit order for compatibiltiy with older versions of this * library. Returning data in the bit order of the native cpu * makes the most sense but also requires applications to check * the value of the FillOrder tag; something they probably do * not do right now. * * The 'M' and 'm' flags are provided because some virtual memory * systems exhibit poor behaviour when large images are mapped. * These options permit clients to control the use of memory-mapped * files on a per-file basis. * * The 'C' and 'c' flags are provided because the library support * for chopping up large strips into multiple smaller strips is not * application-transparent and as such can cause problems. The 'c' * option permits applications that only want to look at the tags, * for example, to get the unadulterated TIFF tag information. */ for (cp = mode; *cp; cp++) switch (*cp) { case 'b': #ifndef WORDS_BIGENDIAN if (m&O_CREAT) tif->tif_flags |= TIFF_SWAB; #endif break; case 'l': #ifdef WORDS_BIGENDIAN if ((m&O_CREAT)) tif->tif_flags |= TIFF_SWAB; #endif break; case 'B': tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) | FILLORDER_MSB2LSB; break; case 'L': tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) | FILLORDER_LSB2MSB; break; case 'H': tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) | HOST_FILLORDER; break; case 'M': if (m == O_RDONLY) tif->tif_flags |= TIFF_MAPPED; break; case 'm': if (m == O_RDONLY) tif->tif_flags &= ~TIFF_MAPPED; break; case 'C': if (m == O_RDONLY) tif->tif_flags |= TIFF_STRIPCHOP; break; case 'c': if (m == O_RDONLY) tif->tif_flags &= ~TIFF_STRIPCHOP; break; case 'h': tif->tif_flags |= TIFF_HEADERONLY; break; case '8': if (m&O_CREAT) tif->tif_flags |= TIFF_BIGTIFF; break; } /* * Read in TIFF header. */ if ((m & O_TRUNC) || !ReadOK(tif, &tif->tif_header, sizeof (TIFFHeaderClassic))) { if (tif->tif_mode == O_RDONLY) { TIFFErrorExt(tif->tif_clientdata, name, "Cannot read TIFF header"); goto bad; } /* * Setup header and write. */ #ifdef WORDS_BIGENDIAN tif->tif_header.common.tiff_magic = tif->tif_flags & TIFF_SWAB ? TIFF_LITTLEENDIAN : TIFF_BIGENDIAN; #else tif->tif_header.common.tiff_magic = tif->tif_flags & TIFF_SWAB ? TIFF_BIGENDIAN : TIFF_LITTLEENDIAN; #endif if (!(tif->tif_flags&TIFF_BIGTIFF)) { tif->tif_header.common.tiff_version = TIFF_VERSION_CLASSIC; tif->tif_header.classic.tiff_diroff = 0; if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&tif->tif_header.common.tiff_version); tif->tif_header_size = sizeof(TIFFHeaderClassic); } else { tif->tif_header.common.tiff_version = TIFF_VERSION_BIG; tif->tif_header.big.tiff_offsetsize = 8; tif->tif_header.big.tiff_unused = 0; tif->tif_header.big.tiff_diroff = 0; if (tif->tif_flags & TIFF_SWAB) { TIFFSwabShort(&tif->tif_header.common.tiff_version); TIFFSwabShort(&tif->tif_header.big.tiff_offsetsize); } tif->tif_header_size = sizeof (TIFFHeaderBig); } /* * The doc for "fopen" for some STD_C_LIBs says that if you * open a file for modify ("+"), then you must fseek (or * fflush?) between any freads and fwrites. This is not * necessary on most systems, but has been shown to be needed * on Solaris. */ TIFFSeekFile( tif, 0, SEEK_SET ); if (!WriteOK(tif, &tif->tif_header, (tmsize_t)(tif->tif_header_size))) { TIFFErrorExt(tif->tif_clientdata, name, "Error writing TIFF header"); goto bad; } /* * Setup the byte order handling. */ if (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN) { #ifndef WORDS_BIGENDIAN tif->tif_flags |= TIFF_SWAB; #endif } else { #ifdef WORDS_BIGENDIAN tif->tif_flags |= TIFF_SWAB; #endif } /* * Setup default directory. */ if (!TIFFDefaultDirectory(tif)) goto bad; tif->tif_diroff = 0; tif->tif_dirlist = NULL; tif->tif_dirlistsize = 0; tif->tif_dirnumber = 0; return (tif); } /* * Setup the byte order handling. */ if (tif->tif_header.common.tiff_magic != TIFF_BIGENDIAN && tif->tif_header.common.tiff_magic != TIFF_LITTLEENDIAN #if MDI_SUPPORT && #if HOST_BIGENDIAN tif->tif_header.common.tiff_magic != MDI_BIGENDIAN #else tif->tif_header.common.tiff_magic != MDI_LITTLEENDIAN #endif ) { TIFFErrorExt(tif->tif_clientdata, name, "Not a TIFF or MDI file, bad magic number %d (0x%x)", #else ) { TIFFErrorExt(tif->tif_clientdata, name, "Not a TIFF file, bad magic number %d (0x%x)", #endif tif->tif_header.common.tiff_magic, tif->tif_header.common.tiff_magic); goto bad; } if (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN) { #ifndef WORDS_BIGENDIAN tif->tif_flags |= TIFF_SWAB; #endif } else { #ifdef WORDS_BIGENDIAN tif->tif_flags |= TIFF_SWAB; #endif } if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&tif->tif_header.common.tiff_version); if ((tif->tif_header.common.tiff_version != TIFF_VERSION_CLASSIC)&& (tif->tif_header.common.tiff_version != TIFF_VERSION_BIG)) { TIFFErrorExt(tif->tif_clientdata, name, "Not a TIFF file, bad version number %d (0x%x)", tif->tif_header.common.tiff_version, tif->tif_header.common.tiff_version); goto bad; } if (tif->tif_header.common.tiff_version == TIFF_VERSION_CLASSIC) { if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&tif->tif_header.classic.tiff_diroff); tif->tif_header_size = sizeof(TIFFHeaderClassic); } else { if (!ReadOK(tif, ((uint8*)(&tif->tif_header) + sizeof(TIFFHeaderClassic)), (sizeof(TIFFHeaderBig)-sizeof(TIFFHeaderClassic)))) { TIFFErrorExt(tif->tif_clientdata, name, "Cannot read TIFF header"); goto bad; } if (tif->tif_flags & TIFF_SWAB) { TIFFSwabShort(&tif->tif_header.big.tiff_offsetsize); TIFFSwabLong8(&tif->tif_header.big.tiff_diroff); } if (tif->tif_header.big.tiff_offsetsize != 8) { TIFFErrorExt(tif->tif_clientdata, name, "Not a TIFF file, bad BigTIFF offsetsize %d (0x%x)", tif->tif_header.big.tiff_offsetsize, tif->tif_header.big.tiff_offsetsize); goto bad; } if (tif->tif_header.big.tiff_unused != 0) { TIFFErrorExt(tif->tif_clientdata, name, "Not a TIFF file, bad BigTIFF unused %d (0x%x)", tif->tif_header.big.tiff_unused, tif->tif_header.big.tiff_unused); goto bad; } tif->tif_header_size = sizeof(TIFFHeaderBig); tif->tif_flags |= TIFF_BIGTIFF; } tif->tif_flags |= TIFF_MYBUFFER; tif->tif_rawcp = tif->tif_rawdata = 0; tif->tif_rawdatasize = 0; tif->tif_rawdataoff = 0; tif->tif_rawdataloaded = 0; switch (mode[0]) { case 'r': if (!(tif->tif_flags&TIFF_BIGTIFF)) tif->tif_nextdiroff = tif->tif_header.classic.tiff_diroff; else tif->tif_nextdiroff = tif->tif_header.big.tiff_diroff; /* * Try to use a memory-mapped file if the client * has not explicitly suppressed usage with the * 'm' flag in the open mode (see above). */ if (tif->tif_flags & TIFF_MAPPED) { toff_t n; if (TIFFMapFileContents(tif,(void**)(&tif->tif_base),&n)) { tif->tif_size=(tmsize_t)n; assert((toff_t)tif->tif_size==n); } else tif->tif_flags &= ~TIFF_MAPPED; } /* * Sometimes we do not want to read the first directory (for example, * it may be broken) and want to proceed to other directories. I this * case we use the TIFF_HEADERONLY flag to open file and return * immediately after reading TIFF header. */ if (tif->tif_flags & TIFF_HEADERONLY) return (tif); /* * Setup initial directory. */ if (TIFFReadDirectory(tif)) { tif->tif_rawcc = (tmsize_t)-1; tif->tif_flags |= TIFF_BUFFERSETUP; return (tif); } break; case 'a': /* * New directories are automatically append * to the end of the directory chain when they * are written out (see TIFFWriteDirectory). */ if (!TIFFDefaultDirectory(tif)) goto bad; return (tif); } bad: tif->tif_mode = O_RDONLY; /* XXX avoid flush */ TIFFCleanup(tif); bad2: return ((TIFF*)0); } /* * Query functions to access private data. */ /* * Return open file's name. */ const char * TIFFFileName(TIFF* tif) { return (tif->tif_name); } /* * Set the file name. */ const char * TIFFSetFileName(TIFF* tif, const char *name) { const char* old_name = tif->tif_name; tif->tif_name = (char *)name; return (old_name); } /* * Return open file's I/O descriptor. */ int TIFFFileno(TIFF* tif) { return (tif->tif_fd); } /* * Set open file's I/O descriptor, and return previous value. */ int TIFFSetFileno(TIFF* tif, int fd) { int old_fd = tif->tif_fd; tif->tif_fd = fd; return old_fd; } /* * Return open file's clientdata. */ thandle_t TIFFClientdata(TIFF* tif) { return (tif->tif_clientdata); } /* * Set open file's clientdata, and return previous value. */ thandle_t TIFFSetClientdata(TIFF* tif, thandle_t newvalue) { thandle_t m = tif->tif_clientdata; tif->tif_clientdata = newvalue; return m; } /* * Return read/write mode. */ int TIFFGetMode(TIFF* tif) { return (tif->tif_mode); } /* * Return read/write mode. */ int TIFFSetMode(TIFF* tif, int mode) { int old_mode = tif->tif_mode; tif->tif_mode = mode; return (old_mode); } /* * Return nonzero if file is organized in * tiles; zero if organized as strips. */ int TIFFIsTiled(TIFF* tif) { return (isTiled(tif)); } /* * Return current row being read/written. */ uint32 TIFFCurrentRow(TIFF* tif) { return (tif->tif_row); } /* * Return index of the current directory. */ uint16 TIFFCurrentDirectory(TIFF* tif) { return (tif->tif_curdir); } /* * Return current strip. */ uint32 TIFFCurrentStrip(TIFF* tif) { return (tif->tif_curstrip); } /* * Return current tile. */ uint32 TIFFCurrentTile(TIFF* tif) { return (tif->tif_curtile); } /* * Return nonzero if the file has byte-swapped data. */ int TIFFIsByteSwapped(TIFF* tif) { return ((tif->tif_flags & TIFF_SWAB) != 0); } /* * Return nonzero if the data is returned up-sampled. */ int TIFFIsUpSampled(TIFF* tif) { return (isUpSampled(tif)); } /* * Return nonzero if the data is returned in MSB-to-LSB bit order. */ int TIFFIsMSB2LSB(TIFF* tif) { return (isFillOrder(tif, FILLORDER_MSB2LSB)); } /* * Return nonzero if given file was written in big-endian order. */ int TIFFIsBigEndian(TIFF* tif) { return (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN); } /* * Return pointer to file read method. */ TIFFReadWriteProc TIFFGetReadProc(TIFF* tif) { return (tif->tif_readproc); } /* * Return pointer to file write method. */ TIFFReadWriteProc TIFFGetWriteProc(TIFF* tif) { return (tif->tif_writeproc); } /* * Return pointer to file seek method. */ TIFFSeekProc TIFFGetSeekProc(TIFF* tif) { return (tif->tif_seekproc); } /* * Return pointer to file close method. */ TIFFCloseProc TIFFGetCloseProc(TIFF* tif) { return (tif->tif_closeproc); } /* * Return pointer to file size requesting method. */ TIFFSizeProc TIFFGetSizeProc(TIFF* tif) { return (tif->tif_sizeproc); } /* * Return pointer to memory mapping method. */ TIFFMapFileProc TIFFGetMapFileProc(TIFF* tif) { return (tif->tif_mapproc); } /* * Return pointer to memory unmapping method. */ TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF* tif) { return (tif->tif_unmapproc); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_warning.c0000644000212300117540000000452411345765561013503 00000000000000/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_warning.c,v 1.3 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. */ #include "tiffiop.h" TIFFErrorHandlerExt _TIFFwarningHandlerExt = NULL; TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler handler) { TIFFErrorHandler prev = _TIFFwarningHandler; _TIFFwarningHandler = handler; return (prev); } TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt handler) { TIFFErrorHandlerExt prev = _TIFFwarningHandlerExt; _TIFFwarningHandlerExt = handler; return (prev); } void TIFFWarning(const char* module, const char* fmt, ...) { va_list ap; va_start(ap, fmt); if (_TIFFwarningHandler) (*_TIFFwarningHandler)(module, fmt, ap); if (_TIFFwarningHandlerExt) (*_TIFFwarningHandlerExt)(0, module, fmt, ap); va_end(ap); } void TIFFWarningExt(thandle_t fd, const char* module, const char* fmt, ...) { va_list ap; va_start(ap, fmt); if (_TIFFwarningHandler) (*_TIFFwarningHandler)(module, fmt, ap); if (_TIFFwarningHandlerExt) (*_TIFFwarningHandlerExt)(fd, module, fmt, ap); va_end(ap); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_dir.h0000644000212300117540000002524611527767441012626 00000000000000/* $Id: tif_dir.h,v 1.54 2011-02-18 20:53:05 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFFDIR_ #define _TIFFDIR_ /* * ``Library-private'' Directory-related Definitions. */ typedef struct { const TIFFField *info; int count; void *value; } TIFFTagValue; /* * TIFF Image File Directories are comprised of a table of field * descriptors of the form shown below. The table is sorted in * ascending order by tag. The values associated with each entry are * disjoint and may appear anywhere in the file (so long as they are * placed on a word boundary). * * If the value is 4 bytes or less, in ClassicTIFF, or 8 bytes or less in * BigTIFF, then it is placed in the offset field to save space. If so, * it is left-justified in the offset field. */ typedef struct { uint16 tdir_tag; /* see below */ uint16 tdir_type; /* data type; see below */ uint64 tdir_count; /* number of items; length in spec */ union { uint16 toff_short; uint32 toff_long; uint64 toff_long8; } tdir_offset; /* either offset or the data itself if fits */ } TIFFDirEntry; /* * Internal format of a TIFF directory entry. */ typedef struct { #define FIELD_SETLONGS 4 /* bit vector of fields that are set */ unsigned long td_fieldsset[FIELD_SETLONGS]; uint32 td_imagewidth, td_imagelength, td_imagedepth; uint32 td_tilewidth, td_tilelength, td_tiledepth; uint32 td_subfiletype; uint16 td_bitspersample; uint16 td_sampleformat; uint16 td_compression; uint16 td_photometric; uint16 td_threshholding; uint16 td_fillorder; uint16 td_orientation; uint16 td_samplesperpixel; uint32 td_rowsperstrip; uint16 td_minsamplevalue, td_maxsamplevalue; double* td_sminsamplevalue; double* td_smaxsamplevalue; float td_xresolution, td_yresolution; uint16 td_resolutionunit; uint16 td_planarconfig; float td_xposition, td_yposition; uint16 td_pagenumber[2]; uint16* td_colormap[3]; uint16 td_halftonehints[2]; uint16 td_extrasamples; uint16* td_sampleinfo; /* even though the name is misleading, td_stripsperimage is the number * of striles (=strips or tiles) per plane, and td_nstrips the total * number of striles */ uint32 td_stripsperimage; uint32 td_nstrips; /* size of offset & bytecount arrays */ uint64* td_stripoffset; uint64* td_stripbytecount; int td_stripbytecountsorted; /* is the bytecount array sorted ascending? */ #if defined(DEFER_STRILE_LOAD) TIFFDirEntry td_stripoffset_entry; /* for deferred loading */ TIFFDirEntry td_stripbytecount_entry; /* for deferred loading */ #endif uint16 td_nsubifd; uint64* td_subifd; /* YCbCr parameters */ uint16 td_ycbcrsubsampling[2]; uint16 td_ycbcrpositioning; /* Colorimetry parameters */ uint16* td_transferfunction[3]; float* td_refblackwhite; /* CMYK parameters */ int td_inknameslen; char* td_inknames; int td_customValueCount; TIFFTagValue *td_customValues; } TIFFDirectory; /* * Field flags used to indicate fields that have been set in a directory, and * to reference fields when manipulating a directory. */ /* * FIELD_IGNORE is used to signify tags that are to be processed but otherwise * ignored. This permits antiquated tags to be quietly read and discarded. * Note that a bit *is* allocated for ignored tags; this is understood by the * directory reading logic which uses this fact to avoid special-case handling */ #define FIELD_IGNORE 0 /* multi-item fields */ #define FIELD_IMAGEDIMENSIONS 1 #define FIELD_TILEDIMENSIONS 2 #define FIELD_RESOLUTION 3 #define FIELD_POSITION 4 /* single-item fields */ #define FIELD_SUBFILETYPE 5 #define FIELD_BITSPERSAMPLE 6 #define FIELD_COMPRESSION 7 #define FIELD_PHOTOMETRIC 8 #define FIELD_THRESHHOLDING 9 #define FIELD_FILLORDER 10 #define FIELD_ORIENTATION 15 #define FIELD_SAMPLESPERPIXEL 16 #define FIELD_ROWSPERSTRIP 17 #define FIELD_MINSAMPLEVALUE 18 #define FIELD_MAXSAMPLEVALUE 19 #define FIELD_PLANARCONFIG 20 #define FIELD_RESOLUTIONUNIT 22 #define FIELD_PAGENUMBER 23 #define FIELD_STRIPBYTECOUNTS 24 #define FIELD_STRIPOFFSETS 25 #define FIELD_COLORMAP 26 #define FIELD_EXTRASAMPLES 31 #define FIELD_SAMPLEFORMAT 32 #define FIELD_SMINSAMPLEVALUE 33 #define FIELD_SMAXSAMPLEVALUE 34 #define FIELD_IMAGEDEPTH 35 #define FIELD_TILEDEPTH 36 #define FIELD_HALFTONEHINTS 37 #define FIELD_YCBCRSUBSAMPLING 39 #define FIELD_YCBCRPOSITIONING 40 #define FIELD_REFBLACKWHITE 41 #define FIELD_TRANSFERFUNCTION 44 #define FIELD_INKNAMES 46 #define FIELD_SUBIFD 49 /* FIELD_CUSTOM (see tiffio.h) 65 */ /* end of support for well-known tags; codec-private tags follow */ #define FIELD_CODEC 66 /* base of codec-private tags */ /* * Pseudo-tags don't normally need field bits since they are not written to an * output file (by definition). The library also has express logic to always * query a codec for a pseudo-tag so allocating a field bit for one is a * waste. If codec wants to promote the notion of a pseudo-tag being ``set'' * or ``unset'' then it can do using internal state flags without polluting * the field bit space defined for real tags. */ #define FIELD_PSEUDO 0 #define FIELD_LAST (32*FIELD_SETLONGS-1) #define BITn(n) (((unsigned long)1L)<<((n)&0x1f)) #define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n)/32]) #define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field)) #define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field)) #define TIFFClrFieldBit(tif, field) (BITFIELDn(tif, field) &= ~BITn(field)) #define FieldSet(fields, f) (fields[(f)/32] & BITn(f)) #define ResetFieldBit(fields, f) (fields[(f)/32] &= ~BITn(f)) typedef enum { TIFF_SETGET_UNDEFINED = 0, TIFF_SETGET_ASCII = 1, TIFF_SETGET_UINT8 = 2, TIFF_SETGET_SINT8 = 3, TIFF_SETGET_UINT16 = 4, TIFF_SETGET_SINT16 = 5, TIFF_SETGET_UINT32 = 6, TIFF_SETGET_SINT32 = 7, TIFF_SETGET_UINT64 = 8, TIFF_SETGET_SINT64 = 9, TIFF_SETGET_FLOAT = 10, TIFF_SETGET_DOUBLE = 11, TIFF_SETGET_IFD8 = 12, TIFF_SETGET_INT = 13, TIFF_SETGET_UINT16_PAIR = 14, TIFF_SETGET_C0_ASCII = 15, TIFF_SETGET_C0_UINT8 = 16, TIFF_SETGET_C0_SINT8 = 17, TIFF_SETGET_C0_UINT16 = 18, TIFF_SETGET_C0_SINT16 = 19, TIFF_SETGET_C0_UINT32 = 20, TIFF_SETGET_C0_SINT32 = 21, TIFF_SETGET_C0_UINT64 = 22, TIFF_SETGET_C0_SINT64 = 23, TIFF_SETGET_C0_FLOAT = 24, TIFF_SETGET_C0_DOUBLE = 25, TIFF_SETGET_C0_IFD8 = 26, TIFF_SETGET_C16_ASCII = 27, TIFF_SETGET_C16_UINT8 = 28, TIFF_SETGET_C16_SINT8 = 29, TIFF_SETGET_C16_UINT16 = 30, TIFF_SETGET_C16_SINT16 = 31, TIFF_SETGET_C16_UINT32 = 32, TIFF_SETGET_C16_SINT32 = 33, TIFF_SETGET_C16_UINT64 = 34, TIFF_SETGET_C16_SINT64 = 35, TIFF_SETGET_C16_FLOAT = 36, TIFF_SETGET_C16_DOUBLE = 37, TIFF_SETGET_C16_IFD8 = 38, TIFF_SETGET_C32_ASCII = 39, TIFF_SETGET_C32_UINT8 = 40, TIFF_SETGET_C32_SINT8 = 41, TIFF_SETGET_C32_UINT16 = 42, TIFF_SETGET_C32_SINT16 = 43, TIFF_SETGET_C32_UINT32 = 44, TIFF_SETGET_C32_SINT32 = 45, TIFF_SETGET_C32_UINT64 = 46, TIFF_SETGET_C32_SINT64 = 47, TIFF_SETGET_C32_FLOAT = 48, TIFF_SETGET_C32_DOUBLE = 49, TIFF_SETGET_C32_IFD8 = 50, TIFF_SETGET_OTHER = 51 } TIFFSetGetFieldType; #if defined(__cplusplus) extern "C" { #endif extern const TIFFFieldArray* _TIFFGetFields(void); extern const TIFFFieldArray* _TIFFGetExifFields(void); extern void _TIFFSetupFields(TIFF* tif, const TIFFFieldArray* infoarray); extern void _TIFFPrintFieldInfo(TIFF*, FILE*); extern int _TIFFFillStriles(TIFF*); typedef enum { tfiatImage, tfiatExif, tfiatOther } TIFFFieldArrayType; struct _TIFFFieldArray { TIFFFieldArrayType type; /* array type, will be used to determine if IFD is image and such */ uint32 allocated_size; /* 0 if array is constant, other if modified by future definition extension support */ uint32 count; /* number of elements in fields array */ TIFFField* fields; /* actual field info */ }; struct _TIFFField { uint32 field_tag; /* field's tag */ short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */ short field_writecount; /* write count/TIFF_VARIABLE */ TIFFDataType field_type; /* type of associated data */ uint32 reserved; /* reserved for future extension */ TIFFSetGetFieldType set_field_type; /* type to be passed to TIFFSetField */ TIFFSetGetFieldType get_field_type; /* type to be passed to TIFFGetField */ unsigned short field_bit; /* bit in fieldsset bit vector */ unsigned char field_oktochange; /* if true, can change while writing */ unsigned char field_passcount; /* if true, pass dir count on set */ char* field_name; /* ASCII name */ TIFFFieldArray* field_subfields; /* if field points to child ifds, child ifd field definition array */ }; extern int _TIFFMergeFields(TIFF*, const TIFFField[], uint32); extern const TIFFField* _TIFFFindOrRegisterField(TIFF *, uint32, TIFFDataType); extern TIFFField* _TIFFCreateAnonField(TIFF *, uint32, TIFFDataType); #if defined(__cplusplus) } #endif #endif /* _TIFFDIR_ */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/mkg3states.c0000644000212300117540000002251311345765560013256 00000000000000/* "$Id: mkg3states.c,v 1.11 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* Initialise fax decoder tables * Decoder support is derived, with permission, from the code * in Frank Cringle's viewfax program; * Copyright (C) 1990, 1995 Frank D. Cringle. */ #include "tif_config.h" #include #include #include #ifdef HAVE_UNISTD_H # include #endif #include "tif_fax3.h" #ifndef HAVE_GETOPT extern int getopt(int, char**, char*); #endif #define streq(a,b) (strcmp(a,b) == 0) /* NB: can't use names in tif_fax3.h 'cuz they are declared const */ TIFFFaxTabEnt MainTable[128]; TIFFFaxTabEnt WhiteTable[4096]; TIFFFaxTabEnt BlackTable[8192]; struct proto { uint16 code; /* right justified, lsb-first, zero filled */ uint16 val; /* (pixel count)<<4 + code width */ }; static struct proto Pass[] = { { 0x0008, 4 }, { 0, 0 } }; static struct proto Horiz[] = { { 0x0004, 3 }, { 0, 0 } }; static struct proto V0[] = { { 0x0001, 1 }, { 0, 0 } }; static struct proto VR[] = { { 0x0006, (1<<4)+3 }, { 0x0030, (2<<4)+6 }, { 0x0060, (3<<4)+7 }, { 0, 0 } }; static struct proto VL[] = { { 0x0002, (1<<4)+3 }, { 0x0010, (2<<4)+6 }, { 0x0020, (3<<4)+7 }, { 0, 0 } }; static struct proto Ext[] = { { 0x0040, 7 }, { 0, 0 } }; static struct proto EOLV[] = { { 0x0000, 7 }, { 0, 0 } }; static struct proto MakeUpW[] = { { 0x001b, 1029 }, { 0x0009, 2053 }, { 0x003a, 3078 }, { 0x0076, 4103 }, { 0x006c, 5128 }, { 0x00ec, 6152 }, { 0x0026, 7176 }, { 0x00a6, 8200 }, { 0x0016, 9224 }, { 0x00e6, 10248 }, { 0x0066, 11273 }, { 0x0166, 12297 }, { 0x0096, 13321 }, { 0x0196, 14345 }, { 0x0056, 15369 }, { 0x0156, 16393 }, { 0x00d6, 17417 }, { 0x01d6, 18441 }, { 0x0036, 19465 }, { 0x0136, 20489 }, { 0x00b6, 21513 }, { 0x01b6, 22537 }, { 0x0032, 23561 }, { 0x0132, 24585 }, { 0x00b2, 25609 }, { 0x0006, 26630 }, { 0x01b2, 27657 }, { 0, 0 } }; static struct proto MakeUpB[] = { { 0x03c0, 1034 }, { 0x0130, 2060 }, { 0x0930, 3084 }, { 0x0da0, 4108 }, { 0x0cc0, 5132 }, { 0x02c0, 6156 }, { 0x0ac0, 7180 }, { 0x06c0, 8205 }, { 0x16c0, 9229 }, { 0x0a40, 10253 }, { 0x1a40, 11277 }, { 0x0640, 12301 }, { 0x1640, 13325 }, { 0x09c0, 14349 }, { 0x19c0, 15373 }, { 0x05c0, 16397 }, { 0x15c0, 17421 }, { 0x0dc0, 18445 }, { 0x1dc0, 19469 }, { 0x0940, 20493 }, { 0x1940, 21517 }, { 0x0540, 22541 }, { 0x1540, 23565 }, { 0x0b40, 24589 }, { 0x1b40, 25613 }, { 0x04c0, 26637 }, { 0x14c0, 27661 }, { 0, 0 } }; static struct proto MakeUp[] = { { 0x0080, 28683 }, { 0x0180, 29707 }, { 0x0580, 30731 }, { 0x0480, 31756 }, { 0x0c80, 32780 }, { 0x0280, 33804 }, { 0x0a80, 34828 }, { 0x0680, 35852 }, { 0x0e80, 36876 }, { 0x0380, 37900 }, { 0x0b80, 38924 }, { 0x0780, 39948 }, { 0x0f80, 40972 }, { 0, 0 } }; static struct proto TermW[] = { { 0x00ac, 8 }, { 0x0038, 22 }, { 0x000e, 36 }, { 0x0001, 52 }, { 0x000d, 68 }, { 0x0003, 84 }, { 0x0007, 100 }, { 0x000f, 116 }, { 0x0019, 133 }, { 0x0005, 149 }, { 0x001c, 165 }, { 0x0002, 181 }, { 0x0004, 198 }, { 0x0030, 214 }, { 0x000b, 230 }, { 0x002b, 246 }, { 0x0015, 262 }, { 0x0035, 278 }, { 0x0072, 295 }, { 0x0018, 311 }, { 0x0008, 327 }, { 0x0074, 343 }, { 0x0060, 359 }, { 0x0010, 375 }, { 0x000a, 391 }, { 0x006a, 407 }, { 0x0064, 423 }, { 0x0012, 439 }, { 0x000c, 455 }, { 0x0040, 472 }, { 0x00c0, 488 }, { 0x0058, 504 }, { 0x00d8, 520 }, { 0x0048, 536 }, { 0x00c8, 552 }, { 0x0028, 568 }, { 0x00a8, 584 }, { 0x0068, 600 }, { 0x00e8, 616 }, { 0x0014, 632 }, { 0x0094, 648 }, { 0x0054, 664 }, { 0x00d4, 680 }, { 0x0034, 696 }, { 0x00b4, 712 }, { 0x0020, 728 }, { 0x00a0, 744 }, { 0x0050, 760 }, { 0x00d0, 776 }, { 0x004a, 792 }, { 0x00ca, 808 }, { 0x002a, 824 }, { 0x00aa, 840 }, { 0x0024, 856 }, { 0x00a4, 872 }, { 0x001a, 888 }, { 0x009a, 904 }, { 0x005a, 920 }, { 0x00da, 936 }, { 0x0052, 952 }, { 0x00d2, 968 }, { 0x004c, 984 }, { 0x00cc, 1000 }, { 0x002c, 1016 }, { 0, 0 } }; static struct proto TermB[] = { { 0x03b0, 10 }, { 0x0002, 19 }, { 0x0003, 34 }, { 0x0001, 50 }, { 0x0006, 67 }, { 0x000c, 84 }, { 0x0004, 100 }, { 0x0018, 117 }, { 0x0028, 134 }, { 0x0008, 150 }, { 0x0010, 167 }, { 0x0050, 183 }, { 0x0070, 199 }, { 0x0020, 216 }, { 0x00e0, 232 }, { 0x0030, 249 }, { 0x03a0, 266 }, { 0x0060, 282 }, { 0x0040, 298 }, { 0x0730, 315 }, { 0x00b0, 331 }, { 0x01b0, 347 }, { 0x0760, 363 }, { 0x00a0, 379 }, { 0x0740, 395 }, { 0x00c0, 411 }, { 0x0530, 428 }, { 0x0d30, 444 }, { 0x0330, 460 }, { 0x0b30, 476 }, { 0x0160, 492 }, { 0x0960, 508 }, { 0x0560, 524 }, { 0x0d60, 540 }, { 0x04b0, 556 }, { 0x0cb0, 572 }, { 0x02b0, 588 }, { 0x0ab0, 604 }, { 0x06b0, 620 }, { 0x0eb0, 636 }, { 0x0360, 652 }, { 0x0b60, 668 }, { 0x05b0, 684 }, { 0x0db0, 700 }, { 0x02a0, 716 }, { 0x0aa0, 732 }, { 0x06a0, 748 }, { 0x0ea0, 764 }, { 0x0260, 780 }, { 0x0a60, 796 }, { 0x04a0, 812 }, { 0x0ca0, 828 }, { 0x0240, 844 }, { 0x0ec0, 860 }, { 0x01c0, 876 }, { 0x0e40, 892 }, { 0x0140, 908 }, { 0x01a0, 924 }, { 0x09a0, 940 }, { 0x0d40, 956 }, { 0x0340, 972 }, { 0x05a0, 988 }, { 0x0660, 1004 }, { 0x0e60, 1020 }, { 0, 0 } }; static struct proto EOLH[] = { { 0x0000, 11 }, { 0, 0 } }; static void FillTable(TIFFFaxTabEnt *T, int Size, struct proto *P, int State) { int limit = 1 << Size; while (P->val) { int width = P->val & 15; int param = P->val >> 4; int incr = 1 << width; int code; for (code = P->code; code < limit; code += incr) { TIFFFaxTabEnt *E = T+code; E->State = State; E->Width = width; E->Param = param; } P++; } } static char* storage_class = ""; static char* const_class = ""; static int packoutput = 1; static char* prebrace = ""; static char* postbrace = ""; void WriteTable(FILE* fd, const TIFFFaxTabEnt* T, int Size, const char* name) { int i; char* sep; fprintf(fd, "%s %s TIFFFaxTabEnt %s[%d] = {", storage_class, const_class, name, Size); if (packoutput) { sep = "\n"; for (i = 0; i < Size; i++) { fprintf(fd, "%s%s%d,%d,%d%s", sep, prebrace, T->State, T->Width, (int) T->Param, postbrace); if (((i+1) % 10) == 0) sep = ",\n"; else sep = ","; T++; } } else { sep = "\n "; for (i = 0; i < Size; i++) { fprintf(fd, "%s%s%3d,%3d,%4d%s", sep, prebrace, T->State, T->Width, (int) T->Param, postbrace); if (((i+1) % 6) == 0) sep = ",\n "; else sep = ","; T++; } } fprintf(fd, "\n};\n"); } /* initialise the huffman code tables */ int main(int argc, char* argv[]) { FILE* fd; char* outputfile; int c; extern int optind; extern char* optarg; while ((c = getopt(argc, argv, "c:s:bp")) != -1) switch (c) { case 'c': const_class = optarg; break; case 's': storage_class = optarg; break; case 'p': packoutput = 0; break; case 'b': prebrace = "{"; postbrace = "}"; break; case '?': fprintf(stderr, "usage: %s [-c const] [-s storage] [-p] [-b] file\n", argv[0]); return (-1); } outputfile = optind < argc ? argv[optind] : "g3states.h"; fd = fopen(outputfile, "w"); if (fd == NULL) { fprintf(stderr, "%s: %s: Cannot create output file.\n", argv[0], outputfile); return (-2); } FillTable(MainTable, 7, Pass, S_Pass); FillTable(MainTable, 7, Horiz, S_Horiz); FillTable(MainTable, 7, V0, S_V0); FillTable(MainTable, 7, VR, S_VR); FillTable(MainTable, 7, VL, S_VL); FillTable(MainTable, 7, Ext, S_Ext); FillTable(MainTable, 7, EOLV, S_EOL); FillTable(WhiteTable, 12, MakeUpW, S_MakeUpW); FillTable(WhiteTable, 12, MakeUp, S_MakeUp); FillTable(WhiteTable, 12, TermW, S_TermW); FillTable(WhiteTable, 12, EOLH, S_EOL); FillTable(BlackTable, 13, MakeUpB, S_MakeUpB); FillTable(BlackTable, 13, MakeUp, S_MakeUp); FillTable(BlackTable, 13, TermB, S_TermB); FillTable(BlackTable, 13, EOLH, S_EOL); fprintf(fd, "/* WARNING, this file was automatically generated by the\n"); fprintf(fd, " mkg3states program */\n"); fprintf(fd, "#include \"tiff.h\"\n"); fprintf(fd, "#include \"tif_fax3.h\"\n"); WriteTable(fd, MainTable, 128, "TIFFFaxMainTable"); WriteTable(fd, WhiteTable, 4096, "TIFFFaxWhiteTable"); WriteTable(fd, BlackTable, 8192, "TIFFFaxBlackTable"); fclose(fd); return (0); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_dirinfo.c0000644000212300117540000013557512014215302013454 00000000000000/* $Id: tif_dirinfo.c,v 1.117 2012-08-19 16:56:34 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Core Directory Tag Support. */ #include "tiffiop.h" #include /* * NOTE: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG. * * NOTE: The second field (field_readcount) and third field (field_writecount) * sometimes use the values TIFF_VARIABLE (-1), TIFF_VARIABLE2 (-3) * and TIFF_SPP (-2). The macros should be used but would throw off * the formatting of the code, so please interprete the -1, -2 and -3 * values accordingly. */ static TIFFFieldArray tiffFieldArray; static TIFFFieldArray exifFieldArray; static TIFFField tiffFields[] = { { TIFFTAG_SUBFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_SUBFILETYPE, 1, 0, "SubfileType", NULL }, { TIFFTAG_OSUBFILETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_SUBFILETYPE, 1, 0, "OldSubfileType", NULL }, { TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_IMAGEDIMENSIONS, 0, 0, "ImageWidth", NULL }, { TIFFTAG_IMAGELENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_IMAGEDIMENSIONS, 1, 0, "ImageLength", NULL }, { TIFFTAG_BITSPERSAMPLE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_BITSPERSAMPLE, 0, 0, "BitsPerSample", NULL }, { TIFFTAG_COMPRESSION, -1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_COMPRESSION, 0, 0, "Compression", NULL }, { TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_PHOTOMETRIC, 0, 0, "PhotometricInterpretation", NULL }, { TIFFTAG_THRESHHOLDING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_THRESHHOLDING, 1, 0, "Threshholding", NULL }, { TIFFTAG_CELLWIDTH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "CellWidth", NULL }, { TIFFTAG_CELLLENGTH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "CellLength", NULL }, { TIFFTAG_FILLORDER, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_FILLORDER, 0, 0, "FillOrder", NULL }, { TIFFTAG_DOCUMENTNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DocumentName", NULL }, { TIFFTAG_IMAGEDESCRIPTION, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageDescription", NULL }, { TIFFTAG_MAKE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Make", NULL }, { TIFFTAG_MODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Model", NULL }, { TIFFTAG_STRIPOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPOFFSETS, 0, 0, "StripOffsets", NULL }, { TIFFTAG_ORIENTATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_ORIENTATION, 0, 0, "Orientation", NULL }, { TIFFTAG_SAMPLESPERPIXEL, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_SAMPLESPERPIXEL, 0, 0, "SamplesPerPixel", NULL }, { TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_ROWSPERSTRIP, 0, 0, "RowsPerStrip", NULL }, { TIFFTAG_STRIPBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "StripByteCounts", NULL }, { TIFFTAG_MINSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_MINSAMPLEVALUE, 1, 0, "MinSampleValue", NULL }, { TIFFTAG_MAXSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_MAXSAMPLEVALUE, 1, 0, "MaxSampleValue", NULL }, { TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "XResolution", NULL }, { TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "YResolution", NULL }, { TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_PLANARCONFIG, 0, 0, "PlanarConfiguration", NULL }, { TIFFTAG_PAGENAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PageName", NULL }, { TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "XPosition", NULL }, { TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "YPosition", NULL }, { TIFFTAG_FREEOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeOffsets", NULL }, { TIFFTAG_FREEBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeByteCounts", NULL }, { TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseUnit", NULL }, { TIFFTAG_GRAYRESPONSECURVE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseCurve", NULL }, { TIFFTAG_RESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTIONUNIT, 1, 0, "ResolutionUnit", NULL }, { TIFFTAG_PAGENUMBER, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_PAGENUMBER, 1, 0, "PageNumber", NULL }, { TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "ColorResponseUnit", NULL }, { TIFFTAG_TRANSFERFUNCTION, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_OTHER, TIFF_SETGET_UNDEFINED, FIELD_TRANSFERFUNCTION, 1, 0, "TransferFunction", NULL }, { TIFFTAG_SOFTWARE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Software", NULL }, { TIFFTAG_DATETIME, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTime", NULL }, { TIFFTAG_ARTIST, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Artist", NULL }, { TIFFTAG_HOSTCOMPUTER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "HostComputer", NULL }, { TIFFTAG_WHITEPOINT, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhitePoint", NULL }, { TIFFTAG_PRIMARYCHROMATICITIES, 6, 6, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PrimaryChromaticities", NULL }, { TIFFTAG_COLORMAP, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_OTHER, TIFF_SETGET_UNDEFINED, FIELD_COLORMAP, 1, 0, "ColorMap", NULL }, { TIFFTAG_HALFTONEHINTS, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_HALFTONEHINTS, 1, 0, "HalftoneHints", NULL }, { TIFFTAG_TILEWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_TILEDIMENSIONS, 0, 0, "TileWidth", NULL }, { TIFFTAG_TILELENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_TILEDIMENSIONS, 0, 0, "TileLength", NULL }, { TIFFTAG_TILEOFFSETS, -1, 1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPOFFSETS, 0, 0, "TileOffsets", NULL }, { TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "TileByteCounts", NULL }, { TIFFTAG_SUBIFD, -1, -1, TIFF_IFD8, 0, TIFF_SETGET_C16_IFD8, TIFF_SETGET_UNDEFINED, FIELD_SUBIFD, 1, 1, "SubIFD", &tiffFieldArray }, { TIFFTAG_INKSET, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InkSet", NULL }, { TIFFTAG_INKNAMES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_C16_ASCII, TIFF_SETGET_UNDEFINED, FIELD_INKNAMES, 1, 1, "InkNames", NULL }, { TIFFTAG_NUMBEROFINKS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "NumberOfInks", NULL }, { TIFFTAG_DOTRANGE, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DotRange", NULL }, { TIFFTAG_TARGETPRINTER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TargetPrinter", NULL }, { TIFFTAG_EXTRASAMPLES, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_EXTRASAMPLES, 0, 1, "ExtraSamples", NULL }, { TIFFTAG_SAMPLEFORMAT, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_SAMPLEFORMAT, 0, 0, "SampleFormat", NULL }, { TIFFTAG_SMINSAMPLEVALUE, -2, -1, TIFF_ANY, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_SMINSAMPLEVALUE, 1, 0, "SMinSampleValue", NULL }, { TIFFTAG_SMAXSAMPLEVALUE, -2, -1, TIFF_ANY, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_SMAXSAMPLEVALUE, 1, 0, "SMaxSampleValue", NULL }, { TIFFTAG_CLIPPATH, -1, -3, TIFF_BYTE, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ClipPath", NULL }, { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SLONG, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "XClipPathUnits", NULL }, { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SBYTE, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "XClipPathUnits", NULL }, { TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SLONG, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "YClipPathUnits", NULL }, { TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "YCbCrCoefficients", NULL }, { TIFFTAG_YCBCRSUBSAMPLING, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_YCBCRSUBSAMPLING, 0, 0, "YCbCrSubsampling", NULL }, { TIFFTAG_YCBCRPOSITIONING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_YCBCRPOSITIONING, 0, 0, "YCbCrPositioning", NULL }, { TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_REFBLACKWHITE, 1, 0, "ReferenceBlackWhite", NULL }, { TIFFTAG_XMLPACKET, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "XMLPacket", NULL }, /* begin SGI tags */ { TIFFTAG_MATTEING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_EXTRASAMPLES, 0, 0, "Matteing", NULL }, { TIFFTAG_DATATYPE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_SAMPLEFORMAT, 0, 0, "DataType", NULL }, { TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_IMAGEDEPTH, 0, 0, "ImageDepth", NULL }, { TIFFTAG_TILEDEPTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_TILEDEPTH, 0, 0, "TileDepth", NULL }, /* end SGI tags */ /* begin Pixar tags */ { TIFFTAG_PIXAR_IMAGEFULLWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageFullWidth", NULL }, { TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageFullLength", NULL }, { TIFFTAG_PIXAR_TEXTUREFORMAT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TextureFormat", NULL }, { TIFFTAG_PIXAR_WRAPMODES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TextureWrapModes", NULL }, { TIFFTAG_PIXAR_FOVCOT, 1, 1, TIFF_FLOAT, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FieldOfViewCotangent", NULL }, { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToScreen", NULL }, { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToCamera", NULL }, { TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Copyright", NULL }, /* end Pixar tags */ { TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_LONG, 0, TIFF_SETGET_C32_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "RichTIFFIPTC", NULL }, { TIFFTAG_PHOTOSHOP, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Photoshop", NULL }, { TIFFTAG_EXIFIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "EXIFIFDOffset", &exifFieldArray }, { TIFFTAG_ICCPROFILE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ICC Profile", NULL }, { TIFFTAG_GPSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "GPSIFDOffset", NULL }, { TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvParams", NULL }, { TIFFTAG_FAXSUBADDRESS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxSubAddress", NULL }, { TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvTime", NULL }, { TIFFTAG_FAXDCS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxDcs", NULL }, { TIFFTAG_STONITS, 1, 1, TIFF_DOUBLE, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "StoNits", NULL }, { TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InteroperabilityIFDOffset", NULL }, /* begin DNG tags */ { TIFFTAG_DNGVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DNGVersion", NULL }, { TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DNGBackwardVersion", NULL }, { TIFFTAG_UNIQUECAMERAMODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "UniqueCameraModel", NULL }, { TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "LocalizedCameraModel", NULL }, { TIFFTAG_CFAPLANECOLOR, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CFAPlaneColor", NULL }, { TIFFTAG_CFALAYOUT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFALayout", NULL }, { TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "LinearizationTable", NULL }, { TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BlackLevelRepeatDim", NULL }, { TIFFTAG_BLACKLEVEL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevel", NULL }, { TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevelDeltaH", NULL }, { TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevelDeltaV", NULL }, { TIFFTAG_WHITELEVEL, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "WhiteLevel", NULL }, { TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultScale", NULL }, { TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BestQualityScale", NULL }, { TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropOrigin", NULL }, { TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropSize", NULL }, { TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ColorMatrix1", NULL }, { TIFFTAG_COLORMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ColorMatrix2", NULL }, { TIFFTAG_CAMERACALIBRATION1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CameraCalibration1", NULL }, { TIFFTAG_CAMERACALIBRATION2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CameraCalibration2", NULL }, { TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ReductionMatrix1", NULL }, { TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ReductionMatrix2", NULL }, { TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AnalogBalance", NULL }, { TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotNeutral", NULL }, { TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AsShotWhiteXY", NULL }, { TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineExposure", NULL }, { TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineNoise", NULL }, { TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineSharpness", NULL }, { TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BayerGreenSplit", NULL }, { TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LinearResponseLimit", NULL }, { TIFFTAG_CAMERASERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraSerialNumber", NULL }, { TIFFTAG_LENSINFO, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LensInfo", NULL }, { TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ChromaBlurRadius", NULL }, { TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AntiAliasStrength", NULL }, { TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ShadowScale", NULL }, { TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "DNGPrivateData", NULL }, { TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "MakerNoteSafety", NULL }, { TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CalibrationIlluminant1", NULL }, { TIFFTAG_CALIBRATIONILLUMINANT2, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CalibrationIlluminant2", NULL }, { TIFFTAG_RAWDATAUNIQUEID, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "RawDataUniqueID", NULL }, { TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OriginalRawFileName", NULL }, { TIFFTAG_ORIGINALRAWFILEDATA, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "OriginalRawFileData", NULL }, { TIFFTAG_ACTIVEAREA, 4, 4, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ActiveArea", NULL }, { TIFFTAG_MASKEDAREAS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "MaskedAreas", NULL }, { TIFFTAG_ASSHOTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotICCProfile", NULL }, { TIFFTAG_ASSHOTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotPreProfileMatrix", NULL }, { TIFFTAG_CURRENTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CurrentICCProfile", NULL }, { TIFFTAG_CURRENTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CurrentPreProfileMatrix", NULL }, { TIFFTAG_PERSAMPLE, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "PerSample", NULL}, /* end DNG tags */ /* begin TIFF/FX tags */ { TIFFTAG_INDEXED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "Indexed" }, { TIFFTAG_GLOBALPARAMETERSIFD, 1, 1, TIFF_IFD, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "GlobalParametersIFD", NULL }, { TIFFTAG_PROFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ProfileType", NULL }, { TIFFTAG_FAXPROFILE, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "FaxProfile", NULL }, { TIFFTAG_CODINGMETHODS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CodingMethods", NULL }, { TIFFTAG_VERSIONYEAR, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "VersionYear", NULL }, { TIFFTAG_MODENUMBER, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ModeNumber", NULL }, { TIFFTAG_DECODE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Decode", NULL }, { TIFFTAG_IMAGEBASECOLOR, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ImageBaseColor", NULL }, { TIFFTAG_T82OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "T82Options", NULL }, { TIFFTAG_STRIPROWCOUNTS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "StripRowCounts", NULL }, { TIFFTAG_IMAGELAYER, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ImageLayer", NULL }, /* end DNG tags */ /* begin pseudo tags */ }; static TIFFField exifFields[] = { { EXIFTAG_EXPOSURETIME, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureTime", NULL }, { EXIFTAG_FNUMBER, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FNumber", NULL }, { EXIFTAG_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureProgram", NULL }, { EXIFTAG_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SpectralSensitivity", NULL }, { EXIFTAG_ISOSPEEDRATINGS, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ISOSpeedRatings", NULL }, { EXIFTAG_OECF, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OptoelectricConversionFactor", NULL }, { EXIFTAG_EXIFVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExifVersion", NULL }, { EXIFTAG_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeOriginal", NULL }, { EXIFTAG_DATETIMEDIGITIZED, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeDigitized", NULL }, { EXIFTAG_COMPONENTSCONFIGURATION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ComponentsConfiguration", NULL }, { EXIFTAG_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CompressedBitsPerPixel", NULL }, { EXIFTAG_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ShutterSpeedValue", NULL }, { EXIFTAG_APERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ApertureValue", NULL }, { EXIFTAG_BRIGHTNESSVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BrightnessValue", NULL }, { EXIFTAG_EXPOSUREBIASVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureBiasValue", NULL }, { EXIFTAG_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MaxApertureValue", NULL }, { EXIFTAG_SUBJECTDISTANCE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistance", NULL }, { EXIFTAG_METERINGMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MeteringMode", NULL }, { EXIFTAG_LIGHTSOURCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LightSource", NULL }, { EXIFTAG_FLASH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Flash", NULL }, { EXIFTAG_FOCALLENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLength", NULL }, { EXIFTAG_SUBJECTAREA, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SubjectArea", NULL }, { EXIFTAG_MAKERNOTE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "MakerNote", NULL }, { EXIFTAG_USERCOMMENT, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "UserComment", NULL }, { EXIFTAG_SUBSECTIME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTime", NULL }, { EXIFTAG_SUBSECTIMEORIGINAL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeOriginal", NULL }, { EXIFTAG_SUBSECTIMEDIGITIZED, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeDigitized", NULL }, { EXIFTAG_FLASHPIXVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashpixVersion", NULL }, { EXIFTAG_COLORSPACE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ColorSpace", NULL }, { EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelXDimension", NULL }, { EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelYDimension", NULL }, { EXIFTAG_RELATEDSOUNDFILE, 13, 13, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RelatedSoundFile", NULL }, { EXIFTAG_FLASHENERGY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashEnergy", NULL }, { EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SpatialFrequencyResponse", NULL }, { EXIFTAG_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneXResolution", NULL }, { EXIFTAG_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneYResolution", NULL }, { EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneResolutionUnit", NULL }, { EXIFTAG_SUBJECTLOCATION, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectLocation", NULL }, { EXIFTAG_EXPOSUREINDEX, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureIndex", NULL }, { EXIFTAG_SENSINGMETHOD, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SensingMethod", NULL }, { EXIFTAG_FILESOURCE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FileSource", NULL }, { EXIFTAG_SCENETYPE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneType", NULL }, { EXIFTAG_CFAPATTERN, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CFAPattern", NULL }, { EXIFTAG_CUSTOMRENDERED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CustomRendered", NULL }, { EXIFTAG_EXPOSUREMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureMode", NULL }, { EXIFTAG_WHITEBALANCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhiteBalance", NULL }, { EXIFTAG_DIGITALZOOMRATIO, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DigitalZoomRatio", NULL }, { EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLengthIn35mmFilm", NULL }, { EXIFTAG_SCENECAPTURETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneCaptureType", NULL }, { EXIFTAG_GAINCONTROL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GainControl", NULL }, { EXIFTAG_CONTRAST, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Contrast", NULL }, { EXIFTAG_SATURATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Saturation", NULL }, { EXIFTAG_SHARPNESS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Sharpness", NULL }, { EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "DeviceSettingDescription", NULL }, { EXIFTAG_SUBJECTDISTANCERANGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistanceRange", NULL }, { EXIFTAG_IMAGEUNIQUEID, 33, 33, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageUniqueID", NULL } }; static TIFFFieldArray tiffFieldArray = { tfiatImage, 0, TIFFArrayCount(tiffFields), tiffFields }; static TIFFFieldArray exifFieldArray = { tfiatExif, 0, TIFFArrayCount(exifFields), exifFields }; /* * We have our own local lfind() equivelent to avoid subtle differences * in types passed to lfind() on different systems. */ static void * td_lfind(const void *key, const void *base, size_t *nmemb, size_t size, int(*compar)(const void *, const void *)) { char *element, *end; end = (char *)base + *nmemb * size; for (element = (char *)base; element < end; element += size) if (!compar(key, element)) /* key found */ return element; return NULL; } const TIFFFieldArray* _TIFFGetFields(void) { return(&tiffFieldArray); } const TIFFFieldArray* _TIFFGetExifFields(void) { return(&exifFieldArray); } void _TIFFSetupFields(TIFF* tif, const TIFFFieldArray* fieldarray) { if (tif->tif_fields && tif->tif_nfields > 0) { uint32 i; for (i = 0; i < tif->tif_nfields; i++) { TIFFField *fld = tif->tif_fields[i]; if (fld->field_bit == FIELD_CUSTOM && strncmp("Tag ", fld->field_name, 4) == 0) { _TIFFfree(fld->field_name); _TIFFfree(fld); } } _TIFFfree(tif->tif_fields); tif->tif_fields = NULL; tif->tif_nfields = 0; } if (!_TIFFMergeFields(tif, fieldarray->fields, fieldarray->count)) { TIFFErrorExt(tif->tif_clientdata, "_TIFFSetupFields", "Setting up field info failed"); } } static int tagCompare(const void* a, const void* b) { const TIFFField* ta = *(const TIFFField**) a; const TIFFField* tb = *(const TIFFField**) b; /* NB: be careful of return values for 16-bit platforms */ if (ta->field_tag != tb->field_tag) return (int)ta->field_tag - (int)tb->field_tag; else return (ta->field_type == TIFF_ANY) ? 0 : ((int)tb->field_type - (int)ta->field_type); } static int tagNameCompare(const void* a, const void* b) { const TIFFField* ta = *(const TIFFField**) a; const TIFFField* tb = *(const TIFFField**) b; int ret = strcmp(ta->field_name, tb->field_name); if (ret) return ret; else return (ta->field_type == TIFF_ANY) ? 0 : ((int)tb->field_type - (int)ta->field_type); } int _TIFFMergeFields(TIFF* tif, const TIFFField info[], uint32 n) { static const char module[] = "_TIFFMergeFields"; static const char reason[] = "for fields array"; /* TIFFField** tp; */ uint32 i; tif->tif_foundfield = NULL; if (tif->tif_fields && tif->tif_nfields > 0) { tif->tif_fields = (TIFFField**) _TIFFCheckRealloc(tif, tif->tif_fields, (tif->tif_nfields + n), sizeof(TIFFField *), reason); } else { tif->tif_fields = (TIFFField **) _TIFFCheckMalloc(tif, n, sizeof(TIFFField *), reason); } if (!tif->tif_fields) { TIFFErrorExt(tif->tif_clientdata, module, "Failed to allocate fields array"); return 0; } /* tp = tif->tif_fields + tif->tif_nfields; */ for (i = 0; i < n; i++) { const TIFFField *fip = TIFFFindField(tif, info[i].field_tag, TIFF_ANY); /* only add definitions that aren't already present */ if (!fip) { tif->tif_fields[tif->tif_nfields] = (TIFFField *) (info+i); tif->tif_nfields++; } } /* Sort the field info by tag number */ qsort(tif->tif_fields, tif->tif_nfields, sizeof(TIFFField *), tagCompare); return n; } void _TIFFPrintFieldInfo(TIFF* tif, FILE* fd) { uint32 i; fprintf(fd, "%s: \n", tif->tif_name); for (i = 0; i < tif->tif_nfields; i++) { const TIFFField* fip = tif->tif_fields[i]; fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n" , (int)i , (unsigned long) fip->field_tag , fip->field_readcount, fip->field_writecount , fip->field_type , fip->field_bit , fip->field_oktochange ? "TRUE" : "FALSE" , fip->field_passcount ? "TRUE" : "FALSE" , fip->field_name ); } } /* * Return size of TIFFDataType in bytes */ int TIFFDataWidth(TIFFDataType type) { switch(type) { case 0: /* nothing */ case TIFF_BYTE: case TIFF_ASCII: case TIFF_SBYTE: case TIFF_UNDEFINED: return 1; case TIFF_SHORT: case TIFF_SSHORT: return 2; case TIFF_LONG: case TIFF_SLONG: case TIFF_FLOAT: case TIFF_IFD: return 4; case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_DOUBLE: case TIFF_LONG8: case TIFF_SLONG8: case TIFF_IFD8: return 8; default: return 0; /* will return 0 for unknown types */ } } /* * Return size of TIFFDataType in bytes. * * XXX: We need a separate function to determine the space needed * to store the value. For TIFF_RATIONAL values TIFFDataWidth() returns 8, * but we use 4-byte float to represent rationals. */ int _TIFFDataSize(TIFFDataType type) { switch (type) { case TIFF_BYTE: case TIFF_SBYTE: case TIFF_ASCII: case TIFF_UNDEFINED: return 1; case TIFF_SHORT: case TIFF_SSHORT: return 2; case TIFF_LONG: case TIFF_SLONG: case TIFF_FLOAT: case TIFF_IFD: case TIFF_RATIONAL: case TIFF_SRATIONAL: return 4; case TIFF_DOUBLE: case TIFF_LONG8: case TIFF_SLONG8: case TIFF_IFD8: return 8; default: return 0; } } const TIFFField* TIFFFindField(TIFF* tif, uint32 tag, TIFFDataType dt) { TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, 0, NULL, NULL}; TIFFField* pkey = &key; const TIFFField **ret; if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag && (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type)) return tif->tif_foundfield; /* If we are invoked with no field information, then just return. */ if (!tif->tif_fields) return NULL; /* NB: use sorted search (e.g. binary search) */ key.field_tag = tag; key.field_type = dt; ret = (const TIFFField **) bsearch(&pkey, tif->tif_fields, tif->tif_nfields, sizeof(TIFFField *), tagCompare); return tif->tif_foundfield = (ret ? *ret : NULL); } const TIFFField* _TIFFFindFieldByName(TIFF* tif, const char *field_name, TIFFDataType dt) { TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, 0, NULL, NULL}; TIFFField* pkey = &key; const TIFFField **ret; if (tif->tif_foundfield && streq(tif->tif_foundfield->field_name, field_name) && (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type)) return (tif->tif_foundfield); /* If we are invoked with no field information, then just return. */ if (!tif->tif_fields) return NULL; /* NB: use linear search since list is sorted by key#, not name */ key.field_name = (char *)field_name; key.field_type = dt; ret = (const TIFFField **) td_lfind(&pkey, tif->tif_fields, &tif->tif_nfields, sizeof(TIFFField *), tagNameCompare); return tif->tif_foundfield = (ret ? *ret : NULL); } const TIFFField* TIFFFieldWithTag(TIFF* tif, uint32 tag) { const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY); if (!fip) { TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithTag", "Internal error, unknown tag 0x%x", (unsigned int) tag); } return (fip); } const TIFFField* TIFFFieldWithName(TIFF* tif, const char *field_name) { const TIFFField* fip = _TIFFFindFieldByName(tif, field_name, TIFF_ANY); if (!fip) { TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithName", "Internal error, unknown tag %s", field_name); } return (fip); } uint32 TIFFFieldTag(const TIFFField* fip) { return fip->field_tag; } const char * TIFFFieldName(const TIFFField* fip) { return fip->field_name; } TIFFDataType TIFFFieldDataType(const TIFFField* fip) { return fip->field_type; } int TIFFFieldPassCount(const TIFFField* fip) { return fip->field_passcount; } int TIFFFieldReadCount(const TIFFField* fip) { return fip->field_readcount; } int TIFFFieldWriteCount(const TIFFField* fip) { return fip->field_writecount; } const TIFFField* _TIFFFindOrRegisterField(TIFF *tif, uint32 tag, TIFFDataType dt) { const TIFFField *fld; fld = TIFFFindField(tif, tag, dt); if (fld == NULL) { fld = _TIFFCreateAnonField(tif, tag, dt); if (!_TIFFMergeFields(tif, fld, 1)) return NULL; } return fld; } TIFFField* _TIFFCreateAnonField(TIFF *tif, uint32 tag, TIFFDataType field_type) { TIFFField *fld; (void) tif; fld = (TIFFField *) _TIFFmalloc(sizeof (TIFFField)); if (fld == NULL) return NULL; _TIFFmemset(fld, 0, sizeof(TIFFField)); fld->field_tag = tag; fld->field_readcount = TIFF_VARIABLE2; fld->field_writecount = TIFF_VARIABLE2; fld->field_type = field_type; fld->reserved = 0; switch (field_type) { case TIFF_BYTE: case TIFF_UNDEFINED: fld->set_field_type = TIFF_SETGET_C32_UINT8; fld->get_field_type = TIFF_SETGET_C32_UINT8; break; case TIFF_ASCII: fld->set_field_type = TIFF_SETGET_C32_ASCII; fld->get_field_type = TIFF_SETGET_C32_ASCII; break; case TIFF_SHORT: fld->set_field_type = TIFF_SETGET_C32_UINT16; fld->get_field_type = TIFF_SETGET_C32_UINT16; break; case TIFF_LONG: fld->set_field_type = TIFF_SETGET_C32_UINT32; fld->get_field_type = TIFF_SETGET_C32_UINT32; break; case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: fld->set_field_type = TIFF_SETGET_C32_FLOAT; fld->get_field_type = TIFF_SETGET_C32_FLOAT; break; case TIFF_SBYTE: fld->set_field_type = TIFF_SETGET_C32_SINT8; fld->get_field_type = TIFF_SETGET_C32_SINT8; break; case TIFF_SSHORT: fld->set_field_type = TIFF_SETGET_C32_SINT16; fld->get_field_type = TIFF_SETGET_C32_SINT16; break; case TIFF_SLONG: fld->set_field_type = TIFF_SETGET_C32_SINT32; fld->get_field_type = TIFF_SETGET_C32_SINT32; break; case TIFF_DOUBLE: fld->set_field_type = TIFF_SETGET_C32_DOUBLE; fld->get_field_type = TIFF_SETGET_C32_DOUBLE; break; case TIFF_IFD: case TIFF_IFD8: fld->set_field_type = TIFF_SETGET_C32_IFD8; fld->get_field_type = TIFF_SETGET_C32_IFD8; break; case TIFF_LONG8: fld->set_field_type = TIFF_SETGET_C32_UINT64; fld->get_field_type = TIFF_SETGET_C32_UINT64; break; case TIFF_SLONG8: fld->set_field_type = TIFF_SETGET_C32_SINT64; fld->get_field_type = TIFF_SETGET_C32_SINT64; break; default: fld->set_field_type = TIFF_SETGET_UNDEFINED; fld->get_field_type = TIFF_SETGET_UNDEFINED; break; } fld->field_bit = FIELD_CUSTOM; fld->field_oktochange = TRUE; fld->field_passcount = TRUE; fld->field_name = (char *) _TIFFmalloc(32); if (fld->field_name == NULL) { _TIFFfree(fld); return NULL; } fld->field_subfields = NULL; /* * note that this name is a special sign to TIFFClose() and * _TIFFSetupFields() to free the field */ sprintf(fld->field_name, "Tag %d", (int) tag); return fld; } /**************************************************************************** * O B S O L E T E D I N T E R F A C E S * * Don't use this stuff in your applications, it may be removed in the future * libtiff versions. ****************************************************************************/ static TIFFSetGetFieldType _TIFFSetGetType(TIFFDataType type, short count, unsigned char passcount) { if (type == TIFF_ASCII && count == TIFF_VARIABLE && passcount == 0) return TIFF_SETGET_ASCII; else if (count == 1 && passcount == 0) { switch (type) { case TIFF_BYTE: case TIFF_UNDEFINED: return TIFF_SETGET_UINT8; case TIFF_ASCII: return TIFF_SETGET_ASCII; case TIFF_SHORT: return TIFF_SETGET_UINT16; case TIFF_LONG: return TIFF_SETGET_UINT32; case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: return TIFF_SETGET_FLOAT; case TIFF_SBYTE: return TIFF_SETGET_SINT8; case TIFF_SSHORT: return TIFF_SETGET_SINT16; case TIFF_SLONG: return TIFF_SETGET_SINT32; case TIFF_DOUBLE: return TIFF_SETGET_DOUBLE; case TIFF_IFD: case TIFF_IFD8: return TIFF_SETGET_IFD8; case TIFF_LONG8: return TIFF_SETGET_UINT64; case TIFF_SLONG8: return TIFF_SETGET_SINT64; default: return TIFF_SETGET_UNDEFINED; } } else if (count >= 1 && passcount == 0) { switch (type) { case TIFF_BYTE: case TIFF_UNDEFINED: return TIFF_SETGET_C0_UINT8; case TIFF_ASCII: return TIFF_SETGET_C0_ASCII; case TIFF_SHORT: return TIFF_SETGET_C0_UINT16; case TIFF_LONG: return TIFF_SETGET_C0_UINT32; case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: return TIFF_SETGET_C0_FLOAT; case TIFF_SBYTE: return TIFF_SETGET_C0_SINT8; case TIFF_SSHORT: return TIFF_SETGET_C0_SINT16; case TIFF_SLONG: return TIFF_SETGET_C0_SINT32; case TIFF_DOUBLE: return TIFF_SETGET_C0_DOUBLE; case TIFF_IFD: case TIFF_IFD8: return TIFF_SETGET_C0_IFD8; case TIFF_LONG8: return TIFF_SETGET_C0_UINT64; case TIFF_SLONG8: return TIFF_SETGET_C0_SINT64; default: return TIFF_SETGET_UNDEFINED; } } else if (count == TIFF_VARIABLE && passcount == 1) { switch (type) { case TIFF_BYTE: case TIFF_UNDEFINED: return TIFF_SETGET_C16_UINT8; case TIFF_ASCII: return TIFF_SETGET_C16_ASCII; case TIFF_SHORT: return TIFF_SETGET_C16_UINT16; case TIFF_LONG: return TIFF_SETGET_C16_UINT32; case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: return TIFF_SETGET_C16_FLOAT; case TIFF_SBYTE: return TIFF_SETGET_C16_SINT8; case TIFF_SSHORT: return TIFF_SETGET_C16_SINT16; case TIFF_SLONG: return TIFF_SETGET_C16_SINT32; case TIFF_DOUBLE: return TIFF_SETGET_C16_DOUBLE; case TIFF_IFD: case TIFF_IFD8: return TIFF_SETGET_C16_IFD8; case TIFF_LONG8: return TIFF_SETGET_C16_UINT64; case TIFF_SLONG8: return TIFF_SETGET_C16_SINT64; default: return TIFF_SETGET_UNDEFINED; } } else if (count == TIFF_VARIABLE2 && passcount == 1) { switch (type) { case TIFF_BYTE: case TIFF_UNDEFINED: return TIFF_SETGET_C32_UINT8; case TIFF_ASCII: return TIFF_SETGET_C32_ASCII; case TIFF_SHORT: return TIFF_SETGET_C32_UINT16; case TIFF_LONG: return TIFF_SETGET_C32_UINT32; case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: return TIFF_SETGET_C32_FLOAT; case TIFF_SBYTE: return TIFF_SETGET_C32_SINT8; case TIFF_SSHORT: return TIFF_SETGET_C32_SINT16; case TIFF_SLONG: return TIFF_SETGET_C32_SINT32; case TIFF_DOUBLE: return TIFF_SETGET_C32_DOUBLE; case TIFF_IFD: case TIFF_IFD8: return TIFF_SETGET_C32_IFD8; case TIFF_LONG8: return TIFF_SETGET_C32_UINT64; case TIFF_SLONG8: return TIFF_SETGET_C32_SINT64; default: return TIFF_SETGET_UNDEFINED; } } return TIFF_SETGET_UNDEFINED; } int TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], uint32 n) { static const char module[] = "TIFFMergeFieldInfo"; static const char reason[] = "for fields array"; TIFFField *tp; size_t nfields; uint32 i; if (tif->tif_nfieldscompat > 0) { tif->tif_fieldscompat = (TIFFFieldArray *) _TIFFCheckRealloc(tif, tif->tif_fieldscompat, tif->tif_nfieldscompat + 1, sizeof(TIFFFieldArray), reason); } else { tif->tif_fieldscompat = (TIFFFieldArray *) _TIFFCheckMalloc(tif, 1, sizeof(TIFFFieldArray), reason); } if (!tif->tif_fieldscompat) { TIFFErrorExt(tif->tif_clientdata, module, "Failed to allocate fields array"); return -1; } nfields = tif->tif_nfieldscompat++; tif->tif_fieldscompat[nfields].type = tfiatOther; tif->tif_fieldscompat[nfields].allocated_size = n; tif->tif_fieldscompat[nfields].count = n; tif->tif_fieldscompat[nfields].fields = (TIFFField *)_TIFFCheckMalloc(tif, n, sizeof(TIFFField), reason); if (!tif->tif_fieldscompat[nfields].fields) { TIFFErrorExt(tif->tif_clientdata, module, "Failed to allocate fields array"); return -1; } tp = tif->tif_fieldscompat[nfields].fields; for (i = 0; i < n; i++) { tp->field_tag = info[i].field_tag; tp->field_readcount = info[i].field_readcount; tp->field_writecount = info[i].field_writecount; tp->field_type = info[i].field_type; tp->reserved = 0; tp->set_field_type = _TIFFSetGetType(info[i].field_type, info[i].field_readcount, info[i].field_passcount); tp->get_field_type = _TIFFSetGetType(info[i].field_type, info[i].field_readcount, info[i].field_passcount); tp->field_bit = info[i].field_bit; tp->field_oktochange = info[i].field_oktochange; tp->field_passcount = info[i].field_passcount; tp->field_name = info[i].field_name; tp->field_subfields = NULL; tp++; } if (!_TIFFMergeFields(tif, tif->tif_fieldscompat[nfields].fields, n)) { TIFFErrorExt(tif->tif_clientdata, module, "Setting up field info failed"); return -1; } return 0; } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/libtiffxx.map0000644000212300117540000000004411707054642013510 00000000000000LIBTIFFXX_4.0 { global: *; }; tiff-4.0.3/libtiff/tif_dirread.c0000644000212300117540000042167712014215302013435 00000000000000/* $Id: tif_dirread.c,v 1.178 2012-08-19 16:56:34 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Directory Read Support Routines. */ /* Suggested pending improvements: * - add a field 'ignore' to the TIFFDirEntry structure, to flag status, * eliminating current use of the IGNORE value, and therefore eliminating * current irrational behaviour on tags with tag id code 0 * - add a field 'field_info' to the TIFFDirEntry structure, and set that with * the pointer to the appropriate TIFFField structure early on in * TIFFReadDirectory, so as to eliminate current possibly repetitive lookup. */ #include "tiffiop.h" #define IGNORE 0 /* tag placeholder used below */ #define FAILED_FII ((uint32) -1) #ifdef HAVE_IEEEFP # define TIFFCvtIEEEFloatToNative(tif, n, fp) # define TIFFCvtIEEEDoubleToNative(tif, n, dp) #else extern void TIFFCvtIEEEFloatToNative(TIFF*, uint32, float*); extern void TIFFCvtIEEEDoubleToNative(TIFF*, uint32, double*); #endif enum TIFFReadDirEntryErr { TIFFReadDirEntryErrOk = 0, TIFFReadDirEntryErrCount = 1, TIFFReadDirEntryErrType = 2, TIFFReadDirEntryErrIo = 3, TIFFReadDirEntryErrRange = 4, TIFFReadDirEntryErrPsdif = 5, TIFFReadDirEntryErrSizesan = 6, TIFFReadDirEntryErrAlloc = 7, }; static enum TIFFReadDirEntryErr TIFFReadDirEntryByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryFloat(TIFF* tif, TIFFDirEntry* direntry, float* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryDouble(TIFF* tif, TIFFDirEntry* direntry, double* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8(TIFF* tif, TIFFDirEntry* direntry, uint64* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryArray(TIFF* tif, TIFFDirEntry* direntry, uint32* count, uint32 desttypesize, void** value); static enum TIFFReadDirEntryErr TIFFReadDirEntryByteArray(TIFF* tif, TIFFDirEntry* direntry, uint8** value); static enum TIFFReadDirEntryErr TIFFReadDirEntrySbyteArray(TIFF* tif, TIFFDirEntry* direntry, int8** value); static enum TIFFReadDirEntryErr TIFFReadDirEntryShortArray(TIFF* tif, TIFFDirEntry* direntry, uint16** value); static enum TIFFReadDirEntryErr TIFFReadDirEntrySshortArray(TIFF* tif, TIFFDirEntry* direntry, int16** value); static enum TIFFReadDirEntryErr TIFFReadDirEntryLongArray(TIFF* tif, TIFFDirEntry* direntry, uint32** value); static enum TIFFReadDirEntryErr TIFFReadDirEntrySlongArray(TIFF* tif, TIFFDirEntry* direntry, int32** value); static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value); static enum TIFFReadDirEntryErr TIFFReadDirEntrySlong8Array(TIFF* tif, TIFFDirEntry* direntry, int64** value); static enum TIFFReadDirEntryErr TIFFReadDirEntryFloatArray(TIFF* tif, TIFFDirEntry* direntry, float** value); static enum TIFFReadDirEntryErr TIFFReadDirEntryDoubleArray(TIFF* tif, TIFFDirEntry* direntry, double** value); static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value); static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value); #if 0 static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value); #endif static void TIFFReadDirEntryCheckedByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value); static void TIFFReadDirEntryCheckedSbyte(TIFF* tif, TIFFDirEntry* direntry, int8* value); static void TIFFReadDirEntryCheckedShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value); static void TIFFReadDirEntryCheckedSshort(TIFF* tif, TIFFDirEntry* direntry, int16* value); static void TIFFReadDirEntryCheckedLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value); static void TIFFReadDirEntryCheckedSlong(TIFF* tif, TIFFDirEntry* direntry, int32* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSlong8(TIFF* tif, TIFFDirEntry* direntry, int64* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedRational(TIFF* tif, TIFFDirEntry* direntry, double* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSrational(TIFF* tif, TIFFDirEntry* direntry, double* value); static void TIFFReadDirEntryCheckedFloat(TIFF* tif, TIFFDirEntry* direntry, float* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedDouble(TIFF* tif, TIFFDirEntry* direntry, double* value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSbyte(int8 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteShort(uint16 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSshort(int16 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong(uint32 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong(int32 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong8(uint64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong8(int64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteByte(uint8 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteShort(uint16 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSshort(int16 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong(uint32 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong(int32 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong8(uint64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong8(int64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSbyte(int8 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSshort(int16 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong(uint32 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong(int32 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong8(uint64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong8(int64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortShort(uint16 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong(uint32 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong(int32 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong8(uint64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong8(int64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSbyte(int8 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSshort(int16 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong(int32 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongLong8(uint64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong8(int64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong(uint32 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong8(uint64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongSlong8(int64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Sbyte(int8 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Sshort(int16 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Slong(int32 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Slong8(int64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlong8Long8(uint64 value); static enum TIFFReadDirEntryErr TIFFReadDirEntryData(TIFF* tif, uint64 offset, tmsize_t size, void* dest); static void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, const char* module, const char* tagname, int recover); static void TIFFReadDirectoryCheckOrder(TIFF* tif, TIFFDirEntry* dir, uint16 dircount); static TIFFDirEntry* TIFFReadDirectoryFindEntry(TIFF* tif, TIFFDirEntry* dir, uint16 dircount, uint16 tagid); static void TIFFReadDirectoryFindFieldInfo(TIFF* tif, uint16 tagid, uint32* fii); static int EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount); static void MissingRequired(TIFF*, const char*); static int TIFFCheckDirOffset(TIFF* tif, uint64 diroff); static int CheckDirCount(TIFF*, TIFFDirEntry*, uint32); static uint16 TIFFFetchDirectory(TIFF* tif, uint64 diroff, TIFFDirEntry** pdir, uint64* nextdiroff); static int TIFFFetchNormalTag(TIFF*, TIFFDirEntry*, int recover); static int TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, uint32 nstrips, uint64** lpp); static int TIFFFetchSubjectDistance(TIFF*, TIFFDirEntry*); static void ChopUpSingleUncompressedStrip(TIFF*); static uint64 TIFFReadUInt64(const uint8 *value); typedef union _UInt64Aligned_t { double d; uint64 l; uint32 i[2]; uint16 s[4]; uint8 c[8]; } UInt64Aligned_t; /* Unaligned safe copy of a uint64 value from an octet array. */ static uint64 TIFFReadUInt64(const uint8 *value) { UInt64Aligned_t result; result.c[0]=value[0]; result.c[1]=value[1]; result.c[2]=value[2]; result.c[3]=value[3]; result.c[4]=value[4]; result.c[5]=value[5]; result.c[6]=value[6]; result.c[7]=value[7]; return result.l; } static enum TIFFReadDirEntryErr TIFFReadDirEntryByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value) { enum TIFFReadDirEntryErr err; if (direntry->tdir_count!=1) return(TIFFReadDirEntryErrCount); switch (direntry->tdir_type) { case TIFF_BYTE: TIFFReadDirEntryCheckedByte(tif,direntry,value); return(TIFFReadDirEntryErrOk); case TIFF_SBYTE: { int8 m; TIFFReadDirEntryCheckedSbyte(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeByteSbyte(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint8)m; return(TIFFReadDirEntryErrOk); } case TIFF_SHORT: { uint16 m; TIFFReadDirEntryCheckedShort(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeByteShort(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint8)m; return(TIFFReadDirEntryErrOk); } case TIFF_SSHORT: { int16 m; TIFFReadDirEntryCheckedSshort(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeByteSshort(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint8)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG: { uint32 m; TIFFReadDirEntryCheckedLong(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeByteLong(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint8)m; return(TIFFReadDirEntryErrOk); } case TIFF_SLONG: { int32 m; TIFFReadDirEntryCheckedSlong(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeByteSlong(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint8)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG8: { uint64 m; err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); err=TIFFReadDirEntryCheckRangeByteLong8(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint8)m; return(TIFFReadDirEntryErrOk); } case TIFF_SLONG8: { int64 m; err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); err=TIFFReadDirEntryCheckRangeByteSlong8(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint8)m; return(TIFFReadDirEntryErrOk); } default: return(TIFFReadDirEntryErrType); } } static enum TIFFReadDirEntryErr TIFFReadDirEntryShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value) { enum TIFFReadDirEntryErr err; if (direntry->tdir_count!=1) return(TIFFReadDirEntryErrCount); switch (direntry->tdir_type) { case TIFF_BYTE: { uint8 m; TIFFReadDirEntryCheckedByte(tif,direntry,&m); *value=(uint16)m; return(TIFFReadDirEntryErrOk); } case TIFF_SBYTE: { int8 m; TIFFReadDirEntryCheckedSbyte(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeShortSbyte(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint16)m; return(TIFFReadDirEntryErrOk); } case TIFF_SHORT: TIFFReadDirEntryCheckedShort(tif,direntry,value); return(TIFFReadDirEntryErrOk); case TIFF_SSHORT: { int16 m; TIFFReadDirEntryCheckedSshort(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeShortSshort(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint16)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG: { uint32 m; TIFFReadDirEntryCheckedLong(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeShortLong(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint16)m; return(TIFFReadDirEntryErrOk); } case TIFF_SLONG: { int32 m; TIFFReadDirEntryCheckedSlong(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeShortSlong(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint16)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG8: { uint64 m; err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); err=TIFFReadDirEntryCheckRangeShortLong8(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint16)m; return(TIFFReadDirEntryErrOk); } case TIFF_SLONG8: { int64 m; err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); err=TIFFReadDirEntryCheckRangeShortSlong8(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint16)m; return(TIFFReadDirEntryErrOk); } default: return(TIFFReadDirEntryErrType); } } static enum TIFFReadDirEntryErr TIFFReadDirEntryLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value) { enum TIFFReadDirEntryErr err; if (direntry->tdir_count!=1) return(TIFFReadDirEntryErrCount); switch (direntry->tdir_type) { case TIFF_BYTE: { uint8 m; TIFFReadDirEntryCheckedByte(tif,direntry,&m); *value=(uint32)m; return(TIFFReadDirEntryErrOk); } case TIFF_SBYTE: { int8 m; TIFFReadDirEntryCheckedSbyte(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeLongSbyte(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint32)m; return(TIFFReadDirEntryErrOk); } case TIFF_SHORT: { uint16 m; TIFFReadDirEntryCheckedShort(tif,direntry,&m); *value=(uint32)m; return(TIFFReadDirEntryErrOk); } case TIFF_SSHORT: { int16 m; TIFFReadDirEntryCheckedSshort(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeLongSshort(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint32)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG: TIFFReadDirEntryCheckedLong(tif,direntry,value); return(TIFFReadDirEntryErrOk); case TIFF_SLONG: { int32 m; TIFFReadDirEntryCheckedSlong(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeLongSlong(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint32)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG8: { uint64 m; err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); err=TIFFReadDirEntryCheckRangeLongLong8(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint32)m; return(TIFFReadDirEntryErrOk); } case TIFF_SLONG8: { int64 m; err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); err=TIFFReadDirEntryCheckRangeLongSlong8(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint32)m; return(TIFFReadDirEntryErrOk); } default: return(TIFFReadDirEntryErrType); } } static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value) { enum TIFFReadDirEntryErr err; if (direntry->tdir_count!=1) return(TIFFReadDirEntryErrCount); switch (direntry->tdir_type) { case TIFF_BYTE: { uint8 m; TIFFReadDirEntryCheckedByte(tif,direntry,&m); *value=(uint64)m; return(TIFFReadDirEntryErrOk); } case TIFF_SBYTE: { int8 m; TIFFReadDirEntryCheckedSbyte(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeLong8Sbyte(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint64)m; return(TIFFReadDirEntryErrOk); } case TIFF_SHORT: { uint16 m; TIFFReadDirEntryCheckedShort(tif,direntry,&m); *value=(uint64)m; return(TIFFReadDirEntryErrOk); } case TIFF_SSHORT: { int16 m; TIFFReadDirEntryCheckedSshort(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeLong8Sshort(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint64)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG: { uint32 m; TIFFReadDirEntryCheckedLong(tif,direntry,&m); *value=(uint64)m; return(TIFFReadDirEntryErrOk); } case TIFF_SLONG: { int32 m; TIFFReadDirEntryCheckedSlong(tif,direntry,&m); err=TIFFReadDirEntryCheckRangeLong8Slong(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint64)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG8: err=TIFFReadDirEntryCheckedLong8(tif,direntry,value); return(err); case TIFF_SLONG8: { int64 m; err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); err=TIFFReadDirEntryCheckRangeLong8Slong8(m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(uint64)m; return(TIFFReadDirEntryErrOk); } default: return(TIFFReadDirEntryErrType); } } static enum TIFFReadDirEntryErr TIFFReadDirEntryFloat(TIFF* tif, TIFFDirEntry* direntry, float* value) { enum TIFFReadDirEntryErr err; if (direntry->tdir_count!=1) return(TIFFReadDirEntryErrCount); switch (direntry->tdir_type) { case TIFF_BYTE: { uint8 m; TIFFReadDirEntryCheckedByte(tif,direntry,&m); *value=(float)m; return(TIFFReadDirEntryErrOk); } case TIFF_SBYTE: { int8 m; TIFFReadDirEntryCheckedSbyte(tif,direntry,&m); *value=(float)m; return(TIFFReadDirEntryErrOk); } case TIFF_SHORT: { uint16 m; TIFFReadDirEntryCheckedShort(tif,direntry,&m); *value=(float)m; return(TIFFReadDirEntryErrOk); } case TIFF_SSHORT: { int16 m; TIFFReadDirEntryCheckedSshort(tif,direntry,&m); *value=(float)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG: { uint32 m; TIFFReadDirEntryCheckedLong(tif,direntry,&m); *value=(float)m; return(TIFFReadDirEntryErrOk); } case TIFF_SLONG: { int32 m; TIFFReadDirEntryCheckedSlong(tif,direntry,&m); *value=(float)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG8: { uint64 m; err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); #if defined(__WIN32__) && (_MSC_VER < 1500) /* * XXX: MSVC 6.0 does not support conversion * of 64-bit integers into floating point * values. */ *value = _TIFFUInt64ToFloat(m); #else *value=(float)m; #endif return(TIFFReadDirEntryErrOk); } case TIFF_SLONG8: { int64 m; err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(float)m; return(TIFFReadDirEntryErrOk); } case TIFF_RATIONAL: { double m; err=TIFFReadDirEntryCheckedRational(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(float)m; return(TIFFReadDirEntryErrOk); } case TIFF_SRATIONAL: { double m; err=TIFFReadDirEntryCheckedSrational(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(float)m; return(TIFFReadDirEntryErrOk); } case TIFF_FLOAT: TIFFReadDirEntryCheckedFloat(tif,direntry,value); return(TIFFReadDirEntryErrOk); case TIFF_DOUBLE: { double m; err=TIFFReadDirEntryCheckedDouble(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(float)m; return(TIFFReadDirEntryErrOk); } default: return(TIFFReadDirEntryErrType); } } static enum TIFFReadDirEntryErr TIFFReadDirEntryDouble(TIFF* tif, TIFFDirEntry* direntry, double* value) { enum TIFFReadDirEntryErr err; if (direntry->tdir_count!=1) return(TIFFReadDirEntryErrCount); switch (direntry->tdir_type) { case TIFF_BYTE: { uint8 m; TIFFReadDirEntryCheckedByte(tif,direntry,&m); *value=(double)m; return(TIFFReadDirEntryErrOk); } case TIFF_SBYTE: { int8 m; TIFFReadDirEntryCheckedSbyte(tif,direntry,&m); *value=(double)m; return(TIFFReadDirEntryErrOk); } case TIFF_SHORT: { uint16 m; TIFFReadDirEntryCheckedShort(tif,direntry,&m); *value=(double)m; return(TIFFReadDirEntryErrOk); } case TIFF_SSHORT: { int16 m; TIFFReadDirEntryCheckedSshort(tif,direntry,&m); *value=(double)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG: { uint32 m; TIFFReadDirEntryCheckedLong(tif,direntry,&m); *value=(double)m; return(TIFFReadDirEntryErrOk); } case TIFF_SLONG: { int32 m; TIFFReadDirEntryCheckedSlong(tif,direntry,&m); *value=(double)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG8: { uint64 m; err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); #if defined(__WIN32__) && (_MSC_VER < 1500) /* * XXX: MSVC 6.0 does not support conversion * of 64-bit integers into floating point * values. */ *value = _TIFFUInt64ToDouble(m); #else *value = (double)m; #endif return(TIFFReadDirEntryErrOk); } case TIFF_SLONG8: { int64 m; err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); *value=(double)m; return(TIFFReadDirEntryErrOk); } case TIFF_RATIONAL: err=TIFFReadDirEntryCheckedRational(tif,direntry,value); return(err); case TIFF_SRATIONAL: err=TIFFReadDirEntryCheckedSrational(tif,direntry,value); return(err); case TIFF_FLOAT: { float m; TIFFReadDirEntryCheckedFloat(tif,direntry,&m); *value=(double)m; return(TIFFReadDirEntryErrOk); } case TIFF_DOUBLE: err=TIFFReadDirEntryCheckedDouble(tif,direntry,value); return(err); default: return(TIFFReadDirEntryErrType); } } static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8(TIFF* tif, TIFFDirEntry* direntry, uint64* value) { enum TIFFReadDirEntryErr err; if (direntry->tdir_count!=1) return(TIFFReadDirEntryErrCount); switch (direntry->tdir_type) { case TIFF_LONG: case TIFF_IFD: { uint32 m; TIFFReadDirEntryCheckedLong(tif,direntry,&m); *value=(uint64)m; return(TIFFReadDirEntryErrOk); } case TIFF_LONG8: case TIFF_IFD8: err=TIFFReadDirEntryCheckedLong8(tif,direntry,value); return(err); default: return(TIFFReadDirEntryErrType); } } static enum TIFFReadDirEntryErr TIFFReadDirEntryArray(TIFF* tif, TIFFDirEntry* direntry, uint32* count, uint32 desttypesize, void** value) { int typesize; uint32 datasize; void* data; typesize=TIFFDataWidth(direntry->tdir_type); if ((direntry->tdir_count==0)||(typesize==0)) { *value=0; return(TIFFReadDirEntryErrOk); } (void) desttypesize; /* * As a sanity check, make sure we have no more than a 2GB tag array * in either the current data type or the dest data type. This also * avoids problems with overflow of tmsize_t on 32bit systems. */ if ((uint64)(2147483647/typesize)tdir_count) return(TIFFReadDirEntryErrSizesan); if ((uint64)(2147483647/desttypesize)tdir_count) return(TIFFReadDirEntryErrSizesan); *count=(uint32)direntry->tdir_count; datasize=(*count)*typesize; assert((tmsize_t)datasize>0); data=_TIFFCheckMalloc(tif, *count, typesize, "ReadDirEntryArray"); if (data==0) return(TIFFReadDirEntryErrAlloc); if (!(tif->tif_flags&TIFF_BIGTIFF)) { if (datasize<=4) _TIFFmemcpy(data,&direntry->tdir_offset,datasize); else { enum TIFFReadDirEntryErr err; uint32 offset = direntry->tdir_offset.toff_long; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,(uint64)offset,(tmsize_t)datasize,data); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(data); return(err); } } } else { if (datasize<=8) _TIFFmemcpy(data,&direntry->tdir_offset,datasize); else { enum TIFFReadDirEntryErr err; uint64 offset = direntry->tdir_offset.toff_long8; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8(&offset); err=TIFFReadDirEntryData(tif,offset,(tmsize_t)datasize,data); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(data); return(err); } } } *value=data; return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryByteArray(TIFF* tif, TIFFDirEntry* direntry, uint8** value) { enum TIFFReadDirEntryErr err; uint32 count; void* origdata; uint8* data; switch (direntry->tdir_type) { case TIFF_ASCII: case TIFF_UNDEFINED: case TIFF_BYTE: case TIFF_SBYTE: case TIFF_SHORT: case TIFF_SSHORT: case TIFF_LONG: case TIFF_SLONG: case TIFF_LONG8: case TIFF_SLONG8: break; default: return(TIFFReadDirEntryErrType); } err=TIFFReadDirEntryArray(tif,direntry,&count,1,&origdata); if ((err!=TIFFReadDirEntryErrOk)||(origdata==0)) { *value=0; return(err); } switch (direntry->tdir_type) { case TIFF_ASCII: case TIFF_UNDEFINED: case TIFF_BYTE: *value=(uint8*)origdata; return(TIFFReadDirEntryErrOk); case TIFF_SBYTE: { int8* m; uint32 n; m=(int8*)origdata; for (n=0; ntdir_type) { case TIFF_SHORT: { uint16* ma; uint8* mb; uint32 n; ma=(uint16*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort(ma); err=TIFFReadDirEntryCheckRangeByteShort(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint8)(*ma++); } } break; case TIFF_SSHORT: { int16* ma; uint8* mb; uint32 n; ma=(int16*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)ma); err=TIFFReadDirEntryCheckRangeByteSshort(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint8)(*ma++); } } break; case TIFF_LONG: { uint32* ma; uint8* mb; uint32 n; ma=(uint32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); err=TIFFReadDirEntryCheckRangeByteLong(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint8)(*ma++); } } break; case TIFF_SLONG: { int32* ma; uint8* mb; uint32 n; ma=(int32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)ma); err=TIFFReadDirEntryCheckRangeByteSlong(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint8)(*ma++); } } break; case TIFF_LONG8: { uint64* ma; uint8* mb; uint32 n; ma=(uint64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8(ma); err=TIFFReadDirEntryCheckRangeByteLong8(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint8)(*ma++); } } break; case TIFF_SLONG8: { int64* ma; uint8* mb; uint32 n; ma=(int64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)ma); err=TIFFReadDirEntryCheckRangeByteSlong8(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint8)(*ma++); } } break; } _TIFFfree(origdata); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(data); return(err); } *value=data; return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntrySbyteArray(TIFF* tif, TIFFDirEntry* direntry, int8** value) { enum TIFFReadDirEntryErr err; uint32 count; void* origdata; int8* data; switch (direntry->tdir_type) { case TIFF_UNDEFINED: case TIFF_BYTE: case TIFF_SBYTE: case TIFF_SHORT: case TIFF_SSHORT: case TIFF_LONG: case TIFF_SLONG: case TIFF_LONG8: case TIFF_SLONG8: break; default: return(TIFFReadDirEntryErrType); } err=TIFFReadDirEntryArray(tif,direntry,&count,1,&origdata); if ((err!=TIFFReadDirEntryErrOk)||(origdata==0)) { *value=0; return(err); } switch (direntry->tdir_type) { case TIFF_UNDEFINED: case TIFF_BYTE: { uint8* m; uint32 n; m=(uint8*)origdata; for (n=0; ntdir_type) { case TIFF_SHORT: { uint16* ma; int8* mb; uint32 n; ma=(uint16*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort(ma); err=TIFFReadDirEntryCheckRangeSbyteShort(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(int8)(*ma++); } } break; case TIFF_SSHORT: { int16* ma; int8* mb; uint32 n; ma=(int16*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)ma); err=TIFFReadDirEntryCheckRangeSbyteSshort(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(int8)(*ma++); } } break; case TIFF_LONG: { uint32* ma; int8* mb; uint32 n; ma=(uint32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); err=TIFFReadDirEntryCheckRangeSbyteLong(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(int8)(*ma++); } } break; case TIFF_SLONG: { int32* ma; int8* mb; uint32 n; ma=(int32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)ma); err=TIFFReadDirEntryCheckRangeSbyteSlong(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(int8)(*ma++); } } break; case TIFF_LONG8: { uint64* ma; int8* mb; uint32 n; ma=(uint64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8(ma); err=TIFFReadDirEntryCheckRangeSbyteLong8(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(int8)(*ma++); } } break; case TIFF_SLONG8: { int64* ma; int8* mb; uint32 n; ma=(int64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)ma); err=TIFFReadDirEntryCheckRangeSbyteSlong8(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(int8)(*ma++); } } break; } _TIFFfree(origdata); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(data); return(err); } *value=data; return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryShortArray(TIFF* tif, TIFFDirEntry* direntry, uint16** value) { enum TIFFReadDirEntryErr err; uint32 count; void* origdata; uint16* data; switch (direntry->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: case TIFF_SHORT: case TIFF_SSHORT: case TIFF_LONG: case TIFF_SLONG: case TIFF_LONG8: case TIFF_SLONG8: break; default: return(TIFFReadDirEntryErrType); } err=TIFFReadDirEntryArray(tif,direntry,&count,2,&origdata); if ((err!=TIFFReadDirEntryErrOk)||(origdata==0)) { *value=0; return(err); } switch (direntry->tdir_type) { case TIFF_SHORT: *value=(uint16*)origdata; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfShort(*value,count); return(TIFFReadDirEntryErrOk); case TIFF_SSHORT: { int16* m; uint32 n; m=(int16*)origdata; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)m); err=TIFFReadDirEntryCheckRangeShortSshort(*m); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(origdata); return(err); } m++; } *value=(uint16*)origdata; return(TIFFReadDirEntryErrOk); } } data=(uint16*)_TIFFmalloc(count*2); if (data==0) { _TIFFfree(origdata); return(TIFFReadDirEntryErrAlloc); } switch (direntry->tdir_type) { case TIFF_BYTE: { uint8* ma; uint16* mb; uint32 n; ma=(uint8*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); err=TIFFReadDirEntryCheckRangeShortLong(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint16)(*ma++); } } break; case TIFF_SLONG: { int32* ma; uint16* mb; uint32 n; ma=(int32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)ma); err=TIFFReadDirEntryCheckRangeShortSlong(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint16)(*ma++); } } break; case TIFF_LONG8: { uint64* ma; uint16* mb; uint32 n; ma=(uint64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8(ma); err=TIFFReadDirEntryCheckRangeShortLong8(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint16)(*ma++); } } break; case TIFF_SLONG8: { int64* ma; uint16* mb; uint32 n; ma=(int64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)ma); err=TIFFReadDirEntryCheckRangeShortSlong8(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint16)(*ma++); } } break; } _TIFFfree(origdata); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(data); return(err); } *value=data; return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntrySshortArray(TIFF* tif, TIFFDirEntry* direntry, int16** value) { enum TIFFReadDirEntryErr err; uint32 count; void* origdata; int16* data; switch (direntry->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: case TIFF_SHORT: case TIFF_SSHORT: case TIFF_LONG: case TIFF_SLONG: case TIFF_LONG8: case TIFF_SLONG8: break; default: return(TIFFReadDirEntryErrType); } err=TIFFReadDirEntryArray(tif,direntry,&count,2,&origdata); if ((err!=TIFFReadDirEntryErrOk)||(origdata==0)) { *value=0; return(err); } switch (direntry->tdir_type) { case TIFF_SHORT: { uint16* m; uint32 n; m=(uint16*)origdata; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort(m); err=TIFFReadDirEntryCheckRangeSshortShort(*m); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(origdata); return(err); } m++; } *value=(int16*)origdata; return(TIFFReadDirEntryErrOk); } case TIFF_SSHORT: *value=(int16*)origdata; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfShort((uint16*)(*value),count); return(TIFFReadDirEntryErrOk); } data=(int16*)_TIFFmalloc(count*2); if (data==0) { _TIFFfree(origdata); return(TIFFReadDirEntryErrAlloc); } switch (direntry->tdir_type) { case TIFF_BYTE: { uint8* ma; int16* mb; uint32 n; ma=(uint8*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); err=TIFFReadDirEntryCheckRangeSshortLong(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(int16)(*ma++); } } break; case TIFF_SLONG: { int32* ma; int16* mb; uint32 n; ma=(int32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)ma); err=TIFFReadDirEntryCheckRangeSshortSlong(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(int16)(*ma++); } } break; case TIFF_LONG8: { uint64* ma; int16* mb; uint32 n; ma=(uint64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8(ma); err=TIFFReadDirEntryCheckRangeSshortLong8(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(int16)(*ma++); } } break; case TIFF_SLONG8: { int64* ma; int16* mb; uint32 n; ma=(int64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)ma); err=TIFFReadDirEntryCheckRangeSshortSlong8(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(int16)(*ma++); } } break; } _TIFFfree(origdata); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(data); return(err); } *value=data; return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryLongArray(TIFF* tif, TIFFDirEntry* direntry, uint32** value) { enum TIFFReadDirEntryErr err; uint32 count; void* origdata; uint32* data; switch (direntry->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: case TIFF_SHORT: case TIFF_SSHORT: case TIFF_LONG: case TIFF_SLONG: case TIFF_LONG8: case TIFF_SLONG8: break; default: return(TIFFReadDirEntryErrType); } err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata); if ((err!=TIFFReadDirEntryErrOk)||(origdata==0)) { *value=0; return(err); } switch (direntry->tdir_type) { case TIFF_LONG: *value=(uint32*)origdata; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong(*value,count); return(TIFFReadDirEntryErrOk); case TIFF_SLONG: { int32* m; uint32 n; m=(int32*)origdata; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)m); err=TIFFReadDirEntryCheckRangeLongSlong(*m); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(origdata); return(err); } m++; } *value=(uint32*)origdata; return(TIFFReadDirEntryErrOk); } } data=(uint32*)_TIFFmalloc(count*4); if (data==0) { _TIFFfree(origdata); return(TIFFReadDirEntryErrAlloc); } switch (direntry->tdir_type) { case TIFF_BYTE: { uint8* ma; uint32* mb; uint32 n; ma=(uint8*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort(ma); *mb++=(uint32)(*ma++); } } break; case TIFF_SSHORT: { int16* ma; uint32* mb; uint32 n; ma=(int16*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)ma); err=TIFFReadDirEntryCheckRangeLongSshort(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint32)(*ma++); } } break; case TIFF_LONG8: { uint64* ma; uint32* mb; uint32 n; ma=(uint64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8(ma); err=TIFFReadDirEntryCheckRangeLongLong8(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint32)(*ma++); } } break; case TIFF_SLONG8: { int64* ma; uint32* mb; uint32 n; ma=(int64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)ma); err=TIFFReadDirEntryCheckRangeLongSlong8(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint32)(*ma++); } } break; } _TIFFfree(origdata); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(data); return(err); } *value=data; return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntrySlongArray(TIFF* tif, TIFFDirEntry* direntry, int32** value) { enum TIFFReadDirEntryErr err; uint32 count; void* origdata; int32* data; switch (direntry->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: case TIFF_SHORT: case TIFF_SSHORT: case TIFF_LONG: case TIFF_SLONG: case TIFF_LONG8: case TIFF_SLONG8: break; default: return(TIFFReadDirEntryErrType); } err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata); if ((err!=TIFFReadDirEntryErrOk)||(origdata==0)) { *value=0; return(err); } switch (direntry->tdir_type) { case TIFF_LONG: { uint32* m; uint32 n; m=(uint32*)origdata; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)m); err=TIFFReadDirEntryCheckRangeSlongLong(*m); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(origdata); return(err); } m++; } *value=(int32*)origdata; return(TIFFReadDirEntryErrOk); } case TIFF_SLONG: *value=(int32*)origdata; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong((uint32*)(*value),count); return(TIFFReadDirEntryErrOk); } data=(int32*)_TIFFmalloc(count*4); if (data==0) { _TIFFfree(origdata); return(TIFFReadDirEntryErrAlloc); } switch (direntry->tdir_type) { case TIFF_BYTE: { uint8* ma; int32* mb; uint32 n; ma=(uint8*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort(ma); *mb++=(int32)(*ma++); } } break; case TIFF_SSHORT: { int16* ma; int32* mb; uint32 n; ma=(int16*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)ma); *mb++=(int32)(*ma++); } } break; case TIFF_LONG8: { uint64* ma; int32* mb; uint32 n; ma=(uint64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8(ma); err=TIFFReadDirEntryCheckRangeSlongLong8(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(int32)(*ma++); } } break; case TIFF_SLONG8: { int64* ma; int32* mb; uint32 n; ma=(int64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)ma); err=TIFFReadDirEntryCheckRangeSlongSlong8(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(int32)(*ma++); } } break; } _TIFFfree(origdata); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(data); return(err); } *value=data; return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value) { enum TIFFReadDirEntryErr err; uint32 count; void* origdata; uint64* data; switch (direntry->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: case TIFF_SHORT: case TIFF_SSHORT: case TIFF_LONG: case TIFF_SLONG: case TIFF_LONG8: case TIFF_SLONG8: break; default: return(TIFFReadDirEntryErrType); } err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata); if ((err!=TIFFReadDirEntryErrOk)||(origdata==0)) { *value=0; return(err); } switch (direntry->tdir_type) { case TIFF_LONG8: *value=(uint64*)origdata; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong8(*value,count); return(TIFFReadDirEntryErrOk); case TIFF_SLONG8: { int64* m; uint32 n; m=(int64*)origdata; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)m); err=TIFFReadDirEntryCheckRangeLong8Slong8(*m); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(origdata); return(err); } m++; } *value=(uint64*)origdata; return(TIFFReadDirEntryErrOk); } } data=(uint64*)_TIFFmalloc(count*8); if (data==0) { _TIFFfree(origdata); return(TIFFReadDirEntryErrAlloc); } switch (direntry->tdir_type) { case TIFF_BYTE: { uint8* ma; uint64* mb; uint32 n; ma=(uint8*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort(ma); *mb++=(uint64)(*ma++); } } break; case TIFF_SSHORT: { int16* ma; uint64* mb; uint32 n; ma=(int16*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)ma); err=TIFFReadDirEntryCheckRangeLong8Sshort(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint64)(*ma++); } } break; case TIFF_LONG: { uint32* ma; uint64* mb; uint32 n; ma=(uint32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); *mb++=(uint64)(*ma++); } } break; case TIFF_SLONG: { int32* ma; uint64* mb; uint32 n; ma=(int32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)ma); err=TIFFReadDirEntryCheckRangeLong8Slong(*ma); if (err!=TIFFReadDirEntryErrOk) break; *mb++=(uint64)(*ma++); } } break; } _TIFFfree(origdata); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(data); return(err); } *value=data; return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntrySlong8Array(TIFF* tif, TIFFDirEntry* direntry, int64** value) { enum TIFFReadDirEntryErr err; uint32 count; void* origdata; int64* data; switch (direntry->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: case TIFF_SHORT: case TIFF_SSHORT: case TIFF_LONG: case TIFF_SLONG: case TIFF_LONG8: case TIFF_SLONG8: break; default: return(TIFFReadDirEntryErrType); } err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata); if ((err!=TIFFReadDirEntryErrOk)||(origdata==0)) { *value=0; return(err); } switch (direntry->tdir_type) { case TIFF_LONG8: { uint64* m; uint32 n; m=(uint64*)origdata; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8(m); err=TIFFReadDirEntryCheckRangeSlong8Long8(*m); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(origdata); return(err); } m++; } *value=(int64*)origdata; return(TIFFReadDirEntryErrOk); } case TIFF_SLONG8: *value=(int64*)origdata; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong8((uint64*)(*value),count); return(TIFFReadDirEntryErrOk); } data=(int64*)_TIFFmalloc(count*8); if (data==0) { _TIFFfree(origdata); return(TIFFReadDirEntryErrAlloc); } switch (direntry->tdir_type) { case TIFF_BYTE: { uint8* ma; int64* mb; uint32 n; ma=(uint8*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort(ma); *mb++=(int64)(*ma++); } } break; case TIFF_SSHORT: { int16* ma; int64* mb; uint32 n; ma=(int16*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)ma); *mb++=(int64)(*ma++); } } break; case TIFF_LONG: { uint32* ma; int64* mb; uint32 n; ma=(uint32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); *mb++=(int64)(*ma++); } } break; case TIFF_SLONG: { int32* ma; int64* mb; uint32 n; ma=(int32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)ma); *mb++=(int64)(*ma++); } } break; } _TIFFfree(origdata); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(data); return(err); } *value=data; return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryFloatArray(TIFF* tif, TIFFDirEntry* direntry, float** value) { enum TIFFReadDirEntryErr err; uint32 count; void* origdata; float* data; switch (direntry->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: case TIFF_SHORT: case TIFF_SSHORT: case TIFF_LONG: case TIFF_SLONG: case TIFF_LONG8: case TIFF_SLONG8: case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: case TIFF_DOUBLE: break; default: return(TIFFReadDirEntryErrType); } err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata); if ((err!=TIFFReadDirEntryErrOk)||(origdata==0)) { *value=0; return(err); } switch (direntry->tdir_type) { case TIFF_FLOAT: if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong((uint32*)origdata,count); TIFFCvtIEEEDoubleToNative(tif,count,(float*)origdata); *value=(float*)origdata; return(TIFFReadDirEntryErrOk); } data=(float*)_TIFFmalloc(count*sizeof(float)); if (data==0) { _TIFFfree(origdata); return(TIFFReadDirEntryErrAlloc); } switch (direntry->tdir_type) { case TIFF_BYTE: { uint8* ma; float* mb; uint32 n; ma=(uint8*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort(ma); *mb++=(float)(*ma++); } } break; case TIFF_SSHORT: { int16* ma; float* mb; uint32 n; ma=(int16*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)ma); *mb++=(float)(*ma++); } } break; case TIFF_LONG: { uint32* ma; float* mb; uint32 n; ma=(uint32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); *mb++=(float)(*ma++); } } break; case TIFF_SLONG: { int32* ma; float* mb; uint32 n; ma=(int32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)ma); *mb++=(float)(*ma++); } } break; case TIFF_LONG8: { uint64* ma; float* mb; uint32 n; ma=(uint64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8(ma); #if defined(__WIN32__) && (_MSC_VER < 1500) /* * XXX: MSVC 6.0 does not support * conversion of 64-bit integers into * floating point values. */ *mb++ = _TIFFUInt64ToFloat(*ma++); #else *mb++ = (float)(*ma++); #endif } } break; case TIFF_SLONG8: { int64* ma; float* mb; uint32 n; ma=(int64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)ma); *mb++=(float)(*ma++); } } break; case TIFF_RATIONAL: { uint32* ma; uint32 maa; uint32 mab; float* mb; uint32 n; ma=(uint32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); maa=*ma++; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(ma); mab=*ma++; if (mab==0) *mb++=0.0; else *mb++=(float)maa/(float)mab; } } break; case TIFF_SRATIONAL: { uint32* ma; int32 maa; uint32 mab; float* mb; uint32 n; ma=(uint32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); maa=*(int32*)ma; ma++; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(ma); mab=*ma++; if (mab==0) *mb++=0.0; else *mb++=(float)maa/(float)mab; } } break; case TIFF_DOUBLE: { double* ma; float* mb; uint32 n; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong8((uint64*)origdata,count); TIFFCvtIEEEDoubleToNative(tif,count,(double*)origdata); ma=(double*)origdata; mb=data; for (n=0; ntdir_type) { case TIFF_BYTE: case TIFF_SBYTE: case TIFF_SHORT: case TIFF_SSHORT: case TIFF_LONG: case TIFF_SLONG: case TIFF_LONG8: case TIFF_SLONG8: case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: case TIFF_DOUBLE: break; default: return(TIFFReadDirEntryErrType); } err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata); if ((err!=TIFFReadDirEntryErrOk)||(origdata==0)) { *value=0; return(err); } switch (direntry->tdir_type) { case TIFF_DOUBLE: if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong8((uint64*)origdata,count); TIFFCvtIEEEDoubleToNative(tif,count,(double*)origdata); *value=(double*)origdata; return(TIFFReadDirEntryErrOk); } data=(double*)_TIFFmalloc(count*sizeof(double)); if (data==0) { _TIFFfree(origdata); return(TIFFReadDirEntryErrAlloc); } switch (direntry->tdir_type) { case TIFF_BYTE: { uint8* ma; double* mb; uint32 n; ma=(uint8*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort(ma); *mb++=(double)(*ma++); } } break; case TIFF_SSHORT: { int16* ma; double* mb; uint32 n; ma=(int16*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)ma); *mb++=(double)(*ma++); } } break; case TIFF_LONG: { uint32* ma; double* mb; uint32 n; ma=(uint32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); *mb++=(double)(*ma++); } } break; case TIFF_SLONG: { int32* ma; double* mb; uint32 n; ma=(int32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)ma); *mb++=(double)(*ma++); } } break; case TIFF_LONG8: { uint64* ma; double* mb; uint32 n; ma=(uint64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8(ma); #if defined(__WIN32__) && (_MSC_VER < 1500) /* * XXX: MSVC 6.0 does not support * conversion of 64-bit integers into * floating point values. */ *mb++ = _TIFFUInt64ToDouble(*ma++); #else *mb++ = (double)(*ma++); #endif } } break; case TIFF_SLONG8: { int64* ma; double* mb; uint32 n; ma=(int64*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)ma); *mb++=(double)(*ma++); } } break; case TIFF_RATIONAL: { uint32* ma; uint32 maa; uint32 mab; double* mb; uint32 n; ma=(uint32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); maa=*ma++; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(ma); mab=*ma++; if (mab==0) *mb++=0.0; else *mb++=(double)maa/(double)mab; } } break; case TIFF_SRATIONAL: { uint32* ma; int32 maa; uint32 mab; double* mb; uint32 n; ma=(uint32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); maa=*(int32*)ma; ma++; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(ma); mab=*ma++; if (mab==0) *mb++=0.0; else *mb++=(double)maa/(double)mab; } } break; case TIFF_FLOAT: { float* ma; double* mb; uint32 n; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong((uint32*)origdata,count); TIFFCvtIEEEFloatToNative(tif,count,(float*)origdata); ma=(float*)origdata; mb=data; for (n=0; ntdir_type) { case TIFF_LONG: case TIFF_LONG8: case TIFF_IFD: case TIFF_IFD8: break; default: return(TIFFReadDirEntryErrType); } err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata); if ((err!=TIFFReadDirEntryErrOk)||(origdata==0)) { *value=0; return(err); } switch (direntry->tdir_type) { case TIFF_LONG8: case TIFF_IFD8: *value=(uint64*)origdata; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong8(*value,count); return(TIFFReadDirEntryErrOk); } data=(uint64*)_TIFFmalloc(count*8); if (data==0) { _TIFFfree(origdata); return(TIFFReadDirEntryErrAlloc); } switch (direntry->tdir_type) { case TIFF_LONG: case TIFF_IFD: { uint32* ma; uint64* mb; uint32 n; ma=(uint32*)origdata; mb=data; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabLong(ma); *mb++=(uint64)(*ma++); } } break; } _TIFFfree(origdata); if (err!=TIFFReadDirEntryErrOk) { _TIFFfree(data); return(err); } *value=data; return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value) { enum TIFFReadDirEntryErr err; uint16* m; uint16* na; uint16 nb; if (direntry->tdir_count<(uint64)tif->tif_dir.td_samplesperpixel) return(TIFFReadDirEntryErrCount); err=TIFFReadDirEntryShortArray(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); na=m; nb=tif->tif_dir.td_samplesperpixel; *value=*na++; nb--; while (nb>0) { if (*na++!=*value) { err=TIFFReadDirEntryErrPsdif; break; } nb--; } _TIFFfree(m); return(err); } #if 0 static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value) { enum TIFFReadDirEntryErr err; double* m; double* na; uint16 nb; if (direntry->tdir_count<(uint64)tif->tif_dir.td_samplesperpixel) return(TIFFReadDirEntryErrCount); err=TIFFReadDirEntryDoubleArray(tif,direntry,&m); if (err!=TIFFReadDirEntryErrOk) return(err); na=m; nb=tif->tif_dir.td_samplesperpixel; *value=*na++; nb--; while (nb>0) { if (*na++!=*value) { err=TIFFReadDirEntryErrPsdif; break; } nb--; } _TIFFfree(m); return(err); } #endif static void TIFFReadDirEntryCheckedByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value) { (void) tif; *value=*(uint8*)(&direntry->tdir_offset); } static void TIFFReadDirEntryCheckedSbyte(TIFF* tif, TIFFDirEntry* direntry, int8* value) { (void) tif; *value=*(int8*)(&direntry->tdir_offset); } static void TIFFReadDirEntryCheckedShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value) { *value = direntry->tdir_offset.toff_short; /* *value=*(uint16*)(&direntry->tdir_offset); */ if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort(value); } static void TIFFReadDirEntryCheckedSshort(TIFF* tif, TIFFDirEntry* direntry, int16* value) { *value=*(int16*)(&direntry->tdir_offset); if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)value); } static void TIFFReadDirEntryCheckedLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value) { *value=*(uint32*)(&direntry->tdir_offset); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(value); } static void TIFFReadDirEntryCheckedSlong(TIFF* tif, TIFFDirEntry* direntry, int32* value) { *value=*(int32*)(&direntry->tdir_offset); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)value); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value) { if (!(tif->tif_flags&TIFF_BIGTIFF)) { enum TIFFReadDirEntryErr err; uint32 offset = direntry->tdir_offset.toff_long; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,offset,8,value); if (err!=TIFFReadDirEntryErrOk) return(err); } else *value = direntry->tdir_offset.toff_long8; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8(value); return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSlong8(TIFF* tif, TIFFDirEntry* direntry, int64* value) { if (!(tif->tif_flags&TIFF_BIGTIFF)) { enum TIFFReadDirEntryErr err; uint32 offset = direntry->tdir_offset.toff_long; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,offset,8,value); if (err!=TIFFReadDirEntryErrOk) return(err); } else *value=*(int64*)(&direntry->tdir_offset); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)value); return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedRational(TIFF* tif, TIFFDirEntry* direntry, double* value) { UInt64Aligned_t m; assert(sizeof(double)==8); assert(sizeof(uint64)==8); assert(sizeof(uint32)==4); if (!(tif->tif_flags&TIFF_BIGTIFF)) { enum TIFFReadDirEntryErr err; uint32 offset = direntry->tdir_offset.toff_long; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,offset,8,m.i); if (err!=TIFFReadDirEntryErrOk) return(err); } else m.l = direntry->tdir_offset.toff_long8; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong(m.i,2); if (m.i[0]==0) *value=0.0; else *value=(double)m.i[0]/(double)m.i[1]; return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSrational(TIFF* tif, TIFFDirEntry* direntry, double* value) { UInt64Aligned_t m; assert(sizeof(double)==8); assert(sizeof(uint64)==8); assert(sizeof(int32)==4); assert(sizeof(uint32)==4); if (!(tif->tif_flags&TIFF_BIGTIFF)) { enum TIFFReadDirEntryErr err; uint32 offset = direntry->tdir_offset.toff_long; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,offset,8,m.i); if (err!=TIFFReadDirEntryErrOk) return(err); } else m.l=direntry->tdir_offset.toff_long8; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong(m.i,2); if ((int32)m.i[0]==0) *value=0.0; else *value=(double)((int32)m.i[0])/(double)m.i[1]; return(TIFFReadDirEntryErrOk); } static void TIFFReadDirEntryCheckedFloat(TIFF* tif, TIFFDirEntry* direntry, float* value) { union { float f; uint32 i; } float_union; assert(sizeof(float)==4); assert(sizeof(uint32)==4); assert(sizeof(float_union)==4); float_union.i=*(uint32*)(&direntry->tdir_offset); *value=float_union.f; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)value); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedDouble(TIFF* tif, TIFFDirEntry* direntry, double* value) { assert(sizeof(double)==8); assert(sizeof(uint64)==8); assert(sizeof(UInt64Aligned_t)==8); if (!(tif->tif_flags&TIFF_BIGTIFF)) { enum TIFFReadDirEntryErr err; uint32 offset = direntry->tdir_offset.toff_long; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,offset,8,value); if (err!=TIFFReadDirEntryErrOk) return(err); } else { UInt64Aligned_t uint64_union; uint64_union.l=direntry->tdir_offset.toff_long8; *value=uint64_union.d; } if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)value); return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSbyte(int8 value) { if (value<0) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteShort(uint16 value) { if (value>0xFF) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSshort(int16 value) { if ((value<0)||(value>0xFF)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong(uint32 value) { if (value>0xFF) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong(int32 value) { if ((value<0)||(value>0xFF)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong8(uint64 value) { if (value>0xFF) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong8(int64 value) { if ((value<0)||(value>0xFF)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteByte(uint8 value) { if (value>0x7F) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteShort(uint16 value) { if (value>0x7F) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSshort(int16 value) { if ((value<-0x80)||(value>0x7F)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong(uint32 value) { if (value>0x7F) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong(int32 value) { if ((value<-0x80)||(value>0x7F)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong8(uint64 value) { if (value>0x7F) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong8(int64 value) { if ((value<-0x80)||(value>0x7F)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSbyte(int8 value) { if (value<0) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSshort(int16 value) { if (value<0) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong(uint32 value) { if (value>0xFFFF) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong(int32 value) { if ((value<0)||(value>0xFFFF)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong8(uint64 value) { if (value>0xFFFF) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong8(int64 value) { if ((value<0)||(value>0xFFFF)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortShort(uint16 value) { if (value>0x7FFF) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong(uint32 value) { if (value>0x7FFF) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong(int32 value) { if ((value<-0x8000)||(value>0x7FFF)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong8(uint64 value) { if (value>0x7FFF) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong8(int64 value) { if ((value<-0x8000)||(value>0x7FFF)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSbyte(int8 value) { if (value<0) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSshort(int16 value) { if (value<0) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong(int32 value) { if (value<0) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } /* * Largest 32-bit unsigned integer value. */ #if defined(__WIN32__) && defined(_MSC_VER) # define TIFF_UINT32_MAX 0xFFFFFFFFI64 #else # define TIFF_UINT32_MAX 0xFFFFFFFFLL #endif static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongLong8(uint64 value) { if (value > TIFF_UINT32_MAX) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong8(int64 value) { if ((value<0) || (value > TIFF_UINT32_MAX)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } #undef TIFF_UINT32_MAX static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong(uint32 value) { if (value > 0x7FFFFFFFUL) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong8(uint64 value) { if (value > 0x7FFFFFFFUL) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongSlong8(int64 value) { if ((value < 0L-0x80000000L) || (value > 0x7FFFFFFFL)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Sbyte(int8 value) { if (value < 0) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Sshort(int16 value) { if (value < 0) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Slong(int32 value) { if (value < 0) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Slong8(int64 value) { if (value < 0) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } /* * Largest 64-bit signed integer value. */ #if defined(__WIN32__) && defined(_MSC_VER) # define TIFF_INT64_MAX 0x7FFFFFFFFFFFFFFFI64 #else # define TIFF_INT64_MAX 0x7FFFFFFFFFFFFFFFLL #endif static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlong8Long8(uint64 value) { if (value > TIFF_INT64_MAX) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); } #undef TIFF_INT64_MAX static enum TIFFReadDirEntryErr TIFFReadDirEntryData(TIFF* tif, uint64 offset, tmsize_t size, void* dest) { assert(size>0); if (!isMapped(tif)) { if (!SeekOK(tif,offset)) return(TIFFReadDirEntryErrIo); if (!ReadOK(tif,dest,size)) return(TIFFReadDirEntryErrIo); } else { size_t ma,mb; ma=(size_t)offset; mb=ma+size; if (((uint64)ma!=offset) || (mb < ma) || (mb - ma != (size_t) size) || (mb < (size_t)size) || (mb > (size_t)tif->tif_size) ) return(TIFFReadDirEntryErrIo); _TIFFmemcpy(dest,tif->tif_base+ma,size); } return(TIFFReadDirEntryErrOk); } static void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, const char* module, const char* tagname, int recover) { if (!recover) { switch (err) { case TIFFReadDirEntryErrCount: TIFFErrorExt(tif->tif_clientdata, module, "Incorrect count for \"%s\"", tagname); break; case TIFFReadDirEntryErrType: TIFFErrorExt(tif->tif_clientdata, module, "Incompatible type for \"%s\"", tagname); break; case TIFFReadDirEntryErrIo: TIFFErrorExt(tif->tif_clientdata, module, "IO error during reading of \"%s\"", tagname); break; case TIFFReadDirEntryErrRange: TIFFErrorExt(tif->tif_clientdata, module, "Incorrect value for \"%s\"", tagname); break; case TIFFReadDirEntryErrPsdif: TIFFErrorExt(tif->tif_clientdata, module, "Cannot handle different values per sample for \"%s\"", tagname); break; case TIFFReadDirEntryErrSizesan: TIFFErrorExt(tif->tif_clientdata, module, "Sanity check on size of \"%s\" value failed", tagname); break; case TIFFReadDirEntryErrAlloc: TIFFErrorExt(tif->tif_clientdata, module, "Out of memory reading of \"%s\"", tagname); break; default: assert(0); /* we should never get here */ break; } } else { switch (err) { case TIFFReadDirEntryErrCount: TIFFErrorExt(tif->tif_clientdata, module, "Incorrect count for \"%s\"; tag ignored", tagname); break; case TIFFReadDirEntryErrType: TIFFWarningExt(tif->tif_clientdata, module, "Incompatible type for \"%s\"; tag ignored", tagname); break; case TIFFReadDirEntryErrIo: TIFFWarningExt(tif->tif_clientdata, module, "IO error during reading of \"%s\"; tag ignored", tagname); break; case TIFFReadDirEntryErrRange: TIFFWarningExt(tif->tif_clientdata, module, "Incorrect value for \"%s\"; tag ignored", tagname); break; case TIFFReadDirEntryErrPsdif: TIFFWarningExt(tif->tif_clientdata, module, "Cannot handle different values per sample for \"%s\"; tag ignored", tagname); break; case TIFFReadDirEntryErrSizesan: TIFFWarningExt(tif->tif_clientdata, module, "Sanity check on size of \"%s\" value failed; tag ignored", tagname); break; case TIFFReadDirEntryErrAlloc: TIFFWarningExt(tif->tif_clientdata, module, "Out of memory reading of \"%s\"; tag ignored", tagname); break; default: assert(0); /* we should never get here */ break; } } } /* * Read the next TIFF directory from a file and convert it to the internal * format. We read directories sequentially. */ int TIFFReadDirectory(TIFF* tif) { static const char module[] = "TIFFReadDirectory"; TIFFDirEntry* dir; uint16 dircount; TIFFDirEntry* dp; uint16 di; const TIFFField* fip; uint32 fii=FAILED_FII; toff_t nextdiroff; tif->tif_diroff=tif->tif_nextdiroff; if (!TIFFCheckDirOffset(tif,tif->tif_nextdiroff)) return 0; /* last offset or bad offset (IFD looping) */ (*tif->tif_cleanup)(tif); /* cleanup any previous compression state */ tif->tif_curdir++; nextdiroff = tif->tif_nextdiroff; dircount=TIFFFetchDirectory(tif,nextdiroff,&dir,&tif->tif_nextdiroff); if (!dircount) { TIFFErrorExt(tif->tif_clientdata,module, "Failed to read directory at offset " TIFF_UINT64_FORMAT,nextdiroff); return 0; } TIFFReadDirectoryCheckOrder(tif,dir,dircount); /* * Mark duplicates of any tag to be ignored (bugzilla 1994) * to avoid certain pathological problems. */ { TIFFDirEntry* ma; uint16 mb; for (ma=dir, mb=0; mbtdir_tag==na->tdir_tag) na->tdir_tag=IGNORE; } } } tif->tif_flags &= ~TIFF_BEENWRITING; /* reset before new dir */ tif->tif_flags &= ~TIFF_BUF4WRITE; /* reset before new dir */ /* free any old stuff and reinit */ TIFFFreeDirectory(tif); TIFFDefaultDirectory(tif); /* * Electronic Arts writes gray-scale TIFF files * without a PlanarConfiguration directory entry. * Thus we setup a default value here, even though * the TIFF spec says there is no default value. */ TIFFSetField(tif,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG); /* * Setup default value and then make a pass over * the fields to check type and tag information, * and to extract info required to size data * structures. A second pass is made afterwards * to read in everthing not taken in the first pass. * But we must process the Compression tag first * in order to merge in codec-private tag definitions (otherwise * we may get complaints about unknown tags). However, the * Compression tag may be dependent on the SamplesPerPixel * tag value because older TIFF specs permited Compression * to be written as a SamplesPerPixel-count tag entry. * Thus if we don't first figure out the correct SamplesPerPixel * tag value then we may end up ignoring the Compression tag * value because it has an incorrect count value (if the * true value of SamplesPerPixel is not 1). */ dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_SAMPLESPERPIXEL); if (dp) { if (!TIFFFetchNormalTag(tif,dp,0)) goto bad; dp->tdir_tag=IGNORE; } dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_COMPRESSION); if (dp) { /* * The 5.0 spec says the Compression tag has one value, while * earlier specs say it has one value per sample. Because of * this, we accept the tag if one value is supplied with either * count. */ uint16 value; enum TIFFReadDirEntryErr err; err=TIFFReadDirEntryShort(tif,dp,&value); if (err==TIFFReadDirEntryErrCount) err=TIFFReadDirEntryPersampleShort(tif,dp,&value); if (err!=TIFFReadDirEntryErrOk) { TIFFReadDirEntryOutputErr(tif,err,module,"Compression",0); goto bad; } if (!TIFFSetField(tif,TIFFTAG_COMPRESSION,value)) goto bad; dp->tdir_tag=IGNORE; } else { if (!TIFFSetField(tif,TIFFTAG_COMPRESSION,COMPRESSION_NONE)) goto bad; } /* * First real pass over the directory. */ for (di=0, dp=dir; ditdir_tag!=IGNORE) { TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii); if (fii == FAILED_FII) { TIFFWarningExt(tif->tif_clientdata, module, "Unknown field with tag %d (0x%x) encountered", dp->tdir_tag,dp->tdir_tag); /* the following knowingly leaks the anonymous field structure */ if (!_TIFFMergeFields(tif, _TIFFCreateAnonField(tif, dp->tdir_tag, (TIFFDataType) dp->tdir_type), 1)) { TIFFWarningExt(tif->tif_clientdata, module, "Registering anonymous field with tag %d (0x%x) failed", dp->tdir_tag, dp->tdir_tag); dp->tdir_tag=IGNORE; } else { TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii); assert(fii != FAILED_FII); } } } if (dp->tdir_tag!=IGNORE) { fip=tif->tif_fields[fii]; if (fip->field_bit==FIELD_IGNORE) dp->tdir_tag=IGNORE; else { switch (dp->tdir_tag) { case TIFFTAG_STRIPOFFSETS: case TIFFTAG_STRIPBYTECOUNTS: case TIFFTAG_TILEOFFSETS: case TIFFTAG_TILEBYTECOUNTS: TIFFSetFieldBit(tif,fip->field_bit); break; case TIFFTAG_IMAGEWIDTH: case TIFFTAG_IMAGELENGTH: case TIFFTAG_IMAGEDEPTH: case TIFFTAG_TILELENGTH: case TIFFTAG_TILEWIDTH: case TIFFTAG_TILEDEPTH: case TIFFTAG_PLANARCONFIG: case TIFFTAG_ROWSPERSTRIP: case TIFFTAG_EXTRASAMPLES: if (!TIFFFetchNormalTag(tif,dp,0)) goto bad; dp->tdir_tag=IGNORE; break; } } } } /* * XXX: OJPEG hack. * If a) compression is OJPEG, b) planarconfig tag says it's separate, * c) strip offsets/bytecounts tag are both present and * d) both contain exactly one value, then we consistently find * that the buggy implementation of the buggy compression scheme * matches contig planarconfig best. So we 'fix-up' the tag here */ if ((tif->tif_dir.td_compression==COMPRESSION_OJPEG)&& (tif->tif_dir.td_planarconfig==PLANARCONFIG_SEPARATE)) { if (!_TIFFFillStriles(tif)) goto bad; dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_STRIPOFFSETS); if ((dp!=0)&&(dp->tdir_count==1)) { dp=TIFFReadDirectoryFindEntry(tif,dir,dircount, TIFFTAG_STRIPBYTECOUNTS); if ((dp!=0)&&(dp->tdir_count==1)) { tif->tif_dir.td_planarconfig=PLANARCONFIG_CONTIG; TIFFWarningExt(tif->tif_clientdata,module, "Planarconfig tag value assumed incorrect, " "assuming data is contig instead of chunky"); } } } /* * Allocate directory structure and setup defaults. */ if (!TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) { MissingRequired(tif,"ImageLength"); goto bad; } /* * Setup appropriate structures (by strip or by tile) */ if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) { tif->tif_dir.td_nstrips = TIFFNumberOfStrips(tif); tif->tif_dir.td_tilewidth = tif->tif_dir.td_imagewidth; tif->tif_dir.td_tilelength = tif->tif_dir.td_rowsperstrip; tif->tif_dir.td_tiledepth = tif->tif_dir.td_imagedepth; tif->tif_flags &= ~TIFF_ISTILED; } else { tif->tif_dir.td_nstrips = TIFFNumberOfTiles(tif); tif->tif_flags |= TIFF_ISTILED; } if (!tif->tif_dir.td_nstrips) { TIFFErrorExt(tif->tif_clientdata, module, "Cannot handle zero number of %s", isTiled(tif) ? "tiles" : "strips"); goto bad; } tif->tif_dir.td_stripsperimage = tif->tif_dir.td_nstrips; if (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE) tif->tif_dir.td_stripsperimage /= tif->tif_dir.td_samplesperpixel; if (!TIFFFieldSet(tif, FIELD_STRIPOFFSETS)) { if ((tif->tif_dir.td_compression==COMPRESSION_OJPEG) && (isTiled(tif)==0) && (tif->tif_dir.td_nstrips==1)) { /* * XXX: OJPEG hack. * If a) compression is OJPEG, b) it's not a tiled TIFF, * and c) the number of strips is 1, * then we tolerate the absence of stripoffsets tag, * because, presumably, all required data is in the * JpegInterchangeFormat stream. */ TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS); } else { MissingRequired(tif, isTiled(tif) ? "TileOffsets" : "StripOffsets"); goto bad; } } /* * Second pass: extract other information. */ for (di=0, dp=dir; ditdir_tag) { case IGNORE: break; case TIFFTAG_MINSAMPLEVALUE: case TIFFTAG_MAXSAMPLEVALUE: case TIFFTAG_BITSPERSAMPLE: case TIFFTAG_DATATYPE: case TIFFTAG_SAMPLEFORMAT: /* * The MinSampleValue, MaxSampleValue, BitsPerSample * DataType and SampleFormat tags are supposed to be * written as one value/sample, but some vendors * incorrectly write one value only -- so we accept * that as well (yech). Other vendors write correct * value for NumberOfSamples, but incorrect one for * BitsPerSample and friends, and we will read this * too. */ { uint16 value; enum TIFFReadDirEntryErr err; err=TIFFReadDirEntryShort(tif,dp,&value); if (err==TIFFReadDirEntryErrCount) err=TIFFReadDirEntryPersampleShort(tif,dp,&value); if (err!=TIFFReadDirEntryErrOk) { fip = TIFFFieldWithTag(tif,dp->tdir_tag); TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0); goto bad; } if (!TIFFSetField(tif,dp->tdir_tag,value)) goto bad; } break; case TIFFTAG_SMINSAMPLEVALUE: case TIFFTAG_SMAXSAMPLEVALUE: { double *data; enum TIFFReadDirEntryErr err; uint32 saved_flags; int m; if (dp->tdir_count != (uint64)tif->tif_dir.td_samplesperpixel) err = TIFFReadDirEntryErrCount; else err = TIFFReadDirEntryDoubleArray(tif, dp, &data); if (err!=TIFFReadDirEntryErrOk) { fip = TIFFFieldWithTag(tif,dp->tdir_tag); TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0); goto bad; } saved_flags = tif->tif_flags; tif->tif_flags |= TIFF_PERSAMPLE; m = TIFFSetField(tif,dp->tdir_tag,data); tif->tif_flags = saved_flags; _TIFFfree(data); if (!m) goto bad; } break; case TIFFTAG_STRIPOFFSETS: case TIFFTAG_TILEOFFSETS: #if defined(DEFER_STRILE_LOAD) _TIFFmemcpy( &(tif->tif_dir.td_stripoffset_entry), dp, sizeof(TIFFDirEntry) ); #else if (!TIFFFetchStripThing(tif,dp,tif->tif_dir.td_nstrips,&tif->tif_dir.td_stripoffset)) goto bad; #endif break; case TIFFTAG_STRIPBYTECOUNTS: case TIFFTAG_TILEBYTECOUNTS: #if defined(DEFER_STRILE_LOAD) _TIFFmemcpy( &(tif->tif_dir.td_stripbytecount_entry), dp, sizeof(TIFFDirEntry) ); #else if (!TIFFFetchStripThing(tif,dp,tif->tif_dir.td_nstrips,&tif->tif_dir.td_stripbytecount)) goto bad; #endif break; case TIFFTAG_COLORMAP: case TIFFTAG_TRANSFERFUNCTION: { enum TIFFReadDirEntryErr err; uint32 countpersample; uint32 countrequired; uint32 incrementpersample; uint16* value=NULL; countpersample=(1L<tif_dir.td_bitspersample); if ((dp->tdir_tag==TIFFTAG_TRANSFERFUNCTION)&&(dp->tdir_count==(uint64)countpersample)) { countrequired=countpersample; incrementpersample=0; } else { countrequired=3*countpersample; incrementpersample=countpersample; } if (dp->tdir_count!=(uint64)countrequired) err=TIFFReadDirEntryErrCount; else err=TIFFReadDirEntryShortArray(tif,dp,&value); if (err!=TIFFReadDirEntryErrOk) { fip = TIFFFieldWithTag(tif,dp->tdir_tag); TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",1); } else { TIFFSetField(tif,dp->tdir_tag,value,value+incrementpersample,value+2*incrementpersample); _TIFFfree(value); } } break; /* BEGIN REV 4.0 COMPATIBILITY */ case TIFFTAG_OSUBFILETYPE: { uint16 valueo; uint32 value; if (TIFFReadDirEntryShort(tif,dp,&valueo)==TIFFReadDirEntryErrOk) { switch (valueo) { case OFILETYPE_REDUCEDIMAGE: value=FILETYPE_REDUCEDIMAGE; break; case OFILETYPE_PAGE: value=FILETYPE_PAGE; break; default: value=0; break; } if (value!=0) TIFFSetField(tif,TIFFTAG_SUBFILETYPE,value); } } break; /* END REV 4.0 COMPATIBILITY */ default: (void) TIFFFetchNormalTag(tif, dp, TRUE); break; } } /* * OJPEG hack: * - If a) compression is OJPEG, and b) photometric tag is missing, * then we consistently find that photometric should be YCbCr * - If a) compression is OJPEG, and b) photometric tag says it's RGB, * then we consistently find that the buggy implementation of the * buggy compression scheme matches photometric YCbCr instead. * - If a) compression is OJPEG, and b) bitspersample tag is missing, * then we consistently find bitspersample should be 8. * - If a) compression is OJPEG, b) samplesperpixel tag is missing, * and c) photometric is RGB or YCbCr, then we consistently find * samplesperpixel should be 3 * - If a) compression is OJPEG, b) samplesperpixel tag is missing, * and c) photometric is MINISWHITE or MINISBLACK, then we consistently * find samplesperpixel should be 3 */ if (tif->tif_dir.td_compression==COMPRESSION_OJPEG) { if (!TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) { TIFFWarningExt(tif->tif_clientdata, module, "Photometric tag is missing, assuming data is YCbCr"); if (!TIFFSetField(tif,TIFFTAG_PHOTOMETRIC,PHOTOMETRIC_YCBCR)) goto bad; } else if (tif->tif_dir.td_photometric==PHOTOMETRIC_RGB) { tif->tif_dir.td_photometric=PHOTOMETRIC_YCBCR; TIFFWarningExt(tif->tif_clientdata, module, "Photometric tag value assumed incorrect, " "assuming data is YCbCr instead of RGB"); } if (!TIFFFieldSet(tif,FIELD_BITSPERSAMPLE)) { TIFFWarningExt(tif->tif_clientdata,module, "BitsPerSample tag is missing, assuming 8 bits per sample"); if (!TIFFSetField(tif,TIFFTAG_BITSPERSAMPLE,8)) goto bad; } if (!TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL)) { if (tif->tif_dir.td_photometric==PHOTOMETRIC_RGB) { TIFFWarningExt(tif->tif_clientdata,module, "SamplesPerPixel tag is missing, " "assuming correct SamplesPerPixel value is 3"); if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3)) goto bad; } if (tif->tif_dir.td_photometric==PHOTOMETRIC_YCBCR) { TIFFWarningExt(tif->tif_clientdata,module, "SamplesPerPixel tag is missing, " "applying correct SamplesPerPixel value of 3"); if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3)) goto bad; } else if ((tif->tif_dir.td_photometric==PHOTOMETRIC_MINISWHITE) || (tif->tif_dir.td_photometric==PHOTOMETRIC_MINISBLACK)) { /* * SamplesPerPixel tag is missing, but is not required * by spec. Assume correct SamplesPerPixel value of 1. */ if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,1)) goto bad; } } } /* * Verify Palette image has a Colormap. */ if (tif->tif_dir.td_photometric == PHOTOMETRIC_PALETTE && !TIFFFieldSet(tif, FIELD_COLORMAP)) { if ( tif->tif_dir.td_bitspersample>=8 && tif->tif_dir.td_samplesperpixel==3) tif->tif_dir.td_photometric = PHOTOMETRIC_RGB; else if (tif->tif_dir.td_bitspersample>=8) tif->tif_dir.td_photometric = PHOTOMETRIC_MINISBLACK; else { MissingRequired(tif, "Colormap"); goto bad; } } /* * OJPEG hack: * We do no further messing with strip/tile offsets/bytecounts in OJPEG * TIFFs */ if (tif->tif_dir.td_compression!=COMPRESSION_OJPEG) { /* * Attempt to deal with a missing StripByteCounts tag. */ if (!TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS)) { /* * Some manufacturers violate the spec by not giving * the size of the strips. In this case, assume there * is one uncompressed strip of data. */ if ((tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG && tif->tif_dir.td_nstrips > 1) || (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE && tif->tif_dir.td_nstrips != (uint32)tif->tif_dir.td_samplesperpixel)) { MissingRequired(tif, "StripByteCounts"); goto bad; } TIFFWarningExt(tif->tif_clientdata, module, "TIFF directory is missing required " "\"StripByteCounts\" field, calculating from imagelength"); if (EstimateStripByteCounts(tif, dir, dircount) < 0) goto bad; /* * Assume we have wrong StripByteCount value (in case * of single strip) in following cases: * - it is equal to zero along with StripOffset; * - it is larger than file itself (in case of uncompressed * image); * - it is smaller than the size of the bytes per row * multiplied on the number of rows. The last case should * not be checked in the case of writing new image, * because we may do not know the exact strip size * until the whole image will be written and directory * dumped out. */ #define BYTECOUNTLOOKSBAD \ ( (tif->tif_dir.td_stripbytecount[0] == 0 && tif->tif_dir.td_stripoffset[0] != 0) || \ (tif->tif_dir.td_compression == COMPRESSION_NONE && \ tif->tif_dir.td_stripbytecount[0] > TIFFGetFileSize(tif) - tif->tif_dir.td_stripoffset[0]) || \ (tif->tif_mode == O_RDONLY && \ tif->tif_dir.td_compression == COMPRESSION_NONE && \ tif->tif_dir.td_stripbytecount[0] < TIFFScanlineSize64(tif) * tif->tif_dir.td_imagelength) ) } else if (tif->tif_dir.td_nstrips == 1 && _TIFFFillStriles(tif) && tif->tif_dir.td_stripoffset[0] != 0 && BYTECOUNTLOOKSBAD) { /* * XXX: Plexus (and others) sometimes give a value of * zero for a tag when they don't know what the * correct value is! Try and handle the simple case * of estimating the size of a one strip image. */ TIFFWarningExt(tif->tif_clientdata, module, "Bogus \"StripByteCounts\" field, ignoring and calculating from imagelength"); if(EstimateStripByteCounts(tif, dir, dircount) < 0) goto bad; #if !defined(DEFER_STRILE_LOAD) } else if (tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG && tif->tif_dir.td_nstrips > 2 && tif->tif_dir.td_compression == COMPRESSION_NONE && tif->tif_dir.td_stripbytecount[0] != tif->tif_dir.td_stripbytecount[1] && tif->tif_dir.td_stripbytecount[0] != 0 && tif->tif_dir.td_stripbytecount[1] != 0 ) { /* * XXX: Some vendors fill StripByteCount array with * absolutely wrong values (it can be equal to * StripOffset array, for example). Catch this case * here. * * We avoid this check if deferring strile loading * as it would always force us to load the strip/tile * information. */ TIFFWarningExt(tif->tif_clientdata, module, "Wrong \"StripByteCounts\" field, ignoring and calculating from imagelength"); if (EstimateStripByteCounts(tif, dir, dircount) < 0) goto bad; #endif /* !defined(DEFER_STRILE_LOAD) */ } } if (dir) { _TIFFfree(dir); dir=NULL; } if (!TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE)) { if (tif->tif_dir.td_bitspersample>=16) tif->tif_dir.td_maxsamplevalue=0xFFFF; else tif->tif_dir.td_maxsamplevalue = (uint16)((1L<tif_dir.td_bitspersample)-1); } /* * XXX: We can optimize checking for the strip bounds using the sorted * bytecounts array. See also comments for TIFFAppendToStrip() * function in tif_write.c. */ #if !defined(DEFER_STRILE_LOAD) if (tif->tif_dir.td_nstrips > 1) { uint32 strip; tif->tif_dir.td_stripbytecountsorted = 1; for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++) { if (tif->tif_dir.td_stripoffset[strip - 1] > tif->tif_dir.td_stripoffset[strip]) { tif->tif_dir.td_stripbytecountsorted = 0; break; } } } #endif /* !defined(DEFER_STRILE_LOAD) */ /* * An opportunity for compression mode dependent tag fixup */ (*tif->tif_fixuptags)(tif); /* * Some manufacturers make life difficult by writing * large amounts of uncompressed data as a single strip. * This is contrary to the recommendations of the spec. * The following makes an attempt at breaking such images * into strips closer to the recommended 8k bytes. A * side effect, however, is that the RowsPerStrip tag * value may be changed. */ if ((tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)&& (tif->tif_dir.td_nstrips==1)&& (tif->tif_dir.td_compression==COMPRESSION_NONE)&& ((tif->tif_flags&(TIFF_STRIPCHOP|TIFF_ISTILED))==TIFF_STRIPCHOP)) { if ( !_TIFFFillStriles(tif) || !tif->tif_dir.td_stripbytecount ) return 0; ChopUpSingleUncompressedStrip(tif); } /* * Clear the dirty directory flag. */ tif->tif_flags &= ~TIFF_DIRTYDIRECT; tif->tif_flags &= ~TIFF_DIRTYSTRIP; /* * Reinitialize i/o since we are starting on a new directory. */ tif->tif_row = (uint32) -1; tif->tif_curstrip = (uint32) -1; tif->tif_col = (uint32) -1; tif->tif_curtile = (uint32) -1; tif->tif_tilesize = (tmsize_t) -1; tif->tif_scanlinesize = TIFFScanlineSize(tif); if (!tif->tif_scanlinesize) { TIFFErrorExt(tif->tif_clientdata, module, "Cannot handle zero scanline size"); return (0); } if (isTiled(tif)) { tif->tif_tilesize = TIFFTileSize(tif); if (!tif->tif_tilesize) { TIFFErrorExt(tif->tif_clientdata, module, "Cannot handle zero tile size"); return (0); } } else { if (!TIFFStripSize(tif)) { TIFFErrorExt(tif->tif_clientdata, module, "Cannot handle zero strip size"); return (0); } } return (1); bad: if (dir) _TIFFfree(dir); return (0); } static void TIFFReadDirectoryCheckOrder(TIFF* tif, TIFFDirEntry* dir, uint16 dircount) { static const char module[] = "TIFFReadDirectoryCheckOrder"; uint16 m; uint16 n; TIFFDirEntry* o; m=0; for (n=0, o=dir; ntdir_tagtif_clientdata,module, "Invalid TIFF directory; tags are not sorted in ascending order"); break; } m=o->tdir_tag+1; } } static TIFFDirEntry* TIFFReadDirectoryFindEntry(TIFF* tif, TIFFDirEntry* dir, uint16 dircount, uint16 tagid) { TIFFDirEntry* m; uint16 n; (void) tif; for (m=dir, n=0; ntdir_tag==tagid) return(m); } return(0); } static void TIFFReadDirectoryFindFieldInfo(TIFF* tif, uint16 tagid, uint32* fii) { int32 ma,mb,mc; ma=-1; mc=(int32)tif->tif_nfields; while (1) { if (ma+1==mc) { *fii = FAILED_FII; return; } mb=(ma+mc)/2; if (tif->tif_fields[mb]->field_tag==(uint32)tagid) break; if (tif->tif_fields[mb]->field_tag<(uint32)tagid) ma=mb; else mc=mb; } while (1) { if (mb==0) break; if (tif->tif_fields[mb-1]->field_tag!=(uint32)tagid) break; mb--; } *fii=mb; } /* * Read custom directory from the arbitarry offset. * The code is very similar to TIFFReadDirectory(). */ int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray) { static const char module[] = "TIFFReadCustomDirectory"; TIFFDirEntry* dir; uint16 dircount; TIFFDirEntry* dp; uint16 di; const TIFFField* fip; uint32 fii; _TIFFSetupFields(tif, infoarray); dircount=TIFFFetchDirectory(tif,diroff,&dir,NULL); if (!dircount) { TIFFErrorExt(tif->tif_clientdata,module, "Failed to read custom directory at offset " TIFF_UINT64_FORMAT,diroff); return 0; } TIFFFreeDirectory(tif); _TIFFmemset(&tif->tif_dir, 0, sizeof(TIFFDirectory)); TIFFReadDirectoryCheckOrder(tif,dir,dircount); for (di=0, dp=dir; ditdir_tag,&fii); if (fii == FAILED_FII) { TIFFWarningExt(tif->tif_clientdata, module, "Unknown field with tag %d (0x%x) encountered", dp->tdir_tag, dp->tdir_tag); if (!_TIFFMergeFields(tif, _TIFFCreateAnonField(tif, dp->tdir_tag, (TIFFDataType) dp->tdir_type), 1)) { TIFFWarningExt(tif->tif_clientdata, module, "Registering anonymous field with tag %d (0x%x) failed", dp->tdir_tag, dp->tdir_tag); dp->tdir_tag=IGNORE; } else { TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii); assert( fii != FAILED_FII ); } } if (dp->tdir_tag!=IGNORE) { fip=tif->tif_fields[fii]; if (fip->field_bit==FIELD_IGNORE) dp->tdir_tag=IGNORE; else { /* check data type */ while ((fip->field_type!=TIFF_ANY)&&(fip->field_type!=dp->tdir_type)) { fii++; if ((fii==tif->tif_nfields)|| (tif->tif_fields[fii]->field_tag!=(uint32)dp->tdir_tag)) { fii=0xFFFF; break; } fip=tif->tif_fields[fii]; } if (fii==0xFFFF) { TIFFWarningExt(tif->tif_clientdata, module, "Wrong data type %d for \"%s\"; tag ignored", dp->tdir_type,fip->field_name); dp->tdir_tag=IGNORE; } else { /* check count if known in advance */ if ((fip->field_readcount!=TIFF_VARIABLE)&& (fip->field_readcount!=TIFF_VARIABLE2)) { uint32 expected; if (fip->field_readcount==TIFF_SPP) expected=(uint32)tif->tif_dir.td_samplesperpixel; else expected=(uint32)fip->field_readcount; if (!CheckDirCount(tif,dp,expected)) dp->tdir_tag=IGNORE; } } } switch (dp->tdir_tag) { case IGNORE: break; case EXIFTAG_SUBJECTDISTANCE: (void) TIFFFetchSubjectDistance(tif,dp); break; default: (void) TIFFFetchNormalTag(tif, dp, TRUE); break; } } } if (dir) _TIFFfree(dir); return 1; } /* * EXIF is important special case of custom IFD, so we have a special * function to read it. */ int TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff) { const TIFFFieldArray* exifFieldArray; exifFieldArray = _TIFFGetExifFields(); return TIFFReadCustomDirectory(tif, diroff, exifFieldArray); } static int EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount) { static const char module[] = "EstimateStripByteCounts"; TIFFDirEntry *dp; TIFFDirectory *td = &tif->tif_dir; uint32 strip; _TIFFFillStriles( tif ); if (td->td_stripbytecount) _TIFFfree(td->td_stripbytecount); td->td_stripbytecount = (uint64*) _TIFFCheckMalloc(tif, td->td_nstrips, sizeof (uint64), "for \"StripByteCounts\" array"); if( td->td_stripbytecount == NULL ) return -1; if (td->td_compression != COMPRESSION_NONE) { uint64 space; uint64 filesize; uint16 n; filesize = TIFFGetFileSize(tif); if (!(tif->tif_flags&TIFF_BIGTIFF)) space=sizeof(TIFFHeaderClassic)+2+dircount*12+4; else space=sizeof(TIFFHeaderBig)+8+dircount*20+8; /* calculate amount of space used by indirect values */ for (dp = dir, n = dircount; n > 0; n--, dp++) { uint32 typewidth = TIFFDataWidth((TIFFDataType) dp->tdir_type); uint64 datasize; typewidth = TIFFDataWidth((TIFFDataType) dp->tdir_type); if (typewidth == 0) { TIFFErrorExt(tif->tif_clientdata, module, "Cannot determine size of unknown tag type %d", dp->tdir_type); return -1; } datasize=(uint64)typewidth*dp->tdir_count; if (!(tif->tif_flags&TIFF_BIGTIFF)) { if (datasize<=4) datasize=0; } else { if (datasize<=8) datasize=0; } space+=datasize; } space = filesize - space; if (td->td_planarconfig == PLANARCONFIG_SEPARATE) space /= td->td_samplesperpixel; for (strip = 0; strip < td->td_nstrips; strip++) td->td_stripbytecount[strip] = space; /* * This gross hack handles the case were the offset to * the last strip is past the place where we think the strip * should begin. Since a strip of data must be contiguous, * it's safe to assume that we've overestimated the amount * of data in the strip and trim this number back accordingly. */ strip--; if (td->td_stripoffset[strip]+td->td_stripbytecount[strip] > filesize) td->td_stripbytecount[strip] = filesize - td->td_stripoffset[strip]; } else if (isTiled(tif)) { uint64 bytespertile = TIFFTileSize64(tif); for (strip = 0; strip < td->td_nstrips; strip++) td->td_stripbytecount[strip] = bytespertile; } else { uint64 rowbytes = TIFFScanlineSize64(tif); uint32 rowsperstrip = td->td_imagelength/td->td_stripsperimage; for (strip = 0; strip < td->td_nstrips; strip++) td->td_stripbytecount[strip] = rowbytes * rowsperstrip; } TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS); if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP)) td->td_rowsperstrip = td->td_imagelength; return 1; } static void MissingRequired(TIFF* tif, const char* tagname) { static const char module[] = "MissingRequired"; TIFFErrorExt(tif->tif_clientdata, module, "TIFF directory is missing required \"%s\" field", tagname); } /* * Check the directory offset against the list of already seen directory * offsets. This is a trick to prevent IFD looping. The one can create TIFF * file with looped directory pointers. We will maintain a list of already * seen directories and check every IFD offset against that list. */ static int TIFFCheckDirOffset(TIFF* tif, uint64 diroff) { uint16 n; if (diroff == 0) /* no more directories */ return 0; for (n = 0; n < tif->tif_dirnumber && tif->tif_dirlist; n++) { if (tif->tif_dirlist[n] == diroff) return 0; } tif->tif_dirnumber++; if (tif->tif_dirnumber > tif->tif_dirlistsize) { uint64* new_dirlist; /* * XXX: Reduce memory allocation granularity of the dirlist * array. */ new_dirlist = (uint64*)_TIFFCheckRealloc(tif, tif->tif_dirlist, tif->tif_dirnumber, 2 * sizeof(uint64), "for IFD list"); if (!new_dirlist) return 0; tif->tif_dirlistsize = 2 * tif->tif_dirnumber; tif->tif_dirlist = new_dirlist; } tif->tif_dirlist[tif->tif_dirnumber - 1] = diroff; return 1; } /* * Check the count field of a directory entry against a known value. The * caller is expected to skip/ignore the tag if there is a mismatch. */ static int CheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count) { if ((uint64)count > dir->tdir_count) { const TIFFField* fip = TIFFFieldWithTag(tif, dir->tdir_tag); TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT ", expecting %u); tag ignored", fip ? fip->field_name : "unknown tagname", dir->tdir_count, count); return (0); } else if ((uint64)count < dir->tdir_count) { const TIFFField* fip = TIFFFieldWithTag(tif, dir->tdir_tag); TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT ", expecting %u); tag trimmed", fip ? fip->field_name : "unknown tagname", dir->tdir_count, count); dir->tdir_count = count; return (1); } return (1); } /* * Read IFD structure from the specified offset. If the pointer to * nextdiroff variable has been specified, read it too. Function returns a * number of fields in the directory or 0 if failed. */ static uint16 TIFFFetchDirectory(TIFF* tif, uint64 diroff, TIFFDirEntry** pdir, uint64 *nextdiroff) { static const char module[] = "TIFFFetchDirectory"; void* origdir; uint16 dircount16; uint32 dirsize; TIFFDirEntry* dir; uint8* ma; TIFFDirEntry* mb; uint16 n; assert(pdir); tif->tif_diroff = diroff; if (nextdiroff) *nextdiroff = 0; if (!isMapped(tif)) { if (!SeekOK(tif, tif->tif_diroff)) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Seek error accessing TIFF directory", tif->tif_name); return 0; } if (!(tif->tif_flags&TIFF_BIGTIFF)) { if (!ReadOK(tif, &dircount16, sizeof (uint16))) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Can not read TIFF directory count", tif->tif_name); return 0; } if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount16); if (dircount16>4096) { TIFFErrorExt(tif->tif_clientdata, module, "Sanity check on directory count failed, this is probably not a valid IFD offset"); return 0; } dirsize = 12; } else { uint64 dircount64; if (!ReadOK(tif, &dircount64, sizeof (uint64))) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Can not read TIFF directory count", tif->tif_name); return 0; } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong8(&dircount64); if (dircount64>4096) { TIFFErrorExt(tif->tif_clientdata, module, "Sanity check on directory count failed, this is probably not a valid IFD offset"); return 0; } dircount16 = (uint16)dircount64; dirsize = 20; } origdir = _TIFFCheckMalloc(tif, dircount16, dirsize, "to read TIFF directory"); if (origdir == NULL) return 0; if (!ReadOK(tif, origdir, (tmsize_t)(dircount16*dirsize))) { TIFFErrorExt(tif->tif_clientdata, module, "%.100s: Can not read TIFF directory", tif->tif_name); _TIFFfree(origdir); return 0; } /* * Read offset to next directory for sequential scans if * needed. */ if (nextdiroff) { if (!(tif->tif_flags&TIFF_BIGTIFF)) { uint32 nextdiroff32; if (!ReadOK(tif, &nextdiroff32, sizeof(uint32))) nextdiroff32 = 0; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&nextdiroff32); *nextdiroff=nextdiroff32; } else { if (!ReadOK(tif, nextdiroff, sizeof(uint64))) *nextdiroff = 0; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8(nextdiroff); } } } else { tmsize_t m; tmsize_t off = (tmsize_t) tif->tif_diroff; if ((uint64)off!=tif->tif_diroff) { TIFFErrorExt(tif->tif_clientdata,module,"Can not read TIFF directory count"); return(0); } /* * Check for integer overflow when validating the dir_off, * otherwise a very high offset may cause an OOB read and * crash the client. Make two comparisons instead of * * off + sizeof(uint16) > tif->tif_size * * to avoid overflow. */ if (!(tif->tif_flags&TIFF_BIGTIFF)) { m=off+sizeof(uint16); if ((mtif->tif_size)) { TIFFErrorExt(tif->tif_clientdata, module, "Can not read TIFF directory count"); return 0; } else { _TIFFmemcpy(&dircount16, tif->tif_base + off, sizeof(uint16)); } off += sizeof (uint16); if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount16); if (dircount16>4096) { TIFFErrorExt(tif->tif_clientdata, module, "Sanity check on directory count failed, this is probably not a valid IFD offset"); return 0; } dirsize = 12; } else { tmsize_t m; uint64 dircount64; m=off+sizeof(uint64); if ((mtif->tif_size)) { TIFFErrorExt(tif->tif_clientdata, module, "Can not read TIFF directory count"); return 0; } else { _TIFFmemcpy(&dircount64, tif->tif_base + off, sizeof(uint64)); } off += sizeof (uint64); if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong8(&dircount64); if (dircount64>4096) { TIFFErrorExt(tif->tif_clientdata, module, "Sanity check on directory count failed, this is probably not a valid IFD offset"); return 0; } dircount16 = (uint16)dircount64; dirsize = 20; } if (dircount16 == 0 ) { TIFFErrorExt(tif->tif_clientdata, module, "Sanity check on directory count failed, zero tag directories not supported"); return 0; } origdir = _TIFFCheckMalloc(tif, dircount16, dirsize, "to read TIFF directory"); if (origdir == NULL) return 0; m=off+dircount16*dirsize; if ((mtif->tif_size)) { TIFFErrorExt(tif->tif_clientdata, module, "Can not read TIFF directory"); _TIFFfree(origdir); return 0; } else { _TIFFmemcpy(origdir, tif->tif_base + off, dircount16 * dirsize); } if (nextdiroff) { off += dircount16 * dirsize; if (!(tif->tif_flags&TIFF_BIGTIFF)) { uint32 nextdiroff32; m=off+sizeof(uint32); if ((mtif->tif_size)) nextdiroff32 = 0; else _TIFFmemcpy(&nextdiroff32, tif->tif_base + off, sizeof (uint32)); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&nextdiroff32); *nextdiroff = nextdiroff32; } else { m=off+sizeof(uint64); if ((mtif->tif_size)) *nextdiroff = 0; else _TIFFmemcpy(nextdiroff, tif->tif_base + off, sizeof (uint64)); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8(nextdiroff); } } } dir = (TIFFDirEntry*)_TIFFCheckMalloc(tif, dircount16, sizeof(TIFFDirEntry), "to read TIFF directory"); if (dir==0) { _TIFFfree(origdir); return 0; } ma=(uint8*)origdir; mb=dir; for (n=0; ntif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)ma); mb->tdir_tag=*(uint16*)ma; ma+=sizeof(uint16); if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)ma); mb->tdir_type=*(uint16*)ma; ma+=sizeof(uint16); if (!(tif->tif_flags&TIFF_BIGTIFF)) { if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)ma); mb->tdir_count=(uint64)(*(uint32*)ma); ma+=sizeof(uint32); *(uint32*)(&mb->tdir_offset)=*(uint32*)ma; ma+=sizeof(uint32); } else { if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)ma); mb->tdir_count=TIFFReadUInt64(ma); ma+=sizeof(uint64); mb->tdir_offset.toff_long8=TIFFReadUInt64(ma); ma+=sizeof(uint64); } mb++; } _TIFFfree(origdir); *pdir = dir; return dircount16; } /* * Fetch a tag that is not handled by special case code. */ static int TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp, int recover) { static const char module[] = "TIFFFetchNormalTag"; enum TIFFReadDirEntryErr err; uint32 fii; const TIFFField* fip = NULL; TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii); if( fii == FAILED_FII ) { TIFFErrorExt(tif->tif_clientdata, "TIFFFetchNormalTag", "No definition found for tag %d", dp->tdir_tag); return 0; } fip=tif->tif_fields[fii]; assert(fip->set_field_type!=TIFF_SETGET_OTHER); /* if so, we shouldn't arrive here but deal with this in specialized code */ assert(fip->set_field_type!=TIFF_SETGET_INT); /* if so, we shouldn't arrive here as this is only the case for pseudo-tags */ err=TIFFReadDirEntryErrOk; switch (fip->set_field_type) { case TIFF_SETGET_UNDEFINED: break; case TIFF_SETGET_ASCII: { uint8* data; assert(fip->field_passcount==0); err=TIFFReadDirEntryByteArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { uint8* ma; uint32 mb; int n; ma=data; mb=0; while (mb<(uint32)dp->tdir_count) { if (*ma==0) break; ma++; mb++; } if (mb+1<(uint32)dp->tdir_count) TIFFWarningExt(tif->tif_clientdata,module,"ASCII value for tag \"%s\" contains null byte in value; value incorrectly truncated during reading due to implementation limitations",fip->field_name); else if (mb+1>(uint32)dp->tdir_count) { uint8* o; TIFFWarningExt(tif->tif_clientdata,module,"ASCII value for tag \"%s\" does not end in null byte",fip->field_name); if ((uint32)dp->tdir_count+1!=dp->tdir_count+1) o=NULL; else o=_TIFFmalloc((uint32)dp->tdir_count+1); if (o==NULL) { if (data!=NULL) _TIFFfree(data); return(0); } _TIFFmemcpy(o,data,(uint32)dp->tdir_count); o[(uint32)dp->tdir_count]=0; if (data!=0) _TIFFfree(data); data=o; } n=TIFFSetField(tif,dp->tdir_tag,data); if (data!=0) _TIFFfree(data); if (!n) return(0); } } break; case TIFF_SETGET_UINT8: { uint8 data=0; assert(fip->field_readcount==1); assert(fip->field_passcount==0); err=TIFFReadDirEntryByte(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { if (!TIFFSetField(tif,dp->tdir_tag,data)) return(0); } } break; case TIFF_SETGET_UINT16: { uint16 data; assert(fip->field_readcount==1); assert(fip->field_passcount==0); err=TIFFReadDirEntryShort(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { if (!TIFFSetField(tif,dp->tdir_tag,data)) return(0); } } break; case TIFF_SETGET_UINT32: { uint32 data; assert(fip->field_readcount==1); assert(fip->field_passcount==0); err=TIFFReadDirEntryLong(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { if (!TIFFSetField(tif,dp->tdir_tag,data)) return(0); } } break; case TIFF_SETGET_UINT64: { uint64 data; assert(fip->field_readcount==1); assert(fip->field_passcount==0); err=TIFFReadDirEntryLong8(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { if (!TIFFSetField(tif,dp->tdir_tag,data)) return(0); } } break; case TIFF_SETGET_FLOAT: { float data; assert(fip->field_readcount==1); assert(fip->field_passcount==0); err=TIFFReadDirEntryFloat(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { if (!TIFFSetField(tif,dp->tdir_tag,data)) return(0); } } break; case TIFF_SETGET_DOUBLE: { double data; assert(fip->field_readcount==1); assert(fip->field_passcount==0); err=TIFFReadDirEntryDouble(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { if (!TIFFSetField(tif,dp->tdir_tag,data)) return(0); } } break; case TIFF_SETGET_IFD8: { uint64 data; assert(fip->field_readcount==1); assert(fip->field_passcount==0); err=TIFFReadDirEntryIfd8(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { if (!TIFFSetField(tif,dp->tdir_tag,data)) return(0); } } break; case TIFF_SETGET_UINT16_PAIR: { uint16* data; assert(fip->field_readcount==2); assert(fip->field_passcount==0); if (dp->tdir_count!=2) { TIFFWarningExt(tif->tif_clientdata,module, "incorrect count for field \"%s\", expected 2, got %d", fip->field_name,(int)dp->tdir_count); return(0); } err=TIFFReadDirEntryShortArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,data[0],data[1]); _TIFFfree(data); if (!m) return(0); } } break; case TIFF_SETGET_C0_UINT8: { uint8* data; assert(fip->field_readcount>=1); assert(fip->field_passcount==0); if (dp->tdir_count!=(uint64)fip->field_readcount) { TIFFWarningExt(tif->tif_clientdata,module, "incorrect count for field \"%s\", expected %d, got %d", fip->field_name,(int) fip->field_readcount, (int)dp->tdir_count); return 0; } else { err=TIFFReadDirEntryByteArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } } break; case TIFF_SETGET_C0_UINT16: { uint16* data; assert(fip->field_readcount>=1); assert(fip->field_passcount==0); if (dp->tdir_count!=(uint64)fip->field_readcount) /* corrupt file */; else { err=TIFFReadDirEntryShortArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } } break; case TIFF_SETGET_C0_UINT32: { uint32* data; assert(fip->field_readcount>=1); assert(fip->field_passcount==0); if (dp->tdir_count!=(uint64)fip->field_readcount) /* corrupt file */; else { err=TIFFReadDirEntryLongArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } } break; case TIFF_SETGET_C0_FLOAT: { float* data; assert(fip->field_readcount>=1); assert(fip->field_passcount==0); if (dp->tdir_count!=(uint64)fip->field_readcount) /* corrupt file */; else { err=TIFFReadDirEntryFloatArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } } break; case TIFF_SETGET_C16_ASCII: { uint8* data; assert(fip->field_readcount==TIFF_VARIABLE); assert(fip->field_passcount==1); if (dp->tdir_count>0xFFFF) err=TIFFReadDirEntryErrCount; else { err=TIFFReadDirEntryByteArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } } break; case TIFF_SETGET_C16_UINT8: { uint8* data; assert(fip->field_readcount==TIFF_VARIABLE); assert(fip->field_passcount==1); if (dp->tdir_count>0xFFFF) err=TIFFReadDirEntryErrCount; else { err=TIFFReadDirEntryByteArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } } break; case TIFF_SETGET_C16_UINT16: { uint16* data; assert(fip->field_readcount==TIFF_VARIABLE); assert(fip->field_passcount==1); if (dp->tdir_count>0xFFFF) err=TIFFReadDirEntryErrCount; else { err=TIFFReadDirEntryShortArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } } break; case TIFF_SETGET_C16_UINT32: { uint32* data; assert(fip->field_readcount==TIFF_VARIABLE); assert(fip->field_passcount==1); if (dp->tdir_count>0xFFFF) err=TIFFReadDirEntryErrCount; else { err=TIFFReadDirEntryLongArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } } break; case TIFF_SETGET_C16_UINT64: { uint64* data; assert(fip->field_readcount==TIFF_VARIABLE); assert(fip->field_passcount==1); if (dp->tdir_count>0xFFFF) err=TIFFReadDirEntryErrCount; else { err=TIFFReadDirEntryLong8Array(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } } break; case TIFF_SETGET_C16_FLOAT: { float* data; assert(fip->field_readcount==TIFF_VARIABLE); assert(fip->field_passcount==1); if (dp->tdir_count>0xFFFF) err=TIFFReadDirEntryErrCount; else { err=TIFFReadDirEntryFloatArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } } break; case TIFF_SETGET_C16_DOUBLE: { double* data; assert(fip->field_readcount==TIFF_VARIABLE); assert(fip->field_passcount==1); if (dp->tdir_count>0xFFFF) err=TIFFReadDirEntryErrCount; else { err=TIFFReadDirEntryDoubleArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } } break; case TIFF_SETGET_C16_IFD8: { uint64* data; assert(fip->field_readcount==TIFF_VARIABLE); assert(fip->field_passcount==1); if (dp->tdir_count>0xFFFF) err=TIFFReadDirEntryErrCount; else { err=TIFFReadDirEntryIfd8Array(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } } break; case TIFF_SETGET_C32_ASCII: { uint8* data; assert(fip->field_readcount==TIFF_VARIABLE2); assert(fip->field_passcount==1); err=TIFFReadDirEntryByteArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } break; case TIFF_SETGET_C32_UINT8: { uint8* data; assert(fip->field_readcount==TIFF_VARIABLE2); assert(fip->field_passcount==1); err=TIFFReadDirEntryByteArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } break; case TIFF_SETGET_C32_SINT8: { int8* data = NULL; assert(fip->field_readcount==TIFF_VARIABLE2); assert(fip->field_passcount==1); err=TIFFReadDirEntrySbyteArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } break; case TIFF_SETGET_C32_UINT16: { uint16* data; assert(fip->field_readcount==TIFF_VARIABLE2); assert(fip->field_passcount==1); err=TIFFReadDirEntryShortArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } break; case TIFF_SETGET_C32_SINT16: { int16* data = NULL; assert(fip->field_readcount==TIFF_VARIABLE2); assert(fip->field_passcount==1); err=TIFFReadDirEntrySshortArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } break; case TIFF_SETGET_C32_UINT32: { uint32* data; assert(fip->field_readcount==TIFF_VARIABLE2); assert(fip->field_passcount==1); err=TIFFReadDirEntryLongArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } break; case TIFF_SETGET_C32_SINT32: { int32* data = NULL; assert(fip->field_readcount==TIFF_VARIABLE2); assert(fip->field_passcount==1); err=TIFFReadDirEntrySlongArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } break; case TIFF_SETGET_C32_UINT64: { uint64* data; assert(fip->field_readcount==TIFF_VARIABLE2); assert(fip->field_passcount==1); err=TIFFReadDirEntryLong8Array(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } break; case TIFF_SETGET_C32_SINT64: { int64* data = NULL; assert(fip->field_readcount==TIFF_VARIABLE2); assert(fip->field_passcount==1); err=TIFFReadDirEntrySlong8Array(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } break; case TIFF_SETGET_C32_FLOAT: { float* data; assert(fip->field_readcount==TIFF_VARIABLE2); assert(fip->field_passcount==1); err=TIFFReadDirEntryFloatArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } break; case TIFF_SETGET_C32_DOUBLE: { double* data; assert(fip->field_readcount==TIFF_VARIABLE2); assert(fip->field_passcount==1); err=TIFFReadDirEntryDoubleArray(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } break; case TIFF_SETGET_C32_IFD8: { uint64* data; assert(fip->field_readcount==TIFF_VARIABLE2); assert(fip->field_passcount==1); err=TIFFReadDirEntryIfd8Array(tif,dp,&data); if (err==TIFFReadDirEntryErrOk) { int m; m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data); if (data!=0) _TIFFfree(data); if (!m) return(0); } } break; default: assert(0); /* we should never get here */ break; } if (err!=TIFFReadDirEntryErrOk) { TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",recover); return(0); } return(1); } /* * Fetch a set of offsets or lengths. * While this routine says "strips", in fact it's also used for tiles. */ static int TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, uint32 nstrips, uint64** lpp) { static const char module[] = "TIFFFetchStripThing"; enum TIFFReadDirEntryErr err; uint64* data; err=TIFFReadDirEntryLong8Array(tif,dir,&data); if (err!=TIFFReadDirEntryErrOk) { const TIFFField* fip = TIFFFieldWithTag(tif,dir->tdir_tag); TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0); return(0); } if (dir->tdir_count!=(uint64)nstrips) { uint64* resizeddata; resizeddata=(uint64*)_TIFFCheckMalloc(tif,nstrips,sizeof(uint64),"for strip array"); if (resizeddata==0) { _TIFFfree(data); return(0); } if (dir->tdir_count<(uint64)nstrips) { _TIFFmemcpy(resizeddata,data,(uint32)dir->tdir_count*sizeof(uint64)); _TIFFmemset(resizeddata+(uint32)dir->tdir_count,0,(nstrips-(uint32)dir->tdir_count)*sizeof(uint64)); } else _TIFFmemcpy(resizeddata,data,nstrips*sizeof(uint64)); _TIFFfree(data); data=resizeddata; } *lpp=data; return(1); } /* * Fetch and set the SubjectDistance EXIF tag. */ static int TIFFFetchSubjectDistance(TIFF* tif, TIFFDirEntry* dir) { static const char module[] = "TIFFFetchSubjectDistance"; enum TIFFReadDirEntryErr err; UInt64Aligned_t m; m.l=0; assert(sizeof(double)==8); assert(sizeof(uint64)==8); assert(sizeof(uint32)==4); if (dir->tdir_count!=1) err=TIFFReadDirEntryErrCount; else if (dir->tdir_type!=TIFF_RATIONAL) err=TIFFReadDirEntryErrType; else { if (!(tif->tif_flags&TIFF_BIGTIFF)) { uint32 offset; offset=*(uint32*)(&dir->tdir_offset); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,offset,8,m.i); } else { m.l=dir->tdir_offset.toff_long8; err=TIFFReadDirEntryErrOk; } } if (err==TIFFReadDirEntryErrOk) { double n; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong(m.i,2); if (m.i[0]==0) n=0.0; else if (m.i[0]==0xFFFFFFFF) /* * XXX: Numerator 0xFFFFFFFF means that we have infinite * distance. Indicate that with a negative floating point * SubjectDistance value. */ n=-1.0; else n=(double)m.i[0]/(double)m.i[1]; return(TIFFSetField(tif,dir->tdir_tag,n)); } else { TIFFReadDirEntryOutputErr(tif,err,module,"SubjectDistance",TRUE); return(0); } } /* * Replace a single strip (tile) of uncompressed data by multiple strips * (tiles), each approximately STRIP_SIZE_DEFAULT bytes. This is useful for * dealing with large images or for dealing with machines with a limited * amount memory. */ static void ChopUpSingleUncompressedStrip(TIFF* tif) { register TIFFDirectory *td = &tif->tif_dir; uint64 bytecount; uint64 offset; uint32 rowblock; uint64 rowblockbytes; uint64 stripbytes; uint32 strip; uint64 nstrips64; uint32 nstrips32; uint32 rowsperstrip; uint64* newcounts; uint64* newoffsets; bytecount = td->td_stripbytecount[0]; offset = td->td_stripoffset[0]; assert(td->td_planarconfig == PLANARCONFIG_CONTIG); if ((td->td_photometric == PHOTOMETRIC_YCBCR)&& (!isUpSampled(tif))) rowblock = td->td_ycbcrsubsampling[1]; else rowblock = 1; rowblockbytes = TIFFVTileSize64(tif, rowblock); /* * Make the rows hold at least one scanline, but fill specified amount * of data if possible. */ if (rowblockbytes > STRIP_SIZE_DEFAULT) { stripbytes = rowblockbytes; rowsperstrip = rowblock; } else if (rowblockbytes > 0 ) { uint32 rowblocksperstrip; rowblocksperstrip = (uint32) (STRIP_SIZE_DEFAULT / rowblockbytes); rowsperstrip = rowblocksperstrip * rowblock; stripbytes = rowblocksperstrip * rowblockbytes; } else return; /* * never increase the number of strips in an image */ if (rowsperstrip >= td->td_rowsperstrip) return; nstrips64 = TIFFhowmany_64(bytecount, stripbytes); if ((nstrips64==0)||(nstrips64>0xFFFFFFFF)) /* something is wonky, do nothing. */ return; nstrips32 = (uint32)nstrips64; newcounts = (uint64*) _TIFFCheckMalloc(tif, nstrips32, sizeof (uint64), "for chopped \"StripByteCounts\" array"); newoffsets = (uint64*) _TIFFCheckMalloc(tif, nstrips32, sizeof (uint64), "for chopped \"StripOffsets\" array"); if (newcounts == NULL || newoffsets == NULL) { /* * Unable to allocate new strip information, give up and use * the original one strip information. */ if (newcounts != NULL) _TIFFfree(newcounts); if (newoffsets != NULL) _TIFFfree(newoffsets); return; } /* * Fill the strip information arrays with new bytecounts and offsets * that reflect the broken-up format. */ for (strip = 0; strip < nstrips32; strip++) { if (stripbytes > bytecount) stripbytes = bytecount; newcounts[strip] = stripbytes; newoffsets[strip] = offset; offset += stripbytes; bytecount -= stripbytes; } /* * Replace old single strip info with multi-strip info. */ td->td_stripsperimage = td->td_nstrips = nstrips32; TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip); _TIFFfree(td->td_stripbytecount); _TIFFfree(td->td_stripoffset); td->td_stripbytecount = newcounts; td->td_stripoffset = newoffsets; td->td_stripbytecountsorted = 1; } int _TIFFFillStriles( TIFF *tif ) { #if defined(DEFER_STRILE_LOAD) register TIFFDirectory *td = &tif->tif_dir; int return_value = 1; if( td->td_stripoffset != NULL ) return 1; if( td->td_stripoffset_entry.tdir_count == 0 ) return 0; if (!TIFFFetchStripThing(tif,&(td->td_stripoffset_entry), td->td_nstrips,&td->td_stripoffset)) { return_value = 0; } if (!TIFFFetchStripThing(tif,&(td->td_stripbytecount_entry), td->td_nstrips,&td->td_stripbytecount)) { return_value = 0; } _TIFFmemset( &(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry)); _TIFFmemset( &(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry)); if (tif->tif_dir.td_nstrips > 1 && return_value == 1 ) { uint32 strip; tif->tif_dir.td_stripbytecountsorted = 1; for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++) { if (tif->tif_dir.td_stripoffset[strip - 1] > tif->tif_dir.td_stripoffset[strip]) { tif->tif_dir.td_stripbytecountsorted = 0; break; } } } return return_value; #else /* !defined(DEFER_STRILE_LOAD) */ (void) tif; return 1; #endif } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_compress.c0000644000212300117540000001737711345765560013702 00000000000000/* $Id: tif_compress.c,v 1.22 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Compression Scheme Configuration Support. */ #include "tiffiop.h" static int TIFFNoEncode(TIFF* tif, const char* method) { const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression); if (c) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%s %s encoding is not implemented", c->name, method); } else { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Compression scheme %u %s encoding is not implemented", tif->tif_dir.td_compression, method); } return (-1); } int _TIFFNoRowEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s) { (void) pp; (void) cc; (void) s; return (TIFFNoEncode(tif, "scanline")); } int _TIFFNoStripEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s) { (void) pp; (void) cc; (void) s; return (TIFFNoEncode(tif, "strip")); } int _TIFFNoTileEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s) { (void) pp; (void) cc; (void) s; return (TIFFNoEncode(tif, "tile")); } static int TIFFNoDecode(TIFF* tif, const char* method) { const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression); if (c) TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%s %s decoding is not implemented", c->name, method); else TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Compression scheme %u %s decoding is not implemented", tif->tif_dir.td_compression, method); return (-1); } int _TIFFNoFixupTags(TIFF* tif) { (void) tif; return (1); } int _TIFFNoRowDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s) { (void) pp; (void) cc; (void) s; return (TIFFNoDecode(tif, "scanline")); } int _TIFFNoStripDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s) { (void) pp; (void) cc; (void) s; return (TIFFNoDecode(tif, "strip")); } int _TIFFNoTileDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s) { (void) pp; (void) cc; (void) s; return (TIFFNoDecode(tif, "tile")); } int _TIFFNoSeek(TIFF* tif, uint32 off) { (void) off; TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Compression algorithm does not support random access"); return (0); } int _TIFFNoPreCode(TIFF* tif, uint16 s) { (void) tif; (void) s; return (1); } static int _TIFFtrue(TIFF* tif) { (void) tif; return (1); } static void _TIFFvoid(TIFF* tif) { (void) tif; } void _TIFFSetDefaultCompressionState(TIFF* tif) { tif->tif_fixuptags = _TIFFNoFixupTags; tif->tif_decodestatus = TRUE; tif->tif_setupdecode = _TIFFtrue; tif->tif_predecode = _TIFFNoPreCode; tif->tif_decoderow = _TIFFNoRowDecode; tif->tif_decodestrip = _TIFFNoStripDecode; tif->tif_decodetile = _TIFFNoTileDecode; tif->tif_encodestatus = TRUE; tif->tif_setupencode = _TIFFtrue; tif->tif_preencode = _TIFFNoPreCode; tif->tif_postencode = _TIFFtrue; tif->tif_encoderow = _TIFFNoRowEncode; tif->tif_encodestrip = _TIFFNoStripEncode; tif->tif_encodetile = _TIFFNoTileEncode; tif->tif_close = _TIFFvoid; tif->tif_seek = _TIFFNoSeek; tif->tif_cleanup = _TIFFvoid; tif->tif_defstripsize = _TIFFDefaultStripSize; tif->tif_deftilesize = _TIFFDefaultTileSize; tif->tif_flags &= ~(TIFF_NOBITREV|TIFF_NOREADRAW); } int TIFFSetCompressionScheme(TIFF* tif, int scheme) { const TIFFCodec *c = TIFFFindCODEC((uint16) scheme); _TIFFSetDefaultCompressionState(tif); /* * Don't treat an unknown compression scheme as an error. * This permits applications to open files with data that * the library does not have builtin support for, but which * may still be meaningful. */ return (c ? (*c->init)(tif, scheme) : 1); } /* * Other compression schemes may be registered. Registered * schemes can also override the builtin versions provided * by this library. */ typedef struct _codec { struct _codec* next; TIFFCodec* info; } codec_t; static codec_t* registeredCODECS = NULL; const TIFFCodec* TIFFFindCODEC(uint16 scheme) { const TIFFCodec* c; codec_t* cd; for (cd = registeredCODECS; cd; cd = cd->next) if (cd->info->scheme == scheme) return ((const TIFFCodec*) cd->info); for (c = _TIFFBuiltinCODECS; c->name; c++) if (c->scheme == scheme) return (c); return ((const TIFFCodec*) 0); } TIFFCodec* TIFFRegisterCODEC(uint16 scheme, const char* name, TIFFInitMethod init) { codec_t* cd = (codec_t*) _TIFFmalloc((tmsize_t)(sizeof (codec_t) + sizeof (TIFFCodec) + strlen(name)+1)); if (cd != NULL) { cd->info = (TIFFCodec*) ((uint8*) cd + sizeof (codec_t)); cd->info->name = (char*) ((uint8*) cd->info + sizeof (TIFFCodec)); strcpy(cd->info->name, name); cd->info->scheme = scheme; cd->info->init = init; cd->next = registeredCODECS; registeredCODECS = cd; } else { TIFFErrorExt(0, "TIFFRegisterCODEC", "No space to register compression scheme %s", name); return NULL; } return (cd->info); } void TIFFUnRegisterCODEC(TIFFCodec* c) { codec_t* cd; codec_t** pcd; for (pcd = ®isteredCODECS; (cd = *pcd); pcd = &cd->next) if (cd->info == c) { *pcd = cd->next; _TIFFfree(cd); return; } TIFFErrorExt(0, "TIFFUnRegisterCODEC", "Cannot remove compression scheme %s; not registered", c->name); } /************************************************************************/ /* TIFFGetConfisuredCODECs() */ /************************************************************************/ /** * Get list of configured codecs, both built-in and registered by user. * Caller is responsible to free this structure. * * @return returns array of TIFFCodec records (the last record should be NULL) * or NULL if function failed. */ TIFFCodec* TIFFGetConfiguredCODECs() { int i = 1; codec_t *cd; const TIFFCodec* c; TIFFCodec* codecs = NULL; TIFFCodec* new_codecs; for (cd = registeredCODECS; cd; cd = cd->next) { new_codecs = (TIFFCodec *) _TIFFrealloc(codecs, i * sizeof(TIFFCodec)); if (!new_codecs) { _TIFFfree (codecs); return NULL; } codecs = new_codecs; _TIFFmemcpy(codecs + i - 1, cd, sizeof(TIFFCodec)); i++; } for (c = _TIFFBuiltinCODECS; c->name; c++) { if (TIFFIsCODECConfigured(c->scheme)) { new_codecs = (TIFFCodec *) _TIFFrealloc(codecs, i * sizeof(TIFFCodec)); if (!new_codecs) { _TIFFfree (codecs); return NULL; } codecs = new_codecs; _TIFFmemcpy(codecs + i - 1, (const void*)c, sizeof(TIFFCodec)); i++; } } new_codecs = (TIFFCodec *) _TIFFrealloc(codecs, i * sizeof(TIFFCodec)); if (!new_codecs) { _TIFFfree (codecs); return NULL; } codecs = new_codecs; _TIFFmemset(codecs + i - 1, 0, sizeof(TIFFCodec)); return codecs; } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_close.c0000644000212300117540000001004111345765560013131 00000000000000/* $Id: tif_close.c,v 1.19 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. */ #include "tiffiop.h" #include /************************************************************************/ /* TIFFCleanup() */ /************************************************************************/ /** * Auxiliary function to free the TIFF structure. Given structure will be * completetly freed, so you should save opened file handle and pointer * to the close procedure in external variables before calling * _TIFFCleanup(), if you will need these ones to close the file. * * @param tif A TIFF pointer. */ void TIFFCleanup(TIFF* tif) { /* * Flush buffered data and directory (if dirty). */ if (tif->tif_mode != O_RDONLY) TIFFFlush(tif); (*tif->tif_cleanup)(tif); TIFFFreeDirectory(tif); if (tif->tif_dirlist) _TIFFfree(tif->tif_dirlist); /* * Clean up client info links. */ while( tif->tif_clientinfo ) { TIFFClientInfoLink *link = tif->tif_clientinfo; tif->tif_clientinfo = link->next; _TIFFfree( link->name ); _TIFFfree( link ); } if (tif->tif_rawdata && (tif->tif_flags&TIFF_MYBUFFER)) _TIFFfree(tif->tif_rawdata); if (isMapped(tif)) TIFFUnmapFileContents(tif, tif->tif_base, (toff_t)tif->tif_size); /* * Clean up custom fields. */ if (tif->tif_fields && tif->tif_nfields > 0) { uint32 i; for (i = 0; i < tif->tif_nfields; i++) { TIFFField *fld = tif->tif_fields[i]; if (fld->field_bit == FIELD_CUSTOM && strncmp("Tag ", fld->field_name, 4) == 0) { _TIFFfree(fld->field_name); _TIFFfree(fld); } } _TIFFfree(tif->tif_fields); } if (tif->tif_nfieldscompat > 0) { uint32 i; for (i = 0; i < tif->tif_nfieldscompat; i++) { if (tif->tif_fieldscompat[i].allocated_size) _TIFFfree(tif->tif_fieldscompat[i].fields); } _TIFFfree(tif->tif_fieldscompat); } _TIFFfree(tif); } /************************************************************************/ /* TIFFClose() */ /************************************************************************/ /** * Close a previously opened TIFF file. * * TIFFClose closes a file that was previously opened with TIFFOpen(). * Any buffered data are flushed to the file, including the contents of * the current directory (if modified); and all resources are reclaimed. * * @param tif A TIFF pointer. */ void TIFFClose(TIFF* tif) { TIFFCloseProc closeproc = tif->tif_closeproc; thandle_t fd = tif->tif_clientdata; TIFFCleanup(tif); (void) (*closeproc)(fd); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_zip.c0000644000212300117540000003213711527767441012642 00000000000000/* $Id: tif_zip.c,v 1.31 2011-01-06 16:00:23 fwarmerdam Exp $ */ /* * Copyright (c) 1995-1997 Sam Leffler * Copyright (c) 1995-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef ZIP_SUPPORT /* * TIFF Library. * * ZIP (aka Deflate) Compression Support * * This file is simply an interface to the zlib library written by * Jean-loup Gailly and Mark Adler. You must use version 1.0 or later * of the library: this code assumes the 1.0 API and also depends on * the ability to write the zlib header multiple times (one per strip) * which was not possible with versions prior to 0.95. Note also that * older versions of this codec avoided this bug by supressing the header * entirely. This means that files written with the old library cannot * be read; they should be converted to a different compression scheme * and then reconverted. * * The data format used by the zlib library is described in the files * zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available in the * directory ftp://ftp.uu.net/pub/archiving/zip/doc. The library was * last found at ftp://ftp.uu.net/pub/archiving/zip/zlib/zlib-0.99.tar.gz. */ #include "tif_predict.h" #include "zlib.h" #include /* * Sigh, ZLIB_VERSION is defined as a string so there's no * way to do a proper check here. Instead we guess based * on the presence of #defines that were added between the * 0.95 and 1.0 distributions. */ #if !defined(Z_NO_COMPRESSION) || !defined(Z_DEFLATED) #error "Antiquated ZLIB software; you must use version 1.0 or later" #endif /* * State block for each open TIFF * file using ZIP compression/decompression. */ typedef struct { TIFFPredictorState predict; z_stream stream; int zipquality; /* compression level */ int state; /* state flags */ #define ZSTATE_INIT_DECODE 0x01 #define ZSTATE_INIT_ENCODE 0x02 TIFFVGetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ } ZIPState; #define ZState(tif) ((ZIPState*) (tif)->tif_data) #define DecoderState(tif) ZState(tif) #define EncoderState(tif) ZState(tif) static int ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s); static int ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s); static int ZIPFixupTags(TIFF* tif) { (void) tif; return (1); } static int ZIPSetupDecode(TIFF* tif) { static const char module[] = "ZIPSetupDecode"; ZIPState* sp = DecoderState(tif); assert(sp != NULL); /* if we were last encoding, terminate this mode */ if (sp->state & ZSTATE_INIT_ENCODE) { deflateEnd(&sp->stream); sp->state = 0; } if (inflateInit(&sp->stream) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "%s", sp->stream.msg); return (0); } else { sp->state |= ZSTATE_INIT_DECODE; return (1); } } /* * Setup state for decoding a strip. */ static int ZIPPreDecode(TIFF* tif, uint16 s) { static const char module[] = "ZIPPreDecode"; ZIPState* sp = DecoderState(tif); (void) s; assert(sp != NULL); if( (sp->state & ZSTATE_INIT_DECODE) == 0 ) tif->tif_setupdecode( tif ); sp->stream.next_in = tif->tif_rawdata; assert(sizeof(sp->stream.avail_in)==4); /* if this assert gets raised, we need to simplify this code to reflect a ZLib that is likely updated to deal with 8byte memory sizes, though this code will respond apropriately even before we simplify it */ sp->stream.avail_in = (uInt) tif->tif_rawcc; if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size"); return (0); } return (inflateReset(&sp->stream) == Z_OK); } static int ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s) { static const char module[] = "ZIPDecode"; ZIPState* sp = DecoderState(tif); (void) s; assert(sp != NULL); assert(sp->state == ZSTATE_INIT_DECODE); sp->stream.next_in = tif->tif_rawcp; sp->stream.avail_in = (uInt) tif->tif_rawcc; sp->stream.next_out = op; assert(sizeof(sp->stream.avail_out)==4); /* if this assert gets raised, we need to simplify this code to reflect a ZLib that is likely updated to deal with 8byte memory sizes, though this code will respond apropriately even before we simplify it */ sp->stream.avail_out = (uInt) occ; if ((tmsize_t)sp->stream.avail_out != occ) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size"); return (0); } do { int state = inflate(&sp->stream, Z_PARTIAL_FLUSH); if (state == Z_STREAM_END) break; if (state == Z_DATA_ERROR) { TIFFErrorExt(tif->tif_clientdata, module, "Decoding error at scanline %lu, %s", (unsigned long) tif->tif_row, sp->stream.msg); if (inflateSync(&sp->stream) != Z_OK) return (0); continue; } if (state != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", sp->stream.msg); return (0); } } while (sp->stream.avail_out > 0); if (sp->stream.avail_out != 0) { TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at scanline %lu (short " TIFF_UINT64_FORMAT " bytes)", (unsigned long) tif->tif_row, (TIFF_UINT64_T) sp->stream.avail_out); return (0); } tif->tif_rawcp = sp->stream.next_in; tif->tif_rawcc = sp->stream.avail_in; return (1); } static int ZIPSetupEncode(TIFF* tif) { static const char module[] = "ZIPSetupEncode"; ZIPState* sp = EncoderState(tif); assert(sp != NULL); if (sp->state & ZSTATE_INIT_DECODE) { inflateEnd(&sp->stream); sp->state = 0; } if (deflateInit(&sp->stream, sp->zipquality) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "%s", sp->stream.msg); return (0); } else { sp->state |= ZSTATE_INIT_ENCODE; return (1); } } /* * Reset encoding state at the start of a strip. */ static int ZIPPreEncode(TIFF* tif, uint16 s) { static const char module[] = "ZIPPreEncode"; ZIPState *sp = EncoderState(tif); (void) s; assert(sp != NULL); if( sp->state != ZSTATE_INIT_ENCODE ) tif->tif_setupencode( tif ); sp->stream.next_out = tif->tif_rawdata; assert(sizeof(sp->stream.avail_out)==4); /* if this assert gets raised, we need to simplify this code to reflect a ZLib that is likely updated to deal with 8byte memory sizes, though this code will respond apropriately even before we simplify it */ sp->stream.avail_out = tif->tif_rawdatasize; if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size"); return (0); } return (deflateReset(&sp->stream) == Z_OK); } /* * Encode a chunk of pixels. */ static int ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { static const char module[] = "ZIPEncode"; ZIPState *sp = EncoderState(tif); assert(sp != NULL); assert(sp->state == ZSTATE_INIT_ENCODE); (void) s; sp->stream.next_in = bp; assert(sizeof(sp->stream.avail_in)==4); /* if this assert gets raised, we need to simplify this code to reflect a ZLib that is likely updated to deal with 8byte memory sizes, though this code will respond apropriately even before we simplify it */ sp->stream.avail_in = (uInt) cc; if ((tmsize_t)sp->stream.avail_in != cc) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size"); return (0); } do { if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "Encoder error: %s", sp->stream.msg); return (0); } if (sp->stream.avail_out == 0) { tif->tif_rawcc = tif->tif_rawdatasize; TIFFFlushData1(tif); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = (uInt) tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in ZIPPreEncode */ } } while (sp->stream.avail_in > 0); return (1); } /* * Finish off an encoded strip by flushing the last * string and tacking on an End Of Information code. */ static int ZIPPostEncode(TIFF* tif) { static const char module[] = "ZIPPostEncode"; ZIPState *sp = EncoderState(tif); int state; sp->stream.avail_in = 0; do { state = deflate(&sp->stream, Z_FINISH); switch (state) { case Z_STREAM_END: case Z_OK: if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) { tif->tif_rawcc = tif->tif_rawdatasize - sp->stream.avail_out; TIFFFlushData1(tif); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = (uInt) tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in ZIPPreEncode */ } break; default: TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", sp->stream.msg); return (0); } } while (state != Z_STREAM_END); return (1); } static void ZIPCleanup(TIFF* tif) { ZIPState* sp = ZState(tif); assert(sp != 0); (void)TIFFPredictorCleanup(tif); tif->tif_tagmethods.vgetfield = sp->vgetparent; tif->tif_tagmethods.vsetfield = sp->vsetparent; if (sp->state & ZSTATE_INIT_ENCODE) { deflateEnd(&sp->stream); sp->state = 0; } else if( sp->state & ZSTATE_INIT_DECODE) { inflateEnd(&sp->stream); sp->state = 0; } _TIFFfree(sp); tif->tif_data = NULL; _TIFFSetDefaultCompressionState(tif); } static int ZIPVSetField(TIFF* tif, uint32 tag, va_list ap) { static const char module[] = "ZIPVSetField"; ZIPState* sp = ZState(tif); switch (tag) { case TIFFTAG_ZIPQUALITY: sp->zipquality = (int) va_arg(ap, int); if ( sp->state&ZSTATE_INIT_ENCODE ) { if (deflateParams(&sp->stream, sp->zipquality, Z_DEFAULT_STRATEGY) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", sp->stream.msg); return (0); } } return (1); default: return (*sp->vsetparent)(tif, tag, ap); } /*NOTREACHED*/ } static int ZIPVGetField(TIFF* tif, uint32 tag, va_list ap) { ZIPState* sp = ZState(tif); switch (tag) { case TIFFTAG_ZIPQUALITY: *va_arg(ap, int*) = sp->zipquality; break; default: return (*sp->vgetparent)(tif, tag, ap); } return (1); } static const TIFFField zipFields[] = { { TIFFTAG_ZIPQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL }, }; int TIFFInitZIP(TIFF* tif, int scheme) { static const char module[] = "TIFFInitZIP"; ZIPState* sp; assert( (scheme == COMPRESSION_DEFLATE) || (scheme == COMPRESSION_ADOBE_DEFLATE)); /* * Merge codec-specific tag information. */ if (!_TIFFMergeFields(tif, zipFields, TIFFArrayCount(zipFields))) { TIFFErrorExt(tif->tif_clientdata, module, "Merging Deflate codec-specific tags failed"); return 0; } /* * Allocate state block so tag methods have storage to record values. */ tif->tif_data = (uint8*) _TIFFmalloc(sizeof (ZIPState)); if (tif->tif_data == NULL) goto bad; sp = ZState(tif); sp->stream.zalloc = NULL; sp->stream.zfree = NULL; sp->stream.opaque = NULL; sp->stream.data_type = Z_BINARY; /* * Override parent get/set field methods. */ sp->vgetparent = tif->tif_tagmethods.vgetfield; tif->tif_tagmethods.vgetfield = ZIPVGetField; /* hook for codec tags */ sp->vsetparent = tif->tif_tagmethods.vsetfield; tif->tif_tagmethods.vsetfield = ZIPVSetField; /* hook for codec tags */ /* Default values for codec-specific fields */ sp->zipquality = Z_DEFAULT_COMPRESSION; /* default comp. level */ sp->state = 0; /* * Install codec methods. */ tif->tif_fixuptags = ZIPFixupTags; tif->tif_setupdecode = ZIPSetupDecode; tif->tif_predecode = ZIPPreDecode; tif->tif_decoderow = ZIPDecode; tif->tif_decodestrip = ZIPDecode; tif->tif_decodetile = ZIPDecode; tif->tif_setupencode = ZIPSetupEncode; tif->tif_preencode = ZIPPreEncode; tif->tif_postencode = ZIPPostEncode; tif->tif_encoderow = ZIPEncode; tif->tif_encodestrip = ZIPEncode; tif->tif_encodetile = ZIPEncode; tif->tif_cleanup = ZIPCleanup; /* * Setup predictor setup. */ (void) TIFFPredictorInit(tif); return (1); bad: TIFFErrorExt(tif->tif_clientdata, module, "No space for ZIP state block"); return (0); } #endif /* ZIP_SUPORT */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_version.c0000644000212300117540000000301311345765561013513 00000000000000/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_version.c,v 1.3 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1992-1997 Sam Leffler * Copyright (c) 1992-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" static const char TIFFVersion[] = TIFFLIB_VERSION_STR; const char* TIFFGetVersion(void) { return (TIFFVersion); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/Makefile.in0000644000212300117540000010327012027361163013057 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_CXX_TRUE@am__append_1 = tiffio.hxx @WIN32_IO_TRUE@am__append_2 = tif_unix.c @WIN32_IO_TRUE@am__append_3 = tif_win32.c @WIN32_IO_FALSE@am__append_4 = tif_win32.c @WIN32_IO_FALSE@am__append_5 = tif_unix.c @HAVE_CXX_TRUE@am__append_6 = libtiffxx.la @HAVE_RPATH_TRUE@am__append_7 = $(LIBDIR) @HAVE_LD_VERSION_SCRIPT_TRUE@am__append_8 = -Wl,--version-script=$(srcdir)/libtiff.map @HAVE_RPATH_TRUE@am__append_9 = $(LIBDIR) @HAVE_LD_VERSION_SCRIPT_TRUE@am__append_10 = -Wl,--version-script=$(srcdir)/libtiffxx.map noinst_PROGRAMS = mkg3states$(EXEEXT) subdir = libtiff DIST_COMMON = $(am__libtiffinclude_HEADERS_DIST) $(noinst_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/tif_config.h.in $(srcdir)/tiffconf.h.in \ $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = tif_config.h tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" \ "$(DESTDIR)$(libtiffincludedir)" \ "$(DESTDIR)$(libtiffincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libtiff_la_DEPENDENCIES = $(LIBPORT) am__libtiff_la_SOURCES_DIST = tif_aux.c tif_close.c tif_codec.c \ tif_color.c tif_compress.c tif_dir.c tif_dirinfo.c \ tif_dirread.c tif_dirwrite.c tif_dumpmode.c tif_error.c \ tif_extension.c tif_fax3.c tif_fax3sm.c tif_flush.c \ tif_getimage.c tif_jbig.c tif_jpeg.c tif_jpeg_12.c tif_luv.c \ tif_lzma.c tif_lzw.c tif_next.c tif_ojpeg.c tif_open.c \ tif_packbits.c tif_pixarlog.c tif_predict.c tif_print.c \ tif_read.c tif_strip.c tif_swab.c tif_thunder.c tif_tile.c \ tif_version.c tif_warning.c tif_write.c tif_zip.c tif_win32.c \ tif_unix.c @WIN32_IO_TRUE@am__objects_1 = tif_win32.lo @WIN32_IO_FALSE@am__objects_2 = tif_unix.lo am_libtiff_la_OBJECTS = tif_aux.lo tif_close.lo tif_codec.lo \ tif_color.lo tif_compress.lo tif_dir.lo tif_dirinfo.lo \ tif_dirread.lo tif_dirwrite.lo tif_dumpmode.lo tif_error.lo \ tif_extension.lo tif_fax3.lo tif_fax3sm.lo tif_flush.lo \ tif_getimage.lo tif_jbig.lo tif_jpeg.lo tif_jpeg_12.lo \ tif_luv.lo tif_lzma.lo tif_lzw.lo tif_next.lo tif_ojpeg.lo \ tif_open.lo tif_packbits.lo tif_pixarlog.lo tif_predict.lo \ tif_print.lo tif_read.lo tif_strip.lo tif_swab.lo \ tif_thunder.lo tif_tile.lo tif_version.lo tif_warning.lo \ tif_write.lo tif_zip.lo $(am__objects_1) $(am__objects_2) libtiff_la_OBJECTS = $(am_libtiff_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libtiff_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libtiff_la_LDFLAGS) $(LDFLAGS) -o $@ am_libtiffxx_la_OBJECTS = tif_stream.lo libtiffxx_la_OBJECTS = $(am_libtiffxx_la_OBJECTS) libtiffxx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libtiffxx_la_LDFLAGS) $(LDFLAGS) -o $@ @HAVE_CXX_TRUE@am_libtiffxx_la_rpath = -rpath $(libdir) PROGRAMS = $(noinst_PROGRAMS) am_mkg3states_OBJECTS = mkg3states.$(OBJEXT) mkg3states_OBJECTS = $(am_mkg3states_OBJECTS) mkg3states_DEPENDENCIES = $(LIBPORT) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libtiff_la_SOURCES) $(libtiffxx_la_SOURCES) \ $(mkg3states_SOURCES) DIST_SOURCES = $(am__libtiff_la_SOURCES_DIST) $(libtiffxx_la_SOURCES) \ $(mkg3states_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__libtiffinclude_HEADERS_DIST = tiff.h tiffio.h tiffvers.h \ tiffio.hxx HEADERS = $(libtiffinclude_HEADERS) $(nodist_libtiffinclude_HEADERS) \ $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ LIBPORT = $(top_builddir)/port/libport.la LIBTIFF = $(top_builddir)/libtiff/libtiff.la libtiffincludedir = $(includedir) EXTRA_DIST = Makefile.vc SConstruct tif_config.h-vms tif_config.vc.h \ tif_config.wince.h tiffconf.vc.h tiffconf.wince.h libtiff.def \ libtiff.map libtiffxx.map $(am__append_2) $(am__append_4) libtiffinclude_HEADERS = tiff.h tiffio.h tiffvers.h $(am__append_1) noinst_HEADERS = \ t4.h \ tif_dir.h \ tif_predict.h \ tiffiop.h \ uvcode.h nodist_libtiffinclude_HEADERS = \ tiffconf.h libtiff_la_SOURCES = tif_aux.c tif_close.c tif_codec.c tif_color.c \ tif_compress.c tif_dir.c tif_dirinfo.c tif_dirread.c \ tif_dirwrite.c tif_dumpmode.c tif_error.c tif_extension.c \ tif_fax3.c tif_fax3sm.c tif_flush.c tif_getimage.c tif_jbig.c \ tif_jpeg.c tif_jpeg_12.c tif_luv.c tif_lzma.c tif_lzw.c \ tif_next.c tif_ojpeg.c tif_open.c tif_packbits.c \ tif_pixarlog.c tif_predict.c tif_print.c tif_read.c \ tif_strip.c tif_swab.c tif_thunder.c tif_tile.c tif_version.c \ tif_warning.c tif_write.c tif_zip.c $(am__append_3) \ $(am__append_5) libtiffxx_la_SOURCES = \ tif_stream.cxx lib_LTLIBRARIES = libtiff.la $(am__append_6) libtiff_la_LDFLAGS = -no-undefined -version-info \ $(LIBTIFF_VERSION_INFO) $(am__append_7) $(am__append_8) libtiff_la_LIBADD = $(LIBPORT) libtiffxx_la_LDFLAGS = -no-undefined -version-info \ $(LIBTIFF_VERSION_INFO) $(am__append_9) $(am__append_10) libtiffxx_la_LIBADD = $(LIBTIFF) $(LIBPORT) libtiffxx_la_DEPENDENCIES = libtiff.la mkg3states_SOURCES = mkg3states.c tif_fax3.h mkg3states_LDADD = $(LIBPORT) all: tif_config.h tiffconf.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .cxx .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libtiff/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libtiff/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tif_config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/tif_config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status libtiff/tif_config.h $(srcdir)/tif_config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ tiffconf.h: stamp-h2 @if test ! -f $@; then rm -f stamp-h2; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h2; else :; fi stamp-h2: $(srcdir)/tiffconf.h.in $(top_builddir)/config.status @rm -f stamp-h2 cd $(top_builddir) && $(SHELL) ./config.status libtiff/tiffconf.h distclean-hdr: -rm -f tif_config.h stamp-h1 tiffconf.h stamp-h2 install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libtiff.la: $(libtiff_la_OBJECTS) $(libtiff_la_DEPENDENCIES) $(EXTRA_libtiff_la_DEPENDENCIES) $(AM_V_CCLD)$(libtiff_la_LINK) -rpath $(libdir) $(libtiff_la_OBJECTS) $(libtiff_la_LIBADD) $(LIBS) libtiffxx.la: $(libtiffxx_la_OBJECTS) $(libtiffxx_la_DEPENDENCIES) $(EXTRA_libtiffxx_la_DEPENDENCIES) $(AM_V_CXXLD)$(libtiffxx_la_LINK) $(am_libtiffxx_la_rpath) $(libtiffxx_la_OBJECTS) $(libtiffxx_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list mkg3states$(EXEEXT): $(mkg3states_OBJECTS) $(mkg3states_DEPENDENCIES) $(EXTRA_mkg3states_DEPENDENCIES) @rm -f mkg3states$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mkg3states_OBJECTS) $(mkg3states_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkg3states.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_aux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_close.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_color.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_compress.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_dir.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_dirinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_dirread.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_dirwrite.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_dumpmode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_extension.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_fax3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_fax3sm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_flush.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_getimage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_jbig.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_jpeg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_jpeg_12.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_luv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_lzma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_lzw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_next.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_ojpeg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_open.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_packbits.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_pixarlog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_predict.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_print.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_strip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_swab.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_thunder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_tile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_unix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_version.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_warning.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_win32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tif_zip.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .cxx.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cxx.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cxx.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-libtiffincludeHEADERS: $(libtiffinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(libtiffinclude_HEADERS)'; test -n "$(libtiffincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(libtiffincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libtiffincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libtiffincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libtiffincludedir)" || exit $$?; \ done uninstall-libtiffincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(libtiffinclude_HEADERS)'; test -n "$(libtiffincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libtiffincludedir)'; $(am__uninstall_files_from_dir) install-nodist_libtiffincludeHEADERS: $(nodist_libtiffinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(nodist_libtiffinclude_HEADERS)'; test -n "$(libtiffincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(libtiffincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libtiffincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libtiffincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libtiffincludedir)" || exit $$?; \ done uninstall-nodist_libtiffincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_libtiffinclude_HEADERS)'; test -n "$(libtiffincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libtiffincludedir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) tif_config.h.in tiffconf.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) tif_config.h.in tiffconf.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) tif_config.h.in tiffconf.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) tif_config.h.in tiffconf.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) tif_config.h \ tiffconf.h installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libtiffincludedir)" "$(DESTDIR)$(libtiffincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-libtiffincludeHEADERS \ install-nodist_libtiffincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES uninstall-libtiffincludeHEADERS \ uninstall-nodist_libtiffincludeHEADERS .MAKE: all install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS \ cscopelist ctags distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-libLTLIBRARIES \ install-libtiffincludeHEADERS install-man \ install-nodist_libtiffincludeHEADERS install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES \ uninstall-libtiffincludeHEADERS \ uninstall-nodist_libtiffincludeHEADERS faxtable: mkg3states (rm -f tif_fax3sm.c && ./mkg3states -b -c const tif_fax3sm.c) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/libtiff/tiffiop.h0000644000212300117540000003661611763656233012647 00000000000000/* $Id: tiffiop.h,v 1.84 2012-05-30 01:50:17 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFFIOP_ #define _TIFFIOP_ /* * ``Library-private'' definitions. */ #include "tif_config.h" #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_ASSERT_H # include #else # define assert(x) #endif #ifdef HAVE_SEARCH_H # include #else extern void *lfind(const void *, const void *, size_t *, size_t, int (*)(const void *, const void *)); #endif #include "tiffio.h" #include "tif_dir.h" #ifndef STRIP_SIZE_DEFAULT # define STRIP_SIZE_DEFAULT 8192 #endif #define streq(a,b) (strcmp(a,b) == 0) #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif typedef struct client_info { struct client_info *next; void *data; char *name; } TIFFClientInfoLink; /* * Typedefs for ``method pointers'' used internally. * these are depriciated and provided only for backwards compatibility */ typedef unsigned char tidataval_t; /* internal image data value type */ typedef tidataval_t* tidata_t; /* reference to internal image data */ typedef void (*TIFFVoidMethod)(TIFF*); typedef int (*TIFFBoolMethod)(TIFF*); typedef int (*TIFFPreMethod)(TIFF*, uint16); typedef int (*TIFFCodeMethod)(TIFF* tif, uint8* buf, tmsize_t size, uint16 sample); typedef int (*TIFFSeekMethod)(TIFF*, uint32); typedef void (*TIFFPostMethod)(TIFF* tif, uint8* buf, tmsize_t size); typedef uint32 (*TIFFStripMethod)(TIFF*, uint32); typedef void (*TIFFTileMethod)(TIFF*, uint32*, uint32*); struct tiff { char* tif_name; /* name of open file */ int tif_fd; /* open file descriptor */ int tif_mode; /* open mode (O_*) */ uint32 tif_flags; #define TIFF_FILLORDER 0x00003 /* natural bit fill order for machine */ #define TIFF_DIRTYHEADER 0x00004 /* header must be written on close */ #define TIFF_DIRTYDIRECT 0x00008 /* current directory must be written */ #define TIFF_BUFFERSETUP 0x00010 /* data buffers setup */ #define TIFF_CODERSETUP 0x00020 /* encoder/decoder setup done */ #define TIFF_BEENWRITING 0x00040 /* written 1+ scanlines to file */ #define TIFF_SWAB 0x00080 /* byte swap file information */ #define TIFF_NOBITREV 0x00100 /* inhibit bit reversal logic */ #define TIFF_MYBUFFER 0x00200 /* my raw data buffer; free on close */ #define TIFF_ISTILED 0x00400 /* file is tile, not strip- based */ #define TIFF_MAPPED 0x00800 /* file is mapped into memory */ #define TIFF_POSTENCODE 0x01000 /* need call to postencode routine */ #define TIFF_INSUBIFD 0x02000 /* currently writing a subifd */ #define TIFF_UPSAMPLED 0x04000 /* library is doing data up-sampling */ #define TIFF_STRIPCHOP 0x08000 /* enable strip chopping support */ #define TIFF_HEADERONLY 0x10000 /* read header only, do not process the first directory */ #define TIFF_NOREADRAW 0x20000 /* skip reading of raw uncompressed image data */ #define TIFF_INCUSTOMIFD 0x40000 /* currently writing a custom IFD */ #define TIFF_BIGTIFF 0x80000 /* read/write bigtiff */ #define TIFF_BUF4WRITE 0x100000 /* rawcc bytes are for writing */ #define TIFF_DIRTYSTRIP 0x200000 /* stripoffsets/stripbytecount dirty*/ #define TIFF_PERSAMPLE 0x400000 /* get/set per sample tags as arrays */ #define TIFF_BUFFERMMAP 0x800000 /* read buffer (tif_rawdata) points into mmap() memory */ uint64 tif_diroff; /* file offset of current directory */ uint64 tif_nextdiroff; /* file offset of following directory */ uint64* tif_dirlist; /* list of offsets to already seen directories to prevent IFD looping */ uint16 tif_dirlistsize; /* number of entires in offset list */ uint16 tif_dirnumber; /* number of already seen directories */ TIFFDirectory tif_dir; /* internal rep of current directory */ TIFFDirectory tif_customdir; /* custom IFDs are separated from the main ones */ union { TIFFHeaderCommon common; TIFFHeaderClassic classic; TIFFHeaderBig big; } tif_header; uint16 tif_header_size; /* file's header block and its length */ uint32 tif_row; /* current scanline */ uint16 tif_curdir; /* current directory (index) */ uint32 tif_curstrip; /* current strip for read/write */ uint64 tif_curoff; /* current offset for read/write */ uint64 tif_dataoff; /* current offset for writing dir */ /* SubIFD support */ uint16 tif_nsubifd; /* remaining subifds to write */ uint64 tif_subifdoff; /* offset for patching SubIFD link */ /* tiling support */ uint32 tif_col; /* current column (offset by row too) */ uint32 tif_curtile; /* current tile for read/write */ tmsize_t tif_tilesize; /* # of bytes in a tile */ /* compression scheme hooks */ int tif_decodestatus; TIFFBoolMethod tif_fixuptags; /* called in TIFFReadDirectory */ TIFFBoolMethod tif_setupdecode; /* called once before predecode */ TIFFPreMethod tif_predecode; /* pre- row/strip/tile decoding */ TIFFBoolMethod tif_setupencode; /* called once before preencode */ int tif_encodestatus; TIFFPreMethod tif_preencode; /* pre- row/strip/tile encoding */ TIFFBoolMethod tif_postencode; /* post- row/strip/tile encoding */ TIFFCodeMethod tif_decoderow; /* scanline decoding routine */ TIFFCodeMethod tif_encoderow; /* scanline encoding routine */ TIFFCodeMethod tif_decodestrip; /* strip decoding routine */ TIFFCodeMethod tif_encodestrip; /* strip encoding routine */ TIFFCodeMethod tif_decodetile; /* tile decoding routine */ TIFFCodeMethod tif_encodetile; /* tile encoding routine */ TIFFVoidMethod tif_close; /* cleanup-on-close routine */ TIFFSeekMethod tif_seek; /* position within a strip routine */ TIFFVoidMethod tif_cleanup; /* cleanup state routine */ TIFFStripMethod tif_defstripsize; /* calculate/constrain strip size */ TIFFTileMethod tif_deftilesize; /* calculate/constrain tile size */ uint8* tif_data; /* compression scheme private data */ /* input/output buffering */ tmsize_t tif_scanlinesize; /* # of bytes in a scanline */ tmsize_t tif_scanlineskew; /* scanline skew for reading strips */ uint8* tif_rawdata; /* raw data buffer */ tmsize_t tif_rawdatasize; /* # of bytes in raw data buffer */ tmsize_t tif_rawdataoff; /* rawdata offset within strip */ tmsize_t tif_rawdataloaded;/* amount of data in rawdata */ uint8* tif_rawcp; /* current spot in raw buffer */ tmsize_t tif_rawcc; /* bytes unread from raw buffer */ /* memory-mapped file support */ uint8* tif_base; /* base of mapped file */ tmsize_t tif_size; /* size of mapped file region (bytes, thus tmsize_t) */ TIFFMapFileProc tif_mapproc; /* map file method */ TIFFUnmapFileProc tif_unmapproc; /* unmap file method */ /* input/output callback methods */ thandle_t tif_clientdata; /* callback parameter */ TIFFReadWriteProc tif_readproc; /* read method */ TIFFReadWriteProc tif_writeproc; /* write method */ TIFFSeekProc tif_seekproc; /* lseek method */ TIFFCloseProc tif_closeproc; /* close method */ TIFFSizeProc tif_sizeproc; /* filesize method */ /* post-decoding support */ TIFFPostMethod tif_postdecode; /* post decoding routine */ /* tag support */ TIFFField** tif_fields; /* sorted table of registered tags */ size_t tif_nfields; /* # entries in registered tag table */ const TIFFField* tif_foundfield; /* cached pointer to already found tag */ TIFFTagMethods tif_tagmethods; /* tag get/set/print routines */ TIFFClientInfoLink* tif_clientinfo; /* extra client information. */ /* Backward compatibility stuff. We need these two fields for * setting up an old tag extension scheme. */ TIFFFieldArray* tif_fieldscompat; size_t tif_nfieldscompat; }; #define isPseudoTag(t) (t > 0xffff) /* is tag value normal or pseudo */ #define isTiled(tif) (((tif)->tif_flags & TIFF_ISTILED) != 0) #define isMapped(tif) (((tif)->tif_flags & TIFF_MAPPED) != 0) #define isFillOrder(tif, o) (((tif)->tif_flags & (o)) != 0) #define isUpSampled(tif) (((tif)->tif_flags & TIFF_UPSAMPLED) != 0) #define TIFFReadFile(tif, buf, size) \ ((*(tif)->tif_readproc)((tif)->tif_clientdata,(buf),(size))) #define TIFFWriteFile(tif, buf, size) \ ((*(tif)->tif_writeproc)((tif)->tif_clientdata,(buf),(size))) #define TIFFSeekFile(tif, off, whence) \ ((*(tif)->tif_seekproc)((tif)->tif_clientdata,(off),(whence))) #define TIFFCloseFile(tif) \ ((*(tif)->tif_closeproc)((tif)->tif_clientdata)) #define TIFFGetFileSize(tif) \ ((*(tif)->tif_sizeproc)((tif)->tif_clientdata)) #define TIFFMapFileContents(tif, paddr, psize) \ ((*(tif)->tif_mapproc)((tif)->tif_clientdata,(paddr),(psize))) #define TIFFUnmapFileContents(tif, addr, size) \ ((*(tif)->tif_unmapproc)((tif)->tif_clientdata,(addr),(size))) /* * Default Read/Seek/Write definitions. */ #ifndef ReadOK #define ReadOK(tif, buf, size) \ (TIFFReadFile((tif),(buf),(size))==(size)) #endif #ifndef SeekOK #define SeekOK(tif, off) \ (TIFFSeekFile((tif),(off),SEEK_SET)==(off)) #endif #ifndef WriteOK #define WriteOK(tif, buf, size) \ (TIFFWriteFile((tif),(buf),(size))==(size)) #endif /* NB: the uint32 casts are to silence certain ANSI-C compilers */ #define TIFFhowmany_32(x, y) (((uint32)x < (0xffffffff - (uint32)(y-1))) ? \ ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y))) : \ 0U) #define TIFFhowmany8_32(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3) #define TIFFroundup_32(x, y) (TIFFhowmany_32(x,y)*(y)) #define TIFFhowmany_64(x, y) ((((uint64)(x))+(((uint64)(y))-1))/((uint64)(y))) #define TIFFhowmany8_64(x) (((x)&0x07)?((uint64)(x)>>3)+1:(uint64)(x)>>3) #define TIFFroundup_64(x, y) (TIFFhowmany_64(x,y)*(y)) /* Safe multiply which returns zero if there is an integer overflow */ #define TIFFSafeMultiply(t,v,m) ((((t)(m) != (t)0) && (((t)(((v)*(m))/(m))) == (t)(v))) ? (t)((v)*(m)) : (t)0) #define TIFFmax(A,B) ((A)>(B)?(A):(B)) #define TIFFmin(A,B) ((A)<(B)?(A):(B)) #define TIFFArrayCount(a) (sizeof (a) / sizeof ((a)[0])) #if defined(__cplusplus) extern "C" { #endif extern int _TIFFgetMode(const char* mode, const char* module); extern int _TIFFNoRowEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s); extern int _TIFFNoStripEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s); extern int _TIFFNoTileEncode(TIFF*, uint8* pp, tmsize_t cc, uint16 s); extern int _TIFFNoRowDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s); extern int _TIFFNoStripDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s); extern int _TIFFNoTileDecode(TIFF*, uint8* pp, tmsize_t cc, uint16 s); extern void _TIFFNoPostDecode(TIFF* tif, uint8* buf, tmsize_t cc); extern int _TIFFNoPreCode(TIFF* tif, uint16 s); extern int _TIFFNoSeek(TIFF* tif, uint32 off); extern void _TIFFSwab16BitData(TIFF* tif, uint8* buf, tmsize_t cc); extern void _TIFFSwab24BitData(TIFF* tif, uint8* buf, tmsize_t cc); extern void _TIFFSwab32BitData(TIFF* tif, uint8* buf, tmsize_t cc); extern void _TIFFSwab64BitData(TIFF* tif, uint8* buf, tmsize_t cc); extern int TIFFFlushData1(TIFF* tif); extern int TIFFDefaultDirectory(TIFF* tif); extern void _TIFFSetDefaultCompressionState(TIFF* tif); extern int _TIFFRewriteField(TIFF *, uint16, TIFFDataType, tmsize_t, void *); extern int TIFFSetCompressionScheme(TIFF* tif, int scheme); extern int TIFFSetDefaultCompressionState(TIFF* tif); extern uint32 _TIFFDefaultStripSize(TIFF* tif, uint32 s); extern void _TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th); extern int _TIFFDataSize(TIFFDataType type); extern void _TIFFsetByteArray(void**, void*, uint32); extern void _TIFFsetString(char**, char*); extern void _TIFFsetShortArray(uint16**, uint16*, uint32); extern void _TIFFsetLongArray(uint32**, uint32*, uint32); extern void _TIFFsetFloatArray(float**, float*, uint32); extern void _TIFFsetDoubleArray(double**, double*, uint32); extern void _TIFFprintAscii(FILE*, const char*); extern void _TIFFprintAsciiTag(FILE*, const char*, const char*); extern TIFFErrorHandler _TIFFwarningHandler; extern TIFFErrorHandler _TIFFerrorHandler; extern TIFFErrorHandlerExt _TIFFwarningHandlerExt; extern TIFFErrorHandlerExt _TIFFerrorHandlerExt; extern uint32 _TIFFMultiply32(TIFF*, uint32, uint32, const char*); extern uint64 _TIFFMultiply64(TIFF*, uint64, uint64, const char*); extern void* _TIFFCheckMalloc(TIFF*, tmsize_t, tmsize_t, const char*); extern void* _TIFFCheckRealloc(TIFF*, void*, tmsize_t, tmsize_t, const char*); extern double _TIFFUInt64ToDouble(uint64); extern float _TIFFUInt64ToFloat(uint64); extern int TIFFInitDumpMode(TIFF*, int); #ifdef PACKBITS_SUPPORT extern int TIFFInitPackBits(TIFF*, int); #endif #ifdef CCITT_SUPPORT extern int TIFFInitCCITTRLE(TIFF*, int), TIFFInitCCITTRLEW(TIFF*, int); extern int TIFFInitCCITTFax3(TIFF*, int), TIFFInitCCITTFax4(TIFF*, int); #endif #ifdef THUNDER_SUPPORT extern int TIFFInitThunderScan(TIFF*, int); #endif #ifdef NEXT_SUPPORT extern int TIFFInitNeXT(TIFF*, int); #endif #ifdef LZW_SUPPORT extern int TIFFInitLZW(TIFF*, int); #endif #ifdef OJPEG_SUPPORT extern int TIFFInitOJPEG(TIFF*, int); #endif #ifdef JPEG_SUPPORT extern int TIFFInitJPEG(TIFF*, int); #endif #ifdef JBIG_SUPPORT extern int TIFFInitJBIG(TIFF*, int); #endif #ifdef ZIP_SUPPORT extern int TIFFInitZIP(TIFF*, int); #endif #ifdef PIXARLOG_SUPPORT extern int TIFFInitPixarLog(TIFF*, int); #endif #ifdef LOGLUV_SUPPORT extern int TIFFInitSGILog(TIFF*, int); #endif #ifdef LZMA_SUPPORT extern int TIFFInitLZMA(TIFF*, int); #endif #ifdef VMS extern const TIFFCodec _TIFFBuiltinCODECS[]; #else extern TIFFCodec _TIFFBuiltinCODECS[]; #endif #if defined(__cplusplus) } #endif #endif /* _TIFFIOP_ */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_lzma.c0000644000212300117540000003211111674474751012775 00000000000000/* $Id: tif_lzma.c,v 1.4 2011-12-22 00:29:29 bfriesen Exp $ */ /* * Copyright (c) 2010, Andrey Kiselev * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef LZMA_SUPPORT /* * TIFF Library. * * LZMA2 Compression Support * * You need an LZMA2 SDK to link with. See http://tukaani.org/xz/ for details. * * The codec is derived from ZLIB codec (tif_zip.c). */ #include "tif_predict.h" #include "lzma.h" #include /* * State block for each open TIFF file using LZMA2 compression/decompression. */ typedef struct { TIFFPredictorState predict; lzma_stream stream; lzma_filter filters[LZMA_FILTERS_MAX + 1]; lzma_options_delta opt_delta; /* delta filter options */ lzma_options_lzma opt_lzma; /* LZMA2 filter options */ int preset; /* compression level */ lzma_check check; /* type of the integrity check */ int state; /* state flags */ #define LSTATE_INIT_DECODE 0x01 #define LSTATE_INIT_ENCODE 0x02 TIFFVGetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ } LZMAState; #define LState(tif) ((LZMAState*) (tif)->tif_data) #define DecoderState(tif) LState(tif) #define EncoderState(tif) LState(tif) static int LZMAEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s); static int LZMADecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s); static const char * LZMAStrerror(lzma_ret ret) { switch (ret) { case LZMA_OK: return "operation completed successfully"; case LZMA_STREAM_END: return "end of stream was reached"; case LZMA_NO_CHECK: return "input stream has no integrity check"; case LZMA_UNSUPPORTED_CHECK: return "cannot calculate the integrity check"; case LZMA_GET_CHECK: return "integrity check type is now available"; case LZMA_MEM_ERROR: return "cannot allocate memory"; case LZMA_MEMLIMIT_ERROR: return "memory usage limit was reached"; case LZMA_FORMAT_ERROR: return "file format not recognized"; case LZMA_OPTIONS_ERROR: return "invalid or unsupported options"; case LZMA_DATA_ERROR: return "data is corrupt"; case LZMA_BUF_ERROR: return "no progress is possible (stream is truncated or corrupt)"; case LZMA_PROG_ERROR: return "programming error"; default: return "unindentified liblzma error"; } } static int LZMAFixupTags(TIFF* tif) { (void) tif; return 1; } static int LZMASetupDecode(TIFF* tif) { LZMAState* sp = DecoderState(tif); assert(sp != NULL); /* if we were last encoding, terminate this mode */ if (sp->state & LSTATE_INIT_ENCODE) { lzma_end(&sp->stream); sp->state = 0; } sp->state |= LSTATE_INIT_DECODE; return 1; } /* * Setup state for decoding a strip. */ static int LZMAPreDecode(TIFF* tif, uint16 s) { static const char module[] = "LZMAPreDecode"; LZMAState* sp = DecoderState(tif); lzma_ret ret; (void) s; assert(sp != NULL); if( (sp->state & LSTATE_INIT_DECODE) == 0 ) tif->tif_setupdecode(tif); sp->stream.next_in = tif->tif_rawdata; sp->stream.avail_in = (size_t) tif->tif_rawcc; if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc) { TIFFErrorExt(tif->tif_clientdata, module, "Liblzma cannot deal with buffers this size"); return 0; } /* * Disable memory limit when decoding. UINT64_MAX is a flag to disable * the limit, we are passing (uint64_t)-1 which should be the same. */ ret = lzma_stream_decoder(&sp->stream, (uint64_t)-1, 0); if (ret != LZMA_OK) { TIFFErrorExt(tif->tif_clientdata, module, "Error initializing the stream decoder, %s", LZMAStrerror(ret)); return 0; } return 1; } static int LZMADecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s) { static const char module[] = "LZMADecode"; LZMAState* sp = DecoderState(tif); (void) s; assert(sp != NULL); assert(sp->state == LSTATE_INIT_DECODE); sp->stream.next_in = tif->tif_rawcp; sp->stream.avail_in = (size_t) tif->tif_rawcc; sp->stream.next_out = op; sp->stream.avail_out = (size_t) occ; if ((tmsize_t)sp->stream.avail_out != occ) { TIFFErrorExt(tif->tif_clientdata, module, "Liblzma cannot deal with buffers this size"); return 0; } do { /* * Save the current stream state to properly recover from the * decoding errors later. */ const uint8_t *next_in = sp->stream.next_in; size_t avail_in = sp->stream.avail_in; lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN); if (ret == LZMA_STREAM_END) break; if (ret == LZMA_MEMLIMIT_ERROR) { lzma_ret r = lzma_stream_decoder(&sp->stream, lzma_memusage(&sp->stream), 0); if (r != LZMA_OK) { TIFFErrorExt(tif->tif_clientdata, module, "Error initializing the stream decoder, %s", LZMAStrerror(r)); break; } sp->stream.next_in = next_in; sp->stream.avail_in = avail_in; continue; } if (ret != LZMA_OK) { TIFFErrorExt(tif->tif_clientdata, module, "Decoding error at scanline %lu, %s", (unsigned long) tif->tif_row, LZMAStrerror(ret)); break; } } while (sp->stream.avail_out > 0); if (sp->stream.avail_out != 0) { TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at scanline %lu (short %lu bytes)", (unsigned long) tif->tif_row, (unsigned long) sp->stream.avail_out); return 0; } tif->tif_rawcp = (uint8 *)sp->stream.next_in; /* cast away const */ tif->tif_rawcc = sp->stream.avail_in; return 1; } static int LZMASetupEncode(TIFF* tif) { LZMAState* sp = EncoderState(tif); assert(sp != NULL); if (sp->state & LSTATE_INIT_DECODE) { lzma_end(&sp->stream); sp->state = 0; } sp->state |= LSTATE_INIT_ENCODE; return 1; } /* * Reset encoding state at the start of a strip. */ static int LZMAPreEncode(TIFF* tif, uint16 s) { static const char module[] = "LZMAPreEncode"; LZMAState *sp = EncoderState(tif); (void) s; assert(sp != NULL); if( sp->state != LSTATE_INIT_ENCODE ) tif->tif_setupencode(tif); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = (size_t)tif->tif_rawdatasize; if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) { TIFFErrorExt(tif->tif_clientdata, module, "Liblzma cannot deal with buffers this size"); return 0; } return (lzma_stream_encoder(&sp->stream, sp->filters, sp->check) == LZMA_OK); } /* * Encode a chunk of pixels. */ static int LZMAEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { static const char module[] = "LZMAEncode"; LZMAState *sp = EncoderState(tif); assert(sp != NULL); assert(sp->state == LSTATE_INIT_ENCODE); (void) s; sp->stream.next_in = bp; sp->stream.avail_in = (size_t) cc; if ((tmsize_t)sp->stream.avail_in != cc) { TIFFErrorExt(tif->tif_clientdata, module, "Liblzma cannot deal with buffers this size"); return 0; } do { lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN); if (ret != LZMA_OK) { TIFFErrorExt(tif->tif_clientdata, module, "Encoding error at scanline %lu, %s", (unsigned long) tif->tif_row, LZMAStrerror(ret)); return 0; } if (sp->stream.avail_out == 0) { tif->tif_rawcc = tif->tif_rawdatasize; TIFFFlushData1(tif); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = (size_t)tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in LZMAPreEncode */ } } while (sp->stream.avail_in > 0); return 1; } /* * Finish off an encoded strip by flushing the last * string and tacking on an End Of Information code. */ static int LZMAPostEncode(TIFF* tif) { static const char module[] = "LZMAPostEncode"; LZMAState *sp = EncoderState(tif); lzma_ret ret; sp->stream.avail_in = 0; do { ret = lzma_code(&sp->stream, LZMA_FINISH); switch (ret) { case LZMA_STREAM_END: case LZMA_OK: if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) { tif->tif_rawcc = tif->tif_rawdatasize - sp->stream.avail_out; TIFFFlushData1(tif); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = (size_t)tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in ZIPPreEncode */ } break; default: TIFFErrorExt(tif->tif_clientdata, module, "Liblzma error: %s", LZMAStrerror(ret)); return 0; } } while (ret != LZMA_STREAM_END); return 1; } static void LZMACleanup(TIFF* tif) { LZMAState* sp = LState(tif); assert(sp != 0); (void)TIFFPredictorCleanup(tif); tif->tif_tagmethods.vgetfield = sp->vgetparent; tif->tif_tagmethods.vsetfield = sp->vsetparent; if (sp->state) { lzma_end(&sp->stream); sp->state = 0; } _TIFFfree(sp); tif->tif_data = NULL; _TIFFSetDefaultCompressionState(tif); } static int LZMAVSetField(TIFF* tif, uint32 tag, va_list ap) { static const char module[] = "LZMAVSetField"; LZMAState* sp = LState(tif); switch (tag) { case TIFFTAG_LZMAPRESET: sp->preset = (int) va_arg(ap, int); lzma_lzma_preset(&sp->opt_lzma, sp->preset); if (sp->state & LSTATE_INIT_ENCODE) { lzma_ret ret = lzma_stream_encoder(&sp->stream, sp->filters, sp->check); if (ret != LZMA_OK) { TIFFErrorExt(tif->tif_clientdata, module, "Liblzma error: %s", LZMAStrerror(ret)); } } return 1; default: return (*sp->vsetparent)(tif, tag, ap); } /*NOTREACHED*/ } static int LZMAVGetField(TIFF* tif, uint32 tag, va_list ap) { LZMAState* sp = LState(tif); switch (tag) { case TIFFTAG_LZMAPRESET: *va_arg(ap, int*) = sp->preset; break; default: return (*sp->vgetparent)(tif, tag, ap); } return 1; } static const TIFFField lzmaFields[] = { { TIFFTAG_LZMAPRESET, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "LZMA2 Compression Preset", NULL }, }; int TIFFInitLZMA(TIFF* tif, int scheme) { static const char module[] = "TIFFInitLZMA"; LZMAState* sp; lzma_stream tmp_stream = LZMA_STREAM_INIT; assert( scheme == COMPRESSION_LZMA ); /* * Merge codec-specific tag information. */ if (!_TIFFMergeFields(tif, lzmaFields, TIFFArrayCount(lzmaFields))) { TIFFErrorExt(tif->tif_clientdata, module, "Merging LZMA2 codec-specific tags failed"); return 0; } /* * Allocate state block so tag methods have storage to record values. */ tif->tif_data = (uint8*) _TIFFmalloc(sizeof(LZMAState)); if (tif->tif_data == NULL) goto bad; sp = LState(tif); memcpy(&sp->stream, &tmp_stream, sizeof(lzma_stream)); /* * Override parent get/set field methods. */ sp->vgetparent = tif->tif_tagmethods.vgetfield; tif->tif_tagmethods.vgetfield = LZMAVGetField; /* hook for codec tags */ sp->vsetparent = tif->tif_tagmethods.vsetfield; tif->tif_tagmethods.vsetfield = LZMAVSetField; /* hook for codec tags */ /* Default values for codec-specific fields */ sp->preset = LZMA_PRESET_DEFAULT; /* default comp. level */ sp->check = LZMA_CHECK_NONE; sp->state = 0; /* Data filters. So far we are using delta and LZMA2 filters only. */ sp->opt_delta.type = LZMA_DELTA_TYPE_BYTE; /* * The sample size in bytes seems to be reasonable distance for delta * filter. */ sp->opt_delta.dist = (tif->tif_dir.td_bitspersample % 8) ? 1 : tif->tif_dir.td_bitspersample / 8; sp->filters[0].id = LZMA_FILTER_DELTA; sp->filters[0].options = &sp->opt_delta; lzma_lzma_preset(&sp->opt_lzma, sp->preset); sp->filters[1].id = LZMA_FILTER_LZMA2; sp->filters[1].options = &sp->opt_lzma; sp->filters[2].id = LZMA_VLI_UNKNOWN; sp->filters[2].options = NULL; /* * Install codec methods. */ tif->tif_fixuptags = LZMAFixupTags; tif->tif_setupdecode = LZMASetupDecode; tif->tif_predecode = LZMAPreDecode; tif->tif_decoderow = LZMADecode; tif->tif_decodestrip = LZMADecode; tif->tif_decodetile = LZMADecode; tif->tif_setupencode = LZMASetupEncode; tif->tif_preencode = LZMAPreEncode; tif->tif_postencode = LZMAPostEncode; tif->tif_encoderow = LZMAEncode; tif->tif_encodestrip = LZMAEncode; tif->tif_encodetile = LZMAEncode; tif->tif_cleanup = LZMACleanup; /* * Setup predictor setup. */ (void) TIFFPredictorInit(tif); return 1; bad: TIFFErrorExt(tif->tif_clientdata, module, "No space for LZMA2 state block"); return 0; } #endif /* LZMA_SUPORT */ /* vim: set ts=8 sts=8 sw=8 noet: */ tiff-4.0.3/libtiff/tif_predict.c0000644000212300117540000004626711345765561013502 00000000000000/* $Id: tif_predict.c,v 1.32 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Predictor Tag Support (used by multiple codecs). */ #include "tiffiop.h" #include "tif_predict.h" #define PredictorState(tif) ((TIFFPredictorState*) (tif)->tif_data) static void horAcc8(TIFF* tif, uint8* cp0, tmsize_t cc); static void horAcc16(TIFF* tif, uint8* cp0, tmsize_t cc); static void horAcc32(TIFF* tif, uint8* cp0, tmsize_t cc); static void swabHorAcc16(TIFF* tif, uint8* cp0, tmsize_t cc); static void swabHorAcc32(TIFF* tif, uint8* cp0, tmsize_t cc); static void horDiff8(TIFF* tif, uint8* cp0, tmsize_t cc); static void horDiff16(TIFF* tif, uint8* cp0, tmsize_t cc); static void horDiff32(TIFF* tif, uint8* cp0, tmsize_t cc); static void fpAcc(TIFF* tif, uint8* cp0, tmsize_t cc); static void fpDiff(TIFF* tif, uint8* cp0, tmsize_t cc); static int PredictorDecodeRow(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s); static int PredictorDecodeTile(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s); static int PredictorEncodeRow(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s); static int PredictorEncodeTile(TIFF* tif, uint8* bp0, tmsize_t cc0, uint16 s); static int PredictorSetup(TIFF* tif) { static const char module[] = "PredictorSetup"; TIFFPredictorState* sp = PredictorState(tif); TIFFDirectory* td = &tif->tif_dir; switch (sp->predictor) /* no differencing */ { case PREDICTOR_NONE: return 1; case PREDICTOR_HORIZONTAL: if (td->td_bitspersample != 8 && td->td_bitspersample != 16 && td->td_bitspersample != 32) { TIFFErrorExt(tif->tif_clientdata, module, "Horizontal differencing \"Predictor\" not supported with %d-bit samples", td->td_bitspersample); return 0; } break; case PREDICTOR_FLOATINGPOINT: if (td->td_sampleformat != SAMPLEFORMAT_IEEEFP) { TIFFErrorExt(tif->tif_clientdata, module, "Floating point \"Predictor\" not supported with %d data format", td->td_sampleformat); return 0; } break; default: TIFFErrorExt(tif->tif_clientdata, module, "\"Predictor\" value %d not supported", sp->predictor); return 0; } sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel : 1); /* * Calculate the scanline/tile-width size in bytes. */ if (isTiled(tif)) sp->rowsize = TIFFTileRowSize(tif); else sp->rowsize = TIFFScanlineSize(tif); if (sp->rowsize == 0) return 0; return 1; } static int PredictorSetupDecode(TIFF* tif) { TIFFPredictorState* sp = PredictorState(tif); TIFFDirectory* td = &tif->tif_dir; if (!(*sp->setupdecode)(tif) || !PredictorSetup(tif)) return 0; if (sp->predictor == 2) { switch (td->td_bitspersample) { case 8: sp->decodepfunc = horAcc8; break; case 16: sp->decodepfunc = horAcc16; break; case 32: sp->decodepfunc = horAcc32; break; } /* * Override default decoding method with one that does the * predictor stuff. */ if( tif->tif_decoderow != PredictorDecodeRow ) { sp->decoderow = tif->tif_decoderow; tif->tif_decoderow = PredictorDecodeRow; sp->decodestrip = tif->tif_decodestrip; tif->tif_decodestrip = PredictorDecodeTile; sp->decodetile = tif->tif_decodetile; tif->tif_decodetile = PredictorDecodeTile; } /* * If the data is horizontally differenced 16-bit data that * requires byte-swapping, then it must be byte swapped before * the accumulation step. We do this with a special-purpose * routine and override the normal post decoding logic that * the library setup when the directory was read. */ if (tif->tif_flags & TIFF_SWAB) { if (sp->decodepfunc == horAcc16) { sp->decodepfunc = swabHorAcc16; tif->tif_postdecode = _TIFFNoPostDecode; } else if (sp->decodepfunc == horAcc32) { sp->decodepfunc = swabHorAcc32; tif->tif_postdecode = _TIFFNoPostDecode; } } } else if (sp->predictor == 3) { sp->decodepfunc = fpAcc; /* * Override default decoding method with one that does the * predictor stuff. */ if( tif->tif_decoderow != PredictorDecodeRow ) { sp->decoderow = tif->tif_decoderow; tif->tif_decoderow = PredictorDecodeRow; sp->decodestrip = tif->tif_decodestrip; tif->tif_decodestrip = PredictorDecodeTile; sp->decodetile = tif->tif_decodetile; tif->tif_decodetile = PredictorDecodeTile; } /* * The data should not be swapped outside of the floating * point predictor, the accumulation routine should return * byres in the native order. */ if (tif->tif_flags & TIFF_SWAB) { tif->tif_postdecode = _TIFFNoPostDecode; } /* * Allocate buffer to keep the decoded bytes before * rearranging in the ight order */ } return 1; } static int PredictorSetupEncode(TIFF* tif) { TIFFPredictorState* sp = PredictorState(tif); TIFFDirectory* td = &tif->tif_dir; if (!(*sp->setupencode)(tif) || !PredictorSetup(tif)) return 0; if (sp->predictor == 2) { switch (td->td_bitspersample) { case 8: sp->encodepfunc = horDiff8; break; case 16: sp->encodepfunc = horDiff16; break; case 32: sp->encodepfunc = horDiff32; break; } /* * Override default encoding method with one that does the * predictor stuff. */ if( tif->tif_encoderow != PredictorEncodeRow ) { sp->encoderow = tif->tif_encoderow; tif->tif_encoderow = PredictorEncodeRow; sp->encodestrip = tif->tif_encodestrip; tif->tif_encodestrip = PredictorEncodeTile; sp->encodetile = tif->tif_encodetile; tif->tif_encodetile = PredictorEncodeTile; } } else if (sp->predictor == 3) { sp->encodepfunc = fpDiff; /* * Override default encoding method with one that does the * predictor stuff. */ if( tif->tif_encoderow != PredictorEncodeRow ) { sp->encoderow = tif->tif_encoderow; tif->tif_encoderow = PredictorEncodeRow; sp->encodestrip = tif->tif_encodestrip; tif->tif_encodestrip = PredictorEncodeTile; sp->encodetile = tif->tif_encodetile; tif->tif_encodetile = PredictorEncodeTile; } } return 1; } #define REPEAT4(n, op) \ switch (n) { \ default: { tmsize_t i; for (i = n-4; i > 0; i--) { op; } } \ case 4: op; \ case 3: op; \ case 2: op; \ case 1: op; \ case 0: ; \ } static void horAcc8(TIFF* tif, uint8* cp0, tmsize_t cc) { tmsize_t stride = PredictorState(tif)->stride; char* cp = (char*) cp0; assert((cc%stride)==0); if (cc > stride) { /* * Pipeline the most common cases. */ if (stride == 3) { unsigned int cr = cp[0]; unsigned int cg = cp[1]; unsigned int cb = cp[2]; cc -= 3; cp += 3; while (cc>0) { cp[0] = (char) (cr += cp[0]); cp[1] = (char) (cg += cp[1]); cp[2] = (char) (cb += cp[2]); cc -= 3; cp += 3; } } else if (stride == 4) { unsigned int cr = cp[0]; unsigned int cg = cp[1]; unsigned int cb = cp[2]; unsigned int ca = cp[3]; cc -= 4; cp += 4; while (cc>0) { cp[0] = (char) (cr += cp[0]); cp[1] = (char) (cg += cp[1]); cp[2] = (char) (cb += cp[2]); cp[3] = (char) (ca += cp[3]); cc -= 4; cp += 4; } } else { cc -= stride; do { REPEAT4(stride, cp[stride] = (char) (cp[stride] + *cp); cp++) cc -= stride; } while (cc>0); } } } static void swabHorAcc16(TIFF* tif, uint8* cp0, tmsize_t cc) { tmsize_t stride = PredictorState(tif)->stride; uint16* wp = (uint16*) cp0; tmsize_t wc = cc / 2; assert((cc%(2*stride))==0); if (wc > stride) { TIFFSwabArrayOfShort(wp, wc); wc -= stride; do { REPEAT4(stride, wp[stride] += wp[0]; wp++) wc -= stride; } while (wc > 0); } } static void horAcc16(TIFF* tif, uint8* cp0, tmsize_t cc) { tmsize_t stride = PredictorState(tif)->stride; uint16* wp = (uint16*) cp0; tmsize_t wc = cc / 2; assert((cc%(2*stride))==0); if (wc > stride) { wc -= stride; do { REPEAT4(stride, wp[stride] += wp[0]; wp++) wc -= stride; } while (wc > 0); } } static void swabHorAcc32(TIFF* tif, uint8* cp0, tmsize_t cc) { tmsize_t stride = PredictorState(tif)->stride; uint32* wp = (uint32*) cp0; tmsize_t wc = cc / 4; assert((cc%(4*stride))==0); if (wc > stride) { TIFFSwabArrayOfLong(wp, wc); wc -= stride; do { REPEAT4(stride, wp[stride] += wp[0]; wp++) wc -= stride; } while (wc > 0); } } static void horAcc32(TIFF* tif, uint8* cp0, tmsize_t cc) { tmsize_t stride = PredictorState(tif)->stride; uint32* wp = (uint32*) cp0; tmsize_t wc = cc / 4; assert((cc%(4*stride))==0); if (wc > stride) { wc -= stride; do { REPEAT4(stride, wp[stride] += wp[0]; wp++) wc -= stride; } while (wc > 0); } } /* * Floating point predictor accumulation routine. */ static void fpAcc(TIFF* tif, uint8* cp0, tmsize_t cc) { tmsize_t stride = PredictorState(tif)->stride; uint32 bps = tif->tif_dir.td_bitspersample / 8; tmsize_t wc = cc / bps; tmsize_t count = cc; uint8 *cp = (uint8 *) cp0; uint8 *tmp = (uint8 *)_TIFFmalloc(cc); assert((cc%(bps*stride))==0); if (!tmp) return; while (count > stride) { REPEAT4(stride, cp[stride] += cp[0]; cp++) count -= stride; } _TIFFmemcpy(tmp, cp0, cc); cp = (uint8 *) cp0; for (count = 0; count < wc; count++) { uint32 byte; for (byte = 0; byte < bps; byte++) { #if WORDS_BIGENDIAN cp[bps * count + byte] = tmp[byte * wc + count]; #else cp[bps * count + byte] = tmp[(bps - byte - 1) * wc + count]; #endif } } _TIFFfree(tmp); } /* * Decode a scanline and apply the predictor routine. */ static int PredictorDecodeRow(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s) { TIFFPredictorState *sp = PredictorState(tif); assert(sp != NULL); assert(sp->decoderow != NULL); assert(sp->decodepfunc != NULL); if ((*sp->decoderow)(tif, op0, occ0, s)) { (*sp->decodepfunc)(tif, op0, occ0); return 1; } else return 0; } /* * Decode a tile/strip and apply the predictor routine. * Note that horizontal differencing must be done on a * row-by-row basis. The width of a "row" has already * been calculated at pre-decode time according to the * strip/tile dimensions. */ static int PredictorDecodeTile(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s) { TIFFPredictorState *sp = PredictorState(tif); assert(sp != NULL); assert(sp->decodetile != NULL); if ((*sp->decodetile)(tif, op0, occ0, s)) { tmsize_t rowsize = sp->rowsize; assert(rowsize > 0); assert((occ0%rowsize)==0); assert(sp->decodepfunc != NULL); while (occ0 > 0) { (*sp->decodepfunc)(tif, op0, rowsize); occ0 -= rowsize; op0 += rowsize; } return 1; } else return 0; } static void horDiff8(TIFF* tif, uint8* cp0, tmsize_t cc) { TIFFPredictorState* sp = PredictorState(tif); tmsize_t stride = sp->stride; char* cp = (char*) cp0; assert((cc%stride)==0); if (cc > stride) { cc -= stride; /* * Pipeline the most common cases. */ if (stride == 3) { int r1, g1, b1; int r2 = cp[0]; int g2 = cp[1]; int b2 = cp[2]; do { r1 = cp[3]; cp[3] = r1-r2; r2 = r1; g1 = cp[4]; cp[4] = g1-g2; g2 = g1; b1 = cp[5]; cp[5] = b1-b2; b2 = b1; cp += 3; } while ((cc -= 3) > 0); } else if (stride == 4) { int r1, g1, b1, a1; int r2 = cp[0]; int g2 = cp[1]; int b2 = cp[2]; int a2 = cp[3]; do { r1 = cp[4]; cp[4] = r1-r2; r2 = r1; g1 = cp[5]; cp[5] = g1-g2; g2 = g1; b1 = cp[6]; cp[6] = b1-b2; b2 = b1; a1 = cp[7]; cp[7] = a1-a2; a2 = a1; cp += 4; } while ((cc -= 4) > 0); } else { cp += cc - 1; do { REPEAT4(stride, cp[stride] -= cp[0]; cp--) } while ((cc -= stride) > 0); } } } static void horDiff16(TIFF* tif, uint8* cp0, tmsize_t cc) { TIFFPredictorState* sp = PredictorState(tif); tmsize_t stride = sp->stride; int16 *wp = (int16*) cp0; tmsize_t wc = cc/2; assert((cc%(2*stride))==0); if (wc > stride) { wc -= stride; wp += wc - 1; do { REPEAT4(stride, wp[stride] -= wp[0]; wp--) wc -= stride; } while (wc > 0); } } static void horDiff32(TIFF* tif, uint8* cp0, tmsize_t cc) { TIFFPredictorState* sp = PredictorState(tif); tmsize_t stride = sp->stride; int32 *wp = (int32*) cp0; tmsize_t wc = cc/4; assert((cc%(4*stride))==0); if (wc > stride) { wc -= stride; wp += wc - 1; do { REPEAT4(stride, wp[stride] -= wp[0]; wp--) wc -= stride; } while (wc > 0); } } /* * Floating point predictor differencing routine. */ static void fpDiff(TIFF* tif, uint8* cp0, tmsize_t cc) { tmsize_t stride = PredictorState(tif)->stride; uint32 bps = tif->tif_dir.td_bitspersample / 8; tmsize_t wc = cc / bps; tmsize_t count; uint8 *cp = (uint8 *) cp0; uint8 *tmp = (uint8 *)_TIFFmalloc(cc); assert((cc%(bps*stride))==0); if (!tmp) return; _TIFFmemcpy(tmp, cp0, cc); for (count = 0; count < wc; count++) { uint32 byte; for (byte = 0; byte < bps; byte++) { #if WORDS_BIGENDIAN cp[byte * wc + count] = tmp[bps * count + byte]; #else cp[(bps - byte - 1) * wc + count] = tmp[bps * count + byte]; #endif } } _TIFFfree(tmp); cp = (uint8 *) cp0; cp += cc - stride - 1; for (count = cc; count > stride; count -= stride) REPEAT4(stride, cp[stride] -= cp[0]; cp--) } static int PredictorEncodeRow(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { TIFFPredictorState *sp = PredictorState(tif); assert(sp != NULL); assert(sp->encodepfunc != NULL); assert(sp->encoderow != NULL); /* XXX horizontal differencing alters user's data XXX */ (*sp->encodepfunc)(tif, bp, cc); return (*sp->encoderow)(tif, bp, cc, s); } static int PredictorEncodeTile(TIFF* tif, uint8* bp0, tmsize_t cc0, uint16 s) { static const char module[] = "PredictorEncodeTile"; TIFFPredictorState *sp = PredictorState(tif); uint8 *working_copy; tmsize_t cc = cc0, rowsize; unsigned char* bp; int result_code; assert(sp != NULL); assert(sp->encodepfunc != NULL); assert(sp->encodetile != NULL); /* * Do predictor manipulation in a working buffer to avoid altering * the callers buffer. http://trac.osgeo.org/gdal/ticket/1965 */ working_copy = (uint8*) _TIFFmalloc(cc0); if( working_copy == NULL ) { TIFFErrorExt(tif->tif_clientdata, module, "Out of memory allocating " TIFF_SSIZE_FORMAT " byte temp buffer.", cc0 ); return 0; } memcpy( working_copy, bp0, cc0 ); bp = working_copy; rowsize = sp->rowsize; assert(rowsize > 0); assert((cc0%rowsize)==0); while (cc > 0) { (*sp->encodepfunc)(tif, bp, rowsize); cc -= rowsize; bp += rowsize; } result_code = (*sp->encodetile)(tif, working_copy, cc0, s); _TIFFfree( working_copy ); return result_code; } #define FIELD_PREDICTOR (FIELD_CODEC+0) /* XXX */ static const TIFFField predictFields[] = { { TIFFTAG_PREDICTOR, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UINT16, FIELD_PREDICTOR, FALSE, FALSE, "Predictor", NULL }, }; static int PredictorVSetField(TIFF* tif, uint32 tag, va_list ap) { TIFFPredictorState *sp = PredictorState(tif); assert(sp != NULL); assert(sp->vsetparent != NULL); switch (tag) { case TIFFTAG_PREDICTOR: sp->predictor = (uint16) va_arg(ap, uint16_vap); TIFFSetFieldBit(tif, FIELD_PREDICTOR); break; default: return (*sp->vsetparent)(tif, tag, ap); } tif->tif_flags |= TIFF_DIRTYDIRECT; return 1; } static int PredictorVGetField(TIFF* tif, uint32 tag, va_list ap) { TIFFPredictorState *sp = PredictorState(tif); assert(sp != NULL); assert(sp->vgetparent != NULL); switch (tag) { case TIFFTAG_PREDICTOR: *va_arg(ap, uint16*) = sp->predictor; break; default: return (*sp->vgetparent)(tif, tag, ap); } return 1; } static void PredictorPrintDir(TIFF* tif, FILE* fd, long flags) { TIFFPredictorState* sp = PredictorState(tif); (void) flags; if (TIFFFieldSet(tif,FIELD_PREDICTOR)) { fprintf(fd, " Predictor: "); switch (sp->predictor) { case 1: fprintf(fd, "none "); break; case 2: fprintf(fd, "horizontal differencing "); break; case 3: fprintf(fd, "floating point predictor "); break; } fprintf(fd, "%u (0x%x)\n", sp->predictor, sp->predictor); } if (sp->printdir) (*sp->printdir)(tif, fd, flags); } int TIFFPredictorInit(TIFF* tif) { TIFFPredictorState* sp = PredictorState(tif); assert(sp != 0); /* * Merge codec-specific tag information. */ if (!_TIFFMergeFields(tif, predictFields, TIFFArrayCount(predictFields))) { TIFFErrorExt(tif->tif_clientdata, "TIFFPredictorInit", "Merging Predictor codec-specific tags failed"); return 0; } /* * Override parent get/set field methods. */ sp->vgetparent = tif->tif_tagmethods.vgetfield; tif->tif_tagmethods.vgetfield = PredictorVGetField;/* hook for predictor tag */ sp->vsetparent = tif->tif_tagmethods.vsetfield; tif->tif_tagmethods.vsetfield = PredictorVSetField;/* hook for predictor tag */ sp->printdir = tif->tif_tagmethods.printdir; tif->tif_tagmethods.printdir = PredictorPrintDir; /* hook for predictor tag */ sp->setupdecode = tif->tif_setupdecode; tif->tif_setupdecode = PredictorSetupDecode; sp->setupencode = tif->tif_setupencode; tif->tif_setupencode = PredictorSetupEncode; sp->predictor = 1; /* default value */ sp->encodepfunc = NULL; /* no predictor routine */ sp->decodepfunc = NULL; /* no predictor routine */ return 1; } int TIFFPredictorCleanup(TIFF* tif) { TIFFPredictorState* sp = PredictorState(tif); assert(sp != 0); tif->tif_tagmethods.vgetfield = sp->vgetparent; tif->tif_tagmethods.vsetfield = sp->vsetparent; tif->tif_tagmethods.printdir = sp->printdir; tif->tif_setupdecode = sp->setupdecode; tif->tif_setupencode = sp->setupencode; return 1; } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_pixarlog.c0000644000212300117540000012003511775114347013654 00000000000000/* $Id: tif_pixarlog.c,v 1.38 2012-06-21 01:01:53 fwarmerdam Exp $ */ /* * Copyright (c) 1996-1997 Sam Leffler * Copyright (c) 1996 Pixar * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Pixar, Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Pixar, Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL PIXAR, SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef PIXARLOG_SUPPORT /* * TIFF Library. * PixarLog Compression Support * * Contributed by Dan McCoy. * * PixarLog film support uses the TIFF library to store companded * 11 bit values into a tiff file, which are compressed using the * zip compressor. * * The codec can take as input and produce as output 32-bit IEEE float values * as well as 16-bit or 8-bit unsigned integer values. * * On writing any of the above are converted into the internal * 11-bit log format. In the case of 8 and 16 bit values, the * input is assumed to be unsigned linear color values that represent * the range 0-1. In the case of IEEE values, the 0-1 range is assumed to * be the normal linear color range, in addition over 1 values are * accepted up to a value of about 25.0 to encode "hot" hightlights and such. * The encoding is lossless for 8-bit values, slightly lossy for the * other bit depths. The actual color precision should be better * than the human eye can perceive with extra room to allow for * error introduced by further image computation. As with any quantized * color format, it is possible to perform image calculations which * expose the quantization error. This format should certainly be less * susceptable to such errors than standard 8-bit encodings, but more * susceptable than straight 16-bit or 32-bit encodings. * * On reading the internal format is converted to the desired output format. * The program can request which format it desires by setting the internal * pseudo tag TIFFTAG_PIXARLOGDATAFMT to one of these possible values: * PIXARLOGDATAFMT_FLOAT = provide IEEE float values. * PIXARLOGDATAFMT_16BIT = provide unsigned 16-bit integer values * PIXARLOGDATAFMT_8BIT = provide unsigned 8-bit integer values * * alternately PIXARLOGDATAFMT_8BITABGR provides unsigned 8-bit integer * values with the difference that if there are exactly three or four channels * (rgb or rgba) it swaps the channel order (bgr or abgr). * * PIXARLOGDATAFMT_11BITLOG provides the internal encoding directly * packed in 16-bit values. However no tools are supplied for interpreting * these values. * * "hot" (over 1.0) areas written in floating point get clamped to * 1.0 in the integer data types. * * When the file is closed after writing, the bit depth and sample format * are set always to appear as if 8-bit data has been written into it. * That way a naive program unaware of the particulars of the encoding * gets the format it is most likely able to handle. * * The codec does it's own horizontal differencing step on the coded * values so the libraries predictor stuff should be turned off. * The codec also handle byte swapping the encoded values as necessary * since the library does not have the information necessary * to know the bit depth of the raw unencoded buffer. * * NOTE: This decoder does not appear to update tif_rawcp, and tif_rawcc. * This can cause problems with the implementation of CHUNKY_STRIP_READ_SUPPORT * as noted in http://trac.osgeo.org/gdal/ticket/3894. FrankW - Jan'11 */ #include "tif_predict.h" #include "zlib.h" #include #include #include /* Tables for converting to/from 11 bit coded values */ #define TSIZE 2048 /* decode table size (11-bit tokens) */ #define TSIZEP1 2049 /* Plus one for slop */ #define ONE 1250 /* token value of 1.0 exactly */ #define RATIO 1.004 /* nominal ratio for log part */ #define CODE_MASK 0x7ff /* 11 bits. */ static float Fltsize; static float LogK1, LogK2; #define REPEAT(n, op) { int i; i=n; do { i--; op; } while (i>0); } static void horizontalAccumulateF(uint16 *wp, int n, int stride, float *op, float *ToLinearF) { register unsigned int cr, cg, cb, ca, mask; register float t0, t1, t2, t3; if (n >= stride) { mask = CODE_MASK; if (stride == 3) { t0 = ToLinearF[cr = (wp[0] & mask)]; t1 = ToLinearF[cg = (wp[1] & mask)]; t2 = ToLinearF[cb = (wp[2] & mask)]; op[0] = t0; op[1] = t1; op[2] = t2; n -= 3; while (n > 0) { wp += 3; op += 3; n -= 3; t0 = ToLinearF[(cr += wp[0]) & mask]; t1 = ToLinearF[(cg += wp[1]) & mask]; t2 = ToLinearF[(cb += wp[2]) & mask]; op[0] = t0; op[1] = t1; op[2] = t2; } } else if (stride == 4) { t0 = ToLinearF[cr = (wp[0] & mask)]; t1 = ToLinearF[cg = (wp[1] & mask)]; t2 = ToLinearF[cb = (wp[2] & mask)]; t3 = ToLinearF[ca = (wp[3] & mask)]; op[0] = t0; op[1] = t1; op[2] = t2; op[3] = t3; n -= 4; while (n > 0) { wp += 4; op += 4; n -= 4; t0 = ToLinearF[(cr += wp[0]) & mask]; t1 = ToLinearF[(cg += wp[1]) & mask]; t2 = ToLinearF[(cb += wp[2]) & mask]; t3 = ToLinearF[(ca += wp[3]) & mask]; op[0] = t0; op[1] = t1; op[2] = t2; op[3] = t3; } } else { REPEAT(stride, *op = ToLinearF[*wp&mask]; wp++; op++) n -= stride; while (n > 0) { REPEAT(stride, wp[stride] += *wp; *op = ToLinearF[*wp&mask]; wp++; op++) n -= stride; } } } } static void horizontalAccumulate12(uint16 *wp, int n, int stride, int16 *op, float *ToLinearF) { register unsigned int cr, cg, cb, ca, mask; register float t0, t1, t2, t3; #define SCALE12 2048.0F #define CLAMP12(t) (((t) < 3071) ? (uint16) (t) : 3071) if (n >= stride) { mask = CODE_MASK; if (stride == 3) { t0 = ToLinearF[cr = (wp[0] & mask)] * SCALE12; t1 = ToLinearF[cg = (wp[1] & mask)] * SCALE12; t2 = ToLinearF[cb = (wp[2] & mask)] * SCALE12; op[0] = CLAMP12(t0); op[1] = CLAMP12(t1); op[2] = CLAMP12(t2); n -= 3; while (n > 0) { wp += 3; op += 3; n -= 3; t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12; t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12; t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12; op[0] = CLAMP12(t0); op[1] = CLAMP12(t1); op[2] = CLAMP12(t2); } } else if (stride == 4) { t0 = ToLinearF[cr = (wp[0] & mask)] * SCALE12; t1 = ToLinearF[cg = (wp[1] & mask)] * SCALE12; t2 = ToLinearF[cb = (wp[2] & mask)] * SCALE12; t3 = ToLinearF[ca = (wp[3] & mask)] * SCALE12; op[0] = CLAMP12(t0); op[1] = CLAMP12(t1); op[2] = CLAMP12(t2); op[3] = CLAMP12(t3); n -= 4; while (n > 0) { wp += 4; op += 4; n -= 4; t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12; t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12; t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12; t3 = ToLinearF[(ca += wp[3]) & mask] * SCALE12; op[0] = CLAMP12(t0); op[1] = CLAMP12(t1); op[2] = CLAMP12(t2); op[3] = CLAMP12(t3); } } else { REPEAT(stride, t0 = ToLinearF[*wp&mask] * SCALE12; *op = CLAMP12(t0); wp++; op++) n -= stride; while (n > 0) { REPEAT(stride, wp[stride] += *wp; t0 = ToLinearF[wp[stride]&mask]*SCALE12; *op = CLAMP12(t0); wp++; op++) n -= stride; } } } } static void horizontalAccumulate16(uint16 *wp, int n, int stride, uint16 *op, uint16 *ToLinear16) { register unsigned int cr, cg, cb, ca, mask; if (n >= stride) { mask = CODE_MASK; if (stride == 3) { op[0] = ToLinear16[cr = (wp[0] & mask)]; op[1] = ToLinear16[cg = (wp[1] & mask)]; op[2] = ToLinear16[cb = (wp[2] & mask)]; n -= 3; while (n > 0) { wp += 3; op += 3; n -= 3; op[0] = ToLinear16[(cr += wp[0]) & mask]; op[1] = ToLinear16[(cg += wp[1]) & mask]; op[2] = ToLinear16[(cb += wp[2]) & mask]; } } else if (stride == 4) { op[0] = ToLinear16[cr = (wp[0] & mask)]; op[1] = ToLinear16[cg = (wp[1] & mask)]; op[2] = ToLinear16[cb = (wp[2] & mask)]; op[3] = ToLinear16[ca = (wp[3] & mask)]; n -= 4; while (n > 0) { wp += 4; op += 4; n -= 4; op[0] = ToLinear16[(cr += wp[0]) & mask]; op[1] = ToLinear16[(cg += wp[1]) & mask]; op[2] = ToLinear16[(cb += wp[2]) & mask]; op[3] = ToLinear16[(ca += wp[3]) & mask]; } } else { REPEAT(stride, *op = ToLinear16[*wp&mask]; wp++; op++) n -= stride; while (n > 0) { REPEAT(stride, wp[stride] += *wp; *op = ToLinear16[*wp&mask]; wp++; op++) n -= stride; } } } } /* * Returns the log encoded 11-bit values with the horizontal * differencing undone. */ static void horizontalAccumulate11(uint16 *wp, int n, int stride, uint16 *op) { register unsigned int cr, cg, cb, ca, mask; if (n >= stride) { mask = CODE_MASK; if (stride == 3) { op[0] = cr = wp[0]; op[1] = cg = wp[1]; op[2] = cb = wp[2]; n -= 3; while (n > 0) { wp += 3; op += 3; n -= 3; op[0] = (cr += wp[0]) & mask; op[1] = (cg += wp[1]) & mask; op[2] = (cb += wp[2]) & mask; } } else if (stride == 4) { op[0] = cr = wp[0]; op[1] = cg = wp[1]; op[2] = cb = wp[2]; op[3] = ca = wp[3]; n -= 4; while (n > 0) { wp += 4; op += 4; n -= 4; op[0] = (cr += wp[0]) & mask; op[1] = (cg += wp[1]) & mask; op[2] = (cb += wp[2]) & mask; op[3] = (ca += wp[3]) & mask; } } else { REPEAT(stride, *op = *wp&mask; wp++; op++) n -= stride; while (n > 0) { REPEAT(stride, wp[stride] += *wp; *op = *wp&mask; wp++; op++) n -= stride; } } } } static void horizontalAccumulate8(uint16 *wp, int n, int stride, unsigned char *op, unsigned char *ToLinear8) { register unsigned int cr, cg, cb, ca, mask; if (n >= stride) { mask = CODE_MASK; if (stride == 3) { op[0] = ToLinear8[cr = (wp[0] & mask)]; op[1] = ToLinear8[cg = (wp[1] & mask)]; op[2] = ToLinear8[cb = (wp[2] & mask)]; n -= 3; while (n > 0) { n -= 3; wp += 3; op += 3; op[0] = ToLinear8[(cr += wp[0]) & mask]; op[1] = ToLinear8[(cg += wp[1]) & mask]; op[2] = ToLinear8[(cb += wp[2]) & mask]; } } else if (stride == 4) { op[0] = ToLinear8[cr = (wp[0] & mask)]; op[1] = ToLinear8[cg = (wp[1] & mask)]; op[2] = ToLinear8[cb = (wp[2] & mask)]; op[3] = ToLinear8[ca = (wp[3] & mask)]; n -= 4; while (n > 0) { n -= 4; wp += 4; op += 4; op[0] = ToLinear8[(cr += wp[0]) & mask]; op[1] = ToLinear8[(cg += wp[1]) & mask]; op[2] = ToLinear8[(cb += wp[2]) & mask]; op[3] = ToLinear8[(ca += wp[3]) & mask]; } } else { REPEAT(stride, *op = ToLinear8[*wp&mask]; wp++; op++) n -= stride; while (n > 0) { REPEAT(stride, wp[stride] += *wp; *op = ToLinear8[*wp&mask]; wp++; op++) n -= stride; } } } } static void horizontalAccumulate8abgr(uint16 *wp, int n, int stride, unsigned char *op, unsigned char *ToLinear8) { register unsigned int cr, cg, cb, ca, mask; register unsigned char t0, t1, t2, t3; if (n >= stride) { mask = CODE_MASK; if (stride == 3) { op[0] = 0; t1 = ToLinear8[cb = (wp[2] & mask)]; t2 = ToLinear8[cg = (wp[1] & mask)]; t3 = ToLinear8[cr = (wp[0] & mask)]; op[1] = t1; op[2] = t2; op[3] = t3; n -= 3; while (n > 0) { n -= 3; wp += 3; op += 4; op[0] = 0; t1 = ToLinear8[(cb += wp[2]) & mask]; t2 = ToLinear8[(cg += wp[1]) & mask]; t3 = ToLinear8[(cr += wp[0]) & mask]; op[1] = t1; op[2] = t2; op[3] = t3; } } else if (stride == 4) { t0 = ToLinear8[ca = (wp[3] & mask)]; t1 = ToLinear8[cb = (wp[2] & mask)]; t2 = ToLinear8[cg = (wp[1] & mask)]; t3 = ToLinear8[cr = (wp[0] & mask)]; op[0] = t0; op[1] = t1; op[2] = t2; op[3] = t3; n -= 4; while (n > 0) { n -= 4; wp += 4; op += 4; t0 = ToLinear8[(ca += wp[3]) & mask]; t1 = ToLinear8[(cb += wp[2]) & mask]; t2 = ToLinear8[(cg += wp[1]) & mask]; t3 = ToLinear8[(cr += wp[0]) & mask]; op[0] = t0; op[1] = t1; op[2] = t2; op[3] = t3; } } else { REPEAT(stride, *op = ToLinear8[*wp&mask]; wp++; op++) n -= stride; while (n > 0) { REPEAT(stride, wp[stride] += *wp; *op = ToLinear8[*wp&mask]; wp++; op++) n -= stride; } } } } /* * State block for each open TIFF * file using PixarLog compression/decompression. */ typedef struct { TIFFPredictorState predict; z_stream stream; uint16 *tbuf; uint16 stride; int state; int user_datafmt; int quality; #define PLSTATE_INIT 1 TIFFVSetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ float *ToLinearF; uint16 *ToLinear16; unsigned char *ToLinear8; uint16 *FromLT2; uint16 *From14; /* Really for 16-bit data, but we shift down 2 */ uint16 *From8; } PixarLogState; static int PixarLogMakeTables(PixarLogState *sp) { /* * We make several tables here to convert between various external * representations (float, 16-bit, and 8-bit) and the internal * 11-bit companded representation. The 11-bit representation has two * distinct regions. A linear bottom end up through .018316 in steps * of about .000073, and a region of constant ratio up to about 25. * These floating point numbers are stored in the main table ToLinearF. * All other tables are derived from this one. The tables (and the * ratios) are continuous at the internal seam. */ int nlin, lt2size; int i, j; double b, c, linstep, v; float *ToLinearF; uint16 *ToLinear16; unsigned char *ToLinear8; uint16 *FromLT2; uint16 *From14; /* Really for 16-bit data, but we shift down 2 */ uint16 *From8; c = log(RATIO); nlin = (int)(1./c); /* nlin must be an integer */ c = 1./nlin; b = exp(-c*ONE); /* multiplicative scale factor [b*exp(c*ONE) = 1] */ linstep = b*c*exp(1.); LogK1 = (float)(1./c); /* if (v >= 2) token = k1*log(v*k2) */ LogK2 = (float)(1./b); lt2size = (int)(2./linstep) + 1; FromLT2 = (uint16 *)_TIFFmalloc(lt2size*sizeof(uint16)); From14 = (uint16 *)_TIFFmalloc(16384*sizeof(uint16)); From8 = (uint16 *)_TIFFmalloc(256*sizeof(uint16)); ToLinearF = (float *)_TIFFmalloc(TSIZEP1 * sizeof(float)); ToLinear16 = (uint16 *)_TIFFmalloc(TSIZEP1 * sizeof(uint16)); ToLinear8 = (unsigned char *)_TIFFmalloc(TSIZEP1 * sizeof(unsigned char)); if (FromLT2 == NULL || From14 == NULL || From8 == NULL || ToLinearF == NULL || ToLinear16 == NULL || ToLinear8 == NULL) { if (FromLT2) _TIFFfree(FromLT2); if (From14) _TIFFfree(From14); if (From8) _TIFFfree(From8); if (ToLinearF) _TIFFfree(ToLinearF); if (ToLinear16) _TIFFfree(ToLinear16); if (ToLinear8) _TIFFfree(ToLinear8); sp->FromLT2 = NULL; sp->From14 = NULL; sp->From8 = NULL; sp->ToLinearF = NULL; sp->ToLinear16 = NULL; sp->ToLinear8 = NULL; return 0; } j = 0; for (i = 0; i < nlin; i++) { v = i * linstep; ToLinearF[j++] = (float)v; } for (i = nlin; i < TSIZE; i++) ToLinearF[j++] = (float)(b*exp(c*i)); ToLinearF[2048] = ToLinearF[2047]; for (i = 0; i < TSIZEP1; i++) { v = ToLinearF[i]*65535.0 + 0.5; ToLinear16[i] = (v > 65535.0) ? 65535 : (uint16)v; v = ToLinearF[i]*255.0 + 0.5; ToLinear8[i] = (v > 255.0) ? 255 : (unsigned char)v; } j = 0; for (i = 0; i < lt2size; i++) { if ((i*linstep)*(i*linstep) > ToLinearF[j]*ToLinearF[j+1]) j++; FromLT2[i] = j; } /* * Since we lose info anyway on 16-bit data, we set up a 14-bit * table and shift 16-bit values down two bits on input. * saves a little table space. */ j = 0; for (i = 0; i < 16384; i++) { while ((i/16383.)*(i/16383.) > ToLinearF[j]*ToLinearF[j+1]) j++; From14[i] = j; } j = 0; for (i = 0; i < 256; i++) { while ((i/255.)*(i/255.) > ToLinearF[j]*ToLinearF[j+1]) j++; From8[i] = j; } Fltsize = (float)(lt2size/2); sp->ToLinearF = ToLinearF; sp->ToLinear16 = ToLinear16; sp->ToLinear8 = ToLinear8; sp->FromLT2 = FromLT2; sp->From14 = From14; sp->From8 = From8; return 1; } #define DecoderState(tif) ((PixarLogState*) (tif)->tif_data) #define EncoderState(tif) ((PixarLogState*) (tif)->tif_data) static int PixarLogEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s); static int PixarLogDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s); #define PIXARLOGDATAFMT_UNKNOWN -1 static int PixarLogGuessDataFmt(TIFFDirectory *td) { int guess = PIXARLOGDATAFMT_UNKNOWN; int format = td->td_sampleformat; /* If the user didn't tell us his datafmt, * take our best guess from the bitspersample. */ switch (td->td_bitspersample) { case 32: if (format == SAMPLEFORMAT_IEEEFP) guess = PIXARLOGDATAFMT_FLOAT; break; case 16: if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT) guess = PIXARLOGDATAFMT_16BIT; break; case 12: if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_INT) guess = PIXARLOGDATAFMT_12BITPICIO; break; case 11: if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT) guess = PIXARLOGDATAFMT_11BITLOG; break; case 8: if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT) guess = PIXARLOGDATAFMT_8BIT; break; } return guess; } static tmsize_t multiply_ms(tmsize_t m1, tmsize_t m2) { tmsize_t bytes = m1 * m2; if (m1 && bytes / m1 != m2) bytes = 0; return bytes; } static int PixarLogFixupTags(TIFF* tif) { (void) tif; return (1); } static int PixarLogSetupDecode(TIFF* tif) { static const char module[] = "PixarLogSetupDecode"; TIFFDirectory *td = &tif->tif_dir; PixarLogState* sp = DecoderState(tif); tmsize_t tbuf_size; assert(sp != NULL); /* Make sure no byte swapping happens on the data * after decompression. */ tif->tif_postdecode = _TIFFNoPostDecode; /* for some reason, we can't do this in TIFFInitPixarLog */ sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel : 1); tbuf_size = multiply_ms(multiply_ms(multiply_ms(sp->stride, td->td_imagewidth), td->td_rowsperstrip), sizeof(uint16)); if (tbuf_size == 0) return (0); /* TODO: this is an error return without error report through TIFFErrorExt */ sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size+sizeof(uint16)*sp->stride); if (sp->tbuf == NULL) return (0); if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) sp->user_datafmt = PixarLogGuessDataFmt(td); if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) { TIFFErrorExt(tif->tif_clientdata, module, "PixarLog compression can't handle bits depth/data format combination (depth: %d)", td->td_bitspersample); return (0); } if (inflateInit(&sp->stream) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "%s", sp->stream.msg); return (0); } else { sp->state |= PLSTATE_INIT; return (1); } } /* * Setup state for decoding a strip. */ static int PixarLogPreDecode(TIFF* tif, uint16 s) { static const char module[] = "PixarLogPreDecode"; PixarLogState* sp = DecoderState(tif); (void) s; assert(sp != NULL); sp->stream.next_in = tif->tif_rawdata; assert(sizeof(sp->stream.avail_in)==4); /* if this assert gets raised, we need to simplify this code to reflect a ZLib that is likely updated to deal with 8byte memory sizes, though this code will respond apropriately even before we simplify it */ sp->stream.avail_in = (uInt) tif->tif_rawcc; if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size"); return (0); } return (inflateReset(&sp->stream) == Z_OK); } static int PixarLogDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s) { static const char module[] = "PixarLogDecode"; TIFFDirectory *td = &tif->tif_dir; PixarLogState* sp = DecoderState(tif); tmsize_t i; tmsize_t nsamples; int llen; uint16 *up; switch (sp->user_datafmt) { case PIXARLOGDATAFMT_FLOAT: nsamples = occ / sizeof(float); /* XXX float == 32 bits */ break; case PIXARLOGDATAFMT_16BIT: case PIXARLOGDATAFMT_12BITPICIO: case PIXARLOGDATAFMT_11BITLOG: nsamples = occ / sizeof(uint16); /* XXX uint16 == 16 bits */ break; case PIXARLOGDATAFMT_8BIT: case PIXARLOGDATAFMT_8BITABGR: nsamples = occ; break; default: TIFFErrorExt(tif->tif_clientdata, module, "%d bit input not supported in PixarLog", td->td_bitspersample); return 0; } llen = sp->stride * td->td_imagewidth; (void) s; assert(sp != NULL); sp->stream.next_out = (unsigned char *) sp->tbuf; assert(sizeof(sp->stream.avail_out)==4); /* if this assert gets raised, we need to simplify this code to reflect a ZLib that is likely updated to deal with 8byte memory sizes, though this code will respond apropriately even before we simplify it */ sp->stream.avail_out = (uInt) (nsamples * sizeof(uint16)); if (sp->stream.avail_out != nsamples * sizeof(uint16)) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size"); return (0); } do { int state = inflate(&sp->stream, Z_PARTIAL_FLUSH); if (state == Z_STREAM_END) { break; /* XXX */ } if (state == Z_DATA_ERROR) { TIFFErrorExt(tif->tif_clientdata, module, "Decoding error at scanline %lu, %s", (unsigned long) tif->tif_row, sp->stream.msg); if (inflateSync(&sp->stream) != Z_OK) return (0); continue; } if (state != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", sp->stream.msg); return (0); } } while (sp->stream.avail_out > 0); /* hopefully, we got all the bytes we needed */ if (sp->stream.avail_out != 0) { TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at scanline %lu (short " TIFF_UINT64_FORMAT " bytes)", (unsigned long) tif->tif_row, (TIFF_UINT64_T) sp->stream.avail_out); return (0); } up = sp->tbuf; /* Swap bytes in the data if from a different endian machine. */ if (tif->tif_flags & TIFF_SWAB) TIFFSwabArrayOfShort(up, nsamples); /* * if llen is not an exact multiple of nsamples, the decode operation * may overflow the output buffer, so truncate it enough to prevent * that but still salvage as much data as possible. */ if (nsamples % llen) { TIFFWarningExt(tif->tif_clientdata, module, "stride %lu is not a multiple of sample count, " "%lu, data truncated.", (unsigned long) llen, (unsigned long) nsamples); nsamples -= nsamples % llen; } for (i = 0; i < nsamples; i += llen, up += llen) { switch (sp->user_datafmt) { case PIXARLOGDATAFMT_FLOAT: horizontalAccumulateF(up, llen, sp->stride, (float *)op, sp->ToLinearF); op += llen * sizeof(float); break; case PIXARLOGDATAFMT_16BIT: horizontalAccumulate16(up, llen, sp->stride, (uint16 *)op, sp->ToLinear16); op += llen * sizeof(uint16); break; case PIXARLOGDATAFMT_12BITPICIO: horizontalAccumulate12(up, llen, sp->stride, (int16 *)op, sp->ToLinearF); op += llen * sizeof(int16); break; case PIXARLOGDATAFMT_11BITLOG: horizontalAccumulate11(up, llen, sp->stride, (uint16 *)op); op += llen * sizeof(uint16); break; case PIXARLOGDATAFMT_8BIT: horizontalAccumulate8(up, llen, sp->stride, (unsigned char *)op, sp->ToLinear8); op += llen * sizeof(unsigned char); break; case PIXARLOGDATAFMT_8BITABGR: horizontalAccumulate8abgr(up, llen, sp->stride, (unsigned char *)op, sp->ToLinear8); op += llen * sizeof(unsigned char); break; default: TIFFErrorExt(tif->tif_clientdata, module, "Unsupported bits/sample: %d", td->td_bitspersample); return (0); } } return (1); } static int PixarLogSetupEncode(TIFF* tif) { static const char module[] = "PixarLogSetupEncode"; TIFFDirectory *td = &tif->tif_dir; PixarLogState* sp = EncoderState(tif); tmsize_t tbuf_size; assert(sp != NULL); /* for some reason, we can't do this in TIFFInitPixarLog */ sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel : 1); tbuf_size = multiply_ms(multiply_ms(multiply_ms(sp->stride, td->td_imagewidth), td->td_rowsperstrip), sizeof(uint16)); if (tbuf_size == 0) return (0); /* TODO: this is an error return without error report through TIFFErrorExt */ sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size); if (sp->tbuf == NULL) return (0); if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) sp->user_datafmt = PixarLogGuessDataFmt(td); if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) { TIFFErrorExt(tif->tif_clientdata, module, "PixarLog compression can't handle %d bit linear encodings", td->td_bitspersample); return (0); } if (deflateInit(&sp->stream, sp->quality) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "%s", sp->stream.msg); return (0); } else { sp->state |= PLSTATE_INIT; return (1); } } /* * Reset encoding state at the start of a strip. */ static int PixarLogPreEncode(TIFF* tif, uint16 s) { static const char module[] = "PixarLogPreEncode"; PixarLogState *sp = EncoderState(tif); (void) s; assert(sp != NULL); sp->stream.next_out = tif->tif_rawdata; assert(sizeof(sp->stream.avail_out)==4); /* if this assert gets raised, we need to simplify this code to reflect a ZLib that is likely updated to deal with 8byte memory sizes, though this code will respond apropriately even before we simplify it */ sp->stream.avail_out = tif->tif_rawdatasize; if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size"); return (0); } return (deflateReset(&sp->stream) == Z_OK); } static void horizontalDifferenceF(float *ip, int n, int stride, uint16 *wp, uint16 *FromLT2) { int32 r1, g1, b1, a1, r2, g2, b2, a2, mask; float fltsize = Fltsize; #define CLAMP(v) ( (v<(float)0.) ? 0 \ : (v<(float)2.) ? FromLT2[(int)(v*fltsize)] \ : (v>(float)24.2) ? 2047 \ : LogK1*log(v*LogK2) + 0.5 ) mask = CODE_MASK; if (n >= stride) { if (stride == 3) { r2 = wp[0] = (uint16) CLAMP(ip[0]); g2 = wp[1] = (uint16) CLAMP(ip[1]); b2 = wp[2] = (uint16) CLAMP(ip[2]); n -= 3; while (n > 0) { n -= 3; wp += 3; ip += 3; r1 = (int32) CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1; g1 = (int32) CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1; b1 = (int32) CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1; } } else if (stride == 4) { r2 = wp[0] = (uint16) CLAMP(ip[0]); g2 = wp[1] = (uint16) CLAMP(ip[1]); b2 = wp[2] = (uint16) CLAMP(ip[2]); a2 = wp[3] = (uint16) CLAMP(ip[3]); n -= 4; while (n > 0) { n -= 4; wp += 4; ip += 4; r1 = (int32) CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1; g1 = (int32) CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1; b1 = (int32) CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1; a1 = (int32) CLAMP(ip[3]); wp[3] = (a1-a2) & mask; a2 = a1; } } else { ip += n - 1; /* point to last one */ wp += n - 1; /* point to last one */ n -= stride; while (n > 0) { REPEAT(stride, wp[0] = (uint16) CLAMP(ip[0]); wp[stride] -= wp[0]; wp[stride] &= mask; wp--; ip--) n -= stride; } REPEAT(stride, wp[0] = (uint16) CLAMP(ip[0]); wp--; ip--) } } } static void horizontalDifference16(unsigned short *ip, int n, int stride, unsigned short *wp, uint16 *From14) { register int r1, g1, b1, a1, r2, g2, b2, a2, mask; /* assumption is unsigned pixel values */ #undef CLAMP #define CLAMP(v) From14[(v) >> 2] mask = CODE_MASK; if (n >= stride) { if (stride == 3) { r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); b2 = wp[2] = CLAMP(ip[2]); n -= 3; while (n > 0) { n -= 3; wp += 3; ip += 3; r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1; g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1; b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1; } } else if (stride == 4) { r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); b2 = wp[2] = CLAMP(ip[2]); a2 = wp[3] = CLAMP(ip[3]); n -= 4; while (n > 0) { n -= 4; wp += 4; ip += 4; r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1; g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1; b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1; a1 = CLAMP(ip[3]); wp[3] = (a1-a2) & mask; a2 = a1; } } else { ip += n - 1; /* point to last one */ wp += n - 1; /* point to last one */ n -= stride; while (n > 0) { REPEAT(stride, wp[0] = CLAMP(ip[0]); wp[stride] -= wp[0]; wp[stride] &= mask; wp--; ip--) n -= stride; } REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--) } } } static void horizontalDifference8(unsigned char *ip, int n, int stride, unsigned short *wp, uint16 *From8) { register int r1, g1, b1, a1, r2, g2, b2, a2, mask; #undef CLAMP #define CLAMP(v) (From8[(v)]) mask = CODE_MASK; if (n >= stride) { if (stride == 3) { r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); b2 = wp[2] = CLAMP(ip[2]); n -= 3; while (n > 0) { n -= 3; r1 = CLAMP(ip[3]); wp[3] = (r1-r2) & mask; r2 = r1; g1 = CLAMP(ip[4]); wp[4] = (g1-g2) & mask; g2 = g1; b1 = CLAMP(ip[5]); wp[5] = (b1-b2) & mask; b2 = b1; wp += 3; ip += 3; } } else if (stride == 4) { r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); b2 = wp[2] = CLAMP(ip[2]); a2 = wp[3] = CLAMP(ip[3]); n -= 4; while (n > 0) { n -= 4; r1 = CLAMP(ip[4]); wp[4] = (r1-r2) & mask; r2 = r1; g1 = CLAMP(ip[5]); wp[5] = (g1-g2) & mask; g2 = g1; b1 = CLAMP(ip[6]); wp[6] = (b1-b2) & mask; b2 = b1; a1 = CLAMP(ip[7]); wp[7] = (a1-a2) & mask; a2 = a1; wp += 4; ip += 4; } } else { wp += n + stride - 1; /* point to last one */ ip += n + stride - 1; /* point to last one */ n -= stride; while (n > 0) { REPEAT(stride, wp[0] = CLAMP(ip[0]); wp[stride] -= wp[0]; wp[stride] &= mask; wp--; ip--) n -= stride; } REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--) } } } /* * Encode a chunk of pixels. */ static int PixarLogEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { static const char module[] = "PixarLogEncode"; TIFFDirectory *td = &tif->tif_dir; PixarLogState *sp = EncoderState(tif); tmsize_t i; tmsize_t n; int llen; unsigned short * up; (void) s; switch (sp->user_datafmt) { case PIXARLOGDATAFMT_FLOAT: n = cc / sizeof(float); /* XXX float == 32 bits */ break; case PIXARLOGDATAFMT_16BIT: case PIXARLOGDATAFMT_12BITPICIO: case PIXARLOGDATAFMT_11BITLOG: n = cc / sizeof(uint16); /* XXX uint16 == 16 bits */ break; case PIXARLOGDATAFMT_8BIT: case PIXARLOGDATAFMT_8BITABGR: n = cc; break; default: TIFFErrorExt(tif->tif_clientdata, module, "%d bit input not supported in PixarLog", td->td_bitspersample); return 0; } llen = sp->stride * td->td_imagewidth; for (i = 0, up = sp->tbuf; i < n; i += llen, up += llen) { switch (sp->user_datafmt) { case PIXARLOGDATAFMT_FLOAT: horizontalDifferenceF((float *)bp, llen, sp->stride, up, sp->FromLT2); bp += llen * sizeof(float); break; case PIXARLOGDATAFMT_16BIT: horizontalDifference16((uint16 *)bp, llen, sp->stride, up, sp->From14); bp += llen * sizeof(uint16); break; case PIXARLOGDATAFMT_8BIT: horizontalDifference8((unsigned char *)bp, llen, sp->stride, up, sp->From8); bp += llen * sizeof(unsigned char); break; default: TIFFErrorExt(tif->tif_clientdata, module, "%d bit input not supported in PixarLog", td->td_bitspersample); return 0; } } sp->stream.next_in = (unsigned char *) sp->tbuf; assert(sizeof(sp->stream.avail_in)==4); /* if this assert gets raised, we need to simplify this code to reflect a ZLib that is likely updated to deal with 8byte memory sizes, though this code will respond apropriately even before we simplify it */ sp->stream.avail_in = (uInt) (n * sizeof(uint16)); if ((sp->stream.avail_in / sizeof(uint16)) != (uInt) n) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size"); return (0); } do { if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "Encoder error: %s", sp->stream.msg); return (0); } if (sp->stream.avail_out == 0) { tif->tif_rawcc = tif->tif_rawdatasize; TIFFFlushData1(tif); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = (uInt) tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in PixarLogPreEncode */ } } while (sp->stream.avail_in > 0); return (1); } /* * Finish off an encoded strip by flushing the last * string and tacking on an End Of Information code. */ static int PixarLogPostEncode(TIFF* tif) { static const char module[] = "PixarLogPostEncode"; PixarLogState *sp = EncoderState(tif); int state; sp->stream.avail_in = 0; do { state = deflate(&sp->stream, Z_FINISH); switch (state) { case Z_STREAM_END: case Z_OK: if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) { tif->tif_rawcc = tif->tif_rawdatasize - sp->stream.avail_out; TIFFFlushData1(tif); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = (uInt) tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in PixarLogPreEncode */ } break; default: TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", sp->stream.msg); return (0); } } while (state != Z_STREAM_END); return (1); } static void PixarLogClose(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; /* In a really sneaky (and really incorrect, and untruthfull, and * troublesome, and error-prone) maneuver that completely goes against * the spirit of TIFF, and breaks TIFF, on close, we covertly * modify both bitspersample and sampleformat in the directory to * indicate 8-bit linear. This way, the decode "just works" even for * readers that don't know about PixarLog, or how to set * the PIXARLOGDATFMT pseudo-tag. */ td->td_bitspersample = 8; td->td_sampleformat = SAMPLEFORMAT_UINT; } static void PixarLogCleanup(TIFF* tif) { PixarLogState* sp = (PixarLogState*) tif->tif_data; assert(sp != 0); (void)TIFFPredictorCleanup(tif); tif->tif_tagmethods.vgetfield = sp->vgetparent; tif->tif_tagmethods.vsetfield = sp->vsetparent; if (sp->FromLT2) _TIFFfree(sp->FromLT2); if (sp->From14) _TIFFfree(sp->From14); if (sp->From8) _TIFFfree(sp->From8); if (sp->ToLinearF) _TIFFfree(sp->ToLinearF); if (sp->ToLinear16) _TIFFfree(sp->ToLinear16); if (sp->ToLinear8) _TIFFfree(sp->ToLinear8); if (sp->state&PLSTATE_INIT) { if (tif->tif_mode == O_RDONLY) inflateEnd(&sp->stream); else deflateEnd(&sp->stream); } if (sp->tbuf) _TIFFfree(sp->tbuf); _TIFFfree(sp); tif->tif_data = NULL; _TIFFSetDefaultCompressionState(tif); } static int PixarLogVSetField(TIFF* tif, uint32 tag, va_list ap) { static const char module[] = "PixarLogVSetField"; PixarLogState *sp = (PixarLogState *)tif->tif_data; int result; switch (tag) { case TIFFTAG_PIXARLOGQUALITY: sp->quality = (int) va_arg(ap, int); if (tif->tif_mode != O_RDONLY && (sp->state&PLSTATE_INIT)) { if (deflateParams(&sp->stream, sp->quality, Z_DEFAULT_STRATEGY) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", sp->stream.msg); return (0); } } return (1); case TIFFTAG_PIXARLOGDATAFMT: sp->user_datafmt = (int) va_arg(ap, int); /* Tweak the TIFF header so that the rest of libtiff knows what * size of data will be passed between app and library, and * assume that the app knows what it is doing and is not * confused by these header manipulations... */ switch (sp->user_datafmt) { case PIXARLOGDATAFMT_8BIT: case PIXARLOGDATAFMT_8BITABGR: TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); break; case PIXARLOGDATAFMT_11BITLOG: TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); break; case PIXARLOGDATAFMT_12BITPICIO: TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT); break; case PIXARLOGDATAFMT_16BIT: TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); break; case PIXARLOGDATAFMT_FLOAT: TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 32); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); break; } /* * Must recalculate sizes should bits/sample change. */ tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tmsize_t)(-1); tif->tif_scanlinesize = TIFFScanlineSize(tif); result = 1; /* NB: pseudo tag */ break; default: result = (*sp->vsetparent)(tif, tag, ap); } return (result); } static int PixarLogVGetField(TIFF* tif, uint32 tag, va_list ap) { PixarLogState *sp = (PixarLogState *)tif->tif_data; switch (tag) { case TIFFTAG_PIXARLOGQUALITY: *va_arg(ap, int*) = sp->quality; break; case TIFFTAG_PIXARLOGDATAFMT: *va_arg(ap, int*) = sp->user_datafmt; break; default: return (*sp->vgetparent)(tif, tag, ap); } return (1); } static const TIFFField pixarlogFields[] = { {TIFFTAG_PIXARLOGDATAFMT, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL}, {TIFFTAG_PIXARLOGQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL} }; int TIFFInitPixarLog(TIFF* tif, int scheme) { static const char module[] = "TIFFInitPixarLog"; PixarLogState* sp; assert(scheme == COMPRESSION_PIXARLOG); /* * Merge codec-specific tag information. */ if (!_TIFFMergeFields(tif, pixarlogFields, TIFFArrayCount(pixarlogFields))) { TIFFErrorExt(tif->tif_clientdata, module, "Merging PixarLog codec-specific tags failed"); return 0; } /* * Allocate state block so tag methods have storage to record values. */ tif->tif_data = (uint8*) _TIFFmalloc(sizeof (PixarLogState)); if (tif->tif_data == NULL) goto bad; sp = (PixarLogState*) tif->tif_data; _TIFFmemset(sp, 0, sizeof (*sp)); sp->stream.data_type = Z_BINARY; sp->user_datafmt = PIXARLOGDATAFMT_UNKNOWN; /* * Install codec methods. */ tif->tif_fixuptags = PixarLogFixupTags; tif->tif_setupdecode = PixarLogSetupDecode; tif->tif_predecode = PixarLogPreDecode; tif->tif_decoderow = PixarLogDecode; tif->tif_decodestrip = PixarLogDecode; tif->tif_decodetile = PixarLogDecode; tif->tif_setupencode = PixarLogSetupEncode; tif->tif_preencode = PixarLogPreEncode; tif->tif_postencode = PixarLogPostEncode; tif->tif_encoderow = PixarLogEncode; tif->tif_encodestrip = PixarLogEncode; tif->tif_encodetile = PixarLogEncode; tif->tif_close = PixarLogClose; tif->tif_cleanup = PixarLogCleanup; /* Override SetField so we can handle our private pseudo-tag */ sp->vgetparent = tif->tif_tagmethods.vgetfield; tif->tif_tagmethods.vgetfield = PixarLogVGetField; /* hook for codec tags */ sp->vsetparent = tif->tif_tagmethods.vsetfield; tif->tif_tagmethods.vsetfield = PixarLogVSetField; /* hook for codec tags */ /* Default values for codec-specific fields */ sp->quality = Z_DEFAULT_COMPRESSION; /* default comp. level */ sp->state = 0; /* we don't wish to use the predictor, * the default is none, which predictor value 1 */ (void) TIFFPredictorInit(tif); /* * build the companding tables */ PixarLogMakeTables(sp); return (1); bad: TIFFErrorExt(tif->tif_clientdata, module, "No space for PixarLog state block"); return (0); } #endif /* PIXARLOG_SUPPORT */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_next.c0000644000212300117540000001015011345765560013003 00000000000000/* $Id: tif_next.c,v 1.13 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef NEXT_SUPPORT /* * TIFF Library. * * NeXT 2-bit Grey Scale Compression Algorithm Support */ #define SETPIXEL(op, v) { \ switch (npixels++ & 3) { \ case 0: op[0] = (unsigned char) ((v) << 6); break; \ case 1: op[0] |= (v) << 4; break; \ case 2: op[0] |= (v) << 2; break; \ case 3: *op++ |= (v); break; \ } \ } #define LITERALROW 0x00 #define LITERALSPAN 0x40 #define WHITE ((1<<2)-1) static int NeXTDecode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) { static const char module[] = "NeXTDecode"; unsigned char *bp, *op; tmsize_t cc; uint8* row; tmsize_t scanline, n; (void) s; /* * Each scanline is assumed to start off as all * white (we assume a PhotometricInterpretation * of ``min-is-black''). */ for (op = (unsigned char*) buf, cc = occ; cc-- > 0;) *op++ = 0xff; bp = (unsigned char *)tif->tif_rawcp; cc = tif->tif_rawcc; scanline = tif->tif_scanlinesize; if (occ % scanline) { TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read"); return (0); } for (row = buf; occ > 0; occ -= scanline, row += scanline) { n = *bp++, cc--; switch (n) { case LITERALROW: /* * The entire scanline is given as literal values. */ if (cc < scanline) goto bad; _TIFFmemcpy(row, bp, scanline); bp += scanline; cc -= scanline; break; case LITERALSPAN: { tmsize_t off; /* * The scanline has a literal span that begins at some * offset. */ off = (bp[0] * 256) + bp[1]; n = (bp[2] * 256) + bp[3]; if (cc < 4+n || off+n > scanline) goto bad; _TIFFmemcpy(row+off, bp+4, n); bp += 4+n; cc -= 4+n; break; } default: { uint32 npixels = 0, grey; uint32 imagewidth = tif->tif_dir.td_imagewidth; /* * The scanline is composed of a sequence of constant * color ``runs''. We shift into ``run mode'' and * interpret bytes as codes of the form * until we've filled the scanline. */ op = row; for (;;) { grey = (uint32)((n>>6) & 0x3); n &= 0x3f; /* * Ensure the run does not exceed the scanline * bounds, potentially resulting in a security * issue. */ while (n-- > 0 && npixels < imagewidth) SETPIXEL(op, grey); if (npixels >= imagewidth) break; if (cc == 0) goto bad; n = *bp++, cc--; } break; } } } tif->tif_rawcp = (uint8*) bp; tif->tif_rawcc = cc; return (1); bad: TIFFErrorExt(tif->tif_clientdata, module, "Not enough data for scanline %ld", (long) tif->tif_row); return (0); } int TIFFInitNeXT(TIFF* tif, int scheme) { (void) scheme; tif->tif_decoderow = NeXTDecode; tif->tif_decodestrip = NeXTDecode; tif->tif_decodetile = NeXTDecode; return (1); } #endif /* NEXT_SUPPORT */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_fax3.c0000644000212300117540000012736511775114347012705 00000000000000/* $Id: tif_fax3.c,v 1.74 2012-06-21 02:01:31 fwarmerdam Exp $ */ /* * Copyright (c) 1990-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef CCITT_SUPPORT /* * TIFF Library. * * CCITT Group 3 (T.4) and Group 4 (T.6) Compression Support. * * This file contains support for decoding and encoding TIFF * compression algorithms 2, 3, 4, and 32771. * * Decoder support is derived, with permission, from the code * in Frank Cringle's viewfax program; * Copyright (C) 1990, 1995 Frank D. Cringle. */ #include "tif_fax3.h" #define G3CODES #include "t4.h" #include /* * Compression+decompression state blocks are * derived from this ``base state'' block. */ typedef struct { int rw_mode; /* O_RDONLY for decode, else encode */ int mode; /* operating mode */ tmsize_t rowbytes; /* bytes in a decoded scanline */ uint32 rowpixels; /* pixels in a scanline */ uint16 cleanfaxdata; /* CleanFaxData tag */ uint32 badfaxrun; /* BadFaxRun tag */ uint32 badfaxlines; /* BadFaxLines tag */ uint32 groupoptions; /* Group 3/4 options tag */ TIFFVGetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ TIFFPrintMethod printdir; /* super-class method */ } Fax3BaseState; #define Fax3State(tif) ((Fax3BaseState*) (tif)->tif_data) typedef enum { G3_1D, G3_2D } Ttag; typedef struct { Fax3BaseState b; /* Decoder state info */ const unsigned char* bitmap; /* bit reversal table */ uint32 data; /* current i/o byte/word */ int bit; /* current i/o bit in byte */ int EOLcnt; /* count of EOL codes recognized */ TIFFFaxFillFunc fill; /* fill routine */ uint32* runs; /* b&w runs for current/previous row */ uint32* refruns; /* runs for reference line */ uint32* curruns; /* runs for current line */ /* Encoder state info */ Ttag tag; /* encoding state */ unsigned char* refline; /* reference line for 2d decoding */ int k; /* #rows left that can be 2d encoded */ int maxk; /* max #rows that can be 2d encoded */ int line; } Fax3CodecState; #define DecoderState(tif) ((Fax3CodecState*) Fax3State(tif)) #define EncoderState(tif) ((Fax3CodecState*) Fax3State(tif)) #define is2DEncoding(sp) (sp->b.groupoptions & GROUP3OPT_2DENCODING) #define isAligned(p,t) ((((size_t)(p)) & (sizeof (t)-1)) == 0) /* * Group 3 and Group 4 Decoding. */ /* * These macros glue the TIFF library state to * the state expected by Frank's decoder. */ #define DECLARE_STATE(tif, sp, mod) \ static const char module[] = mod; \ Fax3CodecState* sp = DecoderState(tif); \ int a0; /* reference element */ \ int lastx = sp->b.rowpixels; /* last element in row */ \ uint32 BitAcc; /* bit accumulator */ \ int BitsAvail; /* # valid bits in BitAcc */ \ int RunLength; /* length of current run */ \ unsigned char* cp; /* next byte of input data */ \ unsigned char* ep; /* end of input data */ \ uint32* pa; /* place to stuff next run */ \ uint32* thisrun; /* current row's run array */ \ int EOLcnt; /* # EOL codes recognized */ \ const unsigned char* bitmap = sp->bitmap; /* input data bit reverser */ \ const TIFFFaxTabEnt* TabEnt #define DECLARE_STATE_2D(tif, sp, mod) \ DECLARE_STATE(tif, sp, mod); \ int b1; /* next change on prev line */ \ uint32* pb /* next run in reference line */\ /* * Load any state that may be changed during decoding. */ #define CACHE_STATE(tif, sp) do { \ BitAcc = sp->data; \ BitsAvail = sp->bit; \ EOLcnt = sp->EOLcnt; \ cp = (unsigned char*) tif->tif_rawcp; \ ep = cp + tif->tif_rawcc; \ } while (0) /* * Save state possibly changed during decoding. */ #define UNCACHE_STATE(tif, sp) do { \ sp->bit = BitsAvail; \ sp->data = BitAcc; \ sp->EOLcnt = EOLcnt; \ tif->tif_rawcc -= (tmsize_t)((uint8*) cp - tif->tif_rawcp); \ tif->tif_rawcp = (uint8*) cp; \ } while (0) /* * Setup state for decoding a strip. */ static int Fax3PreDecode(TIFF* tif, uint16 s) { Fax3CodecState* sp = DecoderState(tif); (void) s; assert(sp != NULL); sp->bit = 0; /* force initial read */ sp->data = 0; sp->EOLcnt = 0; /* force initial scan for EOL */ /* * Decoder assumes lsb-to-msb bit order. Note that we select * this here rather than in Fax3SetupState so that viewers can * hold the image open, fiddle with the FillOrder tag value, * and then re-decode the image. Otherwise they'd need to close * and open the image to get the state reset. */ sp->bitmap = TIFFGetBitRevTable(tif->tif_dir.td_fillorder != FILLORDER_LSB2MSB); if (sp->refruns) { /* init reference line to white */ sp->refruns[0] = (uint32) sp->b.rowpixels; sp->refruns[1] = 0; } sp->line = 0; return (1); } /* * Routine for handling various errors/conditions. * Note how they are "glued into the decoder" by * overriding the definitions used by the decoder. */ static void Fax3Unexpected(const char* module, TIFF* tif, uint32 line, uint32 a0) { TIFFErrorExt(tif->tif_clientdata, module, "Bad code word at line %u of %s %u (x %u)", line, isTiled(tif) ? "tile" : "strip", (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip), a0); } #define unexpected(table, a0) Fax3Unexpected(module, tif, sp->line, a0) static void Fax3Extension(const char* module, TIFF* tif, uint32 line, uint32 a0) { TIFFErrorExt(tif->tif_clientdata, module, "Uncompressed data (not supported) at line %u of %s %u (x %u)", line, isTiled(tif) ? "tile" : "strip", (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip), a0); } #define extension(a0) Fax3Extension(module, tif, sp->line, a0) static void Fax3BadLength(const char* module, TIFF* tif, uint32 line, uint32 a0, uint32 lastx) { TIFFWarningExt(tif->tif_clientdata, module, "%s at line %u of %s %u (got %u, expected %u)", a0 < lastx ? "Premature EOL" : "Line length mismatch", line, isTiled(tif) ? "tile" : "strip", (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip), a0, lastx); } #define badlength(a0,lastx) Fax3BadLength(module, tif, sp->line, a0, lastx) static void Fax3PrematureEOF(const char* module, TIFF* tif, uint32 line, uint32 a0) { TIFFWarningExt(tif->tif_clientdata, module, "Premature EOF at line %u of %s %u (x %u)", line, isTiled(tif) ? "tile" : "strip", (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip), a0); } #define prematureEOF(a0) Fax3PrematureEOF(module, tif, sp->line, a0) #define Nop /* * Decode the requested amount of G3 1D-encoded data. */ static int Fax3Decode1D(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) { DECLARE_STATE(tif, sp, "Fax3Decode1D"); (void) s; if (occ % sp->b.rowbytes) { TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read"); return (-1); } CACHE_STATE(tif, sp); thisrun = sp->curruns; while (occ > 0) { a0 = 0; RunLength = 0; pa = thisrun; #ifdef FAX3_DEBUG printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail); printf("-------------------- %d\n", tif->tif_row); fflush(stdout); #endif SYNC_EOL(EOF1D); EXPAND1D(EOF1Da); (*sp->fill)(buf, thisrun, pa, lastx); buf += sp->b.rowbytes; occ -= sp->b.rowbytes; sp->line++; continue; EOF1D: /* premature EOF */ CLEANUP_RUNS(); EOF1Da: /* premature EOF */ (*sp->fill)(buf, thisrun, pa, lastx); UNCACHE_STATE(tif, sp); return (-1); } UNCACHE_STATE(tif, sp); return (1); } #define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; } /* * Decode the requested amount of G3 2D-encoded data. */ static int Fax3Decode2D(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) { DECLARE_STATE_2D(tif, sp, "Fax3Decode2D"); int is1D; /* current line is 1d/2d-encoded */ (void) s; if (occ % sp->b.rowbytes) { TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read"); return (-1); } CACHE_STATE(tif, sp); while (occ > 0) { a0 = 0; RunLength = 0; pa = thisrun = sp->curruns; #ifdef FAX3_DEBUG printf("\nBitAcc=%08X, BitsAvail = %d EOLcnt = %d", BitAcc, BitsAvail, EOLcnt); #endif SYNC_EOL(EOF2D); NeedBits8(1, EOF2D); is1D = GetBits(1); /* 1D/2D-encoding tag bit */ ClrBits(1); #ifdef FAX3_DEBUG printf(" %s\n-------------------- %d\n", is1D ? "1D" : "2D", tif->tif_row); fflush(stdout); #endif pb = sp->refruns; b1 = *pb++; if (is1D) EXPAND1D(EOF2Da); else EXPAND2D(EOF2Da); (*sp->fill)(buf, thisrun, pa, lastx); SETVALUE(0); /* imaginary change for reference */ SWAP(uint32*, sp->curruns, sp->refruns); buf += sp->b.rowbytes; occ -= sp->b.rowbytes; sp->line++; continue; EOF2D: /* premature EOF */ CLEANUP_RUNS(); EOF2Da: /* premature EOF */ (*sp->fill)(buf, thisrun, pa, lastx); UNCACHE_STATE(tif, sp); return (-1); } UNCACHE_STATE(tif, sp); return (1); } #undef SWAP /* * The ZERO & FILL macros must handle spans < 2*sizeof(long) bytes. * For machines with 64-bit longs this is <16 bytes; otherwise * this is <8 bytes. We optimize the code here to reflect the * machine characteristics. */ #if SIZEOF_UNSIGNED_LONG == 8 # define FILL(n, cp) \ switch (n) { \ case 15:(cp)[14] = 0xff; case 14:(cp)[13] = 0xff; case 13: (cp)[12] = 0xff;\ case 12:(cp)[11] = 0xff; case 11:(cp)[10] = 0xff; case 10: (cp)[9] = 0xff;\ case 9: (cp)[8] = 0xff; case 8: (cp)[7] = 0xff; case 7: (cp)[6] = 0xff;\ case 6: (cp)[5] = 0xff; case 5: (cp)[4] = 0xff; case 4: (cp)[3] = 0xff;\ case 3: (cp)[2] = 0xff; case 2: (cp)[1] = 0xff; \ case 1: (cp)[0] = 0xff; (cp) += (n); case 0: ; \ } # define ZERO(n, cp) \ switch (n) { \ case 15:(cp)[14] = 0; case 14:(cp)[13] = 0; case 13: (cp)[12] = 0; \ case 12:(cp)[11] = 0; case 11:(cp)[10] = 0; case 10: (cp)[9] = 0; \ case 9: (cp)[8] = 0; case 8: (cp)[7] = 0; case 7: (cp)[6] = 0; \ case 6: (cp)[5] = 0; case 5: (cp)[4] = 0; case 4: (cp)[3] = 0; \ case 3: (cp)[2] = 0; case 2: (cp)[1] = 0; \ case 1: (cp)[0] = 0; (cp) += (n); case 0: ; \ } #else # define FILL(n, cp) \ switch (n) { \ case 7: (cp)[6] = 0xff; case 6: (cp)[5] = 0xff; case 5: (cp)[4] = 0xff; \ case 4: (cp)[3] = 0xff; case 3: (cp)[2] = 0xff; case 2: (cp)[1] = 0xff; \ case 1: (cp)[0] = 0xff; (cp) += (n); case 0: ; \ } # define ZERO(n, cp) \ switch (n) { \ case 7: (cp)[6] = 0; case 6: (cp)[5] = 0; case 5: (cp)[4] = 0; \ case 4: (cp)[3] = 0; case 3: (cp)[2] = 0; case 2: (cp)[1] = 0; \ case 1: (cp)[0] = 0; (cp) += (n); case 0: ; \ } #endif /* * Bit-fill a row according to the white/black * runs generated during G3/G4 decoding. */ void _TIFFFax3fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) { static const unsigned char _fillmasks[] = { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; unsigned char* cp; uint32 x, bx, run; int32 n, nw; long* lp; if ((erun-runs)&1) *erun++ = 0; x = 0; for (; runs < erun; runs += 2) { run = runs[0]; if (x+run > lastx || run > lastx ) run = runs[0] = (uint32) (lastx - x); if (run) { cp = buf + (x>>3); bx = x&7; if (run > 8-bx) { if (bx) { /* align to byte boundary */ *cp++ &= 0xff << (8-bx); run -= 8-bx; } if( (n = run >> 3) != 0 ) { /* multiple bytes to fill */ if ((n/sizeof (long)) > 1) { /* * Align to longword boundary and fill. */ for (; n && !isAligned(cp, long); n--) *cp++ = 0x00; lp = (long*) cp; nw = (int32)(n / sizeof (long)); n -= nw * sizeof (long); do { *lp++ = 0L; } while (--nw); cp = (unsigned char*) lp; } ZERO(n, cp); run &= 7; } if (run) cp[0] &= 0xff >> run; } else cp[0] &= ~(_fillmasks[run]>>bx); x += runs[0]; } run = runs[1]; if (x+run > lastx || run > lastx ) run = runs[1] = lastx - x; if (run) { cp = buf + (x>>3); bx = x&7; if (run > 8-bx) { if (bx) { /* align to byte boundary */ *cp++ |= 0xff >> bx; run -= 8-bx; } if( (n = run>>3) != 0 ) { /* multiple bytes to fill */ if ((n/sizeof (long)) > 1) { /* * Align to longword boundary and fill. */ for (; n && !isAligned(cp, long); n--) *cp++ = 0xff; lp = (long*) cp; nw = (int32)(n / sizeof (long)); n -= nw * sizeof (long); do { *lp++ = -1L; } while (--nw); cp = (unsigned char*) lp; } FILL(n, cp); run &= 7; } if (run) cp[0] |= 0xff00 >> run; } else cp[0] |= _fillmasks[run]>>bx; x += runs[1]; } } assert(x == lastx); } #undef ZERO #undef FILL static int Fax3FixupTags(TIFF* tif) { (void) tif; return (1); } /* * Setup G3/G4-related compression/decompression state * before data is processed. This routine is called once * per image -- it sets up different state based on whether * or not decoding or encoding is being done and whether * 1D- or 2D-encoded data is involved. */ static int Fax3SetupState(TIFF* tif) { static const char module[] = "Fax3SetupState"; TIFFDirectory* td = &tif->tif_dir; Fax3BaseState* sp = Fax3State(tif); int needsRefLine; Fax3CodecState* dsp = (Fax3CodecState*) Fax3State(tif); tmsize_t rowbytes; uint32 rowpixels, nruns; if (td->td_bitspersample != 1) { TIFFErrorExt(tif->tif_clientdata, module, "Bits/sample must be 1 for Group 3/4 encoding/decoding"); return (0); } /* * Calculate the scanline/tile widths. */ if (isTiled(tif)) { rowbytes = TIFFTileRowSize(tif); rowpixels = td->td_tilewidth; } else { rowbytes = TIFFScanlineSize(tif); rowpixels = td->td_imagewidth; } sp->rowbytes = rowbytes; sp->rowpixels = rowpixels; /* * Allocate any additional space required for decoding/encoding. */ needsRefLine = ( (sp->groupoptions & GROUP3OPT_2DENCODING) || td->td_compression == COMPRESSION_CCITTFAX4 ); /* Assure that allocation computations do not overflow. TIFFroundup and TIFFSafeMultiply return zero on integer overflow */ dsp->runs=(uint32*) NULL; nruns = TIFFroundup_32(rowpixels,32); if (needsRefLine) { nruns = TIFFSafeMultiply(uint32,nruns,2); } if ((nruns == 0) || (TIFFSafeMultiply(uint32,nruns,2) == 0)) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Row pixels integer overflow (rowpixels %u)", rowpixels); return (0); } dsp->runs = (uint32*) _TIFFCheckMalloc(tif, TIFFSafeMultiply(uint32,nruns,2), sizeof (uint32), "for Group 3/4 run arrays"); if (dsp->runs == NULL) return (0); memset( dsp->runs, 0, TIFFSafeMultiply(uint32,nruns,2)*sizeof(uint32)); dsp->curruns = dsp->runs; if (needsRefLine) dsp->refruns = dsp->runs + nruns; else dsp->refruns = NULL; if (td->td_compression == COMPRESSION_CCITTFAX3 && is2DEncoding(dsp)) { /* NB: default is 1D routine */ tif->tif_decoderow = Fax3Decode2D; tif->tif_decodestrip = Fax3Decode2D; tif->tif_decodetile = Fax3Decode2D; } if (needsRefLine) { /* 2d encoding */ Fax3CodecState* esp = EncoderState(tif); /* * 2d encoding requires a scanline * buffer for the ``reference line''; the * scanline against which delta encoding * is referenced. The reference line must * be initialized to be ``white'' (done elsewhere). */ esp->refline = (unsigned char*) _TIFFmalloc(rowbytes); if (esp->refline == NULL) { TIFFErrorExt(tif->tif_clientdata, module, "No space for Group 3/4 reference line"); return (0); } } else /* 1d encoding */ EncoderState(tif)->refline = NULL; return (1); } /* * CCITT Group 3 FAX Encoding. */ #define Fax3FlushBits(tif, sp) { \ if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \ (void) TIFFFlushData1(tif); \ *(tif)->tif_rawcp++ = (uint8) (sp)->data; \ (tif)->tif_rawcc++; \ (sp)->data = 0, (sp)->bit = 8; \ } #define _FlushBits(tif) { \ if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \ (void) TIFFFlushData1(tif); \ *(tif)->tif_rawcp++ = (uint8) data; \ (tif)->tif_rawcc++; \ data = 0, bit = 8; \ } static const int _msbmask[9] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; #define _PutBits(tif, bits, length) { \ while (length > bit) { \ data |= bits >> (length - bit); \ length -= bit; \ _FlushBits(tif); \ } \ assert( length < 9 ); \ data |= (bits & _msbmask[length]) << (bit - length); \ bit -= length; \ if (bit == 0) \ _FlushBits(tif); \ } /* * Write a variable-length bit-value to * the output stream. Values are * assumed to be at most 16 bits. */ static void Fax3PutBits(TIFF* tif, unsigned int bits, unsigned int length) { Fax3CodecState* sp = EncoderState(tif); unsigned int bit = sp->bit; int data = sp->data; _PutBits(tif, bits, length); sp->data = data; sp->bit = bit; } /* * Write a code to the output stream. */ #define putcode(tif, te) Fax3PutBits(tif, (te)->code, (te)->length) #ifdef FAX3_DEBUG #define DEBUG_COLOR(w) (tab == TIFFFaxWhiteCodes ? w "W" : w "B") #define DEBUG_PRINT(what,len) { \ int t; \ printf("%08X/%-2d: %s%5d\t", data, bit, DEBUG_COLOR(what), len); \ for (t = length-1; t >= 0; t--) \ putchar(code & (1<bit; int data = sp->data; unsigned int code, length; while (span >= 2624) { const tableentry* te = &tab[63 + (2560>>6)]; code = te->code, length = te->length; #ifdef FAX3_DEBUG DEBUG_PRINT("MakeUp", te->runlen); #endif _PutBits(tif, code, length); span -= te->runlen; } if (span >= 64) { const tableentry* te = &tab[63 + (span>>6)]; assert(te->runlen == 64*(span>>6)); code = te->code, length = te->length; #ifdef FAX3_DEBUG DEBUG_PRINT("MakeUp", te->runlen); #endif _PutBits(tif, code, length); span -= te->runlen; } code = tab[span].code, length = tab[span].length; #ifdef FAX3_DEBUG DEBUG_PRINT(" Term", tab[span].runlen); #endif _PutBits(tif, code, length); sp->data = data; sp->bit = bit; } /* * Write an EOL code to the output stream. The zero-fill * logic for byte-aligning encoded scanlines is handled * here. We also handle writing the tag bit for the next * scanline when doing 2d encoding. */ static void Fax3PutEOL(TIFF* tif) { Fax3CodecState* sp = EncoderState(tif); unsigned int bit = sp->bit; int data = sp->data; unsigned int code, length, tparm; if (sp->b.groupoptions & GROUP3OPT_FILLBITS) { /* * Force bit alignment so EOL will terminate on * a byte boundary. That is, force the bit alignment * to 16-12 = 4 before putting out the EOL code. */ int align = 8 - 4; if (align != sp->bit) { if (align > sp->bit) align = sp->bit + (8 - align); else align = sp->bit - align; code = 0; tparm=align; _PutBits(tif, 0, tparm); } } code = EOL, length = 12; if (is2DEncoding(sp)) code = (code<<1) | (sp->tag == G3_1D), length++; _PutBits(tif, code, length); sp->data = data; sp->bit = bit; } /* * Reset encoding state at the start of a strip. */ static int Fax3PreEncode(TIFF* tif, uint16 s) { Fax3CodecState* sp = EncoderState(tif); (void) s; assert(sp != NULL); sp->bit = 8; sp->data = 0; sp->tag = G3_1D; /* * This is necessary for Group 4; otherwise it isn't * needed because the first scanline of each strip ends * up being copied into the refline. */ if (sp->refline) _TIFFmemset(sp->refline, 0x00, sp->b.rowbytes); if (is2DEncoding(sp)) { float res = tif->tif_dir.td_yresolution; /* * The CCITT spec says that when doing 2d encoding, you * should only do it on K consecutive scanlines, where K * depends on the resolution of the image being encoded * (2 for <= 200 lpi, 4 for > 200 lpi). Since the directory * code initializes td_yresolution to 0, this code will * select a K of 2 unless the YResolution tag is set * appropriately. (Note also that we fudge a little here * and use 150 lpi to avoid problems with units conversion.) */ if (tif->tif_dir.td_resolutionunit == RESUNIT_CENTIMETER) res *= 2.54f; /* convert to inches */ sp->maxk = (res > 150 ? 4 : 2); sp->k = sp->maxk-1; } else sp->k = sp->maxk = 0; sp->line = 0; return (1); } static const unsigned char zeroruns[256] = { 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, /* 0x00 - 0x0f */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x10 - 0x1f */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x20 - 0x2f */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x30 - 0x3f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 - 0x4f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 - 0x5f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 - 0x6f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x70 - 0x7f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 - 0xaf */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 - 0xbf */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 - 0xcf */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 - 0xdf */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 - 0xef */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 - 0xff */ }; static const unsigned char oneruns[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 - 0x0f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 - 0x1f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x2f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 - 0x3f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 - 0x4f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 - 0x5f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80 - 0x8f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90 - 0x9f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0 - 0xaf */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0 - 0xbf */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xc0 - 0xcf */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xd0 - 0xdf */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xe0 - 0xef */ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, /* 0xf0 - 0xff */ }; /* * On certain systems it pays to inline * the routines that find pixel spans. */ #ifdef VAXC static int32 find0span(unsigned char*, int32, int32); static int32 find1span(unsigned char*, int32, int32); #pragma inline(find0span,find1span) #endif /* * Find a span of ones or zeros using the supplied * table. The ``base'' of the bit string is supplied * along with the start+end bit indices. */ inline static int32 find0span(unsigned char* bp, int32 bs, int32 be) { int32 bits = be - bs; int32 n, span; bp += bs>>3; /* * Check partial byte on lhs. */ if (bits > 0 && (n = (bs & 7))) { span = zeroruns[(*bp << n) & 0xff]; if (span > 8-n) /* table value too generous */ span = 8-n; if (span > bits) /* constrain span to bit range */ span = bits; if (n+span < 8) /* doesn't extend to edge of byte */ return (span); bits -= span; bp++; } else span = 0; if (bits >= (int32)(2 * 8 * sizeof(long))) { long* lp; /* * Align to longword boundary and check longwords. */ while (!isAligned(bp, long)) { if (*bp != 0x00) return (span + zeroruns[*bp]); span += 8, bits -= 8; bp++; } lp = (long*) bp; while ((bits >= (int32)(8 * sizeof(long))) && (0 == *lp)) { span += 8*sizeof (long), bits -= 8*sizeof (long); lp++; } bp = (unsigned char*) lp; } /* * Scan full bytes for all 0's. */ while (bits >= 8) { if (*bp != 0x00) /* end of run */ return (span + zeroruns[*bp]); span += 8, bits -= 8; bp++; } /* * Check partial byte on rhs. */ if (bits > 0) { n = zeroruns[*bp]; span += (n > bits ? bits : n); } return (span); } inline static int32 find1span(unsigned char* bp, int32 bs, int32 be) { int32 bits = be - bs; int32 n, span; bp += bs>>3; /* * Check partial byte on lhs. */ if (bits > 0 && (n = (bs & 7))) { span = oneruns[(*bp << n) & 0xff]; if (span > 8-n) /* table value too generous */ span = 8-n; if (span > bits) /* constrain span to bit range */ span = bits; if (n+span < 8) /* doesn't extend to edge of byte */ return (span); bits -= span; bp++; } else span = 0; if (bits >= (int32)(2 * 8 * sizeof(long))) { long* lp; /* * Align to longword boundary and check longwords. */ while (!isAligned(bp, long)) { if (*bp != 0xff) return (span + oneruns[*bp]); span += 8, bits -= 8; bp++; } lp = (long*) bp; while ((bits >= (int32)(8 * sizeof(long))) && (~0 == *lp)) { span += 8*sizeof (long), bits -= 8*sizeof (long); lp++; } bp = (unsigned char*) lp; } /* * Scan full bytes for all 1's. */ while (bits >= 8) { if (*bp != 0xff) /* end of run */ return (span + oneruns[*bp]); span += 8, bits -= 8; bp++; } /* * Check partial byte on rhs. */ if (bits > 0) { n = oneruns[*bp]; span += (n > bits ? bits : n); } return (span); } /* * Return the offset of the next bit in the range * [bs..be] that is different from the specified * color. The end, be, is returned if no such bit * exists. */ #define finddiff(_cp, _bs, _be, _color) \ (_bs + (_color ? find1span(_cp,_bs,_be) : find0span(_cp,_bs,_be))) /* * Like finddiff, but also check the starting bit * against the end in case start > end. */ #define finddiff2(_cp, _bs, _be, _color) \ (_bs < _be ? finddiff(_cp,_bs,_be,_color) : _be) /* * 1d-encode a row of pixels. The encoding is * a sequence of all-white or all-black spans * of pixels encoded with Huffman codes. */ static int Fax3Encode1DRow(TIFF* tif, unsigned char* bp, uint32 bits) { Fax3CodecState* sp = EncoderState(tif); int32 span; uint32 bs = 0; for (;;) { span = find0span(bp, bs, bits); /* white span */ putspan(tif, span, TIFFFaxWhiteCodes); bs += span; if (bs >= bits) break; span = find1span(bp, bs, bits); /* black span */ putspan(tif, span, TIFFFaxBlackCodes); bs += span; if (bs >= bits) break; } if (sp->b.mode & (FAXMODE_BYTEALIGN|FAXMODE_WORDALIGN)) { if (sp->bit != 8) /* byte-align */ Fax3FlushBits(tif, sp); if ((sp->b.mode&FAXMODE_WORDALIGN) && !isAligned(tif->tif_rawcp, uint16)) Fax3FlushBits(tif, sp); } return (1); } static const tableentry horizcode = { 3, 0x1, 0 }; /* 001 */ static const tableentry passcode = { 4, 0x1, 0 }; /* 0001 */ static const tableentry vcodes[7] = { { 7, 0x03, 0 }, /* 0000 011 */ { 6, 0x03, 0 }, /* 0000 11 */ { 3, 0x03, 0 }, /* 011 */ { 1, 0x1, 0 }, /* 1 */ { 3, 0x2, 0 }, /* 010 */ { 6, 0x02, 0 }, /* 0000 10 */ { 7, 0x02, 0 } /* 0000 010 */ }; /* * 2d-encode a row of pixels. Consult the CCITT * documentation for the algorithm. */ static int Fax3Encode2DRow(TIFF* tif, unsigned char* bp, unsigned char* rp, uint32 bits) { #define PIXEL(buf,ix) ((((buf)[(ix)>>3]) >> (7-((ix)&7))) & 1) uint32 a0 = 0; uint32 a1 = (PIXEL(bp, 0) != 0 ? 0 : finddiff(bp, 0, bits, 0)); uint32 b1 = (PIXEL(rp, 0) != 0 ? 0 : finddiff(rp, 0, bits, 0)); uint32 a2, b2; for (;;) { b2 = finddiff2(rp, b1, bits, PIXEL(rp,b1)); if (b2 >= a1) { int32 d = b1 - a1; if (!(-3 <= d && d <= 3)) { /* horizontal mode */ a2 = finddiff2(bp, a1, bits, PIXEL(bp,a1)); putcode(tif, &horizcode); if (a0+a1 == 0 || PIXEL(bp, a0) == 0) { putspan(tif, a1-a0, TIFFFaxWhiteCodes); putspan(tif, a2-a1, TIFFFaxBlackCodes); } else { putspan(tif, a1-a0, TIFFFaxBlackCodes); putspan(tif, a2-a1, TIFFFaxWhiteCodes); } a0 = a2; } else { /* vertical mode */ putcode(tif, &vcodes[d+3]); a0 = a1; } } else { /* pass mode */ putcode(tif, &passcode); a0 = b2; } if (a0 >= bits) break; a1 = finddiff(bp, a0, bits, PIXEL(bp,a0)); b1 = finddiff(rp, a0, bits, !PIXEL(bp,a0)); b1 = finddiff(rp, b1, bits, PIXEL(bp,a0)); } return (1); #undef PIXEL } /* * Encode a buffer of pixels. */ static int Fax3Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { static const char module[] = "Fax3Encode"; Fax3CodecState* sp = EncoderState(tif); (void) s; if (cc % sp->b.rowbytes) { TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be written"); return (0); } while (cc > 0) { if ((sp->b.mode & FAXMODE_NOEOL) == 0) Fax3PutEOL(tif); if (is2DEncoding(sp)) { if (sp->tag == G3_1D) { if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels)) return (0); sp->tag = G3_2D; } else { if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels)) return (0); sp->k--; } if (sp->k == 0) { sp->tag = G3_1D; sp->k = sp->maxk-1; } else _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes); } else { if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels)) return (0); } bp += sp->b.rowbytes; cc -= sp->b.rowbytes; } return (1); } static int Fax3PostEncode(TIFF* tif) { Fax3CodecState* sp = EncoderState(tif); if (sp->bit != 8) Fax3FlushBits(tif, sp); return (1); } static void Fax3Close(TIFF* tif) { if ((Fax3State(tif)->mode & FAXMODE_NORTC) == 0) { Fax3CodecState* sp = EncoderState(tif); unsigned int code = EOL; unsigned int length = 12; int i; if (is2DEncoding(sp)) code = (code<<1) | (sp->tag == G3_1D), length++; for (i = 0; i < 6; i++) Fax3PutBits(tif, code, length); Fax3FlushBits(tif, sp); } } static void Fax3Cleanup(TIFF* tif) { Fax3CodecState* sp = DecoderState(tif); assert(sp != 0); tif->tif_tagmethods.vgetfield = sp->b.vgetparent; tif->tif_tagmethods.vsetfield = sp->b.vsetparent; tif->tif_tagmethods.printdir = sp->b.printdir; if (sp->runs) _TIFFfree(sp->runs); if (sp->refline) _TIFFfree(sp->refline); _TIFFfree(tif->tif_data); tif->tif_data = NULL; _TIFFSetDefaultCompressionState(tif); } #define FIELD_BADFAXLINES (FIELD_CODEC+0) #define FIELD_CLEANFAXDATA (FIELD_CODEC+1) #define FIELD_BADFAXRUN (FIELD_CODEC+2) #define FIELD_OPTIONS (FIELD_CODEC+7) static const TIFFField faxFields[] = { { TIFFTAG_FAXMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "FaxMode", NULL }, { TIFFTAG_FAXFILLFUNC, 0, 0, TIFF_ANY, 0, TIFF_SETGET_OTHER, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "FaxFillFunc", NULL }, { TIFFTAG_BADFAXLINES, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_BADFAXLINES, TRUE, FALSE, "BadFaxLines", NULL }, { TIFFTAG_CLEANFAXDATA, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UINT16, FIELD_CLEANFAXDATA, TRUE, FALSE, "CleanFaxData", NULL }, { TIFFTAG_CONSECUTIVEBADFAXLINES, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_BADFAXRUN, TRUE, FALSE, "ConsecutiveBadFaxLines", NULL }}; static const TIFFField fax3Fields[] = { { TIFFTAG_GROUP3OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_OPTIONS, FALSE, FALSE, "Group3Options", NULL }, }; static const TIFFField fax4Fields[] = { { TIFFTAG_GROUP4OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_OPTIONS, FALSE, FALSE, "Group4Options", NULL }, }; static int Fax3VSetField(TIFF* tif, uint32 tag, va_list ap) { Fax3BaseState* sp = Fax3State(tif); const TIFFField* fip; assert(sp != 0); assert(sp->vsetparent != 0); switch (tag) { case TIFFTAG_FAXMODE: sp->mode = (int) va_arg(ap, int); return 1; /* NB: pseudo tag */ case TIFFTAG_FAXFILLFUNC: DecoderState(tif)->fill = va_arg(ap, TIFFFaxFillFunc); return 1; /* NB: pseudo tag */ case TIFFTAG_GROUP3OPTIONS: /* XXX: avoid reading options if compression mismatches. */ if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX3) sp->groupoptions = (uint32) va_arg(ap, uint32); break; case TIFFTAG_GROUP4OPTIONS: /* XXX: avoid reading options if compression mismatches. */ if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4) sp->groupoptions = (uint32) va_arg(ap, uint32); break; case TIFFTAG_BADFAXLINES: sp->badfaxlines = (uint32) va_arg(ap, uint32); break; case TIFFTAG_CLEANFAXDATA: sp->cleanfaxdata = (uint16) va_arg(ap, uint16_vap); break; case TIFFTAG_CONSECUTIVEBADFAXLINES: sp->badfaxrun = (uint32) va_arg(ap, uint32); break; default: return (*sp->vsetparent)(tif, tag, ap); } if ((fip = TIFFFieldWithTag(tif, tag))) TIFFSetFieldBit(tif, fip->field_bit); else return 0; tif->tif_flags |= TIFF_DIRTYDIRECT; return 1; } static int Fax3VGetField(TIFF* tif, uint32 tag, va_list ap) { Fax3BaseState* sp = Fax3State(tif); assert(sp != 0); switch (tag) { case TIFFTAG_FAXMODE: *va_arg(ap, int*) = sp->mode; break; case TIFFTAG_FAXFILLFUNC: *va_arg(ap, TIFFFaxFillFunc*) = DecoderState(tif)->fill; break; case TIFFTAG_GROUP3OPTIONS: case TIFFTAG_GROUP4OPTIONS: *va_arg(ap, uint32*) = sp->groupoptions; break; case TIFFTAG_BADFAXLINES: *va_arg(ap, uint32*) = sp->badfaxlines; break; case TIFFTAG_CLEANFAXDATA: *va_arg(ap, uint16*) = sp->cleanfaxdata; break; case TIFFTAG_CONSECUTIVEBADFAXLINES: *va_arg(ap, uint32*) = sp->badfaxrun; break; default: return (*sp->vgetparent)(tif, tag, ap); } return (1); } static void Fax3PrintDir(TIFF* tif, FILE* fd, long flags) { Fax3BaseState* sp = Fax3State(tif); assert(sp != 0); (void) flags; if (TIFFFieldSet(tif,FIELD_OPTIONS)) { const char* sep = " "; if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4) { fprintf(fd, " Group 4 Options:"); if (sp->groupoptions & GROUP4OPT_UNCOMPRESSED) fprintf(fd, "%suncompressed data", sep); } else { fprintf(fd, " Group 3 Options:"); if (sp->groupoptions & GROUP3OPT_2DENCODING) fprintf(fd, "%s2-d encoding", sep), sep = "+"; if (sp->groupoptions & GROUP3OPT_FILLBITS) fprintf(fd, "%sEOL padding", sep), sep = "+"; if (sp->groupoptions & GROUP3OPT_UNCOMPRESSED) fprintf(fd, "%suncompressed data", sep); } fprintf(fd, " (%lu = 0x%lx)\n", (unsigned long) sp->groupoptions, (unsigned long) sp->groupoptions); } if (TIFFFieldSet(tif,FIELD_CLEANFAXDATA)) { fprintf(fd, " Fax Data:"); switch (sp->cleanfaxdata) { case CLEANFAXDATA_CLEAN: fprintf(fd, " clean"); break; case CLEANFAXDATA_REGENERATED: fprintf(fd, " receiver regenerated"); break; case CLEANFAXDATA_UNCLEAN: fprintf(fd, " uncorrected errors"); break; } fprintf(fd, " (%u = 0x%x)\n", sp->cleanfaxdata, sp->cleanfaxdata); } if (TIFFFieldSet(tif,FIELD_BADFAXLINES)) fprintf(fd, " Bad Fax Lines: %lu\n", (unsigned long) sp->badfaxlines); if (TIFFFieldSet(tif,FIELD_BADFAXRUN)) fprintf(fd, " Consecutive Bad Fax Lines: %lu\n", (unsigned long) sp->badfaxrun); if (sp->printdir) (*sp->printdir)(tif, fd, flags); } static int InitCCITTFax3(TIFF* tif) { static const char module[] = "InitCCITTFax3"; Fax3BaseState* sp; /* * Merge codec-specific tag information. */ if (!_TIFFMergeFields(tif, faxFields, TIFFArrayCount(faxFields))) { TIFFErrorExt(tif->tif_clientdata, "InitCCITTFax3", "Merging common CCITT Fax codec-specific tags failed"); return 0; } /* * Allocate state block so tag methods have storage to record values. */ tif->tif_data = (uint8*) _TIFFmalloc(sizeof (Fax3CodecState)); if (tif->tif_data == NULL) { TIFFErrorExt(tif->tif_clientdata, module, "No space for state block"); return (0); } sp = Fax3State(tif); sp->rw_mode = tif->tif_mode; /* * Override parent get/set field methods. */ sp->vgetparent = tif->tif_tagmethods.vgetfield; tif->tif_tagmethods.vgetfield = Fax3VGetField; /* hook for codec tags */ sp->vsetparent = tif->tif_tagmethods.vsetfield; tif->tif_tagmethods.vsetfield = Fax3VSetField; /* hook for codec tags */ sp->printdir = tif->tif_tagmethods.printdir; tif->tif_tagmethods.printdir = Fax3PrintDir; /* hook for codec tags */ sp->groupoptions = 0; if (sp->rw_mode == O_RDONLY) /* FIXME: improve for in place update */ tif->tif_flags |= TIFF_NOBITREV; /* decoder does bit reversal */ DecoderState(tif)->runs = NULL; TIFFSetField(tif, TIFFTAG_FAXFILLFUNC, _TIFFFax3fillruns); EncoderState(tif)->refline = NULL; /* * Install codec methods. */ tif->tif_fixuptags = Fax3FixupTags; tif->tif_setupdecode = Fax3SetupState; tif->tif_predecode = Fax3PreDecode; tif->tif_decoderow = Fax3Decode1D; tif->tif_decodestrip = Fax3Decode1D; tif->tif_decodetile = Fax3Decode1D; tif->tif_setupencode = Fax3SetupState; tif->tif_preencode = Fax3PreEncode; tif->tif_postencode = Fax3PostEncode; tif->tif_encoderow = Fax3Encode; tif->tif_encodestrip = Fax3Encode; tif->tif_encodetile = Fax3Encode; tif->tif_close = Fax3Close; tif->tif_cleanup = Fax3Cleanup; return (1); } int TIFFInitCCITTFax3(TIFF* tif, int scheme) { (void) scheme; if (InitCCITTFax3(tif)) { /* * Merge codec-specific tag information. */ if (!_TIFFMergeFields(tif, fax3Fields, TIFFArrayCount(fax3Fields))) { TIFFErrorExt(tif->tif_clientdata, "TIFFInitCCITTFax3", "Merging CCITT Fax 3 codec-specific tags failed"); return 0; } /* * The default format is Class/F-style w/o RTC. */ return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_CLASSF); } else return 01; } /* * CCITT Group 4 (T.6) Facsimile-compatible * Compression Scheme Support. */ #define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; } /* * Decode the requested amount of G4-encoded data. */ static int Fax4Decode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) { DECLARE_STATE_2D(tif, sp, "Fax4Decode"); (void) s; if (occ % sp->b.rowbytes) { TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read"); return (-1); } CACHE_STATE(tif, sp); while (occ > 0) { a0 = 0; RunLength = 0; pa = thisrun = sp->curruns; pb = sp->refruns; b1 = *pb++; #ifdef FAX3_DEBUG printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail); printf("-------------------- %d\n", tif->tif_row); fflush(stdout); #endif EXPAND2D(EOFG4); if (EOLcnt) goto EOFG4; (*sp->fill)(buf, thisrun, pa, lastx); SETVALUE(0); /* imaginary change for reference */ SWAP(uint32*, sp->curruns, sp->refruns); buf += sp->b.rowbytes; occ -= sp->b.rowbytes; sp->line++; continue; EOFG4: NeedBits16( 13, BADG4 ); BADG4: #ifdef FAX3_DEBUG if( GetBits(13) != 0x1001 ) fputs( "Bad EOFB\n", stderr ); #endif ClrBits( 13 ); (*sp->fill)(buf, thisrun, pa, lastx); UNCACHE_STATE(tif, sp); return ( sp->line ? 1 : -1); /* don't error on badly-terminated strips */ } UNCACHE_STATE(tif, sp); return (1); } #undef SWAP /* * Encode the requested amount of data. */ static int Fax4Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { static const char module[] = "Fax4Encode"; Fax3CodecState *sp = EncoderState(tif); (void) s; if (cc % sp->b.rowbytes) { TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be written"); return (0); } while (cc > 0) { if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels)) return (0); _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes); bp += sp->b.rowbytes; cc -= sp->b.rowbytes; } return (1); } static int Fax4PostEncode(TIFF* tif) { Fax3CodecState *sp = EncoderState(tif); /* terminate strip w/ EOFB */ Fax3PutBits(tif, EOL, 12); Fax3PutBits(tif, EOL, 12); if (sp->bit != 8) Fax3FlushBits(tif, sp); return (1); } int TIFFInitCCITTFax4(TIFF* tif, int scheme) { (void) scheme; if (InitCCITTFax3(tif)) { /* reuse G3 support */ /* * Merge codec-specific tag information. */ if (!_TIFFMergeFields(tif, fax4Fields, TIFFArrayCount(fax4Fields))) { TIFFErrorExt(tif->tif_clientdata, "TIFFInitCCITTFax4", "Merging CCITT Fax 4 codec-specific tags failed"); return 0; } tif->tif_decoderow = Fax4Decode; tif->tif_decodestrip = Fax4Decode; tif->tif_decodetile = Fax4Decode; tif->tif_encoderow = Fax4Encode; tif->tif_encodestrip = Fax4Encode; tif->tif_encodetile = Fax4Encode; tif->tif_postencode = Fax4PostEncode; /* * Suppress RTC at the end of each strip. */ return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC); } else return (0); } /* * CCITT Group 3 1-D Modified Huffman RLE Compression Support. * (Compression algorithms 2 and 32771) */ /* * Decode the requested amount of RLE-encoded data. */ static int Fax3DecodeRLE(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) { DECLARE_STATE(tif, sp, "Fax3DecodeRLE"); int mode = sp->b.mode; (void) s; if (occ % sp->b.rowbytes) { TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read"); return (-1); } CACHE_STATE(tif, sp); thisrun = sp->curruns; while (occ > 0) { a0 = 0; RunLength = 0; pa = thisrun; #ifdef FAX3_DEBUG printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail); printf("-------------------- %d\n", tif->tif_row); fflush(stdout); #endif EXPAND1D(EOFRLE); (*sp->fill)(buf, thisrun, pa, lastx); /* * Cleanup at the end of the row. */ if (mode & FAXMODE_BYTEALIGN) { int n = BitsAvail - (BitsAvail &~ 7); ClrBits(n); } else if (mode & FAXMODE_WORDALIGN) { int n = BitsAvail - (BitsAvail &~ 15); ClrBits(n); if (BitsAvail == 0 && !isAligned(cp, uint16)) cp++; } buf += sp->b.rowbytes; occ -= sp->b.rowbytes; sp->line++; continue; EOFRLE: /* premature EOF */ (*sp->fill)(buf, thisrun, pa, lastx); UNCACHE_STATE(tif, sp); return (-1); } UNCACHE_STATE(tif, sp); return (1); } int TIFFInitCCITTRLE(TIFF* tif, int scheme) { (void) scheme; if (InitCCITTFax3(tif)) { /* reuse G3 support */ tif->tif_decoderow = Fax3DecodeRLE; tif->tif_decodestrip = Fax3DecodeRLE; tif->tif_decodetile = Fax3DecodeRLE; /* * Suppress RTC+EOLs when encoding and byte-align data. */ return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_BYTEALIGN); } else return (0); } int TIFFInitCCITTRLEW(TIFF* tif, int scheme) { (void) scheme; if (InitCCITTFax3(tif)) { /* reuse G3 support */ tif->tif_decoderow = Fax3DecodeRLE; tif->tif_decodestrip = Fax3DecodeRLE; tif->tif_decodetile = Fax3DecodeRLE; /* * Suppress RTC+EOLs when encoding and word-align data. */ return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_WORDALIGN); } else return (0); } #endif /* CCITT_SUPPORT */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_read.c0000644000212300117540000010061011775635422012741 00000000000000/* $Id: tif_read.c,v 1.41 2012-07-06 19:22:58 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * Scanline-oriented Read Support */ #include "tiffiop.h" #include int TIFFFillStrip(TIFF* tif, uint32 strip); int TIFFFillTile(TIFF* tif, uint32 tile); static int TIFFStartStrip(TIFF* tif, uint32 strip); static int TIFFStartTile(TIFF* tif, uint32 tile); static int TIFFCheckRead(TIFF*, int); static tmsize_t TIFFReadRawStrip1(TIFF* tif, uint32 strip, void* buf, tmsize_t size,const char* module); #define NOSTRIP ((uint32)(-1)) /* undefined state */ #define NOTILE ((uint32)(-1)) /* undefined state */ static int TIFFFillStripPartial( TIFF *tif, int strip, tmsize_t read_ahead, int restart ) { static const char module[] = "TIFFFillStripPartial"; register TIFFDirectory *td = &tif->tif_dir; uint64 unused_data; uint64 read_offset; tmsize_t cc, to_read; /* tmsize_t bytecountm; */ if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) return 0; /* * Expand raw data buffer, if needed, to hold data * strip coming from file (perhaps should set upper * bound on the size of a buffer we'll use?). */ /* bytecountm=(tmsize_t) td->td_stripbytecount[strip]; */ if (read_ahead*2 > tif->tif_rawdatasize) { assert( restart ); tif->tif_curstrip = NOSTRIP; if ((tif->tif_flags & TIFF_MYBUFFER) == 0) { TIFFErrorExt(tif->tif_clientdata, module, "Data buffer too small to hold part of strip %lu", (unsigned long) strip); return (0); } if (!TIFFReadBufferSetup(tif, 0, read_ahead*2)) return (0); } if( restart ) { tif->tif_rawdataloaded = 0; tif->tif_rawdataoff = 0; } /* ** If we are reading more data, move any unused data to the ** start of the buffer. */ if( tif->tif_rawdataloaded > 0 ) unused_data = tif->tif_rawdataloaded - (tif->tif_rawcp - tif->tif_rawdata); else unused_data = 0; if( unused_data > 0 ) { assert((tif->tif_flags&TIFF_BUFFERMMAP)==0); memmove( tif->tif_rawdata, tif->tif_rawcp, unused_data ); } /* ** Seek to the point in the file where more data should be read. */ read_offset = td->td_stripoffset[strip] + tif->tif_rawdataoff + tif->tif_rawdataloaded; if (!SeekOK(tif, read_offset)) { TIFFErrorExt(tif->tif_clientdata, module, "Seek error at scanline %lu, strip %lu", (unsigned long) tif->tif_row, (unsigned long) strip); return 0; } /* ** How much do we want to read? */ to_read = tif->tif_rawdatasize - unused_data; if( (uint64) to_read > td->td_stripbytecount[strip] - tif->tif_rawdataoff - tif->tif_rawdataloaded ) { to_read = td->td_stripbytecount[strip] - tif->tif_rawdataoff - tif->tif_rawdataloaded; } assert((tif->tif_flags&TIFF_BUFFERMMAP)==0); cc = TIFFReadFile(tif, tif->tif_rawdata + unused_data, to_read); if (cc != to_read) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Read error at scanline %lu; got %I64u bytes, expected %I64u", (unsigned long) tif->tif_row, (unsigned __int64) cc, (unsigned __int64) to_read); #else TIFFErrorExt(tif->tif_clientdata, module, "Read error at scanline %lu; got %llu bytes, expected %llu", (unsigned long) tif->tif_row, (unsigned long long) cc, (unsigned long long) to_read); #endif return 0; } tif->tif_rawdataoff = tif->tif_rawdataoff + tif->tif_rawdataloaded - unused_data ; tif->tif_rawdataloaded = unused_data + to_read; tif->tif_rawcp = tif->tif_rawdata; if (!isFillOrder(tif, td->td_fillorder) && (tif->tif_flags & TIFF_NOBITREV) == 0) { assert((tif->tif_flags&TIFF_BUFFERMMAP)==0); TIFFReverseBits(tif->tif_rawdata + unused_data, to_read ); } /* ** When starting a strip from the beginning we need to ** restart the decoder. */ if( restart ) return TIFFStartStrip(tif, strip); else return 1; } /* * Seek to a random row+sample in a file. * * Only used by TIFFReadScanline, and is only used on * strip organized files. We do some tricky stuff to try * and avoid reading the whole compressed raw data for big * strips. */ static int TIFFSeek(TIFF* tif, uint32 row, uint16 sample ) { register TIFFDirectory *td = &tif->tif_dir; uint32 strip; int whole_strip; tmsize_t read_ahead = 0; /* ** Establish what strip we are working from. */ if (row >= td->td_imagelength) { /* out of range */ TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%lu: Row out of range, max %lu", (unsigned long) row, (unsigned long) td->td_imagelength); return (0); } if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { if (sample >= td->td_samplesperpixel) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%lu: Sample out of range, max %lu", (unsigned long) sample, (unsigned long) td->td_samplesperpixel); return (0); } strip = (uint32)sample*td->td_stripsperimage + row/td->td_rowsperstrip; } else strip = row / td->td_rowsperstrip; /* * Do we want to treat this strip as one whole chunk or * read it a few lines at a time? */ #if defined(CHUNKY_STRIP_READ_SUPPORT) if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) return 0; whole_strip = tif->tif_dir.td_stripbytecount[strip] < 10 || isMapped(tif); #else whole_strip = 1; #endif if( !whole_strip ) { read_ahead = tif->tif_scanlinesize * 16 + 5000; } /* * If we haven't loaded this strip, do so now, possibly * only reading the first part. */ if (strip != tif->tif_curstrip) { /* different strip, refill */ if( whole_strip ) { if (!TIFFFillStrip(tif, strip)) return (0); } else { if( !TIFFFillStripPartial(tif,strip,read_ahead,1) ) return 0; } } /* ** If we already have some data loaded, do we need to read some more? */ else if( !whole_strip ) { if( ((tif->tif_rawdata + tif->tif_rawdataloaded) - tif->tif_rawcp) < read_ahead && (uint64) tif->tif_rawdataoff+tif->tif_rawdataloaded < td->td_stripbytecount[strip] ) { if( !TIFFFillStripPartial(tif,strip,read_ahead,0) ) return 0; } } if (row < tif->tif_row) { /* * Moving backwards within the same strip: backup * to the start and then decode forward (below). * * NB: If you're planning on lots of random access within a * strip, it's better to just read and decode the entire * strip, and then access the decoded data in a random fashion. */ if( tif->tif_rawdataoff != 0 ) { if( !TIFFFillStripPartial(tif,strip,read_ahead,1) ) return 0; } else { if (!TIFFStartStrip(tif, strip)) return (0); } } if (row != tif->tif_row) { /* * Seek forward to the desired row. */ /* TODO: Will this really work with partial buffers? */ if (!(*tif->tif_seek)(tif, row - tif->tif_row)) return (0); tif->tif_row = row; } return (1); } int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample) { int e; if (!TIFFCheckRead(tif, 0)) return (-1); if( (e = TIFFSeek(tif, row, sample)) != 0) { /* * Decompress desired row into user buffer. */ e = (*tif->tif_decoderow) (tif, (uint8*) buf, tif->tif_scanlinesize, sample); /* we are now poised at the beginning of the next row */ tif->tif_row = row + 1; if (e) (*tif->tif_postdecode)(tif, (uint8*) buf, tif->tif_scanlinesize); } return (e > 0 ? 1 : -1); } /* * Read a strip of data and decompress the specified * amount into the user-supplied buffer. */ tmsize_t TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size) { static const char module[] = "TIFFReadEncodedStrip"; TIFFDirectory *td = &tif->tif_dir; uint32 rowsperstrip; uint32 stripsperplane; uint32 stripinplane; uint16 plane; uint32 rows; tmsize_t stripsize; if (!TIFFCheckRead(tif,0)) return((tmsize_t)(-1)); if (strip>=td->td_nstrips) { TIFFErrorExt(tif->tif_clientdata,module, "%lu: Strip out of range, max %lu",(unsigned long)strip, (unsigned long)td->td_nstrips); return((tmsize_t)(-1)); } /* * Calculate the strip size according to the number of * rows in the strip (check for truncated last strip on any * of the separations). */ rowsperstrip=td->td_rowsperstrip; if (rowsperstrip>td->td_imagelength) rowsperstrip=td->td_imagelength; stripsperplane=((td->td_imagelength+rowsperstrip-1)/rowsperstrip); stripinplane=(strip%stripsperplane); plane=(strip/stripsperplane); rows=td->td_imagelength-stripinplane*rowsperstrip; if (rows>rowsperstrip) rows=rowsperstrip; stripsize=TIFFVStripSize(tif,rows); if (stripsize==0) return((tmsize_t)(-1)); if ((size!=(tmsize_t)(-1))&&(sizetif_decodestrip)(tif,buf,stripsize,plane)<=0) return((tmsize_t)(-1)); (*tif->tif_postdecode)(tif,buf,stripsize); return(stripsize); } static tmsize_t TIFFReadRawStrip1(TIFF* tif, uint32 strip, void* buf, tmsize_t size, const char* module) { TIFFDirectory *td = &tif->tif_dir; if (!_TIFFFillStriles( tif )) return ((tmsize_t)(-1)); assert((tif->tif_flags&TIFF_NOREADRAW)==0); if (!isMapped(tif)) { tmsize_t cc; if (!SeekOK(tif, td->td_stripoffset[strip])) { TIFFErrorExt(tif->tif_clientdata, module, "Seek error at scanline %lu, strip %lu", (unsigned long) tif->tif_row, (unsigned long) strip); return ((tmsize_t)(-1)); } cc = TIFFReadFile(tif, buf, size); if (cc != size) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Read error at scanline %lu; got %I64u bytes, expected %I64u", (unsigned long) tif->tif_row, (unsigned __int64) cc, (unsigned __int64) size); #else TIFFErrorExt(tif->tif_clientdata, module, "Read error at scanline %lu; got %llu bytes, expected %llu", (unsigned long) tif->tif_row, (unsigned long long) cc, (unsigned long long) size); #endif return ((tmsize_t)(-1)); } } else { tmsize_t ma,mb; tmsize_t n; ma=(tmsize_t)td->td_stripoffset[strip]; mb=ma+size; if (((uint64)ma!=td->td_stripoffset[strip])||(ma>tif->tif_size)) n=0; else if ((mbtif->tif_size)) n=tif->tif_size-ma; else n=size; if (n!=size) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Read error at scanline %lu, strip %lu; got %I64u bytes, expected %I64u", (unsigned long) tif->tif_row, (unsigned long) strip, (unsigned __int64) n, (unsigned __int64) size); #else TIFFErrorExt(tif->tif_clientdata, module, "Read error at scanline %lu, strip %lu; got %llu bytes, expected %llu", (unsigned long) tif->tif_row, (unsigned long) strip, (unsigned long long) n, (unsigned long long) size); #endif return ((tmsize_t)(-1)); } _TIFFmemcpy(buf, tif->tif_base + ma, size); } return (size); } /* * Read a strip of data from the file. */ tmsize_t TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size) { static const char module[] = "TIFFReadRawStrip"; TIFFDirectory *td = &tif->tif_dir; uint64 bytecount; tmsize_t bytecountm; if (!TIFFCheckRead(tif, 0)) return ((tmsize_t)(-1)); if (strip >= td->td_nstrips) { TIFFErrorExt(tif->tif_clientdata, module, "%lu: Strip out of range, max %lu", (unsigned long) strip, (unsigned long) td->td_nstrips); return ((tmsize_t)(-1)); } if (tif->tif_flags&TIFF_NOREADRAW) { TIFFErrorExt(tif->tif_clientdata, module, "Compression scheme does not support access to raw uncompressed data"); return ((tmsize_t)(-1)); } bytecount = td->td_stripbytecount[strip]; if (bytecount <= 0) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "%I64u: Invalid strip byte count, strip %lu", (unsigned __int64) bytecount, (unsigned long) strip); #else TIFFErrorExt(tif->tif_clientdata, module, "%llu: Invalid strip byte count, strip %lu", (unsigned long long) bytecount, (unsigned long) strip); #endif return ((tmsize_t)(-1)); } bytecountm = (tmsize_t)bytecount; if ((uint64)bytecountm!=bytecount) { TIFFErrorExt(tif->tif_clientdata, module, "Integer overflow"); return ((tmsize_t)(-1)); } if (size != (tmsize_t)(-1) && size < bytecountm) bytecountm = size; return (TIFFReadRawStrip1(tif, strip, buf, bytecountm, module)); } /* * Read the specified strip and setup for decoding. The data buffer is * expanded, as necessary, to hold the strip's data. */ int TIFFFillStrip(TIFF* tif, uint32 strip) { static const char module[] = "TIFFFillStrip"; TIFFDirectory *td = &tif->tif_dir; if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) return 0; if ((tif->tif_flags&TIFF_NOREADRAW)==0) { uint64 bytecount = td->td_stripbytecount[strip]; if (bytecount <= 0) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Invalid strip byte count %I64u, strip %lu", (unsigned __int64) bytecount, (unsigned long) strip); #else TIFFErrorExt(tif->tif_clientdata, module, "Invalid strip byte count %llu, strip %lu", (unsigned long long) bytecount, (unsigned long) strip); #endif return (0); } if (isMapped(tif) && (isFillOrder(tif, td->td_fillorder) || (tif->tif_flags & TIFF_NOBITREV))) { /* * The image is mapped into memory and we either don't * need to flip bits or the compression routine is * going to handle this operation itself. In this * case, avoid copying the raw data and instead just * reference the data from the memory mapped file * image. This assumes that the decompression * routines do not modify the contents of the raw data * buffer (if they try to, the application will get a * fault since the file is mapped read-only). */ if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) { _TIFFfree(tif->tif_rawdata); tif->tif_rawdata = NULL; tif->tif_rawdatasize = 0; } tif->tif_flags &= ~TIFF_MYBUFFER; /* * We must check for overflow, potentially causing * an OOB read. Instead of simple * * td->td_stripoffset[strip]+bytecount > tif->tif_size * * comparison (which can overflow) we do the following * two comparisons: */ if (bytecount > (uint64)tif->tif_size || td->td_stripoffset[strip] > (uint64)tif->tif_size - bytecount) { /* * This error message might seem strange, but * it's what would happen if a read were done * instead. */ #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Read error on strip %lu; " "got %I64u bytes, expected %I64u", (unsigned long) strip, (unsigned __int64) tif->tif_size - td->td_stripoffset[strip], (unsigned __int64) bytecount); #else TIFFErrorExt(tif->tif_clientdata, module, "Read error on strip %lu; " "got %llu bytes, expected %llu", (unsigned long) strip, (unsigned long long) tif->tif_size - td->td_stripoffset[strip], (unsigned long long) bytecount); #endif tif->tif_curstrip = NOSTRIP; return (0); } tif->tif_rawdatasize = (tmsize_t)bytecount; tif->tif_rawdata = tif->tif_base + (tmsize_t)td->td_stripoffset[strip]; tif->tif_rawdataoff = 0; tif->tif_rawdataloaded = (tmsize_t) bytecount; /* * When we have tif_rawdata reference directly into the memory mapped file * we need to be pretty careful about how we use the rawdata. It is not * a general purpose working buffer as it normally otherwise is. So we * keep track of this fact to avoid using it improperly. */ tif->tif_flags |= TIFF_BUFFERMMAP; } else { /* * Expand raw data buffer, if needed, to hold data * strip coming from file (perhaps should set upper * bound on the size of a buffer we'll use?). */ tmsize_t bytecountm; bytecountm=(tmsize_t)bytecount; if ((uint64)bytecountm!=bytecount) { TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow"); return(0); } if (bytecountm > tif->tif_rawdatasize) { tif->tif_curstrip = NOSTRIP; if ((tif->tif_flags & TIFF_MYBUFFER) == 0) { TIFFErrorExt(tif->tif_clientdata, module, "Data buffer too small to hold strip %lu", (unsigned long) strip); return (0); } if (!TIFFReadBufferSetup(tif, 0, bytecountm)) return (0); } if (tif->tif_flags&TIFF_BUFFERMMAP) { tif->tif_curstrip = NOSTRIP; if (!TIFFReadBufferSetup(tif, 0, bytecountm)) return (0); } if (TIFFReadRawStrip1(tif, strip, tif->tif_rawdata, bytecountm, module) != bytecountm) return (0); tif->tif_rawdataoff = 0; tif->tif_rawdataloaded = bytecountm; if (!isFillOrder(tif, td->td_fillorder) && (tif->tif_flags & TIFF_NOBITREV) == 0) TIFFReverseBits(tif->tif_rawdata, bytecountm); } } return (TIFFStartStrip(tif, strip)); } /* * Tile-oriented Read Support * Contributed by Nancy Cam (Silicon Graphics). */ /* * Read and decompress a tile of data. The * tile is selected by the (x,y,z,s) coordinates. */ tmsize_t TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s) { if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s)) return ((tmsize_t)(-1)); return (TIFFReadEncodedTile(tif, TIFFComputeTile(tif, x, y, z, s), buf, (tmsize_t)(-1))); } /* * Read a tile of data and decompress the specified * amount into the user-supplied buffer. */ tmsize_t TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size) { static const char module[] = "TIFFReadEncodedTile"; TIFFDirectory *td = &tif->tif_dir; tmsize_t tilesize = tif->tif_tilesize; if (!TIFFCheckRead(tif, 1)) return ((tmsize_t)(-1)); if (tile >= td->td_nstrips) { TIFFErrorExt(tif->tif_clientdata, module, "%lu: Tile out of range, max %lu", (unsigned long) tile, (unsigned long) td->td_nstrips); return ((tmsize_t)(-1)); } if (size == (tmsize_t)(-1)) size = tilesize; else if (size > tilesize) size = tilesize; if (TIFFFillTile(tif, tile) && (*tif->tif_decodetile)(tif, (uint8*) buf, size, (uint16)(tile/td->td_stripsperimage))) { (*tif->tif_postdecode)(tif, (uint8*) buf, size); return (size); } else return ((tmsize_t)(-1)); } static tmsize_t TIFFReadRawTile1(TIFF* tif, uint32 tile, void* buf, tmsize_t size, const char* module) { TIFFDirectory *td = &tif->tif_dir; if (!_TIFFFillStriles( tif )) return ((tmsize_t)(-1)); assert((tif->tif_flags&TIFF_NOREADRAW)==0); if (!isMapped(tif)) { tmsize_t cc; if (!SeekOK(tif, td->td_stripoffset[tile])) { TIFFErrorExt(tif->tif_clientdata, module, "Seek error at row %lu, col %lu, tile %lu", (unsigned long) tif->tif_row, (unsigned long) tif->tif_col, (unsigned long) tile); return ((tmsize_t)(-1)); } cc = TIFFReadFile(tif, buf, size); if (cc != size) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Read error at row %lu, col %lu; got %I64u bytes, expected %I64u", (unsigned long) tif->tif_row, (unsigned long) tif->tif_col, (unsigned __int64) cc, (unsigned __int64) size); #else TIFFErrorExt(tif->tif_clientdata, module, "Read error at row %lu, col %lu; got %llu bytes, expected %llu", (unsigned long) tif->tif_row, (unsigned long) tif->tif_col, (unsigned long long) cc, (unsigned long long) size); #endif return ((tmsize_t)(-1)); } } else { tmsize_t ma,mb; tmsize_t n; ma=(tmsize_t)td->td_stripoffset[tile]; mb=ma+size; if (((uint64)ma!=td->td_stripoffset[tile])||(ma>tif->tif_size)) n=0; else if ((mbtif->tif_size)) n=tif->tif_size-ma; else n=size; if (n!=size) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Read error at row %lu, col %lu, tile %lu; got %I64u bytes, expected %I64u", (unsigned long) tif->tif_row, (unsigned long) tif->tif_col, (unsigned long) tile, (unsigned __int64) n, (unsigned __int64) size); #else TIFFErrorExt(tif->tif_clientdata, module, "Read error at row %lu, col %lu, tile %lu; got %llu bytes, expected %llu", (unsigned long) tif->tif_row, (unsigned long) tif->tif_col, (unsigned long) tile, (unsigned long long) n, (unsigned long long) size); #endif return ((tmsize_t)(-1)); } _TIFFmemcpy(buf, tif->tif_base + ma, size); } return (size); } /* * Read a tile of data from the file. */ tmsize_t TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size) { static const char module[] = "TIFFReadRawTile"; TIFFDirectory *td = &tif->tif_dir; uint64 bytecount64; tmsize_t bytecountm; if (!TIFFCheckRead(tif, 1)) return ((tmsize_t)(-1)); if (tile >= td->td_nstrips) { TIFFErrorExt(tif->tif_clientdata, module, "%lu: Tile out of range, max %lu", (unsigned long) tile, (unsigned long) td->td_nstrips); return ((tmsize_t)(-1)); } if (tif->tif_flags&TIFF_NOREADRAW) { TIFFErrorExt(tif->tif_clientdata, module, "Compression scheme does not support access to raw uncompressed data"); return ((tmsize_t)(-1)); } bytecount64 = td->td_stripbytecount[tile]; if (size != (tmsize_t)(-1) && (uint64)size < bytecount64) bytecount64 = (uint64)size; bytecountm = (tmsize_t)bytecount64; if ((uint64)bytecountm!=bytecount64) { TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow"); return ((tmsize_t)(-1)); } return (TIFFReadRawTile1(tif, tile, buf, bytecountm, module)); } /* * Read the specified tile and setup for decoding. The data buffer is * expanded, as necessary, to hold the tile's data. */ int TIFFFillTile(TIFF* tif, uint32 tile) { static const char module[] = "TIFFFillTile"; TIFFDirectory *td = &tif->tif_dir; if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) return 0; if ((tif->tif_flags&TIFF_NOREADRAW)==0) { uint64 bytecount = td->td_stripbytecount[tile]; if (bytecount <= 0) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "%I64u: Invalid tile byte count, tile %lu", (unsigned __int64) bytecount, (unsigned long) tile); #else TIFFErrorExt(tif->tif_clientdata, module, "%llu: Invalid tile byte count, tile %lu", (unsigned long long) bytecount, (unsigned long) tile); #endif return (0); } if (isMapped(tif) && (isFillOrder(tif, td->td_fillorder) || (tif->tif_flags & TIFF_NOBITREV))) { /* * The image is mapped into memory and we either don't * need to flip bits or the compression routine is * going to handle this operation itself. In this * case, avoid copying the raw data and instead just * reference the data from the memory mapped file * image. This assumes that the decompression * routines do not modify the contents of the raw data * buffer (if they try to, the application will get a * fault since the file is mapped read-only). */ if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) { _TIFFfree(tif->tif_rawdata); tif->tif_rawdata = NULL; tif->tif_rawdatasize = 0; } tif->tif_flags &= ~TIFF_MYBUFFER; /* * We must check for overflow, potentially causing * an OOB read. Instead of simple * * td->td_stripoffset[tile]+bytecount > tif->tif_size * * comparison (which can overflow) we do the following * two comparisons: */ if (bytecount > (uint64)tif->tif_size || td->td_stripoffset[tile] > (uint64)tif->tif_size - bytecount) { tif->tif_curtile = NOTILE; return (0); } tif->tif_rawdatasize = (tmsize_t)bytecount; tif->tif_rawdata = tif->tif_base + (tmsize_t)td->td_stripoffset[tile]; tif->tif_rawdataoff = 0; tif->tif_rawdataloaded = (tmsize_t) bytecount; tif->tif_flags |= TIFF_BUFFERMMAP; } else { /* * Expand raw data buffer, if needed, to hold data * tile coming from file (perhaps should set upper * bound on the size of a buffer we'll use?). */ tmsize_t bytecountm; bytecountm=(tmsize_t)bytecount; if ((uint64)bytecountm!=bytecount) { TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow"); return(0); } if (bytecountm > tif->tif_rawdatasize) { tif->tif_curtile = NOTILE; if ((tif->tif_flags & TIFF_MYBUFFER) == 0) { TIFFErrorExt(tif->tif_clientdata, module, "Data buffer too small to hold tile %lu", (unsigned long) tile); return (0); } if (!TIFFReadBufferSetup(tif, 0, bytecountm)) return (0); } if (tif->tif_flags&TIFF_BUFFERMMAP) { tif->tif_curtile = NOTILE; if (!TIFFReadBufferSetup(tif, 0, bytecountm)) return (0); } if (TIFFReadRawTile1(tif, tile, tif->tif_rawdata, bytecountm, module) != bytecountm) return (0); tif->tif_rawdataoff = 0; tif->tif_rawdataloaded = bytecountm; if (!isFillOrder(tif, td->td_fillorder) && (tif->tif_flags & TIFF_NOBITREV) == 0) TIFFReverseBits(tif->tif_rawdata, tif->tif_rawdataloaded); } } return (TIFFStartTile(tif, tile)); } /* * Setup the raw data buffer in preparation for * reading a strip of raw data. If the buffer * is specified as zero, then a buffer of appropriate * size is allocated by the library. Otherwise, * the client must guarantee that the buffer is * large enough to hold any individual strip of * raw data. */ int TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size) { static const char module[] = "TIFFReadBufferSetup"; assert((tif->tif_flags&TIFF_NOREADRAW)==0); tif->tif_flags &= ~TIFF_BUFFERMMAP; if (tif->tif_rawdata) { if (tif->tif_flags & TIFF_MYBUFFER) _TIFFfree(tif->tif_rawdata); tif->tif_rawdata = NULL; tif->tif_rawdatasize = 0; } if (bp) { tif->tif_rawdatasize = size; tif->tif_rawdata = (uint8*) bp; tif->tif_flags &= ~TIFF_MYBUFFER; } else { tif->tif_rawdatasize = (tmsize_t)TIFFroundup_64((uint64)size, 1024); if (tif->tif_rawdatasize==0) tif->tif_rawdatasize=(tmsize_t)(-1); tif->tif_rawdata = (uint8*) _TIFFmalloc(tif->tif_rawdatasize); tif->tif_flags |= TIFF_MYBUFFER; } if (tif->tif_rawdata == NULL) { TIFFErrorExt(tif->tif_clientdata, module, "No space for data buffer at scanline %lu", (unsigned long) tif->tif_row); tif->tif_rawdatasize = 0; return (0); } return (1); } /* * Set state to appear as if a * strip has just been read in. */ static int TIFFStartStrip(TIFF* tif, uint32 strip) { TIFFDirectory *td = &tif->tif_dir; if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) return 0; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupdecode)(tif)) return (0); tif->tif_flags |= TIFF_CODERSETUP; } tif->tif_curstrip = strip; tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; tif->tif_flags &= ~TIFF_BUF4WRITE; if (tif->tif_flags&TIFF_NOREADRAW) { tif->tif_rawcp = NULL; tif->tif_rawcc = 0; } else { tif->tif_rawcp = tif->tif_rawdata; tif->tif_rawcc = (tmsize_t)td->td_stripbytecount[strip]; } return ((*tif->tif_predecode)(tif, (uint16)(strip / td->td_stripsperimage))); } /* * Set state to appear as if a * tile has just been read in. */ static int TIFFStartTile(TIFF* tif, uint32 tile) { TIFFDirectory *td = &tif->tif_dir; if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) return 0; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupdecode)(tif)) return (0); tif->tif_flags |= TIFF_CODERSETUP; } tif->tif_curtile = tile; tif->tif_row = (tile % TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth)) * td->td_tilelength; tif->tif_col = (tile % TIFFhowmany_32(td->td_imagelength, td->td_tilelength)) * td->td_tilewidth; tif->tif_flags &= ~TIFF_BUF4WRITE; if (tif->tif_flags&TIFF_NOREADRAW) { tif->tif_rawcp = NULL; tif->tif_rawcc = 0; } else { tif->tif_rawcp = tif->tif_rawdata; tif->tif_rawcc = (tmsize_t)td->td_stripbytecount[tile]; } return ((*tif->tif_predecode)(tif, (uint16)(tile/td->td_stripsperimage))); } static int TIFFCheckRead(TIFF* tif, int tiles) { if (tif->tif_mode == O_WRONLY) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "File not open for reading"); return (0); } if (tiles ^ isTiled(tif)) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, tiles ? "Can not read tiles from a stripped image" : "Can not read scanlines from a tiled image"); return (0); } return (1); } void _TIFFNoPostDecode(TIFF* tif, uint8* buf, tmsize_t cc) { (void) tif; (void) buf; (void) cc; } void _TIFFSwab16BitData(TIFF* tif, uint8* buf, tmsize_t cc) { (void) tif; assert((cc & 1) == 0); TIFFSwabArrayOfShort((uint16*) buf, cc/2); } void _TIFFSwab24BitData(TIFF* tif, uint8* buf, tmsize_t cc) { (void) tif; assert((cc % 3) == 0); TIFFSwabArrayOfTriples((uint8*) buf, cc/3); } void _TIFFSwab32BitData(TIFF* tif, uint8* buf, tmsize_t cc) { (void) tif; assert((cc & 3) == 0); TIFFSwabArrayOfLong((uint32*) buf, cc/4); } void _TIFFSwab64BitData(TIFF* tif, uint8* buf, tmsize_t cc) { (void) tif; assert((cc & 7) == 0); TIFFSwabArrayOfDouble((double*) buf, cc/8); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_lzw.c0000644000212300117540000007527511545706361012660 00000000000000/* $Id: tif_lzw.c,v 1.45 2011-04-02 20:54:09 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef LZW_SUPPORT /* * TIFF Library. * Rev 5.0 Lempel-Ziv & Welch Compression Support * * This code is derived from the compress program whose code is * derived from software contributed to Berkeley by James A. Woods, * derived from original work by Spencer Thomas and Joseph Orost. * * The original Berkeley copyright notice appears below in its entirety. */ #include "tif_predict.h" #include /* * NB: The 5.0 spec describes a different algorithm than Aldus * implements. Specifically, Aldus does code length transitions * one code earlier than should be done (for real LZW). * Earlier versions of this library implemented the correct * LZW algorithm, but emitted codes in a bit order opposite * to the TIFF spec. Thus, to maintain compatibility w/ Aldus * we interpret MSB-LSB ordered codes to be images written w/ * old versions of this library, but otherwise adhere to the * Aldus "off by one" algorithm. * * Future revisions to the TIFF spec are expected to "clarify this issue". */ #define LZW_COMPAT /* include backwards compatibility code */ /* * Each strip of data is supposed to be terminated by a CODE_EOI. * If the following #define is included, the decoder will also * check for end-of-strip w/o seeing this code. This makes the * library more robust, but also slower. */ #define LZW_CHECKEOS /* include checks for strips w/o EOI code */ #define MAXCODE(n) ((1L<<(n))-1) /* * The TIFF spec specifies that encoded bit * strings range from 9 to 12 bits. */ #define BITS_MIN 9 /* start with 9 bits */ #define BITS_MAX 12 /* max of 12 bit strings */ /* predefined codes */ #define CODE_CLEAR 256 /* code to clear string table */ #define CODE_EOI 257 /* end-of-information code */ #define CODE_FIRST 258 /* first free code entry */ #define CODE_MAX MAXCODE(BITS_MAX) #define HSIZE 9001L /* 91% occupancy */ #define HSHIFT (13-8) #ifdef LZW_COMPAT /* NB: +1024 is for compatibility with old files */ #define CSIZE (MAXCODE(BITS_MAX)+1024L) #else #define CSIZE (MAXCODE(BITS_MAX)+1L) #endif /* * State block for each open TIFF file using LZW * compression/decompression. Note that the predictor * state block must be first in this data structure. */ typedef struct { TIFFPredictorState predict; /* predictor super class */ unsigned short nbits; /* # of bits/code */ unsigned short maxcode; /* maximum code for lzw_nbits */ unsigned short free_ent; /* next free entry in hash table */ long nextdata; /* next bits of i/o */ long nextbits; /* # of valid bits in lzw_nextdata */ int rw_mode; /* preserve rw_mode from init */ } LZWBaseState; #define lzw_nbits base.nbits #define lzw_maxcode base.maxcode #define lzw_free_ent base.free_ent #define lzw_nextdata base.nextdata #define lzw_nextbits base.nextbits /* * Encoding-specific state. */ typedef uint16 hcode_t; /* codes fit in 16 bits */ typedef struct { long hash; hcode_t code; } hash_t; /* * Decoding-specific state. */ typedef struct code_ent { struct code_ent *next; unsigned short length; /* string len, including this token */ unsigned char value; /* data value */ unsigned char firstchar; /* first token of string */ } code_t; typedef int (*decodeFunc)(TIFF*, uint8*, tmsize_t, uint16); typedef struct { LZWBaseState base; /* Decoding specific data */ long dec_nbitsmask; /* lzw_nbits 1 bits, right adjusted */ long dec_restart; /* restart count */ #ifdef LZW_CHECKEOS uint64 dec_bitsleft; /* available bits in raw data */ #endif decodeFunc dec_decode; /* regular or backwards compatible */ code_t* dec_codep; /* current recognized code */ code_t* dec_oldcodep; /* previously recognized code */ code_t* dec_free_entp; /* next free entry */ code_t* dec_maxcodep; /* max available entry */ code_t* dec_codetab; /* kept separate for small machines */ /* Encoding specific data */ int enc_oldcode; /* last code encountered */ long enc_checkpoint; /* point at which to clear table */ #define CHECK_GAP 10000 /* enc_ratio check interval */ long enc_ratio; /* current compression ratio */ long enc_incount; /* (input) data bytes encoded */ long enc_outcount; /* encoded (output) bytes */ uint8* enc_rawlimit; /* bound on tif_rawdata buffer */ hash_t* enc_hashtab; /* kept separate for small machines */ } LZWCodecState; #define LZWState(tif) ((LZWBaseState*) (tif)->tif_data) #define DecoderState(tif) ((LZWCodecState*) LZWState(tif)) #define EncoderState(tif) ((LZWCodecState*) LZWState(tif)) static int LZWDecode(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s); #ifdef LZW_COMPAT static int LZWDecodeCompat(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s); #endif static void cl_hash(LZWCodecState*); /* * LZW Decoder. */ #ifdef LZW_CHECKEOS /* * This check shouldn't be necessary because each * strip is suppose to be terminated with CODE_EOI. */ #define NextCode(_tif, _sp, _bp, _code, _get) { \ if ((_sp)->dec_bitsleft < (uint64)nbits) { \ TIFFWarningExt(_tif->tif_clientdata, module, \ "LZWDecode: Strip %d not terminated with EOI code", \ _tif->tif_curstrip); \ _code = CODE_EOI; \ } else { \ _get(_sp,_bp,_code); \ (_sp)->dec_bitsleft -= nbits; \ } \ } #else #define NextCode(tif, sp, bp, code, get) get(sp, bp, code) #endif static int LZWFixupTags(TIFF* tif) { (void) tif; return (1); } static int LZWSetupDecode(TIFF* tif) { static const char module[] = "LZWSetupDecode"; LZWCodecState* sp = DecoderState(tif); int code; if( sp == NULL ) { /* * Allocate state block so tag methods have storage to record * values. */ tif->tif_data = (uint8*) _TIFFmalloc(sizeof(LZWCodecState)); if (tif->tif_data == NULL) { TIFFErrorExt(tif->tif_clientdata, module, "No space for LZW state block"); return (0); } DecoderState(tif)->dec_codetab = NULL; DecoderState(tif)->dec_decode = NULL; /* * Setup predictor setup. */ (void) TIFFPredictorInit(tif); sp = DecoderState(tif); } assert(sp != NULL); if (sp->dec_codetab == NULL) { sp->dec_codetab = (code_t*)_TIFFmalloc(CSIZE*sizeof (code_t)); if (sp->dec_codetab == NULL) { TIFFErrorExt(tif->tif_clientdata, module, "No space for LZW code table"); return (0); } /* * Pre-load the table. */ code = 255; do { sp->dec_codetab[code].value = code; sp->dec_codetab[code].firstchar = code; sp->dec_codetab[code].length = 1; sp->dec_codetab[code].next = NULL; } while (code--); /* * Zero-out the unused entries */ _TIFFmemset(&sp->dec_codetab[CODE_CLEAR], 0, (CODE_FIRST - CODE_CLEAR) * sizeof (code_t)); } return (1); } /* * Setup state for decoding a strip. */ static int LZWPreDecode(TIFF* tif, uint16 s) { static const char module[] = "LZWPreDecode"; LZWCodecState *sp = DecoderState(tif); (void) s; assert(sp != NULL); if( sp->dec_codetab == NULL ) { tif->tif_setupdecode( tif ); } /* * Check for old bit-reversed codes. */ if (tif->tif_rawdata[0] == 0 && (tif->tif_rawdata[1] & 0x1)) { #ifdef LZW_COMPAT if (!sp->dec_decode) { TIFFWarningExt(tif->tif_clientdata, module, "Old-style LZW codes, convert file"); /* * Override default decoding methods with * ones that deal with the old coding. * Otherwise the predictor versions set * above will call the compatibility routines * through the dec_decode method. */ tif->tif_decoderow = LZWDecodeCompat; tif->tif_decodestrip = LZWDecodeCompat; tif->tif_decodetile = LZWDecodeCompat; /* * If doing horizontal differencing, must * re-setup the predictor logic since we * switched the basic decoder methods... */ (*tif->tif_setupdecode)(tif); sp->dec_decode = LZWDecodeCompat; } sp->lzw_maxcode = MAXCODE(BITS_MIN); #else /* !LZW_COMPAT */ if (!sp->dec_decode) { TIFFErrorExt(tif->tif_clientdata, module, "Old-style LZW codes not supported"); sp->dec_decode = LZWDecode; } return (0); #endif/* !LZW_COMPAT */ } else { sp->lzw_maxcode = MAXCODE(BITS_MIN)-1; sp->dec_decode = LZWDecode; } sp->lzw_nbits = BITS_MIN; sp->lzw_nextbits = 0; sp->lzw_nextdata = 0; sp->dec_restart = 0; sp->dec_nbitsmask = MAXCODE(BITS_MIN); #ifdef LZW_CHECKEOS sp->dec_bitsleft = ((uint64)tif->tif_rawcc) << 3; #endif sp->dec_free_entp = sp->dec_codetab + CODE_FIRST; /* * Zero entries that are not yet filled in. We do * this to guard against bogus input data that causes * us to index into undefined entries. If you can * come up with a way to safely bounds-check input codes * while decoding then you can remove this operation. */ _TIFFmemset(sp->dec_free_entp, 0, (CSIZE-CODE_FIRST)*sizeof (code_t)); sp->dec_oldcodep = &sp->dec_codetab[-1]; sp->dec_maxcodep = &sp->dec_codetab[sp->dec_nbitsmask-1]; return (1); } /* * Decode a "hunk of data". */ #define GetNextCode(sp, bp, code) { \ nextdata = (nextdata<<8) | *(bp)++; \ nextbits += 8; \ if (nextbits < nbits) { \ nextdata = (nextdata<<8) | *(bp)++; \ nextbits += 8; \ } \ code = (hcode_t)((nextdata >> (nextbits-nbits)) & nbitsmask); \ nextbits -= nbits; \ } static void codeLoop(TIFF* tif, const char* module) { TIFFErrorExt(tif->tif_clientdata, module, "Bogus encoding, loop in the code table; scanline %d", tif->tif_row); } static int LZWDecode(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s) { static const char module[] = "LZWDecode"; LZWCodecState *sp = DecoderState(tif); char *op = (char*) op0; long occ = (long) occ0; char *tp; unsigned char *bp; hcode_t code; int len; long nbits, nextbits, nextdata, nbitsmask; code_t *codep, *free_entp, *maxcodep, *oldcodep; (void) s; assert(sp != NULL); assert(sp->dec_codetab != NULL); /* Fail if value does not fit in long. */ if ((tmsize_t) occ != occ0) return (0); /* * Restart interrupted output operation. */ if (sp->dec_restart) { long residue; codep = sp->dec_codep; residue = codep->length - sp->dec_restart; if (residue > occ) { /* * Residue from previous decode is sufficient * to satisfy decode request. Skip to the * start of the decoded string, place decoded * values in the output buffer, and return. */ sp->dec_restart += occ; do { codep = codep->next; } while (--residue > occ && codep); if (codep) { tp = op + occ; do { *--tp = codep->value; codep = codep->next; } while (--occ && codep); } return (1); } /* * Residue satisfies only part of the decode request. */ op += residue, occ -= residue; tp = op; do { int t; --tp; t = codep->value; codep = codep->next; *tp = t; } while (--residue && codep); sp->dec_restart = 0; } bp = (unsigned char *)tif->tif_rawcp; nbits = sp->lzw_nbits; nextdata = sp->lzw_nextdata; nextbits = sp->lzw_nextbits; nbitsmask = sp->dec_nbitsmask; oldcodep = sp->dec_oldcodep; free_entp = sp->dec_free_entp; maxcodep = sp->dec_maxcodep; while (occ > 0) { NextCode(tif, sp, bp, code, GetNextCode); if (code == CODE_EOI) break; if (code == CODE_CLEAR) { free_entp = sp->dec_codetab + CODE_FIRST; _TIFFmemset(free_entp, 0, (CSIZE - CODE_FIRST) * sizeof (code_t)); nbits = BITS_MIN; nbitsmask = MAXCODE(BITS_MIN); maxcodep = sp->dec_codetab + nbitsmask-1; NextCode(tif, sp, bp, code, GetNextCode); if (code == CODE_EOI) break; if (code >= CODE_CLEAR) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "LZWDecode: Corrupted LZW table at scanline %d", tif->tif_row); return (0); } *op++ = (char)code, occ--; oldcodep = sp->dec_codetab + code; continue; } codep = sp->dec_codetab + code; /* * Add the new entry to the code table. */ if (free_entp < &sp->dec_codetab[0] || free_entp >= &sp->dec_codetab[CSIZE]) { TIFFErrorExt(tif->tif_clientdata, module, "Corrupted LZW table at scanline %d", tif->tif_row); return (0); } free_entp->next = oldcodep; if (free_entp->next < &sp->dec_codetab[0] || free_entp->next >= &sp->dec_codetab[CSIZE]) { TIFFErrorExt(tif->tif_clientdata, module, "Corrupted LZW table at scanline %d", tif->tif_row); return (0); } free_entp->firstchar = free_entp->next->firstchar; free_entp->length = free_entp->next->length+1; free_entp->value = (codep < free_entp) ? codep->firstchar : free_entp->firstchar; if (++free_entp > maxcodep) { if (++nbits > BITS_MAX) /* should not happen */ nbits = BITS_MAX; nbitsmask = MAXCODE(nbits); maxcodep = sp->dec_codetab + nbitsmask-1; } oldcodep = codep; if (code >= 256) { /* * Code maps to a string, copy string * value to output (written in reverse). */ if(codep->length == 0) { TIFFErrorExt(tif->tif_clientdata, module, "Wrong length of decoded string: " "data probably corrupted at scanline %d", tif->tif_row); return (0); } if (codep->length > occ) { /* * String is too long for decode buffer, * locate portion that will fit, copy to * the decode buffer, and setup restart * logic for the next decoding call. */ sp->dec_codep = codep; do { codep = codep->next; } while (codep && codep->length > occ); if (codep) { sp->dec_restart = (long)occ; tp = op + occ; do { *--tp = codep->value; codep = codep->next; } while (--occ && codep); if (codep) codeLoop(tif, module); } break; } len = codep->length; tp = op + len; do { int t; --tp; t = codep->value; codep = codep->next; *tp = t; } while (codep && tp > op); if (codep) { codeLoop(tif, module); break; } assert(occ >= len); op += len, occ -= len; } else *op++ = (char)code, occ--; } tif->tif_rawcp = (uint8*) bp; sp->lzw_nbits = (unsigned short) nbits; sp->lzw_nextdata = nextdata; sp->lzw_nextbits = nextbits; sp->dec_nbitsmask = nbitsmask; sp->dec_oldcodep = oldcodep; sp->dec_free_entp = free_entp; sp->dec_maxcodep = maxcodep; if (occ > 0) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at scanline %d (short %I64d bytes)", tif->tif_row, (unsigned __int64) occ); #else TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at scanline %d (short %llu bytes)", tif->tif_row, (unsigned long long) occ); #endif return (0); } return (1); } #ifdef LZW_COMPAT /* * Decode a "hunk of data" for old images. */ #define GetNextCodeCompat(sp, bp, code) { \ nextdata |= (unsigned long) *(bp)++ << nextbits; \ nextbits += 8; \ if (nextbits < nbits) { \ nextdata |= (unsigned long) *(bp)++ << nextbits;\ nextbits += 8; \ } \ code = (hcode_t)(nextdata & nbitsmask); \ nextdata >>= nbits; \ nextbits -= nbits; \ } static int LZWDecodeCompat(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s) { static const char module[] = "LZWDecodeCompat"; LZWCodecState *sp = DecoderState(tif); char *op = (char*) op0; long occ = (long) occ0; char *tp; unsigned char *bp; int code, nbits; long nextbits, nextdata, nbitsmask; code_t *codep, *free_entp, *maxcodep, *oldcodep; (void) s; assert(sp != NULL); /* Fail if value does not fit in long. */ if ((tmsize_t) occ != occ0) return (0); /* * Restart interrupted output operation. */ if (sp->dec_restart) { long residue; codep = sp->dec_codep; residue = codep->length - sp->dec_restart; if (residue > occ) { /* * Residue from previous decode is sufficient * to satisfy decode request. Skip to the * start of the decoded string, place decoded * values in the output buffer, and return. */ sp->dec_restart += occ; do { codep = codep->next; } while (--residue > occ); tp = op + occ; do { *--tp = codep->value; codep = codep->next; } while (--occ); return (1); } /* * Residue satisfies only part of the decode request. */ op += residue, occ -= residue; tp = op; do { *--tp = codep->value; codep = codep->next; } while (--residue); sp->dec_restart = 0; } bp = (unsigned char *)tif->tif_rawcp; nbits = sp->lzw_nbits; nextdata = sp->lzw_nextdata; nextbits = sp->lzw_nextbits; nbitsmask = sp->dec_nbitsmask; oldcodep = sp->dec_oldcodep; free_entp = sp->dec_free_entp; maxcodep = sp->dec_maxcodep; while (occ > 0) { NextCode(tif, sp, bp, code, GetNextCodeCompat); if (code == CODE_EOI) break; if (code == CODE_CLEAR) { free_entp = sp->dec_codetab + CODE_FIRST; _TIFFmemset(free_entp, 0, (CSIZE - CODE_FIRST) * sizeof (code_t)); nbits = BITS_MIN; nbitsmask = MAXCODE(BITS_MIN); maxcodep = sp->dec_codetab + nbitsmask; NextCode(tif, sp, bp, code, GetNextCodeCompat); if (code == CODE_EOI) break; if (code >= CODE_CLEAR) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "LZWDecode: Corrupted LZW table at scanline %d", tif->tif_row); return (0); } *op++ = code, occ--; oldcodep = sp->dec_codetab + code; continue; } codep = sp->dec_codetab + code; /* * Add the new entry to the code table. */ if (free_entp < &sp->dec_codetab[0] || free_entp >= &sp->dec_codetab[CSIZE]) { TIFFErrorExt(tif->tif_clientdata, module, "Corrupted LZW table at scanline %d", tif->tif_row); return (0); } free_entp->next = oldcodep; if (free_entp->next < &sp->dec_codetab[0] || free_entp->next >= &sp->dec_codetab[CSIZE]) { TIFFErrorExt(tif->tif_clientdata, module, "Corrupted LZW table at scanline %d", tif->tif_row); return (0); } free_entp->firstchar = free_entp->next->firstchar; free_entp->length = free_entp->next->length+1; free_entp->value = (codep < free_entp) ? codep->firstchar : free_entp->firstchar; if (++free_entp > maxcodep) { if (++nbits > BITS_MAX) /* should not happen */ nbits = BITS_MAX; nbitsmask = MAXCODE(nbits); maxcodep = sp->dec_codetab + nbitsmask; } oldcodep = codep; if (code >= 256) { /* * Code maps to a string, copy string * value to output (written in reverse). */ if(codep->length == 0) { TIFFErrorExt(tif->tif_clientdata, module, "Wrong length of decoded " "string: data probably corrupted at scanline %d", tif->tif_row); return (0); } if (codep->length > occ) { /* * String is too long for decode buffer, * locate portion that will fit, copy to * the decode buffer, and setup restart * logic for the next decoding call. */ sp->dec_codep = codep; do { codep = codep->next; } while (codep->length > occ); sp->dec_restart = occ; tp = op + occ; do { *--tp = codep->value; codep = codep->next; } while (--occ); break; } assert(occ >= codep->length); op += codep->length, occ -= codep->length; tp = op; do { *--tp = codep->value; } while( (codep = codep->next) != NULL ); } else *op++ = code, occ--; } tif->tif_rawcp = (uint8*) bp; sp->lzw_nbits = nbits; sp->lzw_nextdata = nextdata; sp->lzw_nextbits = nextbits; sp->dec_nbitsmask = nbitsmask; sp->dec_oldcodep = oldcodep; sp->dec_free_entp = free_entp; sp->dec_maxcodep = maxcodep; if (occ > 0) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at scanline %d (short %I64d bytes)", tif->tif_row, (unsigned __int64) occ); #else TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at scanline %d (short %llu bytes)", tif->tif_row, (unsigned long long) occ); #endif return (0); } return (1); } #endif /* LZW_COMPAT */ /* * LZW Encoding. */ static int LZWSetupEncode(TIFF* tif) { static const char module[] = "LZWSetupEncode"; LZWCodecState* sp = EncoderState(tif); assert(sp != NULL); sp->enc_hashtab = (hash_t*) _TIFFmalloc(HSIZE*sizeof (hash_t)); if (sp->enc_hashtab == NULL) { TIFFErrorExt(tif->tif_clientdata, module, "No space for LZW hash table"); return (0); } return (1); } /* * Reset encoding state at the start of a strip. */ static int LZWPreEncode(TIFF* tif, uint16 s) { LZWCodecState *sp = EncoderState(tif); (void) s; assert(sp != NULL); if( sp->enc_hashtab == NULL ) { tif->tif_setupencode( tif ); } sp->lzw_nbits = BITS_MIN; sp->lzw_maxcode = MAXCODE(BITS_MIN); sp->lzw_free_ent = CODE_FIRST; sp->lzw_nextbits = 0; sp->lzw_nextdata = 0; sp->enc_checkpoint = CHECK_GAP; sp->enc_ratio = 0; sp->enc_incount = 0; sp->enc_outcount = 0; /* * The 4 here insures there is space for 2 max-sized * codes in LZWEncode and LZWPostDecode. */ sp->enc_rawlimit = tif->tif_rawdata + tif->tif_rawdatasize-1 - 4; cl_hash(sp); /* clear hash table */ sp->enc_oldcode = (hcode_t) -1; /* generates CODE_CLEAR in LZWEncode */ return (1); } #define CALCRATIO(sp, rat) { \ if (incount > 0x007fffff) { /* NB: shift will overflow */\ rat = outcount >> 8; \ rat = (rat == 0 ? 0x7fffffff : incount/rat); \ } else \ rat = (incount<<8) / outcount; \ } #define PutNextCode(op, c) { \ nextdata = (nextdata << nbits) | c; \ nextbits += nbits; \ *op++ = (unsigned char)(nextdata >> (nextbits-8)); \ nextbits -= 8; \ if (nextbits >= 8) { \ *op++ = (unsigned char)(nextdata >> (nextbits-8)); \ nextbits -= 8; \ } \ outcount += nbits; \ } /* * Encode a chunk of pixels. * * Uses an open addressing double hashing (no chaining) on the * prefix code/next character combination. We do a variant of * Knuth's algorithm D (vol. 3, sec. 6.4) along with G. Knott's * relatively-prime secondary probe. Here, the modular division * first probe is gives way to a faster exclusive-or manipulation. * Also do block compression with an adaptive reset, whereby the * code table is cleared when the compression ratio decreases, * but after the table fills. The variable-length output codes * are re-sized at this point, and a CODE_CLEAR is generated * for the decoder. */ static int LZWEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { register LZWCodecState *sp = EncoderState(tif); register long fcode; register hash_t *hp; register int h, c; hcode_t ent; long disp; long incount, outcount, checkpoint; long nextdata, nextbits; int free_ent, maxcode, nbits; uint8* op; uint8* limit; (void) s; if (sp == NULL) return (0); assert(sp->enc_hashtab != NULL); /* * Load local state. */ incount = sp->enc_incount; outcount = sp->enc_outcount; checkpoint = sp->enc_checkpoint; nextdata = sp->lzw_nextdata; nextbits = sp->lzw_nextbits; free_ent = sp->lzw_free_ent; maxcode = sp->lzw_maxcode; nbits = sp->lzw_nbits; op = tif->tif_rawcp; limit = sp->enc_rawlimit; ent = sp->enc_oldcode; if (ent == (hcode_t) -1 && cc > 0) { /* * NB: This is safe because it can only happen * at the start of a strip where we know there * is space in the data buffer. */ PutNextCode(op, CODE_CLEAR); ent = *bp++; cc--; incount++; } while (cc > 0) { c = *bp++; cc--; incount++; fcode = ((long)c << BITS_MAX) + ent; h = (c << HSHIFT) ^ ent; /* xor hashing */ #ifdef _WINDOWS /* * Check hash index for an overflow. */ if (h >= HSIZE) h -= HSIZE; #endif hp = &sp->enc_hashtab[h]; if (hp->hash == fcode) { ent = hp->code; continue; } if (hp->hash >= 0) { /* * Primary hash failed, check secondary hash. */ disp = HSIZE - h; if (h == 0) disp = 1; do { /* * Avoid pointer arithmetic 'cuz of * wraparound problems with segments. */ if ((h -= disp) < 0) h += HSIZE; hp = &sp->enc_hashtab[h]; if (hp->hash == fcode) { ent = hp->code; goto hit; } } while (hp->hash >= 0); } /* * New entry, emit code and add to table. */ /* * Verify there is space in the buffer for the code * and any potential Clear code that might be emitted * below. The value of limit is setup so that there * are at least 4 bytes free--room for 2 codes. */ if (op > limit) { tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata); TIFFFlushData1(tif); op = tif->tif_rawdata; } PutNextCode(op, ent); ent = c; hp->code = free_ent++; hp->hash = fcode; if (free_ent == CODE_MAX-1) { /* table is full, emit clear code and reset */ cl_hash(sp); sp->enc_ratio = 0; incount = 0; outcount = 0; free_ent = CODE_FIRST; PutNextCode(op, CODE_CLEAR); nbits = BITS_MIN; maxcode = MAXCODE(BITS_MIN); } else { /* * If the next entry is going to be too big for * the code size, then increase it, if possible. */ if (free_ent > maxcode) { nbits++; assert(nbits <= BITS_MAX); maxcode = (int) MAXCODE(nbits); } else if (incount >= checkpoint) { long rat; /* * Check compression ratio and, if things seem * to be slipping, clear the hash table and * reset state. The compression ratio is a * 24+8-bit fractional number. */ checkpoint = incount+CHECK_GAP; CALCRATIO(sp, rat); if (rat <= sp->enc_ratio) { cl_hash(sp); sp->enc_ratio = 0; incount = 0; outcount = 0; free_ent = CODE_FIRST; PutNextCode(op, CODE_CLEAR); nbits = BITS_MIN; maxcode = MAXCODE(BITS_MIN); } else sp->enc_ratio = rat; } } hit: ; } /* * Restore global state. */ sp->enc_incount = incount; sp->enc_outcount = outcount; sp->enc_checkpoint = checkpoint; sp->enc_oldcode = ent; sp->lzw_nextdata = nextdata; sp->lzw_nextbits = nextbits; sp->lzw_free_ent = free_ent; sp->lzw_maxcode = maxcode; sp->lzw_nbits = nbits; tif->tif_rawcp = op; return (1); } /* * Finish off an encoded strip by flushing the last * string and tacking on an End Of Information code. */ static int LZWPostEncode(TIFF* tif) { register LZWCodecState *sp = EncoderState(tif); uint8* op = tif->tif_rawcp; long nextbits = sp->lzw_nextbits; long nextdata = sp->lzw_nextdata; long outcount = sp->enc_outcount; int nbits = sp->lzw_nbits; if (op > sp->enc_rawlimit) { tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata); TIFFFlushData1(tif); op = tif->tif_rawdata; } if (sp->enc_oldcode != (hcode_t) -1) { PutNextCode(op, sp->enc_oldcode); sp->enc_oldcode = (hcode_t) -1; } PutNextCode(op, CODE_EOI); if (nextbits > 0) *op++ = (unsigned char)(nextdata << (8-nextbits)); tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata); return (1); } /* * Reset encoding hash table. */ static void cl_hash(LZWCodecState* sp) { register hash_t *hp = &sp->enc_hashtab[HSIZE-1]; register long i = HSIZE-8; do { i -= 8; hp[-7].hash = -1; hp[-6].hash = -1; hp[-5].hash = -1; hp[-4].hash = -1; hp[-3].hash = -1; hp[-2].hash = -1; hp[-1].hash = -1; hp[ 0].hash = -1; hp -= 8; } while (i >= 0); for (i += 8; i > 0; i--, hp--) hp->hash = -1; } static void LZWCleanup(TIFF* tif) { (void)TIFFPredictorCleanup(tif); assert(tif->tif_data != 0); if (DecoderState(tif)->dec_codetab) _TIFFfree(DecoderState(tif)->dec_codetab); if (EncoderState(tif)->enc_hashtab) _TIFFfree(EncoderState(tif)->enc_hashtab); _TIFFfree(tif->tif_data); tif->tif_data = NULL; _TIFFSetDefaultCompressionState(tif); } int TIFFInitLZW(TIFF* tif, int scheme) { static const char module[] = "TIFFInitLZW"; assert(scheme == COMPRESSION_LZW); /* * Allocate state block so tag methods have storage to record values. */ tif->tif_data = (uint8*) _TIFFmalloc(sizeof (LZWCodecState)); if (tif->tif_data == NULL) goto bad; DecoderState(tif)->dec_codetab = NULL; DecoderState(tif)->dec_decode = NULL; EncoderState(tif)->enc_hashtab = NULL; LZWState(tif)->rw_mode = tif->tif_mode; /* * Install codec methods. */ tif->tif_fixuptags = LZWFixupTags; tif->tif_setupdecode = LZWSetupDecode; tif->tif_predecode = LZWPreDecode; tif->tif_decoderow = LZWDecode; tif->tif_decodestrip = LZWDecode; tif->tif_decodetile = LZWDecode; tif->tif_setupencode = LZWSetupEncode; tif->tif_preencode = LZWPreEncode; tif->tif_postencode = LZWPostEncode; tif->tif_encoderow = LZWEncode; tif->tif_encodestrip = LZWEncode; tif->tif_encodetile = LZWEncode; tif->tif_cleanup = LZWCleanup; /* * Setup predictor setup. */ (void) TIFFPredictorInit(tif); return (1); bad: TIFFErrorExt(tif->tif_clientdata, module, "No space for LZW state block"); return (0); } /* * Copyright (c) 1985, 1986 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * James A. Woods, derived from original work by Spencer Thomas * and Joseph Orost. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #endif /* LZW_SUPPORT */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tiffvers.h0000644000212300117540000000063212027361253013011 00000000000000#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.3\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc." /* * This define can be used in code that requires * compilation-related definitions specific to a * version or versions of the library. Runtime * version checking should be done based on the * string returned by TIFFGetVersion. */ #define TIFFLIB_VERSION 20120922 tiff-4.0.3/libtiff/tif_strip.c0000644000212300117540000002600111763656233013170 00000000000000/* $Id: tif_strip.c,v 1.35 2012-06-06 05:33:55 fwarmerdam Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Strip-organized Image Support Routines. */ #include "tiffiop.h" /* * Compute which strip a (row,sample) value is in. */ uint32 TIFFComputeStrip(TIFF* tif, uint32 row, uint16 sample) { static const char module[] = "TIFFComputeStrip"; TIFFDirectory *td = &tif->tif_dir; uint32 strip; strip = row / td->td_rowsperstrip; if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { if (sample >= td->td_samplesperpixel) { TIFFErrorExt(tif->tif_clientdata, module, "%lu: Sample out of range, max %lu", (unsigned long) sample, (unsigned long) td->td_samplesperpixel); return (0); } strip += (uint32)sample*td->td_stripsperimage; } return (strip); } /* * Compute how many strips are in an image. */ uint32 TIFFNumberOfStrips(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; uint32 nstrips; nstrips = (td->td_rowsperstrip == (uint32) -1 ? 1 : TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip)); if (td->td_planarconfig == PLANARCONFIG_SEPARATE) nstrips = _TIFFMultiply32(tif, nstrips, (uint32)td->td_samplesperpixel, "TIFFNumberOfStrips"); return (nstrips); } /* * Compute the # bytes in a variable height, row-aligned strip. */ uint64 TIFFVStripSize64(TIFF* tif, uint32 nrows) { static const char module[] = "TIFFVStripSize64"; TIFFDirectory *td = &tif->tif_dir; if (nrows==(uint32)(-1)) nrows=td->td_imagelength; if ((td->td_planarconfig==PLANARCONFIG_CONTIG)&& (td->td_photometric == PHOTOMETRIC_YCBCR)&& (!isUpSampled(tif))) { /* * Packed YCbCr data contain one Cb+Cr for every * HorizontalSampling*VerticalSampling Y values. * Must also roundup width and height when calculating * since images that are not a multiple of the * horizontal/vertical subsampling area include * YCbCr data for the extended image. */ uint16 ycbcrsubsampling[2]; uint16 samplingblock_samples; uint32 samplingblocks_hor; uint32 samplingblocks_ver; uint64 samplingrow_samples; uint64 samplingrow_size; if(td->td_samplesperpixel!=3) { TIFFErrorExt(tif->tif_clientdata,module, "Invalid td_samplesperpixel value"); return 0; } TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING,ycbcrsubsampling+0, ycbcrsubsampling+1); if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 && ycbcrsubsampling[0] != 4) ||(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 && ycbcrsubsampling[1] != 4)) { TIFFErrorExt(tif->tif_clientdata,module, "Invalid YCbCr subsampling (%dx%d)", ycbcrsubsampling[0], ycbcrsubsampling[1] ); return 0; } samplingblock_samples=ycbcrsubsampling[0]*ycbcrsubsampling[1]+2; samplingblocks_hor=TIFFhowmany_32(td->td_imagewidth,ycbcrsubsampling[0]); samplingblocks_ver=TIFFhowmany_32(nrows,ycbcrsubsampling[1]); samplingrow_samples=_TIFFMultiply64(tif,samplingblocks_hor,samplingblock_samples,module); samplingrow_size=TIFFhowmany8_64(_TIFFMultiply64(tif,samplingrow_samples,td->td_bitspersample,module)); return(_TIFFMultiply64(tif,samplingrow_size,samplingblocks_ver,module)); } else return(_TIFFMultiply64(tif,nrows,TIFFScanlineSize64(tif),module)); } tmsize_t TIFFVStripSize(TIFF* tif, uint32 nrows) { static const char module[] = "TIFFVStripSize"; uint64 m; tmsize_t n; m=TIFFVStripSize64(tif,nrows); n=(tmsize_t)m; if ((uint64)n!=m) { TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow"); n=0; } return(n); } /* * Compute the # bytes in a raw strip. */ uint64 TIFFRawStripSize64(TIFF* tif, uint32 strip) { static const char module[] = "TIFFRawStripSize64"; TIFFDirectory* td = &tif->tif_dir; uint64 bytecount = td->td_stripbytecount[strip]; if (bytecount == 0) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "%I64u: Invalid strip byte count, strip %lu", (unsigned __int64) bytecount, (unsigned long) strip); #else TIFFErrorExt(tif->tif_clientdata, module, "%llu: Invalid strip byte count, strip %lu", (unsigned long long) bytecount, (unsigned long) strip); #endif bytecount = (uint64) -1; } return bytecount; } tmsize_t TIFFRawStripSize(TIFF* tif, uint32 strip) { static const char module[] = "TIFFRawStripSize"; uint64 m; tmsize_t n; m=TIFFRawStripSize64(tif,strip); if (m==(uint64)(-1)) n=(tmsize_t)(-1); else { n=(tmsize_t)m; if ((uint64)n!=m) { TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow"); n=0; } } return(n); } /* * Compute the # bytes in a (row-aligned) strip. * * Note that if RowsPerStrip is larger than the * recorded ImageLength, then the strip size is * truncated to reflect the actual space required * to hold the strip. */ uint64 TIFFStripSize64(TIFF* tif) { TIFFDirectory* td = &tif->tif_dir; uint32 rps = td->td_rowsperstrip; if (rps > td->td_imagelength) rps = td->td_imagelength; return (TIFFVStripSize64(tif, rps)); } tmsize_t TIFFStripSize(TIFF* tif) { static const char module[] = "TIFFStripSize"; uint64 m; tmsize_t n; m=TIFFStripSize64(tif); n=(tmsize_t)m; if ((uint64)n!=m) { TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow"); n=0; } return(n); } /* * Compute a default strip size based on the image * characteristics and a requested value. If the * request is <1 then we choose a strip size according * to certain heuristics. */ uint32 TIFFDefaultStripSize(TIFF* tif, uint32 request) { return (*tif->tif_defstripsize)(tif, request); } uint32 _TIFFDefaultStripSize(TIFF* tif, uint32 s) { if ((int32) s < 1) { /* * If RowsPerStrip is unspecified, try to break the * image up into strips that are approximately * STRIP_SIZE_DEFAULT bytes long. */ uint64 scanlinesize; uint64 rows; scanlinesize=TIFFScanlineSize64(tif); if (scanlinesize==0) scanlinesize=1; rows=(uint64)STRIP_SIZE_DEFAULT/scanlinesize; if (rows==0) rows=1; else if (rows>0xFFFFFFFF) rows=0xFFFFFFFF; s=(uint32)rows; } return (s); } /* * Return the number of bytes to read/write in a call to * one of the scanline-oriented i/o routines. Note that * this number may be 1/samples-per-pixel if data is * stored as separate planes. * The ScanlineSize in case of YCbCrSubsampling is defined as the * strip size divided by the strip height, i.e. the size of a pack of vertical * subsampling lines divided by vertical subsampling. It should thus make * sense when multiplied by a multiple of vertical subsampling. */ uint64 TIFFScanlineSize64(TIFF* tif) { static const char module[] = "TIFFScanlineSize64"; TIFFDirectory *td = &tif->tif_dir; uint64 scanline_size; if (td->td_planarconfig==PLANARCONFIG_CONTIG) { if ((td->td_photometric==PHOTOMETRIC_YCBCR)&& (td->td_samplesperpixel==3)&& (!isUpSampled(tif))) { uint16 ycbcrsubsampling[2]; uint16 samplingblock_samples; uint32 samplingblocks_hor; uint64 samplingrow_samples; uint64 samplingrow_size; if(td->td_samplesperpixel!=3) { TIFFErrorExt(tif->tif_clientdata,module, "Invalid td_samplesperpixel value"); return 0; } TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING, ycbcrsubsampling+0, ycbcrsubsampling+1); if (((ycbcrsubsampling[0]!=1)&&(ycbcrsubsampling[0]!=2)&&(ycbcrsubsampling[0]!=4)) || ((ycbcrsubsampling[1]!=1)&&(ycbcrsubsampling[1]!=2)&&(ycbcrsubsampling[1]!=4))) { TIFFErrorExt(tif->tif_clientdata,module, "Invalid YCbCr subsampling"); return 0; } samplingblock_samples = ycbcrsubsampling[0]*ycbcrsubsampling[1]+2; samplingblocks_hor = TIFFhowmany_32(td->td_imagewidth,ycbcrsubsampling[0]); samplingrow_samples = _TIFFMultiply64(tif,samplingblocks_hor,samplingblock_samples,module); samplingrow_size = TIFFhowmany_64(_TIFFMultiply64(tif,samplingrow_samples,td->td_bitspersample,module),8); scanline_size = (samplingrow_size/ycbcrsubsampling[1]); } else { uint64 scanline_samples; scanline_samples=_TIFFMultiply64(tif,td->td_imagewidth,td->td_samplesperpixel,module); scanline_size=TIFFhowmany_64(_TIFFMultiply64(tif,scanline_samples,td->td_bitspersample,module),8); } } else scanline_size=TIFFhowmany_64(_TIFFMultiply64(tif,td->td_imagewidth,td->td_bitspersample,module),8); return(scanline_size); } tmsize_t TIFFScanlineSize(TIFF* tif) { static const char module[] = "TIFFScanlineSize"; uint64 m; tmsize_t n; m=TIFFScanlineSize64(tif); n=(tmsize_t)m; if ((uint64)n!=m) { TIFFErrorExt(tif->tif_clientdata,module,"Integer arithmetic overflow"); n=0; } return(n); } /* * Return the number of bytes required to store a complete * decoded and packed raster scanline (as opposed to the * I/O size returned by TIFFScanlineSize which may be less * if data is store as separate planes). */ uint64 TIFFRasterScanlineSize64(TIFF* tif) { static const char module[] = "TIFFRasterScanlineSize64"; TIFFDirectory *td = &tif->tif_dir; uint64 scanline; scanline = _TIFFMultiply64(tif, td->td_bitspersample, td->td_imagewidth, module); if (td->td_planarconfig == PLANARCONFIG_CONTIG) { scanline = _TIFFMultiply64(tif, scanline, td->td_samplesperpixel, module); return (TIFFhowmany8_64(scanline)); } else return (_TIFFMultiply64(tif, TIFFhowmany8_64(scanline), td->td_samplesperpixel, module)); } tmsize_t TIFFRasterScanlineSize(TIFF* tif) { static const char module[] = "TIFFRasterScanlineSize"; uint64 m; tmsize_t n; m=TIFFRasterScanlineSize64(tif); n=(tmsize_t)m; if ((uint64)n!=m) { TIFFErrorExt(tif->tif_clientdata,module,"Integer arithmetic overflow"); n=0; } return(n); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_print.c0000644000212300117540000005105212014215303013142 00000000000000/* $Id: tif_print.c,v 1.60 2012-08-19 16:56:35 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Directory Printing Support */ #include "tiffiop.h" #include #include static void _TIFFprintAsciiBounded(FILE* fd, const char* cp, int max_chars); static const char *photoNames[] = { "min-is-white", /* PHOTOMETRIC_MINISWHITE */ "min-is-black", /* PHOTOMETRIC_MINISBLACK */ "RGB color", /* PHOTOMETRIC_RGB */ "palette color (RGB from colormap)", /* PHOTOMETRIC_PALETTE */ "transparency mask", /* PHOTOMETRIC_MASK */ "separated", /* PHOTOMETRIC_SEPARATED */ "YCbCr", /* PHOTOMETRIC_YCBCR */ "7 (0x7)", "CIE L*a*b*", /* PHOTOMETRIC_CIELAB */ "ICC L*a*b*", /* PHOTOMETRIC_ICCLAB */ "ITU L*a*b*" /* PHOTOMETRIC_ITULAB */ }; #define NPHOTONAMES (sizeof (photoNames) / sizeof (photoNames[0])) static const char *orientNames[] = { "0 (0x0)", "row 0 top, col 0 lhs", /* ORIENTATION_TOPLEFT */ "row 0 top, col 0 rhs", /* ORIENTATION_TOPRIGHT */ "row 0 bottom, col 0 rhs", /* ORIENTATION_BOTRIGHT */ "row 0 bottom, col 0 lhs", /* ORIENTATION_BOTLEFT */ "row 0 lhs, col 0 top", /* ORIENTATION_LEFTTOP */ "row 0 rhs, col 0 top", /* ORIENTATION_RIGHTTOP */ "row 0 rhs, col 0 bottom", /* ORIENTATION_RIGHTBOT */ "row 0 lhs, col 0 bottom", /* ORIENTATION_LEFTBOT */ }; #define NORIENTNAMES (sizeof (orientNames) / sizeof (orientNames[0])) static void _TIFFPrintField(FILE* fd, const TIFFField *fip, uint32 value_count, void *raw_data) { uint32 j; fprintf(fd, " %s: ", fip->field_name); for(j = 0; j < value_count; j++) { if(fip->field_type == TIFF_BYTE) fprintf(fd, "%u", ((uint8 *) raw_data)[j]); else if(fip->field_type == TIFF_UNDEFINED) fprintf(fd, "0x%x", (unsigned int) ((unsigned char *) raw_data)[j]); else if(fip->field_type == TIFF_SBYTE) fprintf(fd, "%d", ((int8 *) raw_data)[j]); else if(fip->field_type == TIFF_SHORT) fprintf(fd, "%u", ((uint16 *) raw_data)[j]); else if(fip->field_type == TIFF_SSHORT) fprintf(fd, "%d", ((int16 *) raw_data)[j]); else if(fip->field_type == TIFF_LONG) fprintf(fd, "%lu", (unsigned long)((uint32 *) raw_data)[j]); else if(fip->field_type == TIFF_SLONG) fprintf(fd, "%ld", (long)((int32 *) raw_data)[j]); else if(fip->field_type == TIFF_IFD) fprintf(fd, "0x%lx", (unsigned long)((uint32 *) raw_data)[j]); else if(fip->field_type == TIFF_RATIONAL || fip->field_type == TIFF_SRATIONAL || fip->field_type == TIFF_FLOAT) fprintf(fd, "%f", ((float *) raw_data)[j]); else if(fip->field_type == TIFF_LONG8) #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) fprintf(fd, "%I64u", (unsigned __int64)((uint64 *) raw_data)[j]); #else fprintf(fd, "%llu", (unsigned long long)((uint64 *) raw_data)[j]); #endif else if(fip->field_type == TIFF_SLONG8) #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) fprintf(fd, "%I64d", (__int64)((int64 *) raw_data)[j]); #else fprintf(fd, "%lld", (long long)((int64 *) raw_data)[j]); #endif else if(fip->field_type == TIFF_IFD8) #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) fprintf(fd, "0x%I64x", (unsigned __int64)((uint64 *) raw_data)[j]); #else fprintf(fd, "0x%llx", (unsigned long long)((uint64 *) raw_data)[j]); #endif else if(fip->field_type == TIFF_FLOAT) fprintf(fd, "%f", ((float *)raw_data)[j]); else if(fip->field_type == TIFF_DOUBLE) fprintf(fd, "%f", ((double *) raw_data)[j]); else if(fip->field_type == TIFF_ASCII) { fprintf(fd, "%s", (char *) raw_data); break; } else { fprintf(fd, ""); break; } if(j < value_count - 1) fprintf(fd, ","); } fprintf(fd, "\n"); } static int _TIFFPrettyPrintField(TIFF* tif, const TIFFField *fip, FILE* fd, uint32 tag, uint32 value_count, void *raw_data) { (void) tif; /* do not try to pretty print auto-defined fields */ if (strncmp(fip->field_name,"Tag ", 4) == 0) { return 0; } switch (tag) { case TIFFTAG_INKSET: if (value_count == 2 && fip->field_type == TIFF_SHORT) { fprintf(fd, " Ink Set: "); switch (*((uint16*)raw_data)) { case INKSET_CMYK: fprintf(fd, "CMYK\n"); break; default: fprintf(fd, "%u (0x%x)\n", *((uint16*)raw_data), *((uint16*)raw_data)); break; } return 1; } return 0; case TIFFTAG_DOTRANGE: if (value_count == 2 && fip->field_type == TIFF_SHORT) { fprintf(fd, " Dot Range: %u-%u\n", ((uint16*)raw_data)[0], ((uint16*)raw_data)[1]); return 1; } return 0; case TIFFTAG_WHITEPOINT: if (value_count == 2 && fip->field_type == TIFF_RATIONAL) { fprintf(fd, " White Point: %g-%g\n", ((float *)raw_data)[0], ((float *)raw_data)[1]); return 1; } return 0; case TIFFTAG_XMLPACKET: { uint32 i; fprintf(fd, " XMLPacket (XMP Metadata):\n" ); for(i = 0; i < value_count; i++) fputc(((char *)raw_data)[i], fd); fprintf( fd, "\n" ); return 1; } case TIFFTAG_RICHTIFFIPTC: /* * XXX: for some weird reason RichTIFFIPTC tag * defined as array of LONG values. */ fprintf(fd, " RichTIFFIPTC Data: , %lu bytes\n", (unsigned long) value_count * 4); return 1; case TIFFTAG_PHOTOSHOP: fprintf(fd, " Photoshop Data: , %lu bytes\n", (unsigned long) value_count); return 1; case TIFFTAG_ICCPROFILE: fprintf(fd, " ICC Profile: , %lu bytes\n", (unsigned long) value_count); return 1; case TIFFTAG_STONITS: if (value_count == 1 && fip->field_type == TIFF_DOUBLE) { fprintf(fd, " Sample to Nits conversion factor: %.4e\n", *((double*)raw_data)); return 1; } return 0; } return 0; } /* * Print the contents of the current directory * to the specified stdio file stream. */ void TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) { TIFFDirectory *td = &tif->tif_dir; char *sep; uint16 i; long l, n; #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) fprintf(fd, "TIFF Directory at offset 0x%I64x (%I64u)\n", (unsigned __int64) tif->tif_diroff, (unsigned __int64) tif->tif_diroff); #else fprintf(fd, "TIFF Directory at offset 0x%llx (%llu)\n", (unsigned long long) tif->tif_diroff, (unsigned long long) tif->tif_diroff); #endif if (TIFFFieldSet(tif,FIELD_SUBFILETYPE)) { fprintf(fd, " Subfile Type:"); sep = " "; if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE) { fprintf(fd, "%sreduced-resolution image", sep); sep = "/"; } if (td->td_subfiletype & FILETYPE_PAGE) { fprintf(fd, "%smulti-page document", sep); sep = "/"; } if (td->td_subfiletype & FILETYPE_MASK) fprintf(fd, "%stransparency mask", sep); fprintf(fd, " (%lu = 0x%lx)\n", (long) td->td_subfiletype, (long) td->td_subfiletype); } if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) { fprintf(fd, " Image Width: %lu Image Length: %lu", (unsigned long) td->td_imagewidth, (unsigned long) td->td_imagelength); if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH)) fprintf(fd, " Image Depth: %lu", (unsigned long) td->td_imagedepth); fprintf(fd, "\n"); } if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS)) { fprintf(fd, " Tile Width: %lu Tile Length: %lu", (unsigned long) td->td_tilewidth, (unsigned long) td->td_tilelength); if (TIFFFieldSet(tif,FIELD_TILEDEPTH)) fprintf(fd, " Tile Depth: %lu", (unsigned long) td->td_tiledepth); fprintf(fd, "\n"); } if (TIFFFieldSet(tif,FIELD_RESOLUTION)) { fprintf(fd, " Resolution: %g, %g", td->td_xresolution, td->td_yresolution); if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT)) { switch (td->td_resolutionunit) { case RESUNIT_NONE: fprintf(fd, " (unitless)"); break; case RESUNIT_INCH: fprintf(fd, " pixels/inch"); break; case RESUNIT_CENTIMETER: fprintf(fd, " pixels/cm"); break; default: fprintf(fd, " (unit %u = 0x%x)", td->td_resolutionunit, td->td_resolutionunit); break; } } fprintf(fd, "\n"); } if (TIFFFieldSet(tif,FIELD_POSITION)) fprintf(fd, " Position: %g, %g\n", td->td_xposition, td->td_yposition); if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE)) fprintf(fd, " Bits/Sample: %u\n", td->td_bitspersample); if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT)) { fprintf(fd, " Sample Format: "); switch (td->td_sampleformat) { case SAMPLEFORMAT_VOID: fprintf(fd, "void\n"); break; case SAMPLEFORMAT_INT: fprintf(fd, "signed integer\n"); break; case SAMPLEFORMAT_UINT: fprintf(fd, "unsigned integer\n"); break; case SAMPLEFORMAT_IEEEFP: fprintf(fd, "IEEE floating point\n"); break; case SAMPLEFORMAT_COMPLEXINT: fprintf(fd, "complex signed integer\n"); break; case SAMPLEFORMAT_COMPLEXIEEEFP: fprintf(fd, "complex IEEE floating point\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_sampleformat, td->td_sampleformat); break; } } if (TIFFFieldSet(tif,FIELD_COMPRESSION)) { const TIFFCodec* c = TIFFFindCODEC(td->td_compression); fprintf(fd, " Compression Scheme: "); if (c) fprintf(fd, "%s\n", c->name); else fprintf(fd, "%u (0x%x)\n", td->td_compression, td->td_compression); } if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) { fprintf(fd, " Photometric Interpretation: "); if (td->td_photometric < NPHOTONAMES) fprintf(fd, "%s\n", photoNames[td->td_photometric]); else { switch (td->td_photometric) { case PHOTOMETRIC_LOGL: fprintf(fd, "CIE Log2(L)\n"); break; case PHOTOMETRIC_LOGLUV: fprintf(fd, "CIE Log2(L) (u',v')\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_photometric, td->td_photometric); break; } } } if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES) && td->td_extrasamples) { fprintf(fd, " Extra Samples: %u<", td->td_extrasamples); sep = ""; for (i = 0; i < td->td_extrasamples; i++) { switch (td->td_sampleinfo[i]) { case EXTRASAMPLE_UNSPECIFIED: fprintf(fd, "%sunspecified", sep); break; case EXTRASAMPLE_ASSOCALPHA: fprintf(fd, "%sassoc-alpha", sep); break; case EXTRASAMPLE_UNASSALPHA: fprintf(fd, "%sunassoc-alpha", sep); break; default: fprintf(fd, "%s%u (0x%x)", sep, td->td_sampleinfo[i], td->td_sampleinfo[i]); break; } sep = ", "; } fprintf(fd, ">\n"); } if (TIFFFieldSet(tif,FIELD_INKNAMES)) { char* cp; fprintf(fd, " Ink Names: "); i = td->td_samplesperpixel; sep = ""; for (cp = td->td_inknames; i > 0 && cp < td->td_inknames + td->td_inknameslen; cp = strchr(cp,'\0')+1, i--) { int max_chars = td->td_inknameslen - (cp - td->td_inknames); fputs(sep, fd); _TIFFprintAsciiBounded(fd, cp, max_chars); sep = ", "; } fputs("\n", fd); } if (TIFFFieldSet(tif,FIELD_THRESHHOLDING)) { fprintf(fd, " Thresholding: "); switch (td->td_threshholding) { case THRESHHOLD_BILEVEL: fprintf(fd, "bilevel art scan\n"); break; case THRESHHOLD_HALFTONE: fprintf(fd, "halftone or dithered scan\n"); break; case THRESHHOLD_ERRORDIFFUSE: fprintf(fd, "error diffused\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_threshholding, td->td_threshholding); break; } } if (TIFFFieldSet(tif,FIELD_FILLORDER)) { fprintf(fd, " FillOrder: "); switch (td->td_fillorder) { case FILLORDER_MSB2LSB: fprintf(fd, "msb-to-lsb\n"); break; case FILLORDER_LSB2MSB: fprintf(fd, "lsb-to-msb\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_fillorder, td->td_fillorder); break; } } if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING)) { fprintf(fd, " YCbCr Subsampling: %u, %u\n", td->td_ycbcrsubsampling[0], td->td_ycbcrsubsampling[1] ); } if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING)) { fprintf(fd, " YCbCr Positioning: "); switch (td->td_ycbcrpositioning) { case YCBCRPOSITION_CENTERED: fprintf(fd, "centered\n"); break; case YCBCRPOSITION_COSITED: fprintf(fd, "cosited\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_ycbcrpositioning, td->td_ycbcrpositioning); break; } } if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS)) fprintf(fd, " Halftone Hints: light %u dark %u\n", td->td_halftonehints[0], td->td_halftonehints[1]); if (TIFFFieldSet(tif,FIELD_ORIENTATION)) { fprintf(fd, " Orientation: "); if (td->td_orientation < NORIENTNAMES) fprintf(fd, "%s\n", orientNames[td->td_orientation]); else fprintf(fd, "%u (0x%x)\n", td->td_orientation, td->td_orientation); } if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL)) fprintf(fd, " Samples/Pixel: %u\n", td->td_samplesperpixel); if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP)) { fprintf(fd, " Rows/Strip: "); if (td->td_rowsperstrip == (uint32) -1) fprintf(fd, "(infinite)\n"); else fprintf(fd, "%lu\n", (unsigned long) td->td_rowsperstrip); } if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE)) fprintf(fd, " Min Sample Value: %u\n", td->td_minsamplevalue); if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE)) fprintf(fd, " Max Sample Value: %u\n", td->td_maxsamplevalue); if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE)) { int count = (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1; fprintf(fd, " SMin Sample Value:"); for (i = 0; i < count; ++i) fprintf(fd, " %g", td->td_sminsamplevalue[i]); fprintf(fd, "\n"); } if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE)) { int count = (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1; fprintf(fd, " SMax Sample Value:"); for (i = 0; i < count; ++i) fprintf(fd, " %g", td->td_smaxsamplevalue[i]); fprintf(fd, "\n"); } if (TIFFFieldSet(tif,FIELD_PLANARCONFIG)) { fprintf(fd, " Planar Configuration: "); switch (td->td_planarconfig) { case PLANARCONFIG_CONTIG: fprintf(fd, "single image plane\n"); break; case PLANARCONFIG_SEPARATE: fprintf(fd, "separate image planes\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_planarconfig, td->td_planarconfig); break; } } if (TIFFFieldSet(tif,FIELD_PAGENUMBER)) fprintf(fd, " Page Number: %u-%u\n", td->td_pagenumber[0], td->td_pagenumber[1]); if (TIFFFieldSet(tif,FIELD_COLORMAP)) { fprintf(fd, " Color Map: "); if (flags & TIFFPRINT_COLORMAP) { fprintf(fd, "\n"); n = 1L<td_bitspersample; for (l = 0; l < n; l++) fprintf(fd, " %5lu: %5u %5u %5u\n", l, td->td_colormap[0][l], td->td_colormap[1][l], td->td_colormap[2][l]); } else fprintf(fd, "(present)\n"); } if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE)) { fprintf(fd, " Reference Black/White:\n"); for (i = 0; i < 3; i++) fprintf(fd, " %2d: %5g %5g\n", i, td->td_refblackwhite[2*i+0], td->td_refblackwhite[2*i+1]); } if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) { fprintf(fd, " Transfer Function: "); if (flags & TIFFPRINT_CURVES) { fprintf(fd, "\n"); n = 1L<td_bitspersample; for (l = 0; l < n; l++) { fprintf(fd, " %2lu: %5u", l, td->td_transferfunction[0][l]); for (i = 1; i < td->td_samplesperpixel; i++) fprintf(fd, " %5u", td->td_transferfunction[i][l]); fputc('\n', fd); } } else fprintf(fd, "(present)\n"); } if (TIFFFieldSet(tif, FIELD_SUBIFD) && (td->td_subifd)) { fprintf(fd, " SubIFD Offsets:"); for (i = 0; i < td->td_nsubifd; i++) #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) fprintf(fd, " %5I64u", (unsigned __int64) td->td_subifd[i]); #else fprintf(fd, " %5llu", (unsigned long long) td->td_subifd[i]); #endif fputc('\n', fd); } /* ** Custom tag support. */ { int i; short count; count = (short) TIFFGetTagListCount(tif); for(i = 0; i < count; i++) { uint32 tag = TIFFGetTagListEntry(tif, i); const TIFFField *fip; uint32 value_count; int mem_alloc = 0; void *raw_data; fip = TIFFFieldWithTag(tif, tag); if(fip == NULL) continue; if(fip->field_passcount) { if (fip->field_readcount == TIFF_VARIABLE ) { if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1) continue; } else if (fip->field_readcount == TIFF_VARIABLE2 ) { uint16 small_value_count; if(TIFFGetField(tif, tag, &small_value_count, &raw_data) != 1) continue; value_count = small_value_count; } else { assert (fip->field_readcount == TIFF_VARIABLE || fip->field_readcount == TIFF_VARIABLE2); continue; } } else { if (fip->field_readcount == TIFF_VARIABLE || fip->field_readcount == TIFF_VARIABLE2) value_count = 1; else if (fip->field_readcount == TIFF_SPP) value_count = td->td_samplesperpixel; else value_count = fip->field_readcount; if (fip->field_tag == TIFFTAG_DOTRANGE && strcmp(fip->field_name,"DotRange") == 0) { /* TODO: This is an evil exception and should not have been handled this way ... likely best if we move it into the directory structure with an explicit field in libtiff 4.1 and assign it a FIELD_ value */ static uint16 dotrange[2]; raw_data = dotrange; TIFFGetField(tif, tag, dotrange+0, dotrange+1); } else if (fip->field_type == TIFF_ASCII || fip->field_readcount == TIFF_VARIABLE || fip->field_readcount == TIFF_VARIABLE2 || fip->field_readcount == TIFF_SPP || value_count > 1) { if(TIFFGetField(tif, tag, &raw_data) != 1) continue; } else { raw_data = _TIFFmalloc( _TIFFDataSize(fip->field_type) * value_count); mem_alloc = 1; if(TIFFGetField(tif, tag, raw_data) != 1) { _TIFFfree(raw_data); continue; } } } /* * Catch the tags which needs to be specially handled * and pretty print them. If tag not handled in * _TIFFPrettyPrintField() fall down and print it as * any other tag. */ if (!_TIFFPrettyPrintField(tif, fip, fd, tag, value_count, raw_data)) _TIFFPrintField(fd, fip, value_count, raw_data); if(mem_alloc) _TIFFfree(raw_data); } } if (tif->tif_tagmethods.printdir) (*tif->tif_tagmethods.printdir)(tif, fd, flags); _TIFFFillStriles( tif ); if ((flags & TIFFPRINT_STRIPS) && TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) { uint32 s; fprintf(fd, " %lu %s:\n", (long) td->td_nstrips, isTiled(tif) ? "Tiles" : "Strips"); for (s = 0; s < td->td_nstrips; s++) #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) fprintf(fd, " %3lu: [%8I64u, %8I64u]\n", (unsigned long) s, (unsigned __int64) td->td_stripoffset[s], (unsigned __int64) td->td_stripbytecount[s]); #else fprintf(fd, " %3lu: [%8llu, %8llu]\n", (unsigned long) s, (unsigned long long) td->td_stripoffset[s], (unsigned long long) td->td_stripbytecount[s]); #endif } } void _TIFFprintAscii(FILE* fd, const char* cp) { _TIFFprintAsciiBounded( fd, cp, strlen(cp)); } static void _TIFFprintAsciiBounded(FILE* fd, const char* cp, int max_chars) { for (; max_chars > 0 && *cp != '\0'; cp++, max_chars--) { const char* tp; if (isprint((int)*cp)) { fputc(*cp, fd); continue; } for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++) if (*tp++ == *cp) break; if (*tp) fprintf(fd, "\\%c", *tp); else fprintf(fd, "\\%03o", *cp & 0xff); } } void _TIFFprintAsciiTag(FILE* fd, const char* name, const char* value) { fprintf(fd, " %s: \"", name); _TIFFprintAscii(fd, value); fprintf(fd, "\"\n"); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tiff.h0000644000212300117540000010571012014215303012102 00000000000000/* $Id: tiff.h,v 1.68 2012-08-19 16:56:35 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFF_ #define _TIFF_ #include "tiffconf.h" /* * Tag Image File Format (TIFF) * * Based on Rev 6.0 from: * Developer's Desk * Aldus Corporation * 411 First Ave. South * Suite 200 * Seattle, WA 98104 * 206-622-5500 * * (http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf) * * For BigTIFF design notes see the following links * http://www.remotesensing.org/libtiff/bigtiffdesign.html * http://www.awaresystems.be/imaging/tiff/bigtiff.html */ #define TIFF_VERSION_CLASSIC 42 #define TIFF_VERSION_BIG 43 #define TIFF_BIGENDIAN 0x4d4d #define TIFF_LITTLEENDIAN 0x4949 #define MDI_LITTLEENDIAN 0x5045 #define MDI_BIGENDIAN 0x4550 /* * Intrinsic data types required by the file format: * * 8-bit quantities int8/uint8 * 16-bit quantities int16/uint16 * 32-bit quantities int32/uint32 * 64-bit quantities int64/uint64 * strings unsigned char* */ typedef TIFF_INT8_T int8; typedef TIFF_UINT8_T uint8; typedef TIFF_INT16_T int16; typedef TIFF_UINT16_T uint16; typedef TIFF_INT32_T int32; typedef TIFF_UINT32_T uint32; typedef TIFF_INT64_T int64; typedef TIFF_UINT64_T uint64; /* * Some types as promoted in a variable argument list * We use uint16_vap rather then directly using int, because this way * we document the type we actually want to pass through, conceptually, * rather then confusing the issue by merely stating the type it gets * promoted to */ typedef int uint16_vap; /* * TIFF header. */ typedef struct { uint16 tiff_magic; /* magic number (defines byte order) */ uint16 tiff_version; /* TIFF version number */ } TIFFHeaderCommon; typedef struct { uint16 tiff_magic; /* magic number (defines byte order) */ uint16 tiff_version; /* TIFF version number */ uint32 tiff_diroff; /* byte offset to first directory */ } TIFFHeaderClassic; typedef struct { uint16 tiff_magic; /* magic number (defines byte order) */ uint16 tiff_version; /* TIFF version number */ uint16 tiff_offsetsize; /* size of offsets, should be 8 */ uint16 tiff_unused; /* unused word, should be 0 */ uint64 tiff_diroff; /* byte offset to first directory */ } TIFFHeaderBig; /* * NB: In the comments below, * - items marked with a + are obsoleted by revision 5.0, * - items marked with a ! are introduced in revision 6.0. * - items marked with a % are introduced post revision 6.0. * - items marked with a $ are obsoleted by revision 6.0. * - items marked with a & are introduced by Adobe DNG specification. */ /* * Tag data type information. * * Note: RATIONALs are the ratio of two 32-bit integer values. */ typedef enum { TIFF_NOTYPE = 0, /* placeholder */ TIFF_BYTE = 1, /* 8-bit unsigned integer */ TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */ TIFF_SHORT = 3, /* 16-bit unsigned integer */ TIFF_LONG = 4, /* 32-bit unsigned integer */ TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */ TIFF_SBYTE = 6, /* !8-bit signed integer */ TIFF_UNDEFINED = 7, /* !8-bit untyped data */ TIFF_SSHORT = 8, /* !16-bit signed integer */ TIFF_SLONG = 9, /* !32-bit signed integer */ TIFF_SRATIONAL = 10, /* !64-bit signed fraction */ TIFF_FLOAT = 11, /* !32-bit IEEE floating point */ TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */ TIFF_IFD = 13, /* %32-bit unsigned integer (offset) */ TIFF_LONG8 = 16, /* BigTIFF 64-bit unsigned integer */ TIFF_SLONG8 = 17, /* BigTIFF 64-bit signed integer */ TIFF_IFD8 = 18 /* BigTIFF 64-bit unsigned integer (offset) */ } TIFFDataType; /* * TIFF Tag Definitions. */ #define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */ #define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */ #define FILETYPE_PAGE 0x2 /* one page of many */ #define FILETYPE_MASK 0x4 /* transparency mask */ #define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */ #define OFILETYPE_IMAGE 1 /* full resolution image data */ #define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */ #define OFILETYPE_PAGE 3 /* one page of many */ #define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */ #define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */ #define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */ #define TIFFTAG_COMPRESSION 259 /* data compression technique */ #define COMPRESSION_NONE 1 /* dump mode */ #define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */ #define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */ #define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */ #define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */ #define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */ #define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */ #define COMPRESSION_OJPEG 6 /* !6.0 JPEG */ #define COMPRESSION_JPEG 7 /* %JPEG DCT compression */ #define COMPRESSION_T85 9 /* !TIFF/FX T.85 JBIG compression */ #define COMPRESSION_T43 10 /* !TIFF/FX T.43 colour by layered JBIG compression */ #define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */ #define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */ #define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */ #define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */ /* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT */ #define COMPRESSION_DCS 32947 /* Kodak DCS encoding */ #define COMPRESSION_JBIG 34661 /* ISO JBIG */ #define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */ #define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */ #define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */ #define COMPRESSION_LZMA 34925 /* LZMA2 */ #define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */ #define PHOTOMETRIC_MINISWHITE 0 /* min value is white */ #define PHOTOMETRIC_MINISBLACK 1 /* min value is black */ #define PHOTOMETRIC_RGB 2 /* RGB color model */ #define PHOTOMETRIC_PALETTE 3 /* color map indexed */ #define PHOTOMETRIC_MASK 4 /* $holdout mask */ #define PHOTOMETRIC_SEPARATED 5 /* !color separations */ #define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */ #define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */ #define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */ #define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */ #define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */ #define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */ #define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */ #define THRESHHOLD_BILEVEL 1 /* b&w art scan */ #define THRESHHOLD_HALFTONE 2 /* or dithered scan */ #define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */ #define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */ #define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */ #define TIFFTAG_FILLORDER 266 /* data order within a byte */ #define FILLORDER_MSB2LSB 1 /* most significant -> least */ #define FILLORDER_LSB2MSB 2 /* least significant -> most */ #define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */ #define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */ #define TIFFTAG_MAKE 271 /* scanner manufacturer name */ #define TIFFTAG_MODEL 272 /* scanner model name/number */ #define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */ #define TIFFTAG_ORIENTATION 274 /* +image orientation */ #define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */ #define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */ #define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */ #define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */ #define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */ #define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */ #define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */ #define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */ #define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */ #define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */ #define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */ #define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */ #define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */ #define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */ #define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */ #define TIFFTAG_PLANARCONFIG 284 /* storage organization */ #define PLANARCONFIG_CONTIG 1 /* single image plane */ #define PLANARCONFIG_SEPARATE 2 /* separate planes of data */ #define TIFFTAG_PAGENAME 285 /* page name image is from */ #define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */ #define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */ #define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */ #define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */ #define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */ #define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */ #define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */ #define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */ #define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ #define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */ #define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */ #define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */ #define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */ #define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */ #define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */ #define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */ #define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */ #define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */ #define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */ #define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */ #define RESUNIT_NONE 1 /* no meaningful units */ #define RESUNIT_INCH 2 /* english */ #define RESUNIT_CENTIMETER 3 /* metric */ #define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */ #define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */ #define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */ #define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */ #define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */ #define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ #define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */ #define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */ #define TIFFTAG_SOFTWARE 305 /* name & release */ #define TIFFTAG_DATETIME 306 /* creation date and time */ #define TIFFTAG_ARTIST 315 /* creator of image */ #define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */ #define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */ #define PREDICTOR_NONE 1 /* no prediction scheme used */ #define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */ #define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */ #define TIFFTAG_WHITEPOINT 318 /* image white point */ #define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */ #define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */ #define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */ #define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */ #define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */ #define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */ #define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */ #define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */ #define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */ #define CLEANFAXDATA_CLEAN 0 /* no errors detected */ #define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */ #define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */ #define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */ #define TIFFTAG_SUBIFD 330 /* subimage descriptors */ #define TIFFTAG_INKSET 332 /* !inks in separated image */ #define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */ #define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */ #define TIFFTAG_INKNAMES 333 /* !ascii names of inks */ #define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */ #define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */ #define TIFFTAG_TARGETPRINTER 337 /* !separation target */ #define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */ #define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */ #define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */ #define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */ #define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */ #define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */ #define SAMPLEFORMAT_INT 2 /* !signed integer data */ #define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */ #define SAMPLEFORMAT_VOID 4 /* !untyped data */ #define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */ #define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */ #define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */ #define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */ #define TIFFTAG_CLIPPATH 343 /* %ClipPath [Adobe TIFF technote 2] */ #define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits [Adobe TIFF technote 2] */ #define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits [Adobe TIFF technote 2] */ #define TIFFTAG_INDEXED 346 /* %Indexed [Adobe TIFF Technote 3] */ #define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */ #define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */ /* Tags 400-435 are from the TIFF/FX spec */ #define TIFFTAG_GLOBALPARAMETERSIFD 400 /* ! */ #define TIFFTAG_PROFILETYPE 401 /* ! */ #define PROFILETYPE_UNSPECIFIED 0 /* ! */ #define PROFILETYPE_G3_FAX 1 /* ! */ #define TIFFTAG_FAXPROFILE 402 /* ! */ #define FAXPROFILE_S 1 /* !TIFF/FX FAX profile S */ #define FAXPROFILE_F 2 /* !TIFF/FX FAX profile F */ #define FAXPROFILE_J 3 /* !TIFF/FX FAX profile J */ #define FAXPROFILE_C 4 /* !TIFF/FX FAX profile C */ #define FAXPROFILE_L 5 /* !TIFF/FX FAX profile L */ #define FAXPROFILE_M 6 /* !TIFF/FX FAX profile LM */ #define TIFFTAG_CODINGMETHODS 403 /* !TIFF/FX coding methods */ #define CODINGMETHODS_T4_1D (1 << 1) /* !T.4 1D */ #define CODINGMETHODS_T4_2D (1 << 2) /* !T.4 2D */ #define CODINGMETHODS_T6 (1 << 3) /* !T.6 */ #define CODINGMETHODS_T85 (1 << 4) /* !T.85 JBIG */ #define CODINGMETHODS_T42 (1 << 5) /* !T.42 JPEG */ #define CODINGMETHODS_T43 (1 << 6) /* !T.43 colour by layered JBIG */ #define TIFFTAG_VERSIONYEAR 404 /* !TIFF/FX version year */ #define TIFFTAG_MODENUMBER 405 /* !TIFF/FX mode number */ #define TIFFTAG_DECODE 433 /* !TIFF/FX decode */ #define TIFFTAG_IMAGEBASECOLOR 434 /* !TIFF/FX image base colour */ #define TIFFTAG_T82OPTIONS 435 /* !TIFF/FX T.82 options */ /* * Tags 512-521 are obsoleted by Technical Note #2 which specifies a * revised JPEG-in-TIFF scheme. */ #define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */ #define JPEGPROC_BASELINE 1 /* !baseline sequential */ #define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */ #define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */ #define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */ #define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */ #define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */ #define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */ #define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */ #define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */ #define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */ #define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */ #define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */ #define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */ #define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */ #define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */ #define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */ #define TIFFTAG_STRIPROWCOUNTS 559 /* !TIFF/FX strip row counts */ #define TIFFTAG_XMLPACKET 700 /* %XML packet [Adobe XMP Specification, January 2004 */ #define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID [Adobe TIFF technote] */ /* tags 32952-32956 are private tags registered to Island Graphics */ #define TIFFTAG_REFPTS 32953 /* image reference points */ #define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */ #define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */ #define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */ /* tags 32995-32999 are private tags registered to SGI */ #define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */ #define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */ #define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */ #define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */ /* tags 33300-33309 are private tags registered to Pixar */ /* * TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH * are set when an image has been cropped out of a larger image. * They reflect the size of the original uncropped image. * The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used * to determine the position of the smaller image in the larger one. */ #define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */ #define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */ /* Tags 33302-33306 are used to identify special image modes and data * used by Pixar's texture formats. */ #define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */ #define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */ #define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */ #define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305 #define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306 /* tag 33405 is a private tag registered to Eastman Kodak */ #define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */ /* tag 33432 is listed in the 6.0 spec w/ unknown ownership */ #define TIFFTAG_COPYRIGHT 33432 /* copyright string */ /* IPTC TAG from RichTIFF specifications */ #define TIFFTAG_RICHTIFFIPTC 33723 /* 34016-34029 are reserved for ANSI IT8 TIFF/IT */ #define TIFFTAG_STONITS 37439 /* Sample value to Nits */ /* tag 34929 is a private tag registered to FedEx */ #define TIFFTAG_FEDEX_EDR 34929 /* unknown use */ #define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */ /* Adobe Digital Negative (DNG) format tags */ #define TIFFTAG_DNGVERSION 50706 /* &DNG version number */ #define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */ #define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */ #define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model name */ #define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space mapping */ #define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */ #define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */ #define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for the BlackLevel tag */ #define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */ #define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level differences (columns) */ #define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level differences (rows) */ #define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding level */ #define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */ #define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image area */ #define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image area */ #define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space transformation matrix 1 */ #define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space transformation matrix 2 */ #define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */ #define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */ #define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction matrix 1 */ #define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction matrix 2 */ #define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw values*/ #define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in linear reference space */ #define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in x-y chromaticity coordinates */ #define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero point */ #define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */ #define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of sharpening */ #define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of the green pixels in the blue/green rows track the values of the green pixels in the red/green rows */ #define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */ #define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */ #define TIFFTAG_LENSINFO 50736 /* info about the lens */ #define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */ #define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the camera's anti-alias filter */ #define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */ #define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */ #define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote tag is safe to preserve along with the rest of the EXIF data */ #define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */ #define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */ #define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */ #define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for the raw image data */ #define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original raw file */ #define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original raw file */ #define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels of the sensor */ #define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates of fully masked pixels */ #define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */ #define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space into ICC profile space */ #define TIFFTAG_CURRENTICCPROFILE 50833 /* & */ #define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */ /* tag 65535 is an undefined tag used by Eastman Kodak */ #define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */ /* * The following are ``pseudo tags'' that can be used to control * codec-specific functionality. These tags are not written to file. * Note that these values start at 0xffff+1 so that they'll never * collide with Aldus-assigned tags. * * If you want your private pseudo tags ``registered'' (i.e. added to * this file), please post a bug report via the tracking system at * http://www.remotesensing.org/libtiff/bugs.html with the appropriate * C definitions to add. */ #define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */ #define FAXMODE_CLASSIC 0x0000 /* default, include RTC */ #define FAXMODE_NORTC 0x0001 /* no RTC at end of data */ #define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */ #define FAXMODE_BYTEALIGN 0x0004 /* byte align row */ #define FAXMODE_WORDALIGN 0x0008 /* word align row */ #define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */ #define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */ /* Note: quality level is on the IJG 0-100 scale. Default value is 75 */ #define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */ #define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */ #define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */ #define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */ #define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */ #define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */ /* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */ #define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */ #define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */ #define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */ #define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */ #define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */ #define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */ #define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */ #define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */ /* 65550-65556 are allocated to Oceana Matrix */ #define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */ #define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */ #define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */ #define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */ #define DCSIMAGERFILTER_IR 0 /* infrared filter */ #define DCSIMAGERFILTER_MONO 1 /* monochrome filter */ #define DCSIMAGERFILTER_CFA 2 /* color filter array */ #define DCSIMAGERFILTER_OTHER 3 /* other filter */ #define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */ #define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */ #define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */ #define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */ #define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */ #define TIFFTAG_DCSGAMMA 65554 /* gamma value */ #define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */ #define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */ /* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */ #define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */ #define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */ /* 65559 is allocated to Oceana Matrix */ #define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */ #define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */ #define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */ #define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */ #define SGILOGDATAFMT_RAW 2 /* uninterpreted data */ #define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */ #define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/ #define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/ #define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */ #define TIFFTAG_LZMAPRESET 65562 /* LZMA2 preset (compression level) */ #define TIFFTAG_PERSAMPLE 65563 /* interface for per sample tags */ #define PERSAMPLE_MERGED 0 /* present as a single value */ #define PERSAMPLE_MULTI 1 /* present as multiple values */ /* * EXIF tags */ #define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */ #define EXIFTAG_FNUMBER 33437 /* F number */ #define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */ #define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */ #define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */ #define EXIFTAG_OECF 34856 /* Optoelectric conversion factor */ #define EXIFTAG_EXIFVERSION 36864 /* Exif version */ #define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original data generation */ #define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital data generation */ #define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */ #define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */ #define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */ #define EXIFTAG_APERTUREVALUE 37378 /* Aperture */ #define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */ #define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */ #define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */ #define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */ #define EXIFTAG_METERINGMODE 37383 /* Metering mode */ #define EXIFTAG_LIGHTSOURCE 37384 /* Light source */ #define EXIFTAG_FLASH 37385 /* Flash */ #define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */ #define EXIFTAG_SUBJECTAREA 37396 /* Subject area */ #define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */ #define EXIFTAG_USERCOMMENT 37510 /* User comments */ #define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */ #define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */ #define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */ #define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */ #define EXIFTAG_COLORSPACE 40961 /* Color space information */ #define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */ #define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */ #define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */ #define EXIFTAG_FLASHENERGY 41483 /* Flash energy */ #define EXIFTAG_SPATIALFREQUENCYRESPONSE 41484 /* Spatial frequency response */ #define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */ #define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */ #define EXIFTAG_FOCALPLANERESOLUTIONUNIT 41488 /* Focal plane resolution unit */ #define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */ #define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */ #define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */ #define EXIFTAG_FILESOURCE 41728 /* File source */ #define EXIFTAG_SCENETYPE 41729 /* Scene type */ #define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */ #define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */ #define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */ #define EXIFTAG_WHITEBALANCE 41987 /* White balance */ #define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */ #define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */ #define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */ #define EXIFTAG_GAINCONTROL 41991 /* Gain control */ #define EXIFTAG_CONTRAST 41992 /* Contrast */ #define EXIFTAG_SATURATION 41993 /* Saturation */ #define EXIFTAG_SHARPNESS 41994 /* Sharpness */ #define EXIFTAG_DEVICESETTINGDESCRIPTION 41995 /* Device settings description */ #define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */ #define EXIFTAG_GAINCONTROL 41991 /* Gain control */ #define EXIFTAG_GAINCONTROL 41991 /* Gain control */ #define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */ #endif /* _TIFF_ */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_config.h.in0000644000212300117540000002402212027361211013666 00000000000000/* libtiff/tif_config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Support CCITT Group 3 & 4 algorithms */ #undef CCITT_SUPPORT /* Pick up YCbCr subsampling info from the JPEG data stream to support files lacking the tag (default enabled). */ #undef CHECK_JPEG_YCBCR_SUBSAMPLING /* enable partial strip reading for large strips (experimental) */ #undef CHUNKY_STRIP_READ_SUPPORT /* Support C++ stream API (requires C++ compiler) */ #undef CXX_SUPPORT /* Treat extra sample as alpha (default enabled). The RGBA interface will treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA files but don't mark the alpha properly. */ #undef DEFAULT_EXTRASAMPLE_AS_ALPHA /* enable deferred strip/tile offset/size loading (experimental) */ #undef DEFER_STRILE_LOAD /* Define to 1 if you have the header file. */ #undef HAVE_ASSERT_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `floor' function. */ #undef HAVE_FLOOR /* Define to 1 if you have the `getopt' function. */ #undef HAVE_GETOPT /* Define to 1 if you have the header file. */ #undef HAVE_GLUT_GLUT_H /* Define to 1 if you have the header file. */ #undef HAVE_GL_GLUT_H /* Define to 1 if you have the header file. */ #undef HAVE_GL_GLU_H /* Define to 1 if you have the header file. */ #undef HAVE_GL_GL_H /* Define as 0 or 1 according to the floating point format suported by the machine */ #undef HAVE_IEEEFP /* Define to 1 if the system has the type `int16'. */ #undef HAVE_INT16 /* Define to 1 if the system has the type `int32'. */ #undef HAVE_INT32 /* Define to 1 if the system has the type `int8'. */ #undef HAVE_INT8 /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_IO_H /* Define to 1 if you have the `isascii' function. */ #undef HAVE_ISASCII /* Define to 1 if you have the `jbg_newlen' function. */ #undef HAVE_JBG_NEWLEN /* Define to 1 if you have the `lfind' function. */ #undef HAVE_LFIND /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `mmap' function. */ #undef HAVE_MMAP /* Define to 1 if you have the header file. */ #undef HAVE_OPENGL_GLU_H /* Define to 1 if you have the header file. */ #undef HAVE_OPENGL_GL_H /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Define if you have POSIX threads libraries and header files. */ #undef HAVE_PTHREAD /* Define to 1 if you have the header file. */ #undef HAVE_SEARCH_H /* Define to 1 if you have the `setmode' function. */ #undef HAVE_SETMODE /* Define to 1 if you have the `sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the `strtoul' function. */ #undef HAVE_STRTOUL /* Define to 1 if you have the `strtoull' function. */ #undef HAVE_STRTOULL /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Use nonstandard varargs form for the GLU tesselator callback */ #undef HAVE_VARARGS_GLU_TESSCB /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H /* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian (Intel) */ #undef HOST_BIGENDIAN /* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ #undef HOST_FILLORDER /* Support ISO JBIG compression (requires JBIG-KIT library) */ #undef JBIG_SUPPORT /* 8/12 bit libjpeg dual mode enabled */ #undef JPEG_DUAL_MODE_8_12 /* Support JPEG compression (requires IJG JPEG library) */ #undef JPEG_SUPPORT /* 12bit libjpeg primary include file with path */ #undef LIBJPEG_12_PATH /* Support LogLuv high dynamic range encoding */ #undef LOGLUV_SUPPORT /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Support LZMA2 compression */ #undef LZMA_SUPPORT /* Support LZW algorithm */ #undef LZW_SUPPORT /* Support Microsoft Document Imaging format */ #undef MDI_SUPPORT /* Support NeXT 2-bit RLE algorithm */ #undef NEXT_SUPPORT /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Support Old JPEG compresson (read-only) */ #undef OJPEG_SUPPORT /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Support Macintosh PackBits algorithm */ #undef PACKBITS_SUPPORT /* Support Pixar log-format algorithm (requires Zlib) */ #undef PIXARLOG_SUPPORT /* Define to necessary symbol if this constant uses a non-standard name on your system. */ #undef PTHREAD_CREATE_JOINABLE /* The size of `signed int', as computed by sizeof. */ #undef SIZEOF_SIGNED_INT /* The size of `signed long', as computed by sizeof. */ #undef SIZEOF_SIGNED_LONG /* The size of `signed long long', as computed by sizeof. */ #undef SIZEOF_SIGNED_LONG_LONG /* The size of `signed short', as computed by sizeof. */ #undef SIZEOF_SIGNED_SHORT /* The size of `unsigned char *', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_CHAR_P /* The size of `unsigned int', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_INT /* The size of `unsigned long', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_LONG /* The size of `unsigned long long', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_LONG_LONG /* The size of `unsigned short', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_SHORT /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Support strip chopping (whether or not to convert single-strip uncompressed images to mutiple strips of specified size to reduce memory usage) */ #undef STRIPCHOP_DEFAULT /* Default size of the strip in bytes (when strip chopping enabled) */ #undef STRIP_SIZE_DEFAULT /* Enable SubIFD tag (330) support */ #undef SUBIFD_SUPPORT /* Support ThunderScan 4-bit RLE algorithm */ #undef THUNDER_SUPPORT /* Signed 16-bit type */ #undef TIFF_INT16_T /* Signed 32-bit type formatter */ #undef TIFF_INT32_FORMAT /* Signed 32-bit type */ #undef TIFF_INT32_T /* Signed 64-bit type formatter */ #undef TIFF_INT64_FORMAT /* Signed 64-bit type */ #undef TIFF_INT64_T /* Signed 8-bit type */ #undef TIFF_INT8_T /* Pointer difference type formatter */ #undef TIFF_PTRDIFF_FORMAT /* Pointer difference type */ #undef TIFF_PTRDIFF_T /* Signed size type formatter */ #undef TIFF_SSIZE_FORMAT /* Signed size type */ #undef TIFF_SSIZE_T /* Unsigned 16-bit type */ #undef TIFF_UINT16_T /* Unsigned 32-bit type formatter */ #undef TIFF_UINT32_FORMAT /* Unsigned 32-bit type */ #undef TIFF_UINT32_T /* Unsigned 64-bit type formatter */ #undef TIFF_UINT64_FORMAT /* Unsigned 64-bit type */ #undef TIFF_UINT64_T /* Unsigned 8-bit type */ #undef TIFF_UINT8_T /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* define to use win32 IO system */ #undef USE_WIN32_FILEIO /* Version number of package */ #undef VERSION /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Support Deflate compression */ #undef ZIP_SUPPORT /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `long int' if does not define. */ #undef off_t /* Define to `unsigned int' if does not define. */ #undef size_t tiff-4.0.3/libtiff/tiffio.h0000644000212300117540000005473312005263022012443 00000000000000/* $Id: tiffio.h,v 1.91 2012-07-29 15:45:29 tgl Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFFIO_ #define _TIFFIO_ /* * TIFF I/O Library Definitions. */ #include "tiff.h" #include "tiffvers.h" /* * TIFF is defined as an incomplete type to hide the * library's internal data structures from clients. */ typedef struct tiff TIFF; /* * The following typedefs define the intrinsic size of * data types used in the *exported* interfaces. These * definitions depend on the proper definition of types * in tiff.h. Note also that the varargs interface used * to pass tag types and values uses the types defined in * tiff.h directly. * * NB: ttag_t is unsigned int and not unsigned short because * ANSI C requires that the type before the ellipsis be a * promoted type (i.e. one of int, unsigned int, pointer, * or double) and because we defined pseudo-tags that are * outside the range of legal Aldus-assigned tags. * NB: tsize_t is int32 and not uint32 because some functions * return -1. * NB: toff_t is not off_t for many reasons; TIFFs max out at * 32-bit file offsets, and BigTIFF maxes out at 64-bit * offsets being the most important, and to ensure use of * a consistently unsigned type across architectures. * Prior to libtiff 4.0, this was an unsigned 32 bit type. */ /* * this is the machine addressing size type, only it's signed, so make it * int32 on 32bit machines, int64 on 64bit machines */ typedef TIFF_SSIZE_T tmsize_t; typedef uint64 toff_t; /* file offset */ /* the following are deprecated and should be replaced by their defining counterparts */ typedef uint32 ttag_t; /* directory tag */ typedef uint16 tdir_t; /* directory index */ typedef uint16 tsample_t; /* sample number */ typedef uint32 tstrile_t; /* strip or tile number */ typedef tstrile_t tstrip_t; /* strip number */ typedef tstrile_t ttile_t; /* tile number */ typedef tmsize_t tsize_t; /* i/o size in bytes */ typedef void* tdata_t; /* image data ref */ #if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32)) #define __WIN32__ #endif /* * On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c * or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c). * * By default tif_unix.c is assumed. */ #if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) # if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO) # define AVOID_WIN32_FILEIO # endif #endif #if defined(USE_WIN32_FILEIO) # define VC_EXTRALEAN # include # ifdef __WIN32__ DECLARE_HANDLE(thandle_t); /* Win32 file handle */ # else typedef HFILE thandle_t; /* client data handle */ # endif /* __WIN32__ */ #else typedef void* thandle_t; /* client data handle */ #endif /* USE_WIN32_FILEIO */ /* * Flags to pass to TIFFPrintDirectory to control * printing of data structures that are potentially * very large. Bit-or these flags to enable printing * multiple items. */ #define TIFFPRINT_NONE 0x0 /* no extra info */ #define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */ #define TIFFPRINT_CURVES 0x2 /* color/gray response curves */ #define TIFFPRINT_COLORMAP 0x4 /* colormap */ #define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */ #define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */ #define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */ /* * Colour conversion stuff */ /* reference white */ #define D65_X0 (95.0470F) #define D65_Y0 (100.0F) #define D65_Z0 (108.8827F) #define D50_X0 (96.4250F) #define D50_Y0 (100.0F) #define D50_Z0 (82.4680F) /* Structure for holding information about a display device. */ typedef unsigned char TIFFRGBValue; /* 8-bit samples */ typedef struct { float d_mat[3][3]; /* XYZ -> luminance matrix */ float d_YCR; /* Light o/p for reference white */ float d_YCG; float d_YCB; uint32 d_Vrwr; /* Pixel values for ref. white */ uint32 d_Vrwg; uint32 d_Vrwb; float d_Y0R; /* Residual light for black pixel */ float d_Y0G; float d_Y0B; float d_gammaR; /* Gamma values for the three guns */ float d_gammaG; float d_gammaB; } TIFFDisplay; typedef struct { /* YCbCr->RGB support */ TIFFRGBValue* clamptab; /* range clamping table */ int* Cr_r_tab; int* Cb_b_tab; int32* Cr_g_tab; int32* Cb_g_tab; int32* Y_tab; } TIFFYCbCrToRGB; typedef struct { /* CIE Lab 1976->RGB support */ int range; /* Size of conversion table */ #define CIELABTORGB_TABLE_RANGE 1500 float rstep, gstep, bstep; float X0, Y0, Z0; /* Reference white point */ TIFFDisplay display; float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */ float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */ float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */ } TIFFCIELabToRGB; /* * RGBA-style image support. */ typedef struct _TIFFRGBAImage TIFFRGBAImage; /* * The image reading and conversion routines invoke * ``put routines'' to copy/image/whatever tiles of * raw image data. A default set of routines are * provided to convert/copy raw image data to 8-bit * packed ABGR format rasters. Applications can supply * alternate routines that unpack the data into a * different format or, for example, unpack the data * and draw the unpacked raster on the display. */ typedef void (*tileContigRoutine) (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, unsigned char*); typedef void (*tileSeparateRoutine) (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, unsigned char*, unsigned char*, unsigned char*, unsigned char*); /* * RGBA-reader state. */ struct _TIFFRGBAImage { TIFF* tif; /* image handle */ int stoponerr; /* stop on read error */ int isContig; /* data is packed/separate */ int alpha; /* type of alpha data present */ uint32 width; /* image width */ uint32 height; /* image height */ uint16 bitspersample; /* image bits/sample */ uint16 samplesperpixel; /* image samples/pixel */ uint16 orientation; /* image orientation */ uint16 req_orientation; /* requested orientation */ uint16 photometric; /* image photometric interp */ uint16* redcmap; /* colormap pallete */ uint16* greencmap; uint16* bluecmap; /* get image data routine */ int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32); /* put decoded strip/tile */ union { void (*any)(TIFFRGBAImage*); tileContigRoutine contig; tileSeparateRoutine separate; } put; TIFFRGBValue* Map; /* sample mapping array */ uint32** BWmap; /* black&white map */ uint32** PALmap; /* palette image map */ TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */ TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */ uint8* UaToAa; /* Unassociated alpha to associated alpha convertion LUT */ uint8* Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */ int row_offset; int col_offset; }; /* * Macros for extracting components from the * packed ABGR form returned by TIFFReadRGBAImage. */ #define TIFFGetR(abgr) ((abgr) & 0xff) #define TIFFGetG(abgr) (((abgr) >> 8) & 0xff) #define TIFFGetB(abgr) (((abgr) >> 16) & 0xff) #define TIFFGetA(abgr) (((abgr) >> 24) & 0xff) /* * A CODEC is a software package that implements decoding, * encoding, or decoding+encoding of a compression algorithm. * The library provides a collection of builtin codecs. * More codecs may be registered through calls to the library * and/or the builtin implementations may be overridden. */ typedef int (*TIFFInitMethod)(TIFF*, int); typedef struct { char* name; uint16 scheme; TIFFInitMethod init; } TIFFCodec; #include #include /* share internal LogLuv conversion routines? */ #ifndef LOGLUV_PUBLIC #define LOGLUV_PUBLIC 1 #endif #if !defined(__GNUC__) && !defined(__attribute__) # define __attribute__(x) /*nothing*/ #endif #if defined(c_plusplus) || defined(__cplusplus) extern "C" { #endif typedef void (*TIFFErrorHandler)(const char*, const char*, va_list); typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list); typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void*, tmsize_t); typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int); typedef int (*TIFFCloseProc)(thandle_t); typedef toff_t (*TIFFSizeProc)(thandle_t); typedef int (*TIFFMapFileProc)(thandle_t, void** base, toff_t* size); typedef void (*TIFFUnmapFileProc)(thandle_t, void* base, toff_t size); typedef void (*TIFFExtendProc)(TIFF*); extern const char* TIFFGetVersion(void); extern const TIFFCodec* TIFFFindCODEC(uint16); extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod); extern void TIFFUnRegisterCODEC(TIFFCodec*); extern int TIFFIsCODECConfigured(uint16); extern TIFFCodec* TIFFGetConfiguredCODECs(void); /* * Auxiliary functions. */ extern void* _TIFFmalloc(tmsize_t s); extern void* _TIFFrealloc(void* p, tmsize_t s); extern void _TIFFmemset(void* p, int v, tmsize_t c); extern void _TIFFmemcpy(void* d, const void* s, tmsize_t c); extern int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c); extern void _TIFFfree(void* p); /* ** Stuff, related to tag handling and creating custom tags. */ extern int TIFFGetTagListCount( TIFF * ); extern uint32 TIFFGetTagListEntry( TIFF *, int tag_index ); #define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */ #define TIFF_VARIABLE -1 /* marker for variable length tags */ #define TIFF_SPP -2 /* marker for SamplesPerPixel tags */ #define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */ #define FIELD_CUSTOM 65 typedef struct _TIFFField TIFFField; typedef struct _TIFFFieldArray TIFFFieldArray; extern const TIFFField* TIFFFindField(TIFF *, uint32, TIFFDataType); extern const TIFFField* TIFFFieldWithTag(TIFF*, uint32); extern const TIFFField* TIFFFieldWithName(TIFF*, const char *); extern uint32 TIFFFieldTag(const TIFFField*); extern const char* TIFFFieldName(const TIFFField*); extern TIFFDataType TIFFFieldDataType(const TIFFField*); extern int TIFFFieldPassCount(const TIFFField*); extern int TIFFFieldReadCount(const TIFFField*); extern int TIFFFieldWriteCount(const TIFFField*); typedef int (*TIFFVSetMethod)(TIFF*, uint32, va_list); typedef int (*TIFFVGetMethod)(TIFF*, uint32, va_list); typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long); typedef struct { TIFFVSetMethod vsetfield; /* tag set routine */ TIFFVGetMethod vgetfield; /* tag get routine */ TIFFPrintMethod printdir; /* directory print routine */ } TIFFTagMethods; extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *); extern void *TIFFGetClientInfo(TIFF *, const char *); extern void TIFFSetClientInfo(TIFF *, void *, const char *); extern void TIFFCleanup(TIFF* tif); extern void TIFFClose(TIFF* tif); extern int TIFFFlush(TIFF* tif); extern int TIFFFlushData(TIFF* tif); extern int TIFFGetField(TIFF* tif, uint32 tag, ...); extern int TIFFVGetField(TIFF* tif, uint32 tag, va_list ap); extern int TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...); extern int TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap); extern int TIFFReadDirectory(TIFF* tif); extern int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray); extern int TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff); extern uint64 TIFFScanlineSize64(TIFF* tif); extern tmsize_t TIFFScanlineSize(TIFF* tif); extern uint64 TIFFRasterScanlineSize64(TIFF* tif); extern tmsize_t TIFFRasterScanlineSize(TIFF* tif); extern uint64 TIFFStripSize64(TIFF* tif); extern tmsize_t TIFFStripSize(TIFF* tif); extern uint64 TIFFRawStripSize64(TIFF* tif, uint32 strip); extern tmsize_t TIFFRawStripSize(TIFF* tif, uint32 strip); extern uint64 TIFFVStripSize64(TIFF* tif, uint32 nrows); extern tmsize_t TIFFVStripSize(TIFF* tif, uint32 nrows); extern uint64 TIFFTileRowSize64(TIFF* tif); extern tmsize_t TIFFTileRowSize(TIFF* tif); extern uint64 TIFFTileSize64(TIFF* tif); extern tmsize_t TIFFTileSize(TIFF* tif); extern uint64 TIFFVTileSize64(TIFF* tif, uint32 nrows); extern tmsize_t TIFFVTileSize(TIFF* tif, uint32 nrows); extern uint32 TIFFDefaultStripSize(TIFF* tif, uint32 request); extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*); extern int TIFFFileno(TIFF*); extern int TIFFSetFileno(TIFF*, int); extern thandle_t TIFFClientdata(TIFF*); extern thandle_t TIFFSetClientdata(TIFF*, thandle_t); extern int TIFFGetMode(TIFF*); extern int TIFFSetMode(TIFF*, int); extern int TIFFIsTiled(TIFF*); extern int TIFFIsByteSwapped(TIFF*); extern int TIFFIsUpSampled(TIFF*); extern int TIFFIsMSB2LSB(TIFF*); extern int TIFFIsBigEndian(TIFF*); extern TIFFReadWriteProc TIFFGetReadProc(TIFF*); extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*); extern TIFFSeekProc TIFFGetSeekProc(TIFF*); extern TIFFCloseProc TIFFGetCloseProc(TIFF*); extern TIFFSizeProc TIFFGetSizeProc(TIFF*); extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*); extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*); extern uint32 TIFFCurrentRow(TIFF*); extern uint16 TIFFCurrentDirectory(TIFF*); extern uint16 TIFFNumberOfDirectories(TIFF*); extern uint64 TIFFCurrentDirOffset(TIFF*); extern uint32 TIFFCurrentStrip(TIFF*); extern uint32 TIFFCurrentTile(TIFF* tif); extern int TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size); extern int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size); extern int TIFFSetupStrips(TIFF *); extern int TIFFWriteCheck(TIFF*, int, const char *); extern void TIFFFreeDirectory(TIFF*); extern int TIFFCreateDirectory(TIFF*); extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*); extern int TIFFCreateEXIFDirectory(TIFF*); extern int TIFFLastDirectory(TIFF*); extern int TIFFSetDirectory(TIFF*, uint16); extern int TIFFSetSubDirectory(TIFF*, uint64); extern int TIFFUnlinkDirectory(TIFF*, uint16); extern int TIFFSetField(TIFF*, uint32, ...); extern int TIFFVSetField(TIFF*, uint32, va_list); extern int TIFFUnsetField(TIFF*, uint32); extern int TIFFWriteDirectory(TIFF *); extern int TIFFWriteCustomDirectory(TIFF *, uint64 *); extern int TIFFCheckpointDirectory(TIFF *); extern int TIFFRewriteDirectory(TIFF *); #if defined(c_plusplus) || defined(__cplusplus) extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0); extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0); extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0); extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0); extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int = ORIENTATION_BOTLEFT, int = 0); #else extern void TIFFPrintDirectory(TIFF*, FILE*, long); extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample); extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample); extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int); extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int); #endif extern int TIFFReadRGBAStrip(TIFF*, uint32, uint32 * ); extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * ); extern int TIFFRGBAImageOK(TIFF*, char [1024]); extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]); extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32); extern void TIFFRGBAImageEnd(TIFFRGBAImage*); extern TIFF* TIFFOpen(const char*, const char*); # ifdef __WIN32__ extern TIFF* TIFFOpenW(const wchar_t*, const char*); # endif /* __WIN32__ */ extern TIFF* TIFFFdOpen(int, const char*, const char*); extern TIFF* TIFFClientOpen(const char*, const char*, thandle_t, TIFFReadWriteProc, TIFFReadWriteProc, TIFFSeekProc, TIFFCloseProc, TIFFSizeProc, TIFFMapFileProc, TIFFUnmapFileProc); extern const char* TIFFFileName(TIFF*); extern const char* TIFFSetFileName(TIFF*, const char *); extern void TIFFError(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3))); extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4))); extern void TIFFWarning(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3))); extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4))); extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler); extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt); extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler); extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt); extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc); extern uint32 TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s); extern int TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s); extern uint32 TIFFNumberOfTiles(TIFF*); extern tmsize_t TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s); extern tmsize_t TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s); extern uint32 TIFFComputeStrip(TIFF*, uint32, uint16); extern uint32 TIFFNumberOfStrips(TIFF*); extern tmsize_t TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size); extern tmsize_t TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size); extern tmsize_t TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size); extern tmsize_t TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size); extern tmsize_t TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc); extern tmsize_t TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc); extern tmsize_t TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc); extern tmsize_t TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc); extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */ extern void TIFFSetWriteOffset(TIFF* tif, toff_t off); extern void TIFFSwabShort(uint16*); extern void TIFFSwabLong(uint32*); extern void TIFFSwabLong8(uint64*); extern void TIFFSwabFloat(float*); extern void TIFFSwabDouble(double*); extern void TIFFSwabArrayOfShort(uint16* wp, tmsize_t n); extern void TIFFSwabArrayOfTriples(uint8* tp, tmsize_t n); extern void TIFFSwabArrayOfLong(uint32* lp, tmsize_t n); extern void TIFFSwabArrayOfLong8(uint64* lp, tmsize_t n); extern void TIFFSwabArrayOfFloat(float* fp, tmsize_t n); extern void TIFFSwabArrayOfDouble(double* dp, tmsize_t n); extern void TIFFReverseBits(uint8* cp, tmsize_t n); extern const unsigned char* TIFFGetBitRevTable(int); #ifdef LOGLUV_PUBLIC #define U_NEU 0.210526316 #define V_NEU 0.473684211 #define UVSCALE 410. extern double LogL16toY(int); extern double LogL10toY(int); extern void XYZtoRGB24(float*, uint8*); extern int uv_decode(double*, double*, int); extern void LogLuv24toXYZ(uint32, float*); extern void LogLuv32toXYZ(uint32, float*); #if defined(c_plusplus) || defined(__cplusplus) extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER); extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER); extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER); extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER); extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER); #else extern int LogL16fromY(double, int); extern int LogL10fromY(double, int); extern int uv_encode(double, double, int); extern uint32 LogLuv24fromXYZ(float*, int); extern uint32 LogLuv32fromXYZ(float*, int); #endif #endif /* LOGLUV_PUBLIC */ extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, const TIFFDisplay *, float*); extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32, float *, float *, float *); extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float, uint32 *, uint32 *, uint32 *); extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*); extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32, uint32 *, uint32 *, uint32 *); /**************************************************************************** * O B S O L E T E D I N T E R F A C E S * * Don't use this stuff in your applications, it may be removed in the future * libtiff versions. ****************************************************************************/ typedef struct { ttag_t field_tag; /* field's tag */ short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */ short field_writecount; /* write count/TIFF_VARIABLE */ TIFFDataType field_type; /* type of associated data */ unsigned short field_bit; /* bit in fieldsset bit vector */ unsigned char field_oktochange; /* if true, can change while writing */ unsigned char field_passcount; /* if true, pass dir count on set */ char *field_name; /* ASCII name */ } TIFFFieldInfo; extern int TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], uint32); #if defined(c_plusplus) || defined(__cplusplus) } #endif #endif /* _TIFFIO_ */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_config.vc.h0000644000212300117540000000337611631764114013712 00000000000000/* Define to 1 if you have the header file. */ #define HAVE_ASSERT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define as 0 or 1 according to the floating point format suported by the machine */ #define HAVE_IEEEFP 1 /* Define to 1 if you have the `jbg_newlen' function. */ #define HAVE_JBG_NEWLEN 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_IO_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SEARCH_H 1 /* Define to 1 if you have the `setmode' function. */ #define HAVE_SETMODE 1 /* The size of a `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* The size of a `long', as computed by sizeof. */ #define SIZEOF_LONG 4 /* Signed 64-bit type formatter */ #define TIFF_INT64_FORMAT "%I64d" /* Signed 64-bit type */ #define TIFF_INT64_T signed __int64 /* Unsigned 64-bit type formatter */ #define TIFF_UINT64_FORMAT "%I64u" /* Unsigned 64-bit type */ #define TIFF_UINT64_T unsigned __int64 /* Set the native cpu bit order */ #define HOST_FILLORDER FILLORDER_LSB2MSB #define snprintf _snprintf /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ /* #undef WORDS_BIGENDIAN */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus # ifndef inline # define inline __inline # endif #endif #define lfind _lfind /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/Makefile.vc0000644000212300117540000000523511225004205013051 00000000000000# $Id: Makefile.vc,v 1.22 2009-06-23 18:25:43 fwarmerdam Exp $ # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # # Makefile for MS Visual C and Watcom C compilers. # # To build: # C:\libtiff\libtiff> nmake /f makefile.vc all # !INCLUDE ..\nmake.opt INCL = -I. $(JPEG_INCLUDE) $(ZLIB_INCLUDE) $(JBIG_INCLUDE) !IFDEF USE_WIN_CRT_LIB OBJ_SYSDEP_MODULE = tif_unix.obj !ELSE OBJ_SYSDEP_MODULE = tif_win32.obj !ENDIF OBJ = \ tif_aux.obj \ tif_close.obj \ tif_codec.obj \ tif_color.obj \ tif_compress.obj \ tif_dir.obj \ tif_dirinfo.obj \ tif_dirread.obj \ tif_dirwrite.obj \ tif_dumpmode.obj \ tif_error.obj \ tif_extension.obj \ tif_fax3.obj \ tif_fax3sm.obj \ tif_getimage.obj \ tif_jbig.obj \ tif_jpeg.obj \ tif_jpeg_12.obj \ tif_ojpeg.obj \ tif_flush.obj \ tif_luv.obj \ tif_lzw.obj \ tif_next.obj \ tif_open.obj \ tif_packbits.obj \ tif_pixarlog.obj \ tif_predict.obj \ tif_print.obj \ tif_read.obj \ tif_stream.obj \ tif_swab.obj \ tif_strip.obj \ tif_thunder.obj \ tif_tile.obj \ tif_version.obj \ tif_warning.obj \ tif_write.obj \ tif_zip.obj \ $(OBJ_SYSDEP_MODULE) all: libtiff.lib $(DLLNAME) tif_config.h: tif_config.vc.h copy tif_config.vc.h tif_config.h tiffconf.h: tiffconf.vc.h copy tiffconf.vc.h tiffconf.h libtiff.lib: tif_config.h tiffconf.h $(OBJ) $(AR) /out:libtiff.lib $(OBJ) $(LIBS) $(DLLNAME): tif_config.h tiffconf.h libtiff.def $(OBJ) $(LD) /debug /dll /def:libtiff.def /out:$(DLLNAME) \ /implib:libtiff_i.lib $(OBJ) $(LIBS) clean: -del tif_config.h tiffconf.h -del *.obj -del *.lib -del *.dll -del *.dll.manifest -del *.pdb tiff-4.0.3/libtiff/tiffio.hxx0000644000212300117540000000324611403511023013012 00000000000000/* $Id: tiffio.hxx,v 1.3 2010-06-08 18:55:15 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFFIO_HXX_ #define _TIFFIO_HXX_ /* * TIFF I/O library definitions which provide C++ streams API. */ #include #include "tiff.h" extern TIFF* TIFFStreamOpen(const char*, std::ostream *); extern TIFF* TIFFStreamOpen(const char*, std::istream *); #endif /* _TIFFIO_HXX_ */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c++ * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_dirwrite.c0000644000212300117540000025356211775635007013675 00000000000000/* $Id: tif_dirwrite.c,v 1.77 2012-07-06 19:18:31 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Directory Write Support Routines. */ #include "tiffiop.h" #ifdef HAVE_IEEEFP #define TIFFCvtNativeToIEEEFloat(tif, n, fp) #define TIFFCvtNativeToIEEEDouble(tif, n, dp) #else extern void TIFFCvtNativeToIEEEFloat(TIFF* tif, uint32 n, float* fp); extern void TIFFCvtNativeToIEEEDouble(TIFF* tif, uint32 n, double* dp); #endif static int TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff); static int TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value); #if 0 static int TIFFWriteDirectoryTagSampleformatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value); #endif static int TIFFWriteDirectoryTagAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value); static int TIFFWriteDirectoryTagUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value); #ifdef notdef static int TIFFWriteDirectoryTagByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value); #endif static int TIFFWriteDirectoryTagByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value); #if 0 static int TIFFWriteDirectoryTagBytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value); #endif #ifdef notdef static int TIFFWriteDirectoryTagSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value); #endif static int TIFFWriteDirectoryTagSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value); #if 0 static int TIFFWriteDirectoryTagSbytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value); #endif static int TIFFWriteDirectoryTagShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value); static int TIFFWriteDirectoryTagShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value); static int TIFFWriteDirectoryTagShortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value); #ifdef notdef static int TIFFWriteDirectoryTagSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value); #endif static int TIFFWriteDirectoryTagSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value); #if 0 static int TIFFWriteDirectoryTagSshortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value); #endif static int TIFFWriteDirectoryTagLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value); static int TIFFWriteDirectoryTagLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value); #if 0 static int TIFFWriteDirectoryTagLongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value); #endif #ifdef notdef static int TIFFWriteDirectoryTagSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value); #endif static int TIFFWriteDirectoryTagSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value); #if 0 static int TIFFWriteDirectoryTagSlongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value); #endif #ifdef notdef static int TIFFWriteDirectoryTagLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value); #endif static int TIFFWriteDirectoryTagLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value); #ifdef notdef static int TIFFWriteDirectoryTagSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value); #endif static int TIFFWriteDirectoryTagSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value); static int TIFFWriteDirectoryTagRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value); static int TIFFWriteDirectoryTagRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value); static int TIFFWriteDirectoryTagSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value); #ifdef notdef static int TIFFWriteDirectoryTagFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value); #endif static int TIFFWriteDirectoryTagFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value); #if 0 static int TIFFWriteDirectoryTagFloatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value); #endif #ifdef notdef static int TIFFWriteDirectoryTagDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value); #endif static int TIFFWriteDirectoryTagDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value); #if 0 static int TIFFWriteDirectoryTagDoublePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value); #endif static int TIFFWriteDirectoryTagIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value); #ifdef notdef static int TIFFWriteDirectoryTagIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value); #endif static int TIFFWriteDirectoryTagShortLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value); static int TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value); static int TIFFWriteDirectoryTagIfdIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value); #ifdef notdef static int TIFFWriteDirectoryTagShortLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value); #endif static int TIFFWriteDirectoryTagColormap(TIFF* tif, uint32* ndir, TIFFDirEntry* dir); static int TIFFWriteDirectoryTagTransferfunction(TIFF* tif, uint32* ndir, TIFFDirEntry* dir); static int TIFFWriteDirectoryTagSubifd(TIFF* tif, uint32* ndir, TIFFDirEntry* dir); static int TIFFWriteDirectoryTagCheckedAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value); static int TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value); #ifdef notdef static int TIFFWriteDirectoryTagCheckedByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value); #endif static int TIFFWriteDirectoryTagCheckedByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value); #ifdef notdef static int TIFFWriteDirectoryTagCheckedSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value); #endif static int TIFFWriteDirectoryTagCheckedSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value); static int TIFFWriteDirectoryTagCheckedShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value); static int TIFFWriteDirectoryTagCheckedShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value); #ifdef notdef static int TIFFWriteDirectoryTagCheckedSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value); #endif static int TIFFWriteDirectoryTagCheckedSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value); static int TIFFWriteDirectoryTagCheckedLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value); static int TIFFWriteDirectoryTagCheckedLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value); #ifdef notdef static int TIFFWriteDirectoryTagCheckedSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value); #endif static int TIFFWriteDirectoryTagCheckedSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value); #ifdef notdef static int TIFFWriteDirectoryTagCheckedLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value); #endif static int TIFFWriteDirectoryTagCheckedLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value); #ifdef notdef static int TIFFWriteDirectoryTagCheckedSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value); #endif static int TIFFWriteDirectoryTagCheckedSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value); static int TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value); static int TIFFWriteDirectoryTagCheckedRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value); static int TIFFWriteDirectoryTagCheckedSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value); #ifdef notdef static int TIFFWriteDirectoryTagCheckedFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value); #endif static int TIFFWriteDirectoryTagCheckedFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value); #ifdef notdef static int TIFFWriteDirectoryTagCheckedDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value); #endif static int TIFFWriteDirectoryTagCheckedDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value); static int TIFFWriteDirectoryTagCheckedIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value); static int TIFFWriteDirectoryTagCheckedIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value); static int TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 datatype, uint32 count, uint32 datalength, void* data); static int TIFFLinkDirectory(TIFF*); /* * Write the contents of the current directory * to the specified file. This routine doesn't * handle overwriting a directory with auxiliary * storage that's been changed. */ int TIFFWriteDirectory(TIFF* tif) { return TIFFWriteDirectorySec(tif,TRUE,TRUE,NULL); } /* * Similar to TIFFWriteDirectory(), writes the directory out * but leaves all data structures in memory so that it can be * written again. This will make a partially written TIFF file * readable before it is successfully completed/closed. */ int TIFFCheckpointDirectory(TIFF* tif) { int rc; /* Setup the strips arrays, if they haven't already been. */ if (tif->tif_dir.td_stripoffset == NULL) (void) TIFFSetupStrips(tif); rc = TIFFWriteDirectorySec(tif,TRUE,FALSE,NULL); (void) TIFFSetWriteOffset(tif, TIFFSeekFile(tif, 0, SEEK_END)); return rc; } int TIFFWriteCustomDirectory(TIFF* tif, uint64* pdiroff) { return TIFFWriteDirectorySec(tif,FALSE,FALSE,pdiroff); } /* * Similar to TIFFWriteDirectory(), but if the directory has already * been written once, it is relocated to the end of the file, in case it * has changed in size. Note that this will result in the loss of the * previously used directory space. */ int TIFFRewriteDirectory( TIFF *tif ) { static const char module[] = "TIFFRewriteDirectory"; /* We don't need to do anything special if it hasn't been written. */ if( tif->tif_diroff == 0 ) return TIFFWriteDirectory( tif ); /* * Find and zero the pointer to this directory, so that TIFFLinkDirectory * will cause it to be added after this directories current pre-link. */ if (!(tif->tif_flags&TIFF_BIGTIFF)) { if (tif->tif_header.classic.tiff_diroff == tif->tif_diroff) { tif->tif_header.classic.tiff_diroff = 0; tif->tif_diroff = 0; TIFFSeekFile(tif,4,SEEK_SET); if (!WriteOK(tif, &(tif->tif_header.classic.tiff_diroff),4)) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error updating TIFF header"); return (0); } } else { uint32 nextdir; nextdir = tif->tif_header.classic.tiff_diroff; while(1) { uint16 dircount; uint32 nextnextdir; if (!SeekOK(tif, nextdir) || !ReadOK(tif, &dircount, 2)) { TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory count"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); (void) TIFFSeekFile(tif, nextdir+2+dircount*12, SEEK_SET); if (!ReadOK(tif, &nextnextdir, 4)) { TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory link"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&nextnextdir); if (nextnextdir==tif->tif_diroff) { uint32 m; m=0; (void) TIFFSeekFile(tif, nextdir+2+dircount*12, SEEK_SET); if (!WriteOK(tif, &m, 4)) { TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link"); return (0); } tif->tif_diroff=0; break; } nextdir=nextnextdir; } } } else { if (tif->tif_header.big.tiff_diroff == tif->tif_diroff) { tif->tif_header.big.tiff_diroff = 0; tif->tif_diroff = 0; TIFFSeekFile(tif,8,SEEK_SET); if (!WriteOK(tif, &(tif->tif_header.big.tiff_diroff),8)) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error updating TIFF header"); return (0); } } else { uint64 nextdir; nextdir = tif->tif_header.big.tiff_diroff; while(1) { uint64 dircount64; uint16 dircount; uint64 nextnextdir; if (!SeekOK(tif, nextdir) || !ReadOK(tif, &dircount64, 8)) { TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory count"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong8(&dircount64); if (dircount64>0xFFFF) { TIFFErrorExt(tif->tif_clientdata, module, "Sanity check on tag count failed, likely corrupt TIFF"); return (0); } dircount=(uint16)dircount64; (void) TIFFSeekFile(tif, nextdir+8+dircount*20, SEEK_SET); if (!ReadOK(tif, &nextnextdir, 8)) { TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory link"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong8(&nextnextdir); if (nextnextdir==tif->tif_diroff) { uint64 m; m=0; (void) TIFFSeekFile(tif, nextdir+8+dircount*20, SEEK_SET); if (!WriteOK(tif, &m, 8)) { TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link"); return (0); } tif->tif_diroff=0; break; } nextdir=nextnextdir; } } } /* * Now use TIFFWriteDirectory() normally. */ return TIFFWriteDirectory( tif ); } static int TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff) { static const char module[] = "TIFFWriteDirectorySec"; uint32 ndir; TIFFDirEntry* dir; uint32 dirsize; void* dirmem; uint32 m; if (tif->tif_mode == O_RDONLY) return (1); _TIFFFillStriles( tif ); /* * Clear write state so that subsequent images with * different characteristics get the right buffers * setup for them. */ if (imagedone) { if (tif->tif_flags & TIFF_POSTENCODE) { tif->tif_flags &= ~TIFF_POSTENCODE; if (!(*tif->tif_postencode)(tif)) { TIFFErrorExt(tif->tif_clientdata,module, "Error post-encoding before directory write"); return (0); } } (*tif->tif_close)(tif); /* shutdown encoder */ /* * Flush any data that might have been written * by the compression close+cleanup routines. But * be careful not to write stuff if we didn't add data * in the previous steps as the "rawcc" data may well be * a previously read tile/strip in mixed read/write mode. */ if (tif->tif_rawcc > 0 && (tif->tif_flags & TIFF_BEENWRITING) != 0 ) { if( !TIFFFlushData1(tif) ) { TIFFErrorExt(tif->tif_clientdata, module, "Error flushing data before directory write"); return (0); } } if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) { _TIFFfree(tif->tif_rawdata); tif->tif_rawdata = NULL; tif->tif_rawcc = 0; tif->tif_rawdatasize = 0; tif->tif_rawdataoff = 0; tif->tif_rawdataloaded = 0; } tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP); } dir=NULL; dirmem=NULL; dirsize=0; while (1) { ndir=0; if (isimage) { if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) { if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_IMAGEWIDTH,tif->tif_dir.td_imagewidth)) goto bad; if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_IMAGELENGTH,tif->tif_dir.td_imagelength)) goto bad; } if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS)) { if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_TILEWIDTH,tif->tif_dir.td_tilewidth)) goto bad; if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_TILELENGTH,tif->tif_dir.td_tilelength)) goto bad; } if (TIFFFieldSet(tif,FIELD_RESOLUTION)) { if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_XRESOLUTION,tif->tif_dir.td_xresolution)) goto bad; if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_YRESOLUTION,tif->tif_dir.td_yresolution)) goto bad; } if (TIFFFieldSet(tif,FIELD_POSITION)) { if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_XPOSITION,tif->tif_dir.td_xposition)) goto bad; if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_YPOSITION,tif->tif_dir.td_yposition)) goto bad; } if (TIFFFieldSet(tif,FIELD_SUBFILETYPE)) { if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_SUBFILETYPE,tif->tif_dir.td_subfiletype)) goto bad; } if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE)) { if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_BITSPERSAMPLE,tif->tif_dir.td_bitspersample)) goto bad; } if (TIFFFieldSet(tif,FIELD_COMPRESSION)) { if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_COMPRESSION,tif->tif_dir.td_compression)) goto bad; } if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) { if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_PHOTOMETRIC,tif->tif_dir.td_photometric)) goto bad; } if (TIFFFieldSet(tif,FIELD_THRESHHOLDING)) { if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_THRESHHOLDING,tif->tif_dir.td_threshholding)) goto bad; } if (TIFFFieldSet(tif,FIELD_FILLORDER)) { if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_FILLORDER,tif->tif_dir.td_fillorder)) goto bad; } if (TIFFFieldSet(tif,FIELD_ORIENTATION)) { if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_ORIENTATION,tif->tif_dir.td_orientation)) goto bad; } if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL)) { if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_SAMPLESPERPIXEL,tif->tif_dir.td_samplesperpixel)) goto bad; } if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP)) { if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_ROWSPERSTRIP,tif->tif_dir.td_rowsperstrip)) goto bad; } if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE)) { if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_MINSAMPLEVALUE,tif->tif_dir.td_minsamplevalue)) goto bad; } if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE)) { if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_MAXSAMPLEVALUE,tif->tif_dir.td_maxsamplevalue)) goto bad; } if (TIFFFieldSet(tif,FIELD_PLANARCONFIG)) { if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_PLANARCONFIG,tif->tif_dir.td_planarconfig)) goto bad; } if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT)) { if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_RESOLUTIONUNIT,tif->tif_dir.td_resolutionunit)) goto bad; } if (TIFFFieldSet(tif,FIELD_PAGENUMBER)) { if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_PAGENUMBER,2,&tif->tif_dir.td_pagenumber[0])) goto bad; } if (TIFFFieldSet(tif,FIELD_STRIPBYTECOUNTS)) { if (!isTiled(tif)) { if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_STRIPBYTECOUNTS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripbytecount)) goto bad; } else { if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_TILEBYTECOUNTS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripbytecount)) goto bad; } } if (TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) { if (!isTiled(tif)) { if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_STRIPOFFSETS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripoffset)) goto bad; } else { if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_TILEOFFSETS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripoffset)) goto bad; } } if (TIFFFieldSet(tif,FIELD_COLORMAP)) { if (!TIFFWriteDirectoryTagColormap(tif,&ndir,dir)) goto bad; } if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES)) { if (tif->tif_dir.td_extrasamples) { uint16 na; uint16* nb; TIFFGetFieldDefaulted(tif,TIFFTAG_EXTRASAMPLES,&na,&nb); if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_EXTRASAMPLES,na,nb)) goto bad; } } if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT)) { if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_SAMPLEFORMAT,tif->tif_dir.td_sampleformat)) goto bad; } if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE)) { if (!TIFFWriteDirectoryTagSampleformatArray(tif,&ndir,dir,TIFFTAG_SMINSAMPLEVALUE,tif->tif_dir.td_samplesperpixel,tif->tif_dir.td_sminsamplevalue)) goto bad; } if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE)) { if (!TIFFWriteDirectoryTagSampleformatArray(tif,&ndir,dir,TIFFTAG_SMAXSAMPLEVALUE,tif->tif_dir.td_samplesperpixel,tif->tif_dir.td_smaxsamplevalue)) goto bad; } if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH)) { if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_IMAGEDEPTH,tif->tif_dir.td_imagedepth)) goto bad; } if (TIFFFieldSet(tif,FIELD_TILEDEPTH)) { if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_TILEDEPTH,tif->tif_dir.td_tiledepth)) goto bad; } if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS)) { if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_HALFTONEHINTS,2,&tif->tif_dir.td_halftonehints[0])) goto bad; } if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING)) { if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_YCBCRSUBSAMPLING,2,&tif->tif_dir.td_ycbcrsubsampling[0])) goto bad; } if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING)) { if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_YCBCRPOSITIONING,tif->tif_dir.td_ycbcrpositioning)) goto bad; } if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE)) { if (!TIFFWriteDirectoryTagRationalArray(tif,&ndir,dir,TIFFTAG_REFERENCEBLACKWHITE,6,tif->tif_dir.td_refblackwhite)) goto bad; } if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) { if (!TIFFWriteDirectoryTagTransferfunction(tif,&ndir,dir)) goto bad; } if (TIFFFieldSet(tif,FIELD_INKNAMES)) { if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,TIFFTAG_INKNAMES,tif->tif_dir.td_inknameslen,tif->tif_dir.td_inknames)) goto bad; } if (TIFFFieldSet(tif,FIELD_SUBIFD)) { if (!TIFFWriteDirectoryTagSubifd(tif,&ndir,dir)) goto bad; } { uint32 n; for (n=0; ntif_nfields; n++) { const TIFFField* o; o = tif->tif_fields[n]; if ((o->field_bit>=FIELD_CODEC)&&(TIFFFieldSet(tif,o->field_bit))) { switch (o->get_field_type) { case TIFF_SETGET_ASCII: { uint32 pa; char* pb; assert(o->field_type==TIFF_ASCII); assert(o->field_readcount==TIFF_VARIABLE); assert(o->field_passcount==0); TIFFGetField(tif,o->field_tag,&pb); pa=(uint32)(strlen(pb)); if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,o->field_tag,pa,pb)) goto bad; } break; case TIFF_SETGET_UINT16: { uint16 p; assert(o->field_type==TIFF_SHORT); assert(o->field_readcount==1); assert(o->field_passcount==0); TIFFGetField(tif,o->field_tag,&p); if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,o->field_tag,p)) goto bad; } break; case TIFF_SETGET_UINT32: { uint32 p; assert(o->field_type==TIFF_LONG); assert(o->field_readcount==1); assert(o->field_passcount==0); TIFFGetField(tif,o->field_tag,&p); if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,o->field_tag,p)) goto bad; } break; case TIFF_SETGET_C32_UINT8: { uint32 pa; void* pb; assert(o->field_type==TIFF_UNDEFINED); assert(o->field_readcount==TIFF_VARIABLE2); assert(o->field_passcount==1); TIFFGetField(tif,o->field_tag,&pa,&pb); if (!TIFFWriteDirectoryTagUndefinedArray(tif,&ndir,dir,o->field_tag,pa,pb)) goto bad; } break; default: assert(0); /* we should never get here */ break; } } } } } for (m=0; m<(uint32)(tif->tif_dir.td_customValueCount); m++) { switch (tif->tif_dir.td_customValues[m].info->field_type) { case TIFF_ASCII: if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_UNDEFINED: if (!TIFFWriteDirectoryTagUndefinedArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_BYTE: if (!TIFFWriteDirectoryTagByteArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_SBYTE: if (!TIFFWriteDirectoryTagSbyteArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_SHORT: if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_SSHORT: if (!TIFFWriteDirectoryTagSshortArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_LONG: if (!TIFFWriteDirectoryTagLongArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_SLONG: if (!TIFFWriteDirectoryTagSlongArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_LONG8: if (!TIFFWriteDirectoryTagLong8Array(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_SLONG8: if (!TIFFWriteDirectoryTagSlong8Array(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_RATIONAL: if (!TIFFWriteDirectoryTagRationalArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_SRATIONAL: if (!TIFFWriteDirectoryTagSrationalArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_FLOAT: if (!TIFFWriteDirectoryTagFloatArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_DOUBLE: if (!TIFFWriteDirectoryTagDoubleArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_IFD: if (!TIFFWriteDirectoryTagIfdArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; case TIFF_IFD8: if (!TIFFWriteDirectoryTagIfdIfd8Array(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value)) goto bad; break; default: assert(0); /* we should never get here */ break; } } if (dir!=NULL) break; dir=_TIFFmalloc(ndir*sizeof(TIFFDirEntry)); if (dir==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); goto bad; } if (isimage) { if ((tif->tif_diroff==0)&&(!TIFFLinkDirectory(tif))) goto bad; } else tif->tif_diroff=(TIFFSeekFile(tif,0,SEEK_END)+1)&(~1); if (pdiroff!=NULL) *pdiroff=tif->tif_diroff; if (!(tif->tif_flags&TIFF_BIGTIFF)) dirsize=2+ndir*12+4; else dirsize=8+ndir*20+8; tif->tif_dataoff=tif->tif_diroff+dirsize; if (!(tif->tif_flags&TIFF_BIGTIFF)) tif->tif_dataoff=(uint32)tif->tif_dataoff; if ((tif->tif_dataofftif_diroff)||(tif->tif_dataoff<(uint64)dirsize)) { TIFFErrorExt(tif->tif_clientdata,module,"Maximum TIFF file size exceeded"); goto bad; } if (tif->tif_dataoff&1) tif->tif_dataoff++; if (isimage) tif->tif_curdir++; } if (isimage) { if (TIFFFieldSet(tif,FIELD_SUBIFD)&&(tif->tif_subifdoff==0)) { uint32 na; TIFFDirEntry* nb; for (na=0, nb=dir; ; na++, nb++) { assert(natdir_tag==TIFFTAG_SUBIFD) break; } if (!(tif->tif_flags&TIFF_BIGTIFF)) tif->tif_subifdoff=tif->tif_diroff+2+na*12+8; else tif->tif_subifdoff=tif->tif_diroff+8+na*20+12; } } dirmem=_TIFFmalloc(dirsize); if (dirmem==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); goto bad; } if (!(tif->tif_flags&TIFF_BIGTIFF)) { uint8* n; uint32 nTmp; TIFFDirEntry* o; n=dirmem; *(uint16*)n=ndir; if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)n); n+=2; o=dir; for (m=0; mtdir_tag; if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)n); n+=2; *(uint16*)n=o->tdir_type; if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)n); n+=2; nTmp = (uint32)o->tdir_count; _TIFFmemcpy(n,&nTmp,4); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)n); n+=4; /* This is correct. The data has been */ /* swabbed previously in TIFFWriteDirectoryTagData */ _TIFFmemcpy(n,&o->tdir_offset,4); n+=4; o++; } nTmp = (uint32)tif->tif_nextdiroff; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&nTmp); _TIFFmemcpy(n,&nTmp,4); } else { uint8* n; TIFFDirEntry* o; n=dirmem; *(uint64*)n=ndir; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)n); n+=8; o=dir; for (m=0; mtdir_tag; if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)n); n+=2; *(uint16*)n=o->tdir_type; if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)n); n+=2; _TIFFmemcpy(n,&o->tdir_count,8); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)n); n+=8; _TIFFmemcpy(n,&o->tdir_offset,8); n+=8; o++; } _TIFFmemcpy(n,&tif->tif_nextdiroff,8); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)n); } _TIFFfree(dir); dir=NULL; if (!SeekOK(tif,tif->tif_diroff)) { TIFFErrorExt(tif->tif_clientdata,module,"IO error writing directory"); goto bad; } if (!WriteOK(tif,dirmem,(tmsize_t)dirsize)) { TIFFErrorExt(tif->tif_clientdata,module,"IO error writing directory"); goto bad; } _TIFFfree(dirmem); if (imagedone) { TIFFFreeDirectory(tif); tif->tif_flags &= ~TIFF_DIRTYDIRECT; tif->tif_flags &= ~TIFF_DIRTYSTRIP; (*tif->tif_cleanup)(tif); /* * Reset directory-related state for subsequent * directories. */ TIFFCreateDirectory(tif); } return(1); bad: if (dir!=NULL) _TIFFfree(dir); if (dirmem!=NULL) _TIFFfree(dirmem); return(0); } static int TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value) { static const char module[] = "TIFFWriteDirectoryTagSampleformatArray"; void* conv; uint32 i; int ok; conv = _TIFFmalloc(count*sizeof(double)); if (conv == NULL) { TIFFErrorExt(tif->tif_clientdata, module, "Out of memory"); return (0); } switch (tif->tif_dir.td_sampleformat) { case SAMPLEFORMAT_IEEEFP: if (tif->tif_dir.td_bitspersample<=32) { for (i = 0; i < count; ++i) ((float*)conv)[i] = (float)value[i]; ok = TIFFWriteDirectoryTagFloatArray(tif,ndir,dir,tag,count,(float*)conv); } else { ok = TIFFWriteDirectoryTagDoubleArray(tif,ndir,dir,tag,count,value); } break; case SAMPLEFORMAT_INT: if (tif->tif_dir.td_bitspersample<=8) { for (i = 0; i < count; ++i) ((int8*)conv)[i] = (int8)value[i]; ok = TIFFWriteDirectoryTagSbyteArray(tif,ndir,dir,tag,count,(int8*)conv); } else if (tif->tif_dir.td_bitspersample<=16) { for (i = 0; i < count; ++i) ((int16*)conv)[i] = (int16)value[i]; ok = TIFFWriteDirectoryTagSshortArray(tif,ndir,dir,tag,count,(int16*)conv); } else { for (i = 0; i < count; ++i) ((int32*)conv)[i] = (int32)value[i]; ok = TIFFWriteDirectoryTagSlongArray(tif,ndir,dir,tag,count,(int32*)conv); } break; case SAMPLEFORMAT_UINT: if (tif->tif_dir.td_bitspersample<=8) { for (i = 0; i < count; ++i) ((uint8*)conv)[i] = (uint8)value[i]; ok = TIFFWriteDirectoryTagByteArray(tif,ndir,dir,tag,count,(uint8*)conv); } else if (tif->tif_dir.td_bitspersample<=16) { for (i = 0; i < count; ++i) ((uint16*)conv)[i] = (uint16)value[i]; ok = TIFFWriteDirectoryTagShortArray(tif,ndir,dir,tag,count,(uint16*)conv); } else { for (i = 0; i < count; ++i) ((uint32*)conv)[i] = (uint32)value[i]; ok = TIFFWriteDirectoryTagLongArray(tif,ndir,dir,tag,count,(uint32*)conv); } break; default: ok = 0; } _TIFFfree(conv); return (ok); } #if 0 static int TIFFWriteDirectoryTagSampleformatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value) { switch (tif->tif_dir.td_sampleformat) { case SAMPLEFORMAT_IEEEFP: if (tif->tif_dir.td_bitspersample<=32) return(TIFFWriteDirectoryTagFloatPerSample(tif,ndir,dir,tag,(float)value)); else return(TIFFWriteDirectoryTagDoublePerSample(tif,ndir,dir,tag,value)); case SAMPLEFORMAT_INT: if (tif->tif_dir.td_bitspersample<=8) return(TIFFWriteDirectoryTagSbytePerSample(tif,ndir,dir,tag,(int8)value)); else if (tif->tif_dir.td_bitspersample<=16) return(TIFFWriteDirectoryTagSshortPerSample(tif,ndir,dir,tag,(int16)value)); else return(TIFFWriteDirectoryTagSlongPerSample(tif,ndir,dir,tag,(int32)value)); case SAMPLEFORMAT_UINT: if (tif->tif_dir.td_bitspersample<=8) return(TIFFWriteDirectoryTagBytePerSample(tif,ndir,dir,tag,(uint8)value)); else if (tif->tif_dir.td_bitspersample<=16) return(TIFFWriteDirectoryTagShortPerSample(tif,ndir,dir,tag,(uint16)value)); else return(TIFFWriteDirectoryTagLongPerSample(tif,ndir,dir,tag,(uint32)value)); default: return(1); } } #endif static int TIFFWriteDirectoryTagAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedAscii(tif,ndir,dir,tag,count,value)); } static int TIFFWriteDirectoryTagUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedUndefinedArray(tif,ndir,dir,tag,count,value)); } #ifdef notdef static int TIFFWriteDirectoryTagByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedByte(tif,ndir,dir,tag,value)); } #endif static int TIFFWriteDirectoryTagByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedByteArray(tif,ndir,dir,tag,count,value)); } #if 0 static int TIFFWriteDirectoryTagBytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value) { static const char module[] = "TIFFWriteDirectoryTagBytePerSample"; uint8* m; uint8* na; uint16 nb; int o; if (dir==NULL) { (*ndir)++; return(1); } m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint8)); if (m==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (na=m, nb=0; nbtif_dir.td_samplesperpixel; na++, nb++) *na=value; o=TIFFWriteDirectoryTagCheckedByteArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m); _TIFFfree(m); return(o); } #endif #ifdef notdef static int TIFFWriteDirectoryTagSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedSbyte(tif,ndir,dir,tag,value)); } #endif static int TIFFWriteDirectoryTagSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedSbyteArray(tif,ndir,dir,tag,count,value)); } #if 0 static int TIFFWriteDirectoryTagSbytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value) { static const char module[] = "TIFFWriteDirectoryTagSbytePerSample"; int8* m; int8* na; uint16 nb; int o; if (dir==NULL) { (*ndir)++; return(1); } m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int8)); if (m==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (na=m, nb=0; nbtif_dir.td_samplesperpixel; na++, nb++) *na=value; o=TIFFWriteDirectoryTagCheckedSbyteArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m); _TIFFfree(m); return(o); } #endif static int TIFFWriteDirectoryTagShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedShort(tif,ndir,dir,tag,value)); } static int TIFFWriteDirectoryTagShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,count,value)); } static int TIFFWriteDirectoryTagShortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value) { static const char module[] = "TIFFWriteDirectoryTagShortPerSample"; uint16* m; uint16* na; uint16 nb; int o; if (dir==NULL) { (*ndir)++; return(1); } m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint16)); if (m==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (na=m, nb=0; nbtif_dir.td_samplesperpixel; na++, nb++) *na=value; o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m); _TIFFfree(m); return(o); } #ifdef notdef static int TIFFWriteDirectoryTagSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedSshort(tif,ndir,dir,tag,value)); } #endif static int TIFFWriteDirectoryTagSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedSshortArray(tif,ndir,dir,tag,count,value)); } #if 0 static int TIFFWriteDirectoryTagSshortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value) { static const char module[] = "TIFFWriteDirectoryTagSshortPerSample"; int16* m; int16* na; uint16 nb; int o; if (dir==NULL) { (*ndir)++; return(1); } m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int16)); if (m==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (na=m, nb=0; nbtif_dir.td_samplesperpixel; na++, nb++) *na=value; o=TIFFWriteDirectoryTagCheckedSshortArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m); _TIFFfree(m); return(o); } #endif static int TIFFWriteDirectoryTagLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedLong(tif,ndir,dir,tag,value)); } static int TIFFWriteDirectoryTagLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,value)); } #if 0 static int TIFFWriteDirectoryTagLongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value) { static const char module[] = "TIFFWriteDirectoryTagLongPerSample"; uint32* m; uint32* na; uint16 nb; int o; if (dir==NULL) { (*ndir)++; return(1); } m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint32)); if (m==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (na=m, nb=0; nbtif_dir.td_samplesperpixel; na++, nb++) *na=value; o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m); _TIFFfree(m); return(o); } #endif #ifdef notdef static int TIFFWriteDirectoryTagSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedSlong(tif,ndir,dir,tag,value)); } #endif static int TIFFWriteDirectoryTagSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedSlongArray(tif,ndir,dir,tag,count,value)); } #if 0 static int TIFFWriteDirectoryTagSlongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value) { static const char module[] = "TIFFWriteDirectoryTagSlongPerSample"; int32* m; int32* na; uint16 nb; int o; if (dir==NULL) { (*ndir)++; return(1); } m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int32)); if (m==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (na=m, nb=0; nbtif_dir.td_samplesperpixel; na++, nb++) *na=value; o=TIFFWriteDirectoryTagCheckedSlongArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m); _TIFFfree(m); return(o); } #endif #ifdef notdef static int TIFFWriteDirectoryTagLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedLong8(tif,ndir,dir,tag,value)); } #endif static int TIFFWriteDirectoryTagLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,tag,count,value)); } #ifdef notdef static int TIFFWriteDirectoryTagSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedSlong8(tif,ndir,dir,tag,value)); } #endif static int TIFFWriteDirectoryTagSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedSlong8Array(tif,ndir,dir,tag,count,value)); } static int TIFFWriteDirectoryTagRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedRational(tif,ndir,dir,tag,value)); } static int TIFFWriteDirectoryTagRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedRationalArray(tif,ndir,dir,tag,count,value)); } static int TIFFWriteDirectoryTagSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedSrationalArray(tif,ndir,dir,tag,count,value)); } #ifdef notdef static int TIFFWriteDirectoryTagFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedFloat(tif,ndir,dir,tag,value)); } #endif static int TIFFWriteDirectoryTagFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedFloatArray(tif,ndir,dir,tag,count,value)); } #if 0 static int TIFFWriteDirectoryTagFloatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value) { static const char module[] = "TIFFWriteDirectoryTagFloatPerSample"; float* m; float* na; uint16 nb; int o; if (dir==NULL) { (*ndir)++; return(1); } m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(float)); if (m==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (na=m, nb=0; nbtif_dir.td_samplesperpixel; na++, nb++) *na=value; o=TIFFWriteDirectoryTagCheckedFloatArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m); _TIFFfree(m); return(o); } #endif #ifdef notdef static int TIFFWriteDirectoryTagDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedDouble(tif,ndir,dir,tag,value)); } #endif static int TIFFWriteDirectoryTagDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedDoubleArray(tif,ndir,dir,tag,count,value)); } #if 0 static int TIFFWriteDirectoryTagDoublePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value) { static const char module[] = "TIFFWriteDirectoryTagDoublePerSample"; double* m; double* na; uint16 nb; int o; if (dir==NULL) { (*ndir)++; return(1); } m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(double)); if (m==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (na=m, nb=0; nbtif_dir.td_samplesperpixel; na++, nb++) *na=value; o=TIFFWriteDirectoryTagCheckedDoubleArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m); _TIFFfree(m); return(o); } #endif static int TIFFWriteDirectoryTagIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,tag,count,value)); } #ifdef notdef static int TIFFWriteDirectoryTagIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value) { if (dir==NULL) { (*ndir)++; return(1); } return(TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,tag,count,value)); } #endif static int TIFFWriteDirectoryTagShortLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value) { if (dir==NULL) { (*ndir)++; return(1); } if (value<=0xFFFF) return(TIFFWriteDirectoryTagCheckedShort(tif,ndir,dir,tag,(uint16)value)); else return(TIFFWriteDirectoryTagCheckedLong(tif,ndir,dir,tag,value)); } /************************************************************************/ /* TIFFWriteDirectoryTagLongLong8Array() */ /* */ /* Write out LONG8 array as LONG8 for BigTIFF or LONG for */ /* Classic TIFF with some checking. */ /************************************************************************/ static int TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value) { static const char module[] = "TIFFWriteDirectoryTagLongLong8Array"; uint64* ma; uint32 mb; uint32* p; uint32* q; int o; /* is this just a counting pass? */ if (dir==NULL) { (*ndir)++; return(1); } /* We always write LONG8 for BigTIFF, no checking needed. */ if( tif->tif_flags&TIFF_BIGTIFF ) return TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir, tag,count,value); /* ** For classic tiff we want to verify everything is in range for LONG ** and convert to long format. */ p = _TIFFmalloc(count*sizeof(uint32)); if (p==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (q=p, ma=value, mb=0; mb0xFFFFFFFF) { TIFFErrorExt(tif->tif_clientdata,module, "Attempt to write value larger than 0xFFFFFFFF in Classic TIFF file."); _TIFFfree(p); return(0); } *q= (uint32)(*ma); } o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,p); _TIFFfree(p); return(o); } /************************************************************************/ /* TIFFWriteDirectoryTagIfdIfd8Array() */ /* */ /* Write either IFD8 or IFD array depending on file type. */ /************************************************************************/ static int TIFFWriteDirectoryTagIfdIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value) { static const char module[] = "TIFFWriteDirectoryTagIfdIfd8Array"; uint64* ma; uint32 mb; uint32* p; uint32* q; int o; /* is this just a counting pass? */ if (dir==NULL) { (*ndir)++; return(1); } /* We always write IFD8 for BigTIFF, no checking needed. */ if( tif->tif_flags&TIFF_BIGTIFF ) return TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir, tag,count,value); /* ** For classic tiff we want to verify everything is in range for IFD ** and convert to long format. */ p = _TIFFmalloc(count*sizeof(uint32)); if (p==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (q=p, ma=value, mb=0; mb0xFFFFFFFF) { TIFFErrorExt(tif->tif_clientdata,module, "Attempt to write value larger than 0xFFFFFFFF in Classic TIFF file."); _TIFFfree(p); return(0); } *q= (uint32)(*ma); } o=TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,tag,count,p); _TIFFfree(p); return(o); } #ifdef notdef static int TIFFWriteDirectoryTagShortLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value) { static const char module[] = "TIFFWriteDirectoryTagShortLongLong8Array"; uint64* ma; uint32 mb; uint8 n; int o; if (dir==NULL) { (*ndir)++; return(1); } n=0; for (ma=value, mb=0; mb0xFFFF)) n=1; if ((n==1)&&(*ma>0xFFFFFFFF)) { n=2; break; } } if (n==0) { uint16* p; uint16* q; p=_TIFFmalloc(count*sizeof(uint16)); if (p==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (ma=value, mb=0, q=p; mbtif_clientdata,module,"Out of memory"); return(0); } for (ma=value, mb=0, q=p; mbtif_dir.td_bitspersample); n=_TIFFmalloc(3*m*sizeof(uint16)); if (n==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } _TIFFmemcpy(&n[0],tif->tif_dir.td_colormap[0],m*sizeof(uint16)); _TIFFmemcpy(&n[m],tif->tif_dir.td_colormap[1],m*sizeof(uint16)); _TIFFmemcpy(&n[2*m],tif->tif_dir.td_colormap[2],m*sizeof(uint16)); o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,TIFFTAG_COLORMAP,3*m,n); _TIFFfree(n); return(o); } static int TIFFWriteDirectoryTagTransferfunction(TIFF* tif, uint32* ndir, TIFFDirEntry* dir) { static const char module[] = "TIFFWriteDirectoryTagTransferfunction"; uint32 m; uint16 n; uint16* o; int p; if (dir==NULL) { (*ndir)++; return(1); } m=(1<tif_dir.td_bitspersample); n=tif->tif_dir.td_samplesperpixel-tif->tif_dir.td_extrasamples; /* * Check if the table can be written as a single column, * or if it must be written as 3 columns. Note that we * write a 3-column tag if there are 2 samples/pixel and * a single column of data won't suffice--hmm. */ if (n>3) n=3; if (n==3) { if (!_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],tif->tif_dir.td_transferfunction[2],m*sizeof(uint16))) n=2; } if (n==2) { if (!_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],tif->tif_dir.td_transferfunction[1],m*sizeof(uint16))) n=1; } if (n==0) n=1; o=_TIFFmalloc(n*m*sizeof(uint16)); if (o==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } _TIFFmemcpy(&o[0],tif->tif_dir.td_transferfunction[0],m*sizeof(uint16)); if (n>1) _TIFFmemcpy(&o[m],tif->tif_dir.td_transferfunction[1],m*sizeof(uint16)); if (n>2) _TIFFmemcpy(&o[2*m],tif->tif_dir.td_transferfunction[2],m*sizeof(uint16)); p=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,TIFFTAG_TRANSFERFUNCTION,n*m,o); _TIFFfree(o); return(p); } static int TIFFWriteDirectoryTagSubifd(TIFF* tif, uint32* ndir, TIFFDirEntry* dir) { static const char module[] = "TIFFWriteDirectoryTagSubifd"; uint64 m; int n; if (tif->tif_dir.td_nsubifd==0) return(1); if (dir==NULL) { (*ndir)++; return(1); } m=tif->tif_dataoff; if (!(tif->tif_flags&TIFF_BIGTIFF)) { uint32* o; uint64* pa; uint32* pb; uint16 p; o=_TIFFmalloc(tif->tif_dir.td_nsubifd*sizeof(uint32)); if (o==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } pa=tif->tif_dir.td_subifd; pb=o; for (p=0; p < tif->tif_dir.td_nsubifd; p++) { assert(pa != 0); assert(*pa <= 0xFFFFFFFFUL); *pb++=(uint32)(*pa++); } n=TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,TIFFTAG_SUBIFD,tif->tif_dir.td_nsubifd,o); _TIFFfree(o); } else n=TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,TIFFTAG_SUBIFD,tif->tif_dir.td_nsubifd,tif->tif_dir.td_subifd); if (!n) return(0); /* * Total hack: if this directory includes a SubIFD * tag then force the next directories to be * written as ``sub directories'' of this one. This * is used to write things like thumbnails and * image masks that one wants to keep out of the * normal directory linkage access mechanism. */ tif->tif_flags|=TIFF_INSUBIFD; tif->tif_nsubifd=tif->tif_dir.td_nsubifd; if (tif->tif_dir.td_nsubifd==1) tif->tif_subifdoff=0; else tif->tif_subifdoff=m; return(1); } static int TIFFWriteDirectoryTagCheckedAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value) { assert(sizeof(char)==1); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_ASCII,count,count,value)); } static int TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value) { assert(sizeof(uint8)==1); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_UNDEFINED,count,count,value)); } #ifdef notdef static int TIFFWriteDirectoryTagCheckedByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value) { assert(sizeof(uint8)==1); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_BYTE,1,1,&value)); } #endif static int TIFFWriteDirectoryTagCheckedByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value) { assert(sizeof(uint8)==1); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_BYTE,count,count,value)); } #ifdef notdef static int TIFFWriteDirectoryTagCheckedSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value) { assert(sizeof(int8)==1); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SBYTE,1,1,&value)); } #endif static int TIFFWriteDirectoryTagCheckedSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value) { assert(sizeof(int8)==1); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SBYTE,count,count,value)); } static int TIFFWriteDirectoryTagCheckedShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value) { uint16 m; assert(sizeof(uint16)==2); m=value; if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort(&m); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SHORT,1,2,&m)); } static int TIFFWriteDirectoryTagCheckedShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value) { assert(count<0x80000000); assert(sizeof(uint16)==2); if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfShort(value,count); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SHORT,count,count*2,value)); } #ifdef notdef static int TIFFWriteDirectoryTagCheckedSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value) { int16 m; assert(sizeof(int16)==2); m=value; if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort((uint16*)(&m)); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SSHORT,1,2,&m)); } #endif static int TIFFWriteDirectoryTagCheckedSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value) { assert(count<0x80000000); assert(sizeof(int16)==2); if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfShort((uint16*)value,count); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SSHORT,count,count*2,value)); } static int TIFFWriteDirectoryTagCheckedLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value) { uint32 m; assert(sizeof(uint32)==4); m=value; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&m); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG,1,4,&m)); } static int TIFFWriteDirectoryTagCheckedLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value) { assert(count<0x40000000); assert(sizeof(uint32)==4); if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong(value,count); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG,count,count*4,value)); } #ifdef notdef static int TIFFWriteDirectoryTagCheckedSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value) { int32 m; assert(sizeof(int32)==4); m=value; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong((uint32*)(&m)); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG,1,4,&m)); } #endif static int TIFFWriteDirectoryTagCheckedSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value) { assert(count<0x40000000); assert(sizeof(int32)==4); if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong((uint32*)value,count); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG,count,count*4,value)); } #ifdef notdef static int TIFFWriteDirectoryTagCheckedLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value) { uint64 m; assert(sizeof(uint64)==8); assert(tif->tif_flags&TIFF_BIGTIFF); m=value; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8(&m); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,1,8,&m)); } #endif static int TIFFWriteDirectoryTagCheckedLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value) { assert(count<0x20000000); assert(sizeof(uint64)==8); assert(tif->tif_flags&TIFF_BIGTIFF); if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong8(value,count); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,count,count*8,value)); } #ifdef notdef static int TIFFWriteDirectoryTagCheckedSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value) { int64 m; assert(sizeof(int64)==8); assert(tif->tif_flags&TIFF_BIGTIFF); m=value; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)(&m)); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,1,8,&m)); } #endif static int TIFFWriteDirectoryTagCheckedSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value) { assert(count<0x20000000); assert(sizeof(int64)==8); assert(tif->tif_flags&TIFF_BIGTIFF); if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong8((uint64*)value,count); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,count,count*8,value)); } static int TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value) { uint32 m[2]; assert(value>=0.0); assert(sizeof(uint32)==4); if (value<=0.0) { m[0]=0; m[1]=1; } else if (value==(double)(uint32)value) { m[0]=(uint32)value; m[1]=1; } else if (value<1.0) { m[0]=(uint32)(value*0xFFFFFFFF); m[1]=0xFFFFFFFF; } else { m[0]=0xFFFFFFFF; m[1]=(uint32)(0xFFFFFFFF/value); } if (tif->tif_flags&TIFF_SWAB) { TIFFSwabLong(&m[0]); TIFFSwabLong(&m[1]); } return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_RATIONAL,1,8,&m[0])); } static int TIFFWriteDirectoryTagCheckedRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value) { static const char module[] = "TIFFWriteDirectoryTagCheckedRationalArray"; uint32* m; float* na; uint32* nb; uint32 nc; int o; assert(sizeof(uint32)==4); m=_TIFFmalloc(count*2*sizeof(uint32)); if (m==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (na=value, nb=m, nc=0; nctif_flags&TIFF_SWAB) TIFFSwabArrayOfLong(m,count*2); o=TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_RATIONAL,count,count*8,&m[0]); _TIFFfree(m); return(o); } static int TIFFWriteDirectoryTagCheckedSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value) { static const char module[] = "TIFFWriteDirectoryTagCheckedSrationalArray"; int32* m; float* na; int32* nb; uint32 nc; int o; assert(sizeof(int32)==4); m=_TIFFmalloc(count*2*sizeof(int32)); if (m==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); } for (na=value, nb=m, nc=0; nc-1.0) { nb[0]=-(int32)((-*na)*0x7FFFFFFF); nb[1]=0x7FFFFFFF; } else { nb[0]=-0x7FFFFFFF; nb[1]=(int32)(0x7FFFFFFF/(-*na)); } } else { if (*na==(int32)(*na)) { nb[0]=(int32)(*na); nb[1]=1; } else if (*na<1.0) { nb[0]=(int32)((*na)*0x7FFFFFFF); nb[1]=0x7FFFFFFF; } else { nb[0]=0x7FFFFFFF; nb[1]=(int32)(0x7FFFFFFF/(*na)); } } } if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong((uint32*)m,count*2); o=TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SRATIONAL,count,count*8,&m[0]); _TIFFfree(m); return(o); } #ifdef notdef static int TIFFWriteDirectoryTagCheckedFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value) { float m; assert(sizeof(float)==4); m=value; TIFFCvtNativeToIEEEFloat(tif,1,&m); if (tif->tif_flags&TIFF_SWAB) TIFFSwabFloat(&m); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_FLOAT,1,4,&m)); } #endif static int TIFFWriteDirectoryTagCheckedFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value) { assert(count<0x40000000); assert(sizeof(float)==4); TIFFCvtNativeToIEEEFloat(tif,count,&value); if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfFloat(value,count); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_FLOAT,count,count*4,value)); } #ifdef notdef static int TIFFWriteDirectoryTagCheckedDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value) { double m; assert(sizeof(double)==8); m=value; TIFFCvtNativeToIEEEDouble(tif,1,&m); if (tif->tif_flags&TIFF_SWAB) TIFFSwabDouble(&m); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_DOUBLE,1,8,&m)); } #endif static int TIFFWriteDirectoryTagCheckedDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value) { assert(count<0x20000000); assert(sizeof(double)==8); TIFFCvtNativeToIEEEDouble(tif,count,&value); if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfDouble(value,count); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_DOUBLE,count,count*8,value)); } static int TIFFWriteDirectoryTagCheckedIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value) { assert(count<0x40000000); assert(sizeof(uint32)==4); if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong(value,count); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_IFD,count,count*4,value)); } static int TIFFWriteDirectoryTagCheckedIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value) { assert(count<0x20000000); assert(sizeof(uint64)==8); assert(tif->tif_flags&TIFF_BIGTIFF); if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong8(value,count); return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_IFD8,count,count*8,value)); } static int TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 datatype, uint32 count, uint32 datalength, void* data) { static const char module[] = "TIFFWriteDirectoryTagData"; uint32 m; m=0; while (m<(*ndir)) { assert(dir[m].tdir_tag!=tag); if (dir[m].tdir_tag>tag) break; m++; } if (m<(*ndir)) { uint32 n; for (n=*ndir; n>m; n--) dir[n]=dir[n-1]; } dir[m].tdir_tag=tag; dir[m].tdir_type=datatype; dir[m].tdir_count=count; dir[m].tdir_offset.toff_long8 = 0; if (datalength<=((tif->tif_flags&TIFF_BIGTIFF)?0x8U:0x4U)) _TIFFmemcpy(&dir[m].tdir_offset,data,datalength); else { uint64 na,nb; na=tif->tif_dataoff; nb=na+datalength; if (!(tif->tif_flags&TIFF_BIGTIFF)) nb=(uint32)nb; if ((nbtif_clientdata,module,"Maximum TIFF file size exceeded"); return(0); } if (!SeekOK(tif,na)) { TIFFErrorExt(tif->tif_clientdata,module,"IO error writing tag data"); return(0); } assert(datalength<0x80000000UL); if (!WriteOK(tif,data,(tmsize_t)datalength)) { TIFFErrorExt(tif->tif_clientdata,module,"IO error writing tag data"); return(0); } tif->tif_dataoff=nb; if (tif->tif_dataoff&1) tif->tif_dataoff++; if (!(tif->tif_flags&TIFF_BIGTIFF)) { uint32 o; o=(uint32)na; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&o); _TIFFmemcpy(&dir[m].tdir_offset,&o,4); } else { dir[m].tdir_offset.toff_long8 = na; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8(&dir[m].tdir_offset.toff_long8); } } (*ndir)++; return(1); } /* * Link the current directory into the directory chain for the file. */ static int TIFFLinkDirectory(TIFF* tif) { static const char module[] = "TIFFLinkDirectory"; tif->tif_diroff = (TIFFSeekFile(tif,0,SEEK_END)+1) &~ 1; /* * Handle SubIFDs */ if (tif->tif_flags & TIFF_INSUBIFD) { if (!(tif->tif_flags&TIFF_BIGTIFF)) { uint32 m; m = (uint32)tif->tif_diroff; if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&m); (void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET); if (!WriteOK(tif, &m, 4)) { TIFFErrorExt(tif->tif_clientdata, module, "Error writing SubIFD directory link"); return (0); } /* * Advance to the next SubIFD or, if this is * the last one configured, revert back to the * normal directory linkage. */ if (--tif->tif_nsubifd) tif->tif_subifdoff += 4; else tif->tif_flags &= ~TIFF_INSUBIFD; return (1); } else { uint64 m; m = tif->tif_diroff; if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong8(&m); (void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET); if (!WriteOK(tif, &m, 8)) { TIFFErrorExt(tif->tif_clientdata, module, "Error writing SubIFD directory link"); return (0); } /* * Advance to the next SubIFD or, if this is * the last one configured, revert back to the * normal directory linkage. */ if (--tif->tif_nsubifd) tif->tif_subifdoff += 8; else tif->tif_flags &= ~TIFF_INSUBIFD; return (1); } } if (!(tif->tif_flags&TIFF_BIGTIFF)) { uint32 m; uint32 nextdir; m = (uint32)(tif->tif_diroff); if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&m); if (tif->tif_header.classic.tiff_diroff == 0) { /* * First directory, overwrite offset in header. */ tif->tif_header.classic.tiff_diroff = (uint32) tif->tif_diroff; (void) TIFFSeekFile(tif,4, SEEK_SET); if (!WriteOK(tif, &m, 4)) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error writing TIFF header"); return (0); } return (1); } /* * Not the first directory, search to the last and append. */ nextdir = tif->tif_header.classic.tiff_diroff; while(1) { uint16 dircount; uint32 nextnextdir; if (!SeekOK(tif, nextdir) || !ReadOK(tif, &dircount, 2)) { TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory count"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); (void) TIFFSeekFile(tif, nextdir+2+dircount*12, SEEK_SET); if (!ReadOK(tif, &nextnextdir, 4)) { TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory link"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&nextnextdir); if (nextnextdir==0) { (void) TIFFSeekFile(tif, nextdir+2+dircount*12, SEEK_SET); if (!WriteOK(tif, &m, 4)) { TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link"); return (0); } break; } nextdir=nextnextdir; } } else { uint64 m; uint64 nextdir; m = tif->tif_diroff; if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong8(&m); if (tif->tif_header.big.tiff_diroff == 0) { /* * First directory, overwrite offset in header. */ tif->tif_header.big.tiff_diroff = tif->tif_diroff; (void) TIFFSeekFile(tif,8, SEEK_SET); if (!WriteOK(tif, &m, 8)) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error writing TIFF header"); return (0); } return (1); } /* * Not the first directory, search to the last and append. */ nextdir = tif->tif_header.big.tiff_diroff; while(1) { uint64 dircount64; uint16 dircount; uint64 nextnextdir; if (!SeekOK(tif, nextdir) || !ReadOK(tif, &dircount64, 8)) { TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory count"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong8(&dircount64); if (dircount64>0xFFFF) { TIFFErrorExt(tif->tif_clientdata, module, "Sanity check on tag count failed, likely corrupt TIFF"); return (0); } dircount=(uint16)dircount64; (void) TIFFSeekFile(tif, nextdir+8+dircount*20, SEEK_SET); if (!ReadOK(tif, &nextnextdir, 8)) { TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory link"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong8(&nextnextdir); if (nextnextdir==0) { (void) TIFFSeekFile(tif, nextdir+8+dircount*20, SEEK_SET); if (!WriteOK(tif, &m, 8)) { TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link"); return (0); } break; } nextdir=nextnextdir; } } return (1); } /************************************************************************/ /* TIFFRewriteField() */ /* */ /* Rewrite a field in the directory on disk without regard to */ /* updating the TIFF directory structure in memory. Currently */ /* only supported for field that already exist in the on-disk */ /* directory. Mainly used for updating stripoffset / */ /* stripbytecount values after the directory is already on */ /* disk. */ /* */ /* Returns zero on failure, and one on success. */ /************************************************************************/ int _TIFFRewriteField(TIFF* tif, uint16 tag, TIFFDataType in_datatype, tmsize_t count, void* data) { static const char module[] = "TIFFResetField"; /* const TIFFField* fip = NULL; */ uint16 dircount; tmsize_t dirsize; uint8 direntry_raw[20]; uint16 entry_tag = 0; uint16 entry_type = 0; uint64 entry_count = 0; uint64 entry_offset = 0; int value_in_entry = 0; uint64 read_offset; uint8 *buf_to_write = NULL; TIFFDataType datatype; /* -------------------------------------------------------------------- */ /* Find field definition. */ /* -------------------------------------------------------------------- */ /*fip =*/ TIFFFindField(tif, tag, TIFF_ANY); /* -------------------------------------------------------------------- */ /* Do some checking this is a straight forward case. */ /* -------------------------------------------------------------------- */ if( isMapped(tif) ) { TIFFErrorExt( tif->tif_clientdata, module, "Memory mapped files not currently supported for this operation." ); return 0; } if( tif->tif_diroff == 0 ) { TIFFErrorExt( tif->tif_clientdata, module, "Attempt to reset field on directory not already on disk." ); return 0; } /* -------------------------------------------------------------------- */ /* Read the directory entry count. */ /* -------------------------------------------------------------------- */ if (!SeekOK(tif, tif->tif_diroff)) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Seek error accessing TIFF directory", tif->tif_name); return 0; } read_offset = tif->tif_diroff; if (!(tif->tif_flags&TIFF_BIGTIFF)) { if (!ReadOK(tif, &dircount, sizeof (uint16))) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Can not read TIFF directory count", tif->tif_name); return 0; } if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); dirsize = 12; read_offset += 2; } else { uint64 dircount64; if (!ReadOK(tif, &dircount64, sizeof (uint64))) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Can not read TIFF directory count", tif->tif_name); return 0; } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong8(&dircount64); dircount = (uint16)dircount64; dirsize = 20; read_offset += 8; } /* -------------------------------------------------------------------- */ /* Read through directory to find target tag. */ /* -------------------------------------------------------------------- */ while( dircount > 0 ) { if (!ReadOK(tif, direntry_raw, dirsize)) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Can not read TIFF directory entry.", tif->tif_name); return 0; } memcpy( &entry_tag, direntry_raw + 0, sizeof(uint16) ); if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort( &entry_tag ); if( entry_tag == tag ) break; read_offset += dirsize; } if( entry_tag != tag ) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Could not find tag %d.", tif->tif_name, tag ); return 0; } /* -------------------------------------------------------------------- */ /* Extract the type, count and offset for this entry. */ /* -------------------------------------------------------------------- */ memcpy( &entry_type, direntry_raw + 2, sizeof(uint16) ); if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort( &entry_type ); if (!(tif->tif_flags&TIFF_BIGTIFF)) { uint32 value; memcpy( &value, direntry_raw + 4, sizeof(uint32) ); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong( &value ); entry_count = value; memcpy( &value, direntry_raw + 8, sizeof(uint32) ); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong( &value ); entry_offset = value; } else { memcpy( &entry_count, direntry_raw + 4, sizeof(uint64) ); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8( &entry_count ); memcpy( &entry_offset, direntry_raw + 12, sizeof(uint64) ); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8( &entry_offset ); } /* -------------------------------------------------------------------- */ /* What data type do we want to write this as? */ /* -------------------------------------------------------------------- */ if( TIFFDataWidth(in_datatype) == 8 && !(tif->tif_flags&TIFF_BIGTIFF) ) { if( in_datatype == TIFF_LONG8 ) datatype = TIFF_LONG; else if( in_datatype == TIFF_SLONG8 ) datatype = TIFF_SLONG; else if( in_datatype == TIFF_IFD8 ) datatype = TIFF_IFD; else datatype = in_datatype; } else datatype = in_datatype; /* -------------------------------------------------------------------- */ /* Prepare buffer of actual data to write. This includes */ /* swabbing as needed. */ /* -------------------------------------------------------------------- */ buf_to_write = (uint8 *)_TIFFCheckMalloc(tif, count, TIFFDataWidth(datatype), "for field buffer."); if (!buf_to_write) return 0; if( datatype == in_datatype ) memcpy( buf_to_write, data, count * TIFFDataWidth(datatype) ); else if( datatype == TIFF_SLONG && in_datatype == TIFF_SLONG8 ) { tmsize_t i; for( i = 0; i < count; i++ ) { ((int32 *) buf_to_write)[i] = (int32) ((int64 *) data)[i]; if( (int64) ((int32 *) buf_to_write)[i] != ((int64 *) data)[i] ) { _TIFFfree( buf_to_write ); TIFFErrorExt( tif->tif_clientdata, module, "Value exceeds 32bit range of output type." ); return 0; } } } else if( (datatype == TIFF_LONG && in_datatype == TIFF_LONG8) || (datatype == TIFF_IFD && in_datatype == TIFF_IFD8) ) { tmsize_t i; for( i = 0; i < count; i++ ) { ((uint32 *) buf_to_write)[i] = (uint32) ((uint64 *) data)[i]; if( (uint64) ((uint32 *) buf_to_write)[i] != ((uint64 *) data)[i] ) { _TIFFfree( buf_to_write ); TIFFErrorExt( tif->tif_clientdata, module, "Value exceeds 32bit range of output type." ); return 0; } } } if( TIFFDataWidth(datatype) > 1 && (tif->tif_flags&TIFF_SWAB) ) { if( TIFFDataWidth(datatype) == 2 ) TIFFSwabArrayOfShort( (uint16 *) buf_to_write, count ); else if( TIFFDataWidth(datatype) == 4 ) TIFFSwabArrayOfLong( (uint32 *) buf_to_write, count ); else if( TIFFDataWidth(datatype) == 8 ) TIFFSwabArrayOfLong8( (uint64 *) buf_to_write, count ); } /* -------------------------------------------------------------------- */ /* Is this a value that fits into the directory entry? */ /* -------------------------------------------------------------------- */ if (!(tif->tif_flags&TIFF_BIGTIFF)) { if( TIFFDataWidth(datatype) * count <= 4 ) { entry_offset = read_offset + 8; value_in_entry = 1; } } else { if( TIFFDataWidth(datatype) * count <= 8 ) { entry_offset = read_offset + 12; value_in_entry = 1; } } /* -------------------------------------------------------------------- */ /* If the tag type, and count match, then we just write it out */ /* over the old values without altering the directory entry at */ /* all. */ /* -------------------------------------------------------------------- */ if( entry_count == (uint64)count && entry_type == (uint16) datatype ) { if (!SeekOK(tif, entry_offset)) { _TIFFfree( buf_to_write ); TIFFErrorExt(tif->tif_clientdata, module, "%s: Seek error accessing TIFF directory", tif->tif_name); return 0; } if (!WriteOK(tif, buf_to_write, count*TIFFDataWidth(datatype))) { _TIFFfree( buf_to_write ); TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link"); return (0); } _TIFFfree( buf_to_write ); return 1; } /* -------------------------------------------------------------------- */ /* Otherwise, we write the new tag data at the end of the file. */ /* -------------------------------------------------------------------- */ if( !value_in_entry ) { entry_offset = TIFFSeekFile(tif,0,SEEK_END); if (!WriteOK(tif, buf_to_write, count*TIFFDataWidth(datatype))) { _TIFFfree( buf_to_write ); TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link"); return (0); } _TIFFfree( buf_to_write ); } else { memcpy( &entry_offset, buf_to_write, count*TIFFDataWidth(datatype)); } /* -------------------------------------------------------------------- */ /* Adjust the directory entry. */ /* -------------------------------------------------------------------- */ entry_type = datatype; memcpy( direntry_raw + 2, &entry_type, sizeof(uint16) ); if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort( (uint16 *) (direntry_raw + 2) ); if (!(tif->tif_flags&TIFF_BIGTIFF)) { uint32 value; value = (uint32) entry_count; memcpy( direntry_raw + 4, &value, sizeof(uint32) ); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong( (uint32 *) (direntry_raw + 4) ); value = (uint32) entry_offset; memcpy( direntry_raw + 8, &value, sizeof(uint32) ); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong( (uint32 *) (direntry_raw + 8) ); } else { memcpy( direntry_raw + 4, &entry_count, sizeof(uint64) ); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8( (uint64 *) (direntry_raw + 4) ); memcpy( direntry_raw + 12, &entry_offset, sizeof(uint64) ); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8( (uint64 *) (direntry_raw + 12) ); } /* -------------------------------------------------------------------- */ /* Write the directory entry out to disk. */ /* -------------------------------------------------------------------- */ if (!SeekOK(tif, read_offset )) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Seek error accessing TIFF directory", tif->tif_name); return 0; } if (!WriteOK(tif, direntry_raw,dirsize)) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Can not write TIFF directory entry.", tif->tif_name); return 0; } return 1; } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_tile.c0000644000212300117540000002017511763656233012772 00000000000000/* $Id: tif_tile.c,v 1.23 2012-06-06 05:33:55 fwarmerdam Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Tiled Image Support Routines. */ #include "tiffiop.h" /* * Compute which tile an (x,y,z,s) value is in. */ uint32 TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s) { TIFFDirectory *td = &tif->tif_dir; uint32 dx = td->td_tilewidth; uint32 dy = td->td_tilelength; uint32 dz = td->td_tiledepth; uint32 tile = 1; if (td->td_imagedepth == 1) z = 0; if (dx == (uint32) -1) dx = td->td_imagewidth; if (dy == (uint32) -1) dy = td->td_imagelength; if (dz == (uint32) -1) dz = td->td_imagedepth; if (dx != 0 && dy != 0 && dz != 0) { uint32 xpt = TIFFhowmany_32(td->td_imagewidth, dx); uint32 ypt = TIFFhowmany_32(td->td_imagelength, dy); uint32 zpt = TIFFhowmany_32(td->td_imagedepth, dz); if (td->td_planarconfig == PLANARCONFIG_SEPARATE) tile = (xpt*ypt*zpt)*s + (xpt*ypt)*(z/dz) + xpt*(y/dy) + x/dx; else tile = (xpt*ypt)*(z/dz) + xpt*(y/dy) + x/dx; } return (tile); } /* * Check an (x,y,z,s) coordinate * against the image bounds. */ int TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s) { TIFFDirectory *td = &tif->tif_dir; if (x >= td->td_imagewidth) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%lu: Col out of range, max %lu", (unsigned long) x, (unsigned long) (td->td_imagewidth - 1)); return (0); } if (y >= td->td_imagelength) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%lu: Row out of range, max %lu", (unsigned long) y, (unsigned long) (td->td_imagelength - 1)); return (0); } if (z >= td->td_imagedepth) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%lu: Depth out of range, max %lu", (unsigned long) z, (unsigned long) (td->td_imagedepth - 1)); return (0); } if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s >= td->td_samplesperpixel) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%lu: Sample out of range, max %lu", (unsigned long) s, (unsigned long) (td->td_samplesperpixel - 1)); return (0); } return (1); } /* * Compute how many tiles are in an image. */ uint32 TIFFNumberOfTiles(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; uint32 dx = td->td_tilewidth; uint32 dy = td->td_tilelength; uint32 dz = td->td_tiledepth; uint32 ntiles; if (dx == (uint32) -1) dx = td->td_imagewidth; if (dy == (uint32) -1) dy = td->td_imagelength; if (dz == (uint32) -1) dz = td->td_imagedepth; ntiles = (dx == 0 || dy == 0 || dz == 0) ? 0 : _TIFFMultiply32(tif, _TIFFMultiply32(tif, TIFFhowmany_32(td->td_imagewidth, dx), TIFFhowmany_32(td->td_imagelength, dy), "TIFFNumberOfTiles"), TIFFhowmany_32(td->td_imagedepth, dz), "TIFFNumberOfTiles"); if (td->td_planarconfig == PLANARCONFIG_SEPARATE) ntiles = _TIFFMultiply32(tif, ntiles, td->td_samplesperpixel, "TIFFNumberOfTiles"); return (ntiles); } /* * Compute the # bytes in each row of a tile. */ uint64 TIFFTileRowSize64(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; uint64 rowsize; if (td->td_tilelength == 0 || td->td_tilewidth == 0) return (0); rowsize = _TIFFMultiply64(tif, td->td_bitspersample, td->td_tilewidth, "TIFFTileRowSize"); if (td->td_planarconfig == PLANARCONFIG_CONTIG) rowsize = _TIFFMultiply64(tif, rowsize, td->td_samplesperpixel, "TIFFTileRowSize"); return (TIFFhowmany8_64(rowsize)); } tmsize_t TIFFTileRowSize(TIFF* tif) { static const char module[] = "TIFFTileRowSize"; uint64 m; tmsize_t n; m=TIFFTileRowSize64(tif); n=(tmsize_t)m; if ((uint64)n!=m) { TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow"); n=0; } return(n); } /* * Compute the # bytes in a variable length, row-aligned tile. */ uint64 TIFFVTileSize64(TIFF* tif, uint32 nrows) { static const char module[] = "TIFFVTileSize64"; TIFFDirectory *td = &tif->tif_dir; if (td->td_tilelength == 0 || td->td_tilewidth == 0 || td->td_tiledepth == 0) return (0); if ((td->td_planarconfig==PLANARCONFIG_CONTIG)&& (td->td_photometric==PHOTOMETRIC_YCBCR)&& (td->td_samplesperpixel==3)&& (!isUpSampled(tif))) { /* * Packed YCbCr data contain one Cb+Cr for every * HorizontalSampling*VerticalSampling Y values. * Must also roundup width and height when calculating * since images that are not a multiple of the * horizontal/vertical subsampling area include * YCbCr data for the extended image. */ uint16 ycbcrsubsampling[2]; uint16 samplingblock_samples; uint32 samplingblocks_hor; uint32 samplingblocks_ver; uint64 samplingrow_samples; uint64 samplingrow_size; TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING,ycbcrsubsampling+0, ycbcrsubsampling+1); if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 && ycbcrsubsampling[0] != 4) ||(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 && ycbcrsubsampling[1] != 4)) { TIFFErrorExt(tif->tif_clientdata,module, "Invalid YCbCr subsampling (%dx%d)", ycbcrsubsampling[0], ycbcrsubsampling[1] ); return 0; } samplingblock_samples=ycbcrsubsampling[0]*ycbcrsubsampling[1]+2; samplingblocks_hor=TIFFhowmany_32(td->td_tilewidth,ycbcrsubsampling[0]); samplingblocks_ver=TIFFhowmany_32(nrows,ycbcrsubsampling[1]); samplingrow_samples=_TIFFMultiply64(tif,samplingblocks_hor,samplingblock_samples,module); samplingrow_size=TIFFhowmany8_64(_TIFFMultiply64(tif,samplingrow_samples,td->td_bitspersample,module)); return(_TIFFMultiply64(tif,samplingrow_size,samplingblocks_ver,module)); } else return(_TIFFMultiply64(tif,nrows,TIFFTileRowSize64(tif),module)); } tmsize_t TIFFVTileSize(TIFF* tif, uint32 nrows) { static const char module[] = "TIFFVTileSize"; uint64 m; tmsize_t n; m=TIFFVTileSize64(tif,nrows); n=(tmsize_t)m; if ((uint64)n!=m) { TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow"); n=0; } return(n); } /* * Compute the # bytes in a row-aligned tile. */ uint64 TIFFTileSize64(TIFF* tif) { return (TIFFVTileSize64(tif, tif->tif_dir.td_tilelength)); } tmsize_t TIFFTileSize(TIFF* tif) { static const char module[] = "TIFFTileSize"; uint64 m; tmsize_t n; m=TIFFTileSize64(tif); n=(tmsize_t)m; if ((uint64)n!=m) { TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow"); n=0; } return(n); } /* * Compute a default tile size based on the image * characteristics and a requested value. If a * request is <1 then we choose a size according * to certain heuristics. */ void TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th) { (*tif->tif_deftilesize)(tif, tw, th); } void _TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th) { (void) tif; if (*(int32*) tw < 1) *tw = 256; if (*(int32*) th < 1) *th = 256; /* roundup to a multiple of 16 per the spec */ if (*tw & 0xf) *tw = TIFFroundup_32(*tw, 16); if (*th & 0xf) *th = TIFFroundup_32(*th, 16); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_jbig.c0000644000212300117540000001262511345765560012751 00000000000000/* $Id: tif_jbig.c,v 1.15 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * JBIG Compression Algorithm Support. * Contributed by Lee Howard * */ #include "tiffiop.h" #ifdef JBIG_SUPPORT #include "jbig.h" static int JBIGSetupDecode(TIFF* tif) { if (TIFFNumberOfStrips(tif) != 1) { TIFFErrorExt(tif->tif_clientdata, "JBIG", "Multistrip images not supported in decoder"); return 0; } return 1; } static int JBIGDecode(TIFF* tif, uint8* buffer, tmsize_t size, uint16 s) { struct jbg_dec_state decoder; int decodeStatus = 0; unsigned char* pImage = NULL; (void) size, (void) s; if (isFillOrder(tif, tif->tif_dir.td_fillorder)) { TIFFReverseBits(tif->tif_rawdata, tif->tif_rawdatasize); } jbg_dec_init(&decoder); #if defined(HAVE_JBG_NEWLEN) jbg_newlen(tif->tif_rawdata, (size_t)tif->tif_rawdatasize); /* * I do not check the return status of jbg_newlen because even if this * function fails it does not necessarily mean that decoding the image * will fail. It is generally only needed for received fax images * that do not contain the actual length of the image in the BIE * header. I do not log when an error occurs because that will cause * problems when converting JBIG encoded TIFF's to * PostScript. As long as the actual image length is contained in the * BIE header jbg_dec_in should succeed. */ #endif /* HAVE_JBG_NEWLEN */ decodeStatus = jbg_dec_in(&decoder, (unsigned char*)tif->tif_rawdata, (size_t)tif->tif_rawdatasize, NULL); if (JBG_EOK != decodeStatus) { /* * XXX: JBG_EN constant was defined in pre-2.0 releases of the * JBIG-KIT. Since the 2.0 the error reporting functions were * changed. We will handle both cases here. */ TIFFErrorExt(tif->tif_clientdata, "JBIG", "Error (%d) decoding: %s", decodeStatus, #if defined(JBG_EN) jbg_strerror(decodeStatus, JBG_EN) #else jbg_strerror(decodeStatus) #endif ); return 0; } pImage = jbg_dec_getimage(&decoder, 0); _TIFFmemcpy(buffer, pImage, jbg_dec_getsize(&decoder)); jbg_dec_free(&decoder); return 1; } static int JBIGSetupEncode(TIFF* tif) { if (TIFFNumberOfStrips(tif) != 1) { TIFFErrorExt(tif->tif_clientdata, "JBIG", "Multistrip images not supported in encoder"); return 0; } return 1; } static int JBIGCopyEncodedData(TIFF* tif, unsigned char* pp, size_t cc, uint16 s) { (void) s; while (cc > 0) { tmsize_t n = (tmsize_t)cc; if (tif->tif_rawcc + n > tif->tif_rawdatasize) { n = tif->tif_rawdatasize - tif->tif_rawcc; } assert(n > 0); _TIFFmemcpy(tif->tif_rawcp, pp, n); tif->tif_rawcp += n; tif->tif_rawcc += n; pp += n; cc -= (size_t)n; if (tif->tif_rawcc >= tif->tif_rawdatasize && !TIFFFlushData1(tif)) { return (-1); } } return (1); } static void JBIGOutputBie(unsigned char* buffer, size_t len, void* userData) { TIFF* tif = (TIFF*)userData; if (isFillOrder(tif, tif->tif_dir.td_fillorder)) { TIFFReverseBits(buffer, (tmsize_t)len); } JBIGCopyEncodedData(tif, buffer, len, 0); } static int JBIGEncode(TIFF* tif, uint8* buffer, tmsize_t size, uint16 s) { TIFFDirectory* dir = &tif->tif_dir; struct jbg_enc_state encoder; (void) size, (void) s; jbg_enc_init(&encoder, dir->td_imagewidth, dir->td_imagelength, 1, &buffer, JBIGOutputBie, tif); /* * jbg_enc_out does the "real" encoding. As data is encoded, * JBIGOutputBie is called, which writes the data to the directory. */ jbg_enc_out(&encoder); jbg_enc_free(&encoder); return 1; } int TIFFInitJBIG(TIFF* tif, int scheme) { assert(scheme == COMPRESSION_JBIG); /* * These flags are set so the JBIG Codec can control when to reverse * bits and when not to and to allow the jbig decoder and bit reverser * to write to memory when necessary. */ tif->tif_flags |= TIFF_NOBITREV; tif->tif_flags &= ~TIFF_MAPPED; /* Setup the function pointers for encode, decode, and cleanup. */ tif->tif_setupdecode = JBIGSetupDecode; tif->tif_decodestrip = JBIGDecode; tif->tif_setupencode = JBIGSetupEncode; tif->tif_encodestrip = JBIGEncode; return 1; } #endif /* JBIG_SUPPORT */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/libtiff.map0000644000212300117540000000004211707054605013125 00000000000000LIBTIFF_4.0 { global: *; }; tiff-4.0.3/libtiff/tif_dir.c0000644000212300117540000013252211766757625012625 00000000000000/* $Id: tif_dir.c,v 1.113 2012-06-14 20:32:53 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Directory Tag Get & Set Routines. * (and also some miscellaneous stuff) */ #include "tiffiop.h" /* * These are used in the backwards compatibility code... */ #define DATATYPE_VOID 0 /* !untyped data */ #define DATATYPE_INT 1 /* !signed integer data */ #define DATATYPE_UINT 2 /* !unsigned integer data */ #define DATATYPE_IEEEFP 3 /* !IEEE floating point data */ static void setByteArray(void** vpp, void* vp, size_t nmemb, size_t elem_size) { if (*vpp) _TIFFfree(*vpp), *vpp = 0; if (vp) { tmsize_t bytes = (tmsize_t)(nmemb * elem_size); if (elem_size && bytes / elem_size == nmemb) *vpp = (void*) _TIFFmalloc(bytes); if (*vpp) _TIFFmemcpy(*vpp, vp, bytes); } } void _TIFFsetByteArray(void** vpp, void* vp, uint32 n) { setByteArray(vpp, vp, n, 1); } void _TIFFsetString(char** cpp, char* cp) { setByteArray((void**) cpp, (void*) cp, strlen(cp)+1, 1); } void _TIFFsetNString(char** cpp, char* cp, uint32 n) { setByteArray((void**) cpp, (void*) cp, n, 1); } void _TIFFsetShortArray(uint16** wpp, uint16* wp, uint32 n) { setByteArray((void**) wpp, (void*) wp, n, sizeof (uint16)); } void _TIFFsetLongArray(uint32** lpp, uint32* lp, uint32 n) { setByteArray((void**) lpp, (void*) lp, n, sizeof (uint32)); } void _TIFFsetLong8Array(uint64** lpp, uint64* lp, uint32 n) { setByteArray((void**) lpp, (void*) lp, n, sizeof (uint64)); } void _TIFFsetFloatArray(float** fpp, float* fp, uint32 n) { setByteArray((void**) fpp, (void*) fp, n, sizeof (float)); } void _TIFFsetDoubleArray(double** dpp, double* dp, uint32 n) { setByteArray((void**) dpp, (void*) dp, n, sizeof (double)); } static void setDoubleArrayOneValue(double** vpp, double value, size_t nmemb) { if (*vpp) _TIFFfree(*vpp); *vpp = _TIFFmalloc(nmemb*sizeof(double)); if (*vpp) { while (nmemb--) ((double*)*vpp)[nmemb] = value; } } /* * Install extra samples information. */ static int setExtraSamples(TIFFDirectory* td, va_list ap, uint32* v) { /* XXX: Unassociated alpha data == 999 is a known Corel Draw bug, see below */ #define EXTRASAMPLE_COREL_UNASSALPHA 999 uint16* va; uint32 i; *v = (uint16) va_arg(ap, uint16_vap); if ((uint16) *v > td->td_samplesperpixel) return 0; va = va_arg(ap, uint16*); if (*v > 0 && va == NULL) /* typically missing param */ return 0; for (i = 0; i < *v; i++) { if (va[i] > EXTRASAMPLE_UNASSALPHA) { /* * XXX: Corel Draw is known to produce incorrect * ExtraSamples tags which must be patched here if we * want to be able to open some of the damaged TIFF * files: */ if (va[i] == EXTRASAMPLE_COREL_UNASSALPHA) va[i] = EXTRASAMPLE_UNASSALPHA; else return 0; } } td->td_extrasamples = (uint16) *v; _TIFFsetShortArray(&td->td_sampleinfo, va, td->td_extrasamples); return 1; #undef EXTRASAMPLE_COREL_UNASSALPHA } /* * Confirm we have "samplesperpixel" ink names separated by \0. Returns * zero if the ink names are not as expected. */ static uint32 checkInkNamesString(TIFF* tif, uint32 slen, const char* s) { TIFFDirectory* td = &tif->tif_dir; uint16 i = td->td_samplesperpixel; if (slen > 0) { const char* ep = s+slen; const char* cp = s; for (; i > 0; i--) { for (; cp < ep && *cp != '\0'; cp++) {} if (cp >= ep) goto bad; cp++; /* skip \0 */ } return ((uint32)(cp-s)); } bad: TIFFErrorExt(tif->tif_clientdata, "TIFFSetField", "%s: Invalid InkNames value; expecting %d names, found %d", tif->tif_name, td->td_samplesperpixel, td->td_samplesperpixel-i); return (0); } static int _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap) { static const char module[] = "_TIFFVSetField"; TIFFDirectory* td = &tif->tif_dir; int status = 1; uint32 v32, i, v; char* s; const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY); uint32 standard_tag = tag; /* * We want to force the custom code to be used for custom * fields even if the tag happens to match a well known * one - important for reinterpreted handling of standard * tag values in custom directories (ie. EXIF) */ if (fip->field_bit == FIELD_CUSTOM) { standard_tag = 0; } switch (standard_tag) { case TIFFTAG_SUBFILETYPE: td->td_subfiletype = (uint32) va_arg(ap, uint32); break; case TIFFTAG_IMAGEWIDTH: td->td_imagewidth = (uint32) va_arg(ap, uint32); break; case TIFFTAG_IMAGELENGTH: td->td_imagelength = (uint32) va_arg(ap, uint32); break; case TIFFTAG_BITSPERSAMPLE: td->td_bitspersample = (uint16) va_arg(ap, uint16_vap); /* * If the data require post-decoding processing to byte-swap * samples, set it up here. Note that since tags are required * to be ordered, compression code can override this behaviour * in the setup method if it wants to roll the post decoding * work in with its normal work. */ if (tif->tif_flags & TIFF_SWAB) { if (td->td_bitspersample == 8) tif->tif_postdecode = _TIFFNoPostDecode; else if (td->td_bitspersample == 16) tif->tif_postdecode = _TIFFSwab16BitData; else if (td->td_bitspersample == 24) tif->tif_postdecode = _TIFFSwab24BitData; else if (td->td_bitspersample == 32) tif->tif_postdecode = _TIFFSwab32BitData; else if (td->td_bitspersample == 64) tif->tif_postdecode = _TIFFSwab64BitData; else if (td->td_bitspersample == 128) /* two 64's */ tif->tif_postdecode = _TIFFSwab64BitData; } break; case TIFFTAG_COMPRESSION: v = (uint16) va_arg(ap, uint16_vap); /* * If we're changing the compression scheme, the notify the * previous module so that it can cleanup any state it's * setup. */ if (TIFFFieldSet(tif, FIELD_COMPRESSION)) { if ((uint32)td->td_compression == v) break; (*tif->tif_cleanup)(tif); tif->tif_flags &= ~TIFF_CODERSETUP; } /* * Setup new compression routine state. */ if( (status = TIFFSetCompressionScheme(tif, v)) != 0 ) td->td_compression = (uint16) v; else status = 0; break; case TIFFTAG_PHOTOMETRIC: td->td_photometric = (uint16) va_arg(ap, uint16_vap); break; case TIFFTAG_THRESHHOLDING: td->td_threshholding = (uint16) va_arg(ap, uint16_vap); break; case TIFFTAG_FILLORDER: v = (uint16) va_arg(ap, uint16_vap); if (v != FILLORDER_LSB2MSB && v != FILLORDER_MSB2LSB) goto badvalue; td->td_fillorder = (uint16) v; break; case TIFFTAG_ORIENTATION: v = (uint16) va_arg(ap, uint16_vap); if (v < ORIENTATION_TOPLEFT || ORIENTATION_LEFTBOT < v) goto badvalue; else td->td_orientation = (uint16) v; break; case TIFFTAG_SAMPLESPERPIXEL: v = (uint16) va_arg(ap, uint16_vap); if (v == 0) goto badvalue; td->td_samplesperpixel = (uint16) v; break; case TIFFTAG_ROWSPERSTRIP: v32 = (uint32) va_arg(ap, uint32); if (v32 == 0) goto badvalue32; td->td_rowsperstrip = v32; if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) { td->td_tilelength = v32; td->td_tilewidth = td->td_imagewidth; } break; case TIFFTAG_MINSAMPLEVALUE: td->td_minsamplevalue = (uint16) va_arg(ap, uint16_vap); break; case TIFFTAG_MAXSAMPLEVALUE: td->td_maxsamplevalue = (uint16) va_arg(ap, uint16_vap); break; case TIFFTAG_SMINSAMPLEVALUE: if (tif->tif_flags & TIFF_PERSAMPLE) _TIFFsetDoubleArray(&td->td_sminsamplevalue, va_arg(ap, double*), td->td_samplesperpixel); else setDoubleArrayOneValue(&td->td_sminsamplevalue, va_arg(ap, double), td->td_samplesperpixel); break; case TIFFTAG_SMAXSAMPLEVALUE: if (tif->tif_flags & TIFF_PERSAMPLE) _TIFFsetDoubleArray(&td->td_smaxsamplevalue, va_arg(ap, double*), td->td_samplesperpixel); else setDoubleArrayOneValue(&td->td_smaxsamplevalue, va_arg(ap, double), td->td_samplesperpixel); break; case TIFFTAG_XRESOLUTION: td->td_xresolution = (float) va_arg(ap, double); break; case TIFFTAG_YRESOLUTION: td->td_yresolution = (float) va_arg(ap, double); break; case TIFFTAG_PLANARCONFIG: v = (uint16) va_arg(ap, uint16_vap); if (v != PLANARCONFIG_CONTIG && v != PLANARCONFIG_SEPARATE) goto badvalue; td->td_planarconfig = (uint16) v; break; case TIFFTAG_XPOSITION: td->td_xposition = (float) va_arg(ap, double); break; case TIFFTAG_YPOSITION: td->td_yposition = (float) va_arg(ap, double); break; case TIFFTAG_RESOLUTIONUNIT: v = (uint16) va_arg(ap, uint16_vap); if (v < RESUNIT_NONE || RESUNIT_CENTIMETER < v) goto badvalue; td->td_resolutionunit = (uint16) v; break; case TIFFTAG_PAGENUMBER: td->td_pagenumber[0] = (uint16) va_arg(ap, uint16_vap); td->td_pagenumber[1] = (uint16) va_arg(ap, uint16_vap); break; case TIFFTAG_HALFTONEHINTS: td->td_halftonehints[0] = (uint16) va_arg(ap, uint16_vap); td->td_halftonehints[1] = (uint16) va_arg(ap, uint16_vap); break; case TIFFTAG_COLORMAP: v32 = (uint32)(1L<td_bitspersample); _TIFFsetShortArray(&td->td_colormap[0], va_arg(ap, uint16*), v32); _TIFFsetShortArray(&td->td_colormap[1], va_arg(ap, uint16*), v32); _TIFFsetShortArray(&td->td_colormap[2], va_arg(ap, uint16*), v32); break; case TIFFTAG_EXTRASAMPLES: if (!setExtraSamples(td, ap, &v)) goto badvalue; break; case TIFFTAG_MATTEING: td->td_extrasamples = (((uint16) va_arg(ap, uint16_vap)) != 0); if (td->td_extrasamples) { uint16 sv = EXTRASAMPLE_ASSOCALPHA; _TIFFsetShortArray(&td->td_sampleinfo, &sv, 1); } break; case TIFFTAG_TILEWIDTH: v32 = (uint32) va_arg(ap, uint32); if (v32 % 16) { if (tif->tif_mode != O_RDONLY) goto badvalue32; TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "Nonstandard tile width %d, convert file", v32); } td->td_tilewidth = v32; tif->tif_flags |= TIFF_ISTILED; break; case TIFFTAG_TILELENGTH: v32 = (uint32) va_arg(ap, uint32); if (v32 % 16) { if (tif->tif_mode != O_RDONLY) goto badvalue32; TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "Nonstandard tile length %d, convert file", v32); } td->td_tilelength = v32; tif->tif_flags |= TIFF_ISTILED; break; case TIFFTAG_TILEDEPTH: v32 = (uint32) va_arg(ap, uint32); if (v32 == 0) goto badvalue32; td->td_tiledepth = v32; break; case TIFFTAG_DATATYPE: v = (uint16) va_arg(ap, uint16_vap); switch (v) { case DATATYPE_VOID: v = SAMPLEFORMAT_VOID; break; case DATATYPE_INT: v = SAMPLEFORMAT_INT; break; case DATATYPE_UINT: v = SAMPLEFORMAT_UINT; break; case DATATYPE_IEEEFP: v = SAMPLEFORMAT_IEEEFP;break; default: goto badvalue; } td->td_sampleformat = (uint16) v; break; case TIFFTAG_SAMPLEFORMAT: v = (uint16) va_arg(ap, uint16_vap); if (v < SAMPLEFORMAT_UINT || SAMPLEFORMAT_COMPLEXIEEEFP < v) goto badvalue; td->td_sampleformat = (uint16) v; /* Try to fix up the SWAB function for complex data. */ if( td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT && td->td_bitspersample == 32 && tif->tif_postdecode == _TIFFSwab32BitData ) tif->tif_postdecode = _TIFFSwab16BitData; else if( (td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT || td->td_sampleformat == SAMPLEFORMAT_COMPLEXIEEEFP) && td->td_bitspersample == 64 && tif->tif_postdecode == _TIFFSwab64BitData ) tif->tif_postdecode = _TIFFSwab32BitData; break; case TIFFTAG_IMAGEDEPTH: td->td_imagedepth = (uint32) va_arg(ap, uint32); break; case TIFFTAG_SUBIFD: if ((tif->tif_flags & TIFF_INSUBIFD) == 0) { td->td_nsubifd = (uint16) va_arg(ap, uint16_vap); _TIFFsetLong8Array(&td->td_subifd, (uint64*) va_arg(ap, uint64*), (long) td->td_nsubifd); } else { TIFFErrorExt(tif->tif_clientdata, module, "%s: Sorry, cannot nest SubIFDs", tif->tif_name); status = 0; } break; case TIFFTAG_YCBCRPOSITIONING: td->td_ycbcrpositioning = (uint16) va_arg(ap, uint16_vap); break; case TIFFTAG_YCBCRSUBSAMPLING: td->td_ycbcrsubsampling[0] = (uint16) va_arg(ap, uint16_vap); td->td_ycbcrsubsampling[1] = (uint16) va_arg(ap, uint16_vap); break; case TIFFTAG_TRANSFERFUNCTION: v = (td->td_samplesperpixel - td->td_extrasamples) > 1 ? 3 : 1; for (i = 0; i < v; i++) _TIFFsetShortArray(&td->td_transferfunction[i], va_arg(ap, uint16*), 1L<td_bitspersample); break; case TIFFTAG_REFERENCEBLACKWHITE: /* XXX should check for null range */ _TIFFsetFloatArray(&td->td_refblackwhite, va_arg(ap, float*), 6); break; case TIFFTAG_INKNAMES: v = (uint16) va_arg(ap, uint16_vap); s = va_arg(ap, char*); v = checkInkNamesString(tif, v, s); status = v > 0; if( v > 0 ) { _TIFFsetNString(&td->td_inknames, s, v); td->td_inknameslen = v; } break; case TIFFTAG_PERSAMPLE: v = (uint16) va_arg(ap, uint16_vap); if( v == PERSAMPLE_MULTI ) tif->tif_flags |= TIFF_PERSAMPLE; else tif->tif_flags &= ~TIFF_PERSAMPLE; break; default: { TIFFTagValue *tv; int tv_size, iCustom; /* * This can happen if multiple images are open with different * codecs which have private tags. The global tag information * table may then have tags that are valid for one file but not * the other. If the client tries to set a tag that is not valid * for the image's codec then we'll arrive here. This * happens, for example, when tiffcp is used to convert between * compression schemes and codec-specific tags are blindly copied. */ if(fip == NULL || fip->field_bit != FIELD_CUSTOM) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Invalid %stag \"%s\" (not supported by codec)", tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", fip ? fip->field_name : "Unknown"); status = 0; break; } /* * Find the existing entry for this custom value. */ tv = NULL; for (iCustom = 0; iCustom < td->td_customValueCount; iCustom++) { if (td->td_customValues[iCustom].info->field_tag == tag) { tv = td->td_customValues + iCustom; if (tv->value != NULL) { _TIFFfree(tv->value); tv->value = NULL; } break; } } /* * Grow the custom list if the entry was not found. */ if(tv == NULL) { TIFFTagValue *new_customValues; td->td_customValueCount++; new_customValues = (TIFFTagValue *) _TIFFrealloc(td->td_customValues, sizeof(TIFFTagValue) * td->td_customValueCount); if (!new_customValues) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Failed to allocate space for list of custom values", tif->tif_name); status = 0; goto end; } td->td_customValues = new_customValues; tv = td->td_customValues + (td->td_customValueCount - 1); tv->info = fip; tv->value = NULL; tv->count = 0; } /* * Set custom value ... save a copy of the custom tag value. */ tv_size = _TIFFDataSize(fip->field_type); if (tv_size == 0) { status = 0; TIFFErrorExt(tif->tif_clientdata, module, "%s: Bad field type %d for \"%s\"", tif->tif_name, fip->field_type, fip->field_name); goto end; } if (fip->field_type == TIFF_ASCII) { uint32 ma; char* mb; if (fip->field_passcount) { assert(fip->field_writecount==TIFF_VARIABLE2); ma=(uint32)va_arg(ap,uint32); mb=(char*)va_arg(ap,char*); } else { mb=(char*)va_arg(ap,char*); ma=(uint32)(strlen(mb)+1); } tv->count=ma; setByteArray(&tv->value,mb,ma,1); } else { if (fip->field_passcount) { if (fip->field_writecount == TIFF_VARIABLE2) tv->count = (uint32) va_arg(ap, uint32); else tv->count = (int) va_arg(ap, int); } else if (fip->field_writecount == TIFF_VARIABLE || fip->field_writecount == TIFF_VARIABLE2) tv->count = 1; else if (fip->field_writecount == TIFF_SPP) tv->count = td->td_samplesperpixel; else tv->count = fip->field_writecount; if (tv->count == 0) { status = 0; TIFFErrorExt(tif->tif_clientdata, module, "%s: Null count for \"%s\" (type " "%d, writecount %d, passcount %d)", tif->tif_name, fip->field_name, fip->field_type, fip->field_writecount, fip->field_passcount); goto end; } tv->value = _TIFFCheckMalloc(tif, tv->count, tv_size, "custom tag binary object"); if (!tv->value) { status = 0; goto end; } if (fip->field_tag == TIFFTAG_DOTRANGE && strcmp(fip->field_name,"DotRange") == 0) { /* TODO: This is an evil exception and should not have been handled this way ... likely best if we move it into the directory structure with an explicit field in libtiff 4.1 and assign it a FIELD_ value */ uint16 v[2]; v[0] = (uint16)va_arg(ap, int); v[1] = (uint16)va_arg(ap, int); _TIFFmemcpy(tv->value, &v, 4); } else if (fip->field_passcount || fip->field_writecount == TIFF_VARIABLE || fip->field_writecount == TIFF_VARIABLE2 || fip->field_writecount == TIFF_SPP || tv->count > 1) { _TIFFmemcpy(tv->value, va_arg(ap, void *), tv->count * tv_size); } else { char *val = (char *)tv->value; assert( tv->count == 1 ); switch (fip->field_type) { case TIFF_BYTE: case TIFF_UNDEFINED: { uint8 v = (uint8)va_arg(ap, int); _TIFFmemcpy(val, &v, tv_size); } break; case TIFF_SBYTE: { int8 v = (int8)va_arg(ap, int); _TIFFmemcpy(val, &v, tv_size); } break; case TIFF_SHORT: { uint16 v = (uint16)va_arg(ap, int); _TIFFmemcpy(val, &v, tv_size); } break; case TIFF_SSHORT: { int16 v = (int16)va_arg(ap, int); _TIFFmemcpy(val, &v, tv_size); } break; case TIFF_LONG: case TIFF_IFD: { uint32 v = va_arg(ap, uint32); _TIFFmemcpy(val, &v, tv_size); } break; case TIFF_SLONG: { int32 v = va_arg(ap, int32); _TIFFmemcpy(val, &v, tv_size); } break; case TIFF_LONG8: case TIFF_IFD8: { uint64 v = va_arg(ap, uint64); _TIFFmemcpy(val, &v, tv_size); } break; case TIFF_SLONG8: { int64 v = va_arg(ap, int64); _TIFFmemcpy(val, &v, tv_size); } break; case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: { float v = (float)va_arg(ap, double); _TIFFmemcpy(val, &v, tv_size); } break; case TIFF_DOUBLE: { double v = va_arg(ap, double); _TIFFmemcpy(val, &v, tv_size); } break; default: _TIFFmemset(val, 0, tv_size); status = 0; break; } } } } } if (status) { const TIFFField* fip=TIFFFieldWithTag(tif,tag); if (fip) TIFFSetFieldBit(tif, fip->field_bit); tif->tif_flags |= TIFF_DIRTYDIRECT; } end: va_end(ap); return (status); badvalue: { const TIFFField* fip=TIFFFieldWithTag(tif,tag); TIFFErrorExt(tif->tif_clientdata, module, "%s: Bad value %u for \"%s\" tag", tif->tif_name, v, fip ? fip->field_name : "Unknown"); va_end(ap); } return (0); badvalue32: { const TIFFField* fip=TIFFFieldWithTag(tif,tag); TIFFErrorExt(tif->tif_clientdata, module, "%s: Bad value %u for \"%s\" tag", tif->tif_name, v32, fip ? fip->field_name : "Unknown"); va_end(ap); } return (0); } /* * Return 1/0 according to whether or not * it is permissible to set the tag's value. * Note that we allow ImageLength to be changed * so that we can append and extend to images. * Any other tag may not be altered once writing * has commenced, unless its value has no effect * on the format of the data that is written. */ static int OkToChangeTag(TIFF* tif, uint32 tag) { const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY); if (!fip) { /* unknown tag */ TIFFErrorExt(tif->tif_clientdata, "TIFFSetField", "%s: Unknown %stag %u", tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", tag); return (0); } if (tag != TIFFTAG_IMAGELENGTH && (tif->tif_flags & TIFF_BEENWRITING) && !fip->field_oktochange) { /* * Consult info table to see if tag can be changed * after we've started writing. We only allow changes * to those tags that don't/shouldn't affect the * compression and/or format of the data. */ TIFFErrorExt(tif->tif_clientdata, "TIFFSetField", "%s: Cannot modify tag \"%s\" while writing", tif->tif_name, fip->field_name); return (0); } return (1); } /* * Record the value of a field in the * internal directory structure. The * field will be written to the file * when/if the directory structure is * updated. */ int TIFFSetField(TIFF* tif, uint32 tag, ...) { va_list ap; int status; va_start(ap, tag); status = TIFFVSetField(tif, tag, ap); va_end(ap); return (status); } /* * Clear the contents of the field in the internal structure. */ int TIFFUnsetField(TIFF* tif, uint32 tag) { const TIFFField *fip = TIFFFieldWithTag(tif, tag); TIFFDirectory* td = &tif->tif_dir; if( !fip ) return 0; if( fip->field_bit != FIELD_CUSTOM ) TIFFClrFieldBit(tif, fip->field_bit); else { TIFFTagValue *tv = NULL; int i; for (i = 0; i < td->td_customValueCount; i++) { tv = td->td_customValues + i; if( tv->info->field_tag == tag ) break; } if( i < td->td_customValueCount ) { _TIFFfree(tv->value); for( ; i < td->td_customValueCount-1; i++) { td->td_customValues[i] = td->td_customValues[i+1]; } td->td_customValueCount--; } } tif->tif_flags |= TIFF_DIRTYDIRECT; return (1); } /* * Like TIFFSetField, but taking a varargs * parameter list. This routine is useful * for building higher-level interfaces on * top of the library. */ int TIFFVSetField(TIFF* tif, uint32 tag, va_list ap) { return OkToChangeTag(tif, tag) ? (*tif->tif_tagmethods.vsetfield)(tif, tag, ap) : 0; } static int _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap) { TIFFDirectory* td = &tif->tif_dir; int ret_val = 1; uint32 standard_tag = tag; const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY); /* * We want to force the custom code to be used for custom * fields even if the tag happens to match a well known * one - important for reinterpreted handling of standard * tag values in custom directories (ie. EXIF) */ if (fip->field_bit == FIELD_CUSTOM) { standard_tag = 0; } switch (standard_tag) { case TIFFTAG_SUBFILETYPE: *va_arg(ap, uint32*) = td->td_subfiletype; break; case TIFFTAG_IMAGEWIDTH: *va_arg(ap, uint32*) = td->td_imagewidth; break; case TIFFTAG_IMAGELENGTH: *va_arg(ap, uint32*) = td->td_imagelength; break; case TIFFTAG_BITSPERSAMPLE: *va_arg(ap, uint16*) = td->td_bitspersample; break; case TIFFTAG_COMPRESSION: *va_arg(ap, uint16*) = td->td_compression; break; case TIFFTAG_PHOTOMETRIC: *va_arg(ap, uint16*) = td->td_photometric; break; case TIFFTAG_THRESHHOLDING: *va_arg(ap, uint16*) = td->td_threshholding; break; case TIFFTAG_FILLORDER: *va_arg(ap, uint16*) = td->td_fillorder; break; case TIFFTAG_ORIENTATION: *va_arg(ap, uint16*) = td->td_orientation; break; case TIFFTAG_SAMPLESPERPIXEL: *va_arg(ap, uint16*) = td->td_samplesperpixel; break; case TIFFTAG_ROWSPERSTRIP: *va_arg(ap, uint32*) = td->td_rowsperstrip; break; case TIFFTAG_MINSAMPLEVALUE: *va_arg(ap, uint16*) = td->td_minsamplevalue; break; case TIFFTAG_MAXSAMPLEVALUE: *va_arg(ap, uint16*) = td->td_maxsamplevalue; break; case TIFFTAG_SMINSAMPLEVALUE: if (tif->tif_flags & TIFF_PERSAMPLE) *va_arg(ap, double**) = td->td_sminsamplevalue; else { /* libtiff historially treats this as a single value. */ uint16 i; double v = td->td_sminsamplevalue[0]; for (i=1; i < td->td_samplesperpixel; ++i) if( td->td_sminsamplevalue[i] < v ) v = td->td_sminsamplevalue[i]; *va_arg(ap, double*) = v; } break; case TIFFTAG_SMAXSAMPLEVALUE: if (tif->tif_flags & TIFF_PERSAMPLE) *va_arg(ap, double**) = td->td_smaxsamplevalue; else { /* libtiff historially treats this as a single value. */ uint16 i; double v = td->td_smaxsamplevalue[0]; for (i=1; i < td->td_samplesperpixel; ++i) if( td->td_smaxsamplevalue[i] > v ) v = td->td_smaxsamplevalue[i]; *va_arg(ap, double*) = v; } break; case TIFFTAG_XRESOLUTION: *va_arg(ap, float*) = td->td_xresolution; break; case TIFFTAG_YRESOLUTION: *va_arg(ap, float*) = td->td_yresolution; break; case TIFFTAG_PLANARCONFIG: *va_arg(ap, uint16*) = td->td_planarconfig; break; case TIFFTAG_XPOSITION: *va_arg(ap, float*) = td->td_xposition; break; case TIFFTAG_YPOSITION: *va_arg(ap, float*) = td->td_yposition; break; case TIFFTAG_RESOLUTIONUNIT: *va_arg(ap, uint16*) = td->td_resolutionunit; break; case TIFFTAG_PAGENUMBER: *va_arg(ap, uint16*) = td->td_pagenumber[0]; *va_arg(ap, uint16*) = td->td_pagenumber[1]; break; case TIFFTAG_HALFTONEHINTS: *va_arg(ap, uint16*) = td->td_halftonehints[0]; *va_arg(ap, uint16*) = td->td_halftonehints[1]; break; case TIFFTAG_COLORMAP: *va_arg(ap, uint16**) = td->td_colormap[0]; *va_arg(ap, uint16**) = td->td_colormap[1]; *va_arg(ap, uint16**) = td->td_colormap[2]; break; case TIFFTAG_STRIPOFFSETS: case TIFFTAG_TILEOFFSETS: _TIFFFillStriles( tif ); *va_arg(ap, uint64**) = td->td_stripoffset; break; case TIFFTAG_STRIPBYTECOUNTS: case TIFFTAG_TILEBYTECOUNTS: _TIFFFillStriles( tif ); *va_arg(ap, uint64**) = td->td_stripbytecount; break; case TIFFTAG_MATTEING: *va_arg(ap, uint16*) = (td->td_extrasamples == 1 && td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA); break; case TIFFTAG_EXTRASAMPLES: *va_arg(ap, uint16*) = td->td_extrasamples; *va_arg(ap, uint16**) = td->td_sampleinfo; break; case TIFFTAG_TILEWIDTH: *va_arg(ap, uint32*) = td->td_tilewidth; break; case TIFFTAG_TILELENGTH: *va_arg(ap, uint32*) = td->td_tilelength; break; case TIFFTAG_TILEDEPTH: *va_arg(ap, uint32*) = td->td_tiledepth; break; case TIFFTAG_DATATYPE: switch (td->td_sampleformat) { case SAMPLEFORMAT_UINT: *va_arg(ap, uint16*) = DATATYPE_UINT; break; case SAMPLEFORMAT_INT: *va_arg(ap, uint16*) = DATATYPE_INT; break; case SAMPLEFORMAT_IEEEFP: *va_arg(ap, uint16*) = DATATYPE_IEEEFP; break; case SAMPLEFORMAT_VOID: *va_arg(ap, uint16*) = DATATYPE_VOID; break; } break; case TIFFTAG_SAMPLEFORMAT: *va_arg(ap, uint16*) = td->td_sampleformat; break; case TIFFTAG_IMAGEDEPTH: *va_arg(ap, uint32*) = td->td_imagedepth; break; case TIFFTAG_SUBIFD: *va_arg(ap, uint16*) = td->td_nsubifd; *va_arg(ap, uint64**) = td->td_subifd; break; case TIFFTAG_YCBCRPOSITIONING: *va_arg(ap, uint16*) = td->td_ycbcrpositioning; break; case TIFFTAG_YCBCRSUBSAMPLING: *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[0]; *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[1]; break; case TIFFTAG_TRANSFERFUNCTION: *va_arg(ap, uint16**) = td->td_transferfunction[0]; if (td->td_samplesperpixel - td->td_extrasamples > 1) { *va_arg(ap, uint16**) = td->td_transferfunction[1]; *va_arg(ap, uint16**) = td->td_transferfunction[2]; } break; case TIFFTAG_REFERENCEBLACKWHITE: *va_arg(ap, float**) = td->td_refblackwhite; break; case TIFFTAG_INKNAMES: *va_arg(ap, char**) = td->td_inknames; break; default: { int i; /* * This can happen if multiple images are open * with different codecs which have private * tags. The global tag information table may * then have tags that are valid for one file * but not the other. If the client tries to * get a tag that is not valid for the image's * codec then we'll arrive here. */ if( fip == NULL || fip->field_bit != FIELD_CUSTOM ) { TIFFErrorExt(tif->tif_clientdata, "_TIFFVGetField", "%s: Invalid %stag \"%s\" " "(not supported by codec)", tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", fip ? fip->field_name : "Unknown"); ret_val = 0; break; } /* * Do we have a custom value? */ ret_val = 0; for (i = 0; i < td->td_customValueCount; i++) { TIFFTagValue *tv = td->td_customValues + i; if (tv->info->field_tag != tag) continue; if (fip->field_passcount) { if (fip->field_readcount == TIFF_VARIABLE2) *va_arg(ap, uint32*) = (uint32)tv->count; else /* Assume TIFF_VARIABLE */ *va_arg(ap, uint16*) = (uint16)tv->count; *va_arg(ap, void **) = tv->value; ret_val = 1; } else if (fip->field_tag == TIFFTAG_DOTRANGE && strcmp(fip->field_name,"DotRange") == 0) { /* TODO: This is an evil exception and should not have been handled this way ... likely best if we move it into the directory structure with an explicit field in libtiff 4.1 and assign it a FIELD_ value */ *va_arg(ap, uint16*) = ((uint16 *)tv->value)[0]; *va_arg(ap, uint16*) = ((uint16 *)tv->value)[1]; ret_val = 1; } else { if (fip->field_type == TIFF_ASCII || fip->field_readcount == TIFF_VARIABLE || fip->field_readcount == TIFF_VARIABLE2 || fip->field_readcount == TIFF_SPP || tv->count > 1) { *va_arg(ap, void **) = tv->value; ret_val = 1; } else { char *val = (char *)tv->value; assert( tv->count == 1 ); switch (fip->field_type) { case TIFF_BYTE: case TIFF_UNDEFINED: *va_arg(ap, uint8*) = *(uint8 *)val; ret_val = 1; break; case TIFF_SBYTE: *va_arg(ap, int8*) = *(int8 *)val; ret_val = 1; break; case TIFF_SHORT: *va_arg(ap, uint16*) = *(uint16 *)val; ret_val = 1; break; case TIFF_SSHORT: *va_arg(ap, int16*) = *(int16 *)val; ret_val = 1; break; case TIFF_LONG: case TIFF_IFD: *va_arg(ap, uint32*) = *(uint32 *)val; ret_val = 1; break; case TIFF_SLONG: *va_arg(ap, int32*) = *(int32 *)val; ret_val = 1; break; case TIFF_LONG8: case TIFF_IFD8: *va_arg(ap, uint64*) = *(uint64 *)val; ret_val = 1; break; case TIFF_SLONG8: *va_arg(ap, int64*) = *(int64 *)val; ret_val = 1; break; case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: *va_arg(ap, float*) = *(float *)val; ret_val = 1; break; case TIFF_DOUBLE: *va_arg(ap, double*) = *(double *)val; ret_val = 1; break; default: ret_val = 0; break; } } } break; } } } return(ret_val); } /* * Return the value of a field in the * internal directory structure. */ int TIFFGetField(TIFF* tif, uint32 tag, ...) { int status; va_list ap; va_start(ap, tag); status = TIFFVGetField(tif, tag, ap); va_end(ap); return (status); } /* * Like TIFFGetField, but taking a varargs * parameter list. This routine is useful * for building higher-level interfaces on * top of the library. */ int TIFFVGetField(TIFF* tif, uint32 tag, va_list ap) { const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY); return (fip && (isPseudoTag(tag) || TIFFFieldSet(tif, fip->field_bit)) ? (*tif->tif_tagmethods.vgetfield)(tif, tag, ap) : 0); } #define CleanupField(member) { \ if (td->member) { \ _TIFFfree(td->member); \ td->member = 0; \ } \ } /* * Release storage associated with a directory. */ void TIFFFreeDirectory(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; int i; _TIFFmemset(td->td_fieldsset, 0, FIELD_SETLONGS); CleanupField(td_sminsamplevalue); CleanupField(td_smaxsamplevalue); CleanupField(td_colormap[0]); CleanupField(td_colormap[1]); CleanupField(td_colormap[2]); CleanupField(td_sampleinfo); CleanupField(td_subifd); CleanupField(td_inknames); CleanupField(td_refblackwhite); CleanupField(td_transferfunction[0]); CleanupField(td_transferfunction[1]); CleanupField(td_transferfunction[2]); CleanupField(td_stripoffset); CleanupField(td_stripbytecount); TIFFClrFieldBit(tif, FIELD_YCBCRSUBSAMPLING); TIFFClrFieldBit(tif, FIELD_YCBCRPOSITIONING); /* Cleanup custom tag values */ for( i = 0; i < td->td_customValueCount; i++ ) { if (td->td_customValues[i].value) _TIFFfree(td->td_customValues[i].value); } td->td_customValueCount = 0; CleanupField(td_customValues); #if defined(DEFER_STRILE_LOAD) _TIFFmemset( &(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry)); _TIFFmemset( &(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry)); #endif } #undef CleanupField /* * Client Tag extension support (from Niles Ritter). */ static TIFFExtendProc _TIFFextender = (TIFFExtendProc) NULL; TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc extender) { TIFFExtendProc prev = _TIFFextender; _TIFFextender = extender; return (prev); } /* * Setup for a new directory. Should we automatically call * TIFFWriteDirectory() if the current one is dirty? * * The newly created directory will not exist on the file till * TIFFWriteDirectory(), TIFFFlush() or TIFFClose() is called. */ int TIFFCreateDirectory(TIFF* tif) { TIFFDefaultDirectory(tif); tif->tif_diroff = 0; tif->tif_nextdiroff = 0; tif->tif_curoff = 0; tif->tif_row = (uint32) -1; tif->tif_curstrip = (uint32) -1; return 0; } int TIFFCreateCustomDirectory(TIFF* tif, const TIFFFieldArray* infoarray) { TIFFDefaultDirectory(tif); /* * Reset the field definitions to match the application provided list. * Hopefully TIFFDefaultDirectory() won't have done anything irreversable * based on it's assumption this is an image directory. */ _TIFFSetupFields(tif, infoarray); tif->tif_diroff = 0; tif->tif_nextdiroff = 0; tif->tif_curoff = 0; tif->tif_row = (uint32) -1; tif->tif_curstrip = (uint32) -1; return 0; } int TIFFCreateEXIFDirectory(TIFF* tif) { const TIFFFieldArray* exifFieldArray; exifFieldArray = _TIFFGetExifFields(); return TIFFCreateCustomDirectory(tif, exifFieldArray); } /* * Setup a default directory structure. */ int TIFFDefaultDirectory(TIFF* tif) { register TIFFDirectory* td = &tif->tif_dir; const TIFFFieldArray* tiffFieldArray; tiffFieldArray = _TIFFGetFields(); _TIFFSetupFields(tif, tiffFieldArray); _TIFFmemset(td, 0, sizeof (*td)); td->td_fillorder = FILLORDER_MSB2LSB; td->td_bitspersample = 1; td->td_threshholding = THRESHHOLD_BILEVEL; td->td_orientation = ORIENTATION_TOPLEFT; td->td_samplesperpixel = 1; td->td_rowsperstrip = (uint32) -1; td->td_tilewidth = 0; td->td_tilelength = 0; td->td_tiledepth = 1; td->td_stripbytecountsorted = 1; /* Our own arrays always sorted. */ td->td_resolutionunit = RESUNIT_INCH; td->td_sampleformat = SAMPLEFORMAT_UINT; td->td_imagedepth = 1; td->td_ycbcrsubsampling[0] = 2; td->td_ycbcrsubsampling[1] = 2; td->td_ycbcrpositioning = YCBCRPOSITION_CENTERED; tif->tif_postdecode = _TIFFNoPostDecode; tif->tif_foundfield = NULL; tif->tif_tagmethods.vsetfield = _TIFFVSetField; tif->tif_tagmethods.vgetfield = _TIFFVGetField; tif->tif_tagmethods.printdir = NULL; /* * Give client code a chance to install their own * tag extensions & methods, prior to compression overloads. */ if (_TIFFextender) (*_TIFFextender)(tif); (void) TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); /* * NB: The directory is marked dirty as a result of setting * up the default compression scheme. However, this really * isn't correct -- we want TIFF_DIRTYDIRECT to be set only * if the user does something. We could just do the setup * by hand, but it seems better to use the normal mechanism * (i.e. TIFFSetField). */ tif->tif_flags &= ~TIFF_DIRTYDIRECT; /* * As per http://bugzilla.remotesensing.org/show_bug.cgi?id=19 * we clear the ISTILED flag when setting up a new directory. * Should we also be clearing stuff like INSUBIFD? */ tif->tif_flags &= ~TIFF_ISTILED; return (1); } static int TIFFAdvanceDirectory(TIFF* tif, uint64* nextdir, uint64* off) { static const char module[] = "TIFFAdvanceDirectory"; if (isMapped(tif)) { uint64 poff=*nextdir; if (!(tif->tif_flags&TIFF_BIGTIFF)) { tmsize_t poffa,poffb,poffc,poffd; uint16 dircount; uint32 nextdir32; poffa=(tmsize_t)poff; poffb=poffa+sizeof(uint16); if (((uint64)poffa!=poff)||(poffbtif->tif_size)) { TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory count"); return(0); } _TIFFmemcpy(&dircount,tif->tif_base+poffa,sizeof(uint16)); if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort(&dircount); poffc=poffb+dircount*12; poffd=poffc+sizeof(uint32); if ((poffctif->tif_size)) { TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory link"); return(0); } if (off!=NULL) *off=(uint64)poffc; _TIFFmemcpy(&nextdir32,tif->tif_base+poffc,sizeof(uint32)); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&nextdir32); *nextdir=nextdir32; } else { tmsize_t poffa,poffb,poffc,poffd; uint64 dircount64; uint16 dircount16; poffa=(tmsize_t)poff; poffb=poffa+sizeof(uint64); if (((uint64)poffa!=poff)||(poffbtif->tif_size)) { TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory count"); return(0); } _TIFFmemcpy(&dircount64,tif->tif_base+poffa,sizeof(uint64)); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8(&dircount64); if (dircount64>0xFFFF) { TIFFErrorExt(tif->tif_clientdata,module,"Sanity check on directory count failed"); return(0); } dircount16=(uint16)dircount64; poffc=poffb+dircount16*20; poffd=poffc+sizeof(uint64); if ((poffctif->tif_size)) { TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory link"); return(0); } if (off!=NULL) *off=(uint64)poffc; _TIFFmemcpy(nextdir,tif->tif_base+poffc,sizeof(uint64)); if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8(nextdir); } return(1); } else { if (!(tif->tif_flags&TIFF_BIGTIFF)) { uint16 dircount; uint32 nextdir32; if (!SeekOK(tif, *nextdir) || !ReadOK(tif, &dircount, sizeof (uint16))) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory count", tif->tif_name); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); if (off != NULL) *off = TIFFSeekFile(tif, dircount*12, SEEK_CUR); else (void) TIFFSeekFile(tif, dircount*12, SEEK_CUR); if (!ReadOK(tif, &nextdir32, sizeof (uint32))) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory link", tif->tif_name); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&nextdir32); *nextdir=nextdir32; } else { uint64 dircount64; uint16 dircount16; if (!SeekOK(tif, *nextdir) || !ReadOK(tif, &dircount64, sizeof (uint64))) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory count", tif->tif_name); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong8(&dircount64); if (dircount64>0xFFFF) { TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory count"); return(0); } dircount16 = (uint16)dircount64; if (off != NULL) *off = TIFFSeekFile(tif, dircount16*20, SEEK_CUR); else (void) TIFFSeekFile(tif, dircount16*20, SEEK_CUR); if (!ReadOK(tif, nextdir, sizeof (uint64))) { TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory link", tif->tif_name); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong8(nextdir); } return (1); } } /* * Count the number of directories in a file. */ uint16 TIFFNumberOfDirectories(TIFF* tif) { uint64 nextdir; uint16 n; if (!(tif->tif_flags&TIFF_BIGTIFF)) nextdir = tif->tif_header.classic.tiff_diroff; else nextdir = tif->tif_header.big.tiff_diroff; n = 0; while (nextdir != 0 && TIFFAdvanceDirectory(tif, &nextdir, NULL)) n++; return (n); } /* * Set the n-th directory as the current directory. * NB: Directories are numbered starting at 0. */ int TIFFSetDirectory(TIFF* tif, uint16 dirn) { uint64 nextdir; uint16 n; if (!(tif->tif_flags&TIFF_BIGTIFF)) nextdir = tif->tif_header.classic.tiff_diroff; else nextdir = tif->tif_header.big.tiff_diroff; for (n = dirn; n > 0 && nextdir != 0; n--) if (!TIFFAdvanceDirectory(tif, &nextdir, NULL)) return (0); tif->tif_nextdiroff = nextdir; /* * Set curdir to the actual directory index. The * -1 is because TIFFReadDirectory will increment * tif_curdir after successfully reading the directory. */ tif->tif_curdir = (dirn - n) - 1; /* * Reset tif_dirnumber counter and start new list of seen directories. * We need this to prevent IFD loops. */ tif->tif_dirnumber = 0; return (TIFFReadDirectory(tif)); } /* * Set the current directory to be the directory * located at the specified file offset. This interface * is used mainly to access directories linked with * the SubIFD tag (e.g. thumbnail images). */ int TIFFSetSubDirectory(TIFF* tif, uint64 diroff) { tif->tif_nextdiroff = diroff; /* * Reset tif_dirnumber counter and start new list of seen directories. * We need this to prevent IFD loops. */ tif->tif_dirnumber = 0; return (TIFFReadDirectory(tif)); } /* * Return file offset of the current directory. */ uint64 TIFFCurrentDirOffset(TIFF* tif) { return (tif->tif_diroff); } /* * Return an indication of whether or not we are * at the last directory in the file. */ int TIFFLastDirectory(TIFF* tif) { return (tif->tif_nextdiroff == 0); } /* * Unlink the specified directory from the directory chain. */ int TIFFUnlinkDirectory(TIFF* tif, uint16 dirn) { static const char module[] = "TIFFUnlinkDirectory"; uint64 nextdir; uint64 off; uint16 n; if (tif->tif_mode == O_RDONLY) { TIFFErrorExt(tif->tif_clientdata, module, "Can not unlink directory in read-only file"); return (0); } /* * Go to the directory before the one we want * to unlink and nab the offset of the link * field we'll need to patch. */ if (!(tif->tif_flags&TIFF_BIGTIFF)) { nextdir = tif->tif_header.classic.tiff_diroff; off = 4; } else { nextdir = tif->tif_header.big.tiff_diroff; off = 8; } for (n = dirn-1; n > 0; n--) { if (nextdir == 0) { TIFFErrorExt(tif->tif_clientdata, module, "Directory %d does not exist", dirn); return (0); } if (!TIFFAdvanceDirectory(tif, &nextdir, &off)) return (0); } /* * Advance to the directory to be unlinked and fetch * the offset of the directory that follows. */ if (!TIFFAdvanceDirectory(tif, &nextdir, NULL)) return (0); /* * Go back and patch the link field of the preceding * directory to point to the offset of the directory * that follows. */ (void) TIFFSeekFile(tif, off, SEEK_SET); if (!(tif->tif_flags&TIFF_BIGTIFF)) { uint32 nextdir32; nextdir32=(uint32)nextdir; assert((uint64)nextdir32==nextdir); if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&nextdir32); if (!WriteOK(tif, &nextdir32, sizeof (uint32))) { TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link"); return (0); } } else { if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong8(&nextdir); if (!WriteOK(tif, &nextdir, sizeof (uint64))) { TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link"); return (0); } } /* * Leave directory state setup safely. We don't have * facilities for doing inserting and removing directories, * so it's safest to just invalidate everything. This * means that the caller can only append to the directory * chain. */ (*tif->tif_cleanup)(tif); if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) { _TIFFfree(tif->tif_rawdata); tif->tif_rawdata = NULL; tif->tif_rawcc = 0; tif->tif_rawdataoff = 0; tif->tif_rawdataloaded = 0; } tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP|TIFF_POSTENCODE|TIFF_BUF4WRITE); TIFFFreeDirectory(tif); TIFFDefaultDirectory(tif); tif->tif_diroff = 0; /* force link on next write */ tif->tif_nextdiroff = 0; /* next write must be at end */ tif->tif_curoff = 0; tif->tif_row = (uint32) -1; tif->tif_curstrip = (uint32) -1; return (1); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_swab.c0000644000212300117540000002214211345765561012766 00000000000000/* $Id: tif_swab.c,v 1.13 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library Bit & Byte Swapping Support. * * XXX We assume short = 16-bits and long = 32-bits XXX */ #include "tiffiop.h" #ifndef TIFFSwabShort void TIFFSwabShort(uint16* wp) { register unsigned char* cp = (unsigned char*) wp; unsigned char t; assert(sizeof(uint16)==2); t = cp[1]; cp[1] = cp[0]; cp[0] = t; } #endif #ifndef TIFFSwabLong void TIFFSwabLong(uint32* lp) { register unsigned char* cp = (unsigned char*) lp; unsigned char t; assert(sizeof(uint32)==4); t = cp[3]; cp[3] = cp[0]; cp[0] = t; t = cp[2]; cp[2] = cp[1]; cp[1] = t; } #endif #ifndef TIFFSwabLong8 void TIFFSwabLong8(uint64* lp) { register unsigned char* cp = (unsigned char*) lp; unsigned char t; assert(sizeof(uint64)==8); t = cp[7]; cp[7] = cp[0]; cp[0] = t; t = cp[6]; cp[6] = cp[1]; cp[1] = t; t = cp[5]; cp[5] = cp[2]; cp[2] = t; t = cp[4]; cp[4] = cp[3]; cp[3] = t; } #endif #ifndef TIFFSwabArrayOfShort void TIFFSwabArrayOfShort(register uint16* wp, tmsize_t n) { register unsigned char* cp; register unsigned char t; assert(sizeof(uint16)==2); /* XXX unroll loop some */ while (n-- > 0) { cp = (unsigned char*) wp; t = cp[1]; cp[1] = cp[0]; cp[0] = t; wp++; } } #endif #ifndef TIFFSwabArrayOfTriples void TIFFSwabArrayOfTriples(register uint8* tp, tmsize_t n) { unsigned char* cp; unsigned char t; /* XXX unroll loop some */ while (n-- > 0) { cp = (unsigned char*) tp; t = cp[2]; cp[2] = cp[0]; cp[0] = t; tp += 3; } } #endif #ifndef TIFFSwabArrayOfLong void TIFFSwabArrayOfLong(register uint32* lp, tmsize_t n) { register unsigned char *cp; register unsigned char t; assert(sizeof(uint32)==4); /* XXX unroll loop some */ while (n-- > 0) { cp = (unsigned char *)lp; t = cp[3]; cp[3] = cp[0]; cp[0] = t; t = cp[2]; cp[2] = cp[1]; cp[1] = t; lp++; } } #endif #ifndef TIFFSwabArrayOfLong8 void TIFFSwabArrayOfLong8(register uint64* lp, tmsize_t n) { register unsigned char *cp; register unsigned char t; assert(sizeof(uint64)==8); /* XXX unroll loop some */ while (n-- > 0) { cp = (unsigned char *)lp; t = cp[7]; cp[7] = cp[0]; cp[0] = t; t = cp[6]; cp[6] = cp[1]; cp[1] = t; t = cp[5]; cp[5] = cp[2]; cp[2] = t; t = cp[4]; cp[4] = cp[3]; cp[3] = t; lp++; } } #endif #ifndef TIFFSwabFloat void TIFFSwabFloat(float* fp) { register unsigned char* cp = (unsigned char*) fp; unsigned char t; assert(sizeof(float)==4); t = cp[3]; cp[3] = cp[0]; cp[0] = t; t = cp[2]; cp[2] = cp[1]; cp[1] = t; } #endif #ifndef TIFFSwabArrayOfFloat void TIFFSwabArrayOfFloat(register float* fp, tmsize_t n) { register unsigned char *cp; register unsigned char t; assert(sizeof(float)==4); /* XXX unroll loop some */ while (n-- > 0) { cp = (unsigned char *)fp; t = cp[3]; cp[3] = cp[0]; cp[0] = t; t = cp[2]; cp[2] = cp[1]; cp[1] = t; fp++; } } #endif #ifndef TIFFSwabDouble void TIFFSwabDouble(double *dp) { register unsigned char* cp = (unsigned char*) dp; unsigned char t; assert(sizeof(double)==8); t = cp[7]; cp[7] = cp[0]; cp[0] = t; t = cp[6]; cp[6] = cp[1]; cp[1] = t; t = cp[5]; cp[5] = cp[2]; cp[2] = t; t = cp[4]; cp[4] = cp[3]; cp[3] = t; } #endif #ifndef TIFFSwabArrayOfDouble void TIFFSwabArrayOfDouble(double* dp, tmsize_t n) { register unsigned char *cp; register unsigned char t; assert(sizeof(double)==8); /* XXX unroll loop some */ while (n-- > 0) { cp = (unsigned char *)dp; t = cp[7]; cp[7] = cp[0]; cp[0] = t; t = cp[6]; cp[6] = cp[1]; cp[1] = t; t = cp[5]; cp[5] = cp[2]; cp[2] = t; t = cp[4]; cp[4] = cp[3]; cp[3] = t; dp++; } } #endif /* * Bit reversal tables. TIFFBitRevTable[] gives * the bit reversed value of . Used in various * places in the library when the FillOrder requires * bit reversal of byte values (e.g. CCITT Fax 3 * encoding/decoding). TIFFNoBitRevTable is provided * for algorithms that want an equivalent table that * do not reverse bit values. */ static const unsigned char TIFFBitRevTable[256] = { 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff }; static const unsigned char TIFFNoBitRevTable[256] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, }; const unsigned char* TIFFGetBitRevTable(int reversed) { return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable); } void TIFFReverseBits(uint8* cp, tmsize_t n) { for (; n > 8; n -= 8) { cp[0] = TIFFBitRevTable[cp[0]]; cp[1] = TIFFBitRevTable[cp[1]]; cp[2] = TIFFBitRevTable[cp[2]]; cp[3] = TIFFBitRevTable[cp[3]]; cp[4] = TIFFBitRevTable[cp[4]]; cp[5] = TIFFBitRevTable[cp[5]]; cp[6] = TIFFBitRevTable[cp[6]]; cp[7] = TIFFBitRevTable[cp[7]]; cp += 8; } while (n-- > 0) *cp = TIFFBitRevTable[*cp], cp++; } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/uvcode.h0000644000212300117540000001300311345765045012453 00000000000000/* Version 1.0 generated April 7, 1997 by Greg Ward Larson, SGI */ #define UV_SQSIZ (float)0.003500 #define UV_NDIVS 16289 #define UV_VSTART (float)0.016940 #define UV_NVS 163 static struct { float ustart; short nus, ncum; } uv_row[UV_NVS] = { { (float)0.247663, 4, 0 }, { (float)0.243779, 6, 4 }, { (float)0.241684, 7, 10 }, { (float)0.237874, 9, 17 }, { (float)0.235906, 10, 26 }, { (float)0.232153, 12, 36 }, { (float)0.228352, 14, 48 }, { (float)0.226259, 15, 62 }, { (float)0.222371, 17, 77 }, { (float)0.220410, 18, 94 }, { (float)0.214710, 21, 112 }, { (float)0.212714, 22, 133 }, { (float)0.210721, 23, 155 }, { (float)0.204976, 26, 178 }, { (float)0.202986, 27, 204 }, { (float)0.199245, 29, 231 }, { (float)0.195525, 31, 260 }, { (float)0.193560, 32, 291 }, { (float)0.189878, 34, 323 }, { (float)0.186216, 36, 357 }, { (float)0.186216, 36, 393 }, { (float)0.182592, 38, 429 }, { (float)0.179003, 40, 467 }, { (float)0.175466, 42, 507 }, { (float)0.172001, 44, 549 }, { (float)0.172001, 44, 593 }, { (float)0.168612, 46, 637 }, { (float)0.168612, 46, 683 }, { (float)0.163575, 49, 729 }, { (float)0.158642, 52, 778 }, { (float)0.158642, 52, 830 }, { (float)0.158642, 52, 882 }, { (float)0.153815, 55, 934 }, { (float)0.153815, 55, 989 }, { (float)0.149097, 58, 1044 }, { (float)0.149097, 58, 1102 }, { (float)0.142746, 62, 1160 }, { (float)0.142746, 62, 1222 }, { (float)0.142746, 62, 1284 }, { (float)0.138270, 65, 1346 }, { (float)0.138270, 65, 1411 }, { (float)0.138270, 65, 1476 }, { (float)0.132166, 69, 1541 }, { (float)0.132166, 69, 1610 }, { (float)0.126204, 73, 1679 }, { (float)0.126204, 73, 1752 }, { (float)0.126204, 73, 1825 }, { (float)0.120381, 77, 1898 }, { (float)0.120381, 77, 1975 }, { (float)0.120381, 77, 2052 }, { (float)0.120381, 77, 2129 }, { (float)0.112962, 82, 2206 }, { (float)0.112962, 82, 2288 }, { (float)0.112962, 82, 2370 }, { (float)0.107450, 86, 2452 }, { (float)0.107450, 86, 2538 }, { (float)0.107450, 86, 2624 }, { (float)0.107450, 86, 2710 }, { (float)0.100343, 91, 2796 }, { (float)0.100343, 91, 2887 }, { (float)0.100343, 91, 2978 }, { (float)0.095126, 95, 3069 }, { (float)0.095126, 95, 3164 }, { (float)0.095126, 95, 3259 }, { (float)0.095126, 95, 3354 }, { (float)0.088276, 100, 3449 }, { (float)0.088276, 100, 3549 }, { (float)0.088276, 100, 3649 }, { (float)0.088276, 100, 3749 }, { (float)0.081523, 105, 3849 }, { (float)0.081523, 105, 3954 }, { (float)0.081523, 105, 4059 }, { (float)0.081523, 105, 4164 }, { (float)0.074861, 110, 4269 }, { (float)0.074861, 110, 4379 }, { (float)0.074861, 110, 4489 }, { (float)0.074861, 110, 4599 }, { (float)0.068290, 115, 4709 }, { (float)0.068290, 115, 4824 }, { (float)0.068290, 115, 4939 }, { (float)0.068290, 115, 5054 }, { (float)0.063573, 119, 5169 }, { (float)0.063573, 119, 5288 }, { (float)0.063573, 119, 5407 }, { (float)0.063573, 119, 5526 }, { (float)0.057219, 124, 5645 }, { (float)0.057219, 124, 5769 }, { (float)0.057219, 124, 5893 }, { (float)0.057219, 124, 6017 }, { (float)0.050985, 129, 6141 }, { (float)0.050985, 129, 6270 }, { (float)0.050985, 129, 6399 }, { (float)0.050985, 129, 6528 }, { (float)0.050985, 129, 6657 }, { (float)0.044859, 134, 6786 }, { (float)0.044859, 134, 6920 }, { (float)0.044859, 134, 7054 }, { (float)0.044859, 134, 7188 }, { (float)0.040571, 138, 7322 }, { (float)0.040571, 138, 7460 }, { (float)0.040571, 138, 7598 }, { (float)0.040571, 138, 7736 }, { (float)0.036339, 142, 7874 }, { (float)0.036339, 142, 8016 }, { (float)0.036339, 142, 8158 }, { (float)0.036339, 142, 8300 }, { (float)0.032139, 146, 8442 }, { (float)0.032139, 146, 8588 }, { (float)0.032139, 146, 8734 }, { (float)0.032139, 146, 8880 }, { (float)0.027947, 150, 9026 }, { (float)0.027947, 150, 9176 }, { (float)0.027947, 150, 9326 }, { (float)0.023739, 154, 9476 }, { (float)0.023739, 154, 9630 }, { (float)0.023739, 154, 9784 }, { (float)0.023739, 154, 9938 }, { (float)0.019504, 158, 10092 }, { (float)0.019504, 158, 10250 }, { (float)0.019504, 158, 10408 }, { (float)0.016976, 161, 10566 }, { (float)0.016976, 161, 10727 }, { (float)0.016976, 161, 10888 }, { (float)0.016976, 161, 11049 }, { (float)0.012639, 165, 11210 }, { (float)0.012639, 165, 11375 }, { (float)0.012639, 165, 11540 }, { (float)0.009991, 168, 11705 }, { (float)0.009991, 168, 11873 }, { (float)0.009991, 168, 12041 }, { (float)0.009016, 170, 12209 }, { (float)0.009016, 170, 12379 }, { (float)0.009016, 170, 12549 }, { (float)0.006217, 173, 12719 }, { (float)0.006217, 173, 12892 }, { (float)0.005097, 175, 13065 }, { (float)0.005097, 175, 13240 }, { (float)0.005097, 175, 13415 }, { (float)0.003909, 177, 13590 }, { (float)0.003909, 177, 13767 }, { (float)0.002340, 177, 13944 }, { (float)0.002389, 170, 14121 }, { (float)0.001068, 164, 14291 }, { (float)0.001653, 157, 14455 }, { (float)0.000717, 150, 14612 }, { (float)0.001614, 143, 14762 }, { (float)0.000270, 136, 14905 }, { (float)0.000484, 129, 15041 }, { (float)0.001103, 123, 15170 }, { (float)0.001242, 115, 15293 }, { (float)0.001188, 109, 15408 }, { (float)0.001011, 103, 15517 }, { (float)0.000709, 97, 15620 }, { (float)0.000301, 89, 15717 }, { (float)0.002416, 82, 15806 }, { (float)0.003251, 76, 15888 }, { (float)0.003246, 69, 15964 }, { (float)0.004141, 62, 16033 }, { (float)0.005963, 55, 16095 }, { (float)0.008839, 47, 16150 }, { (float)0.010490, 40, 16197 }, { (float)0.016994, 31, 16237 }, { (float)0.023659, 21, 16268 }, }; /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_config.h-vms0000644000212300117540000000230510422164716014074 00000000000000/* Define to 1 if you have the header file. */ #define HAVE_ASSERT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define as 0 or 1 according to the floating point format suported by the machine */ #define HAVE_IEEEFP 1 #define HAVE_UNISTD_H 1 #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ //#define HAVE_IO_H 1 /* Define to 1 if you have the header file. */ //#define HAVE_SEARCH_H 1 /* The size of a `int', as computed by sizeof. */ #define SIZEOF_INT 4 /* The size of a `long', as computed by sizeof. */ #define SIZEOF_LONG 4 /* Set the native cpu bit order */ #define HOST_FILLORDER FILLORDER_LSB2MSB /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ /* #undef WORDS_BIGENDIAN */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ /* #ifndef __cplusplus # ifndef inline # define inline __inline # endif #endif */ // #define lfind _lfind tiff-4.0.3/libtiff/tif_color.c0000644000212300117540000002122111501676264013140 00000000000000/* $Id: tif_color.c,v 1.19 2010-12-14 02:22:42 faxguy Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * CIE L*a*b* to CIE XYZ and CIE XYZ to RGB conversion routines are taken * from the VIPS library (http://www.vips.ecs.soton.ac.uk) with * the permission of John Cupitt, the VIPS author. */ /* * TIFF Library. * * Color space conversion routines. */ #include "tiffiop.h" #include /* * Convert color value from the CIE L*a*b* 1976 space to CIE XYZ. */ void TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32 l, int32 a, int32 b, float *X, float *Y, float *Z) { float L = (float)l * 100.0F / 255.0F; float cby, tmp; if( L < 8.856F ) { *Y = (L * cielab->Y0) / 903.292F; cby = 7.787F * (*Y / cielab->Y0) + 16.0F / 116.0F; } else { cby = (L + 16.0F) / 116.0F; *Y = cielab->Y0 * cby * cby * cby; } tmp = (float)a / 500.0F + cby; if( tmp < 0.2069F ) *X = cielab->X0 * (tmp - 0.13793F) / 7.787F; else *X = cielab->X0 * tmp * tmp * tmp; tmp = cby - (float)b / 200.0F; if( tmp < 0.2069F ) *Z = cielab->Z0 * (tmp - 0.13793F) / 7.787F; else *Z = cielab->Z0 * tmp * tmp * tmp; } #define RINT(R) ((uint32)((R)>0?((R)+0.5):((R)-0.5))) /* * Convert color value from the XYZ space to RGB. */ void TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z, uint32 *r, uint32 *g, uint32 *b) { int i; float Yr, Yg, Yb; float *matrix = &cielab->display.d_mat[0][0]; /* Multiply through the matrix to get luminosity values. */ Yr = matrix[0] * X + matrix[1] * Y + matrix[2] * Z; Yg = matrix[3] * X + matrix[4] * Y + matrix[5] * Z; Yb = matrix[6] * X + matrix[7] * Y + matrix[8] * Z; /* Clip input */ Yr = TIFFmax(Yr, cielab->display.d_Y0R); Yg = TIFFmax(Yg, cielab->display.d_Y0G); Yb = TIFFmax(Yb, cielab->display.d_Y0B); /* Avoid overflow in case of wrong input values */ Yr = TIFFmin(Yr, cielab->display.d_YCR); Yg = TIFFmin(Yg, cielab->display.d_YCG); Yb = TIFFmin(Yb, cielab->display.d_YCB); /* Turn luminosity to colour value. */ i = (int)((Yr - cielab->display.d_Y0R) / cielab->rstep); i = TIFFmin(cielab->range, i); *r = RINT(cielab->Yr2r[i]); i = (int)((Yg - cielab->display.d_Y0G) / cielab->gstep); i = TIFFmin(cielab->range, i); *g = RINT(cielab->Yg2g[i]); i = (int)((Yb - cielab->display.d_Y0B) / cielab->bstep); i = TIFFmin(cielab->range, i); *b = RINT(cielab->Yb2b[i]); /* Clip output. */ *r = TIFFmin(*r, cielab->display.d_Vrwr); *g = TIFFmin(*g, cielab->display.d_Vrwg); *b = TIFFmin(*b, cielab->display.d_Vrwb); } #undef RINT /* * Allocate conversion state structures and make look_up tables for * the Yr,Yb,Yg <=> r,g,b conversions. */ int TIFFCIELabToRGBInit(TIFFCIELabToRGB* cielab, const TIFFDisplay *display, float *refWhite) { int i; double gamma; cielab->range = CIELABTORGB_TABLE_RANGE; _TIFFmemcpy(&cielab->display, display, sizeof(TIFFDisplay)); /* Red */ gamma = 1.0 / cielab->display.d_gammaR ; cielab->rstep = (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range; for(i = 0; i <= cielab->range; i++) { cielab->Yr2r[i] = cielab->display.d_Vrwr * ((float)pow((double)i / cielab->range, gamma)); } /* Green */ gamma = 1.0 / cielab->display.d_gammaG ; cielab->gstep = (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range; for(i = 0; i <= cielab->range; i++) { cielab->Yg2g[i] = cielab->display.d_Vrwg * ((float)pow((double)i / cielab->range, gamma)); } /* Blue */ gamma = 1.0 / cielab->display.d_gammaB ; cielab->bstep = (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range; for(i = 0; i <= cielab->range; i++) { cielab->Yb2b[i] = cielab->display.d_Vrwb * ((float)pow((double)i / cielab->range, gamma)); } /* Init reference white point */ cielab->X0 = refWhite[0]; cielab->Y0 = refWhite[1]; cielab->Z0 = refWhite[2]; return 0; } /* * Convert color value from the YCbCr space to CIE XYZ. * The colorspace conversion algorithm comes from the IJG v5a code; * see below for more information on how it works. */ #define SHIFT 16 #define FIX(x) ((int32)((x) * (1L<(max)?(max):(f)) #define HICLAMP(f,max) ((f)>(max)?(max):(f)) void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32 Y, int32 Cb, int32 Cr, uint32 *r, uint32 *g, uint32 *b) { int32 i; /* XXX: Only 8-bit YCbCr input supported for now */ Y = HICLAMP(Y, 255), Cb = CLAMP(Cb, 0, 255), Cr = CLAMP(Cr, 0, 255); i = ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr]; *r = CLAMP(i, 0, 255); i = ycbcr->Y_tab[Y] + (int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT); *g = CLAMP(i, 0, 255); i = ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb]; *b = CLAMP(i, 0, 255); } /* * Initialize the YCbCr->RGB conversion tables. The conversion * is done according to the 6.0 spec: * * R = Y + Cr*(2 - 2*LumaRed) * B = Y + Cb*(2 - 2*LumaBlue) * G = Y * - LumaBlue*Cb*(2-2*LumaBlue)/LumaGreen * - LumaRed*Cr*(2-2*LumaRed)/LumaGreen * * To avoid floating point arithmetic the fractional constants that * come out of the equations are represented as fixed point values * in the range 0...2^16. We also eliminate multiplications by * pre-calculating possible values indexed by Cb and Cr (this code * assumes conversion is being done for 8-bit samples). */ int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite) { TIFFRGBValue* clamptab; int i; #define LumaRed luma[0] #define LumaGreen luma[1] #define LumaBlue luma[2] clamptab = (TIFFRGBValue*)( (uint8*) ycbcr+TIFFroundup_32(sizeof (TIFFYCbCrToRGB), sizeof (long))); _TIFFmemset(clamptab, 0, 256); /* v < 0 => 0 */ ycbcr->clamptab = (clamptab += 256); for (i = 0; i < 256; i++) clamptab[i] = (TIFFRGBValue) i; _TIFFmemset(clamptab+256, 255, 2*256); /* v > 255 => 255 */ ycbcr->Cr_r_tab = (int*) (clamptab + 3*256); ycbcr->Cb_b_tab = ycbcr->Cr_r_tab + 256; ycbcr->Cr_g_tab = (int32*) (ycbcr->Cb_b_tab + 256); ycbcr->Cb_g_tab = ycbcr->Cr_g_tab + 256; ycbcr->Y_tab = ycbcr->Cb_g_tab + 256; { float f1 = 2-2*LumaRed; int32 D1 = FIX(f1); float f2 = LumaRed*f1/LumaGreen; int32 D2 = -FIX(f2); float f3 = 2-2*LumaBlue; int32 D3 = FIX(f3); float f4 = LumaBlue*f3/LumaGreen; int32 D4 = -FIX(f4); int x; #undef LumaBlue #undef LumaGreen #undef LumaRed /* * i is the actual input pixel value in the range 0..255 * Cb and Cr values are in the range -128..127 (actually * they are in a range defined by the ReferenceBlackWhite * tag) so there is some range shifting to do here when * constructing tables indexed by the raw pixel data. */ for (i = 0, x = -128; i < 256; i++, x++) { int32 Cr = (int32)Code2V(x, refBlackWhite[4] - 128.0F, refBlackWhite[5] - 128.0F, 127); int32 Cb = (int32)Code2V(x, refBlackWhite[2] - 128.0F, refBlackWhite[3] - 128.0F, 127); ycbcr->Cr_r_tab[i] = (int32)((D1*Cr + ONE_HALF)>>SHIFT); ycbcr->Cb_b_tab[i] = (int32)((D3*Cb + ONE_HALF)>>SHIFT); ycbcr->Cr_g_tab[i] = D2*Cr; ycbcr->Cb_g_tab[i] = D4*Cb + ONE_HALF; ycbcr->Y_tab[i] = (int32)Code2V(x + 128, refBlackWhite[0], refBlackWhite[1], 255); } } return 0; } #undef HICLAMP #undef CLAMP #undef Code2V #undef SHIFT #undef ONE_HALF #undef FIX /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_win32.c0000644000212300117540000002424211674661755013004 00000000000000/* $Id: tif_win32.c,v 1.39 2011-12-22 17:07:57 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library Win32-specific Routines. Adapted from tif_unix.c 4/5/95 by * Scott Wagner (wagner@itek.com), Itek Graphix, Rochester, NY USA */ #include "tiffiop.h" #include static tmsize_t _tiffReadProc(thandle_t fd, void* buf, tmsize_t size) { /* tmsize_t is 64bit on 64bit systems, but the WinAPI ReadFile takes * 32bit sizes, so we loop through the data in suitable 32bit sized * chunks */ uint8* ma; uint64 mb; DWORD n; DWORD o; tmsize_t p; ma=(uint8*)buf; mb=size; p=0; while (mb>0) { n=0x80000000UL; if ((uint64)n>mb) n=(DWORD)mb; if (!ReadFile(fd,(LPVOID)ma,n,&o,NULL)) return(0); ma+=o; mb-=o; p+=o; if (o!=n) break; } return(p); } static tmsize_t _tiffWriteProc(thandle_t fd, void* buf, tmsize_t size) { /* tmsize_t is 64bit on 64bit systems, but the WinAPI WriteFile takes * 32bit sizes, so we loop through the data in suitable 32bit sized * chunks */ uint8* ma; uint64 mb; DWORD n; DWORD o; tmsize_t p; ma=(uint8*)buf; mb=size; p=0; while (mb>0) { n=0x80000000UL; if ((uint64)n>mb) n=(DWORD)mb; if (!WriteFile(fd,(LPVOID)ma,n,&o,NULL)) return(0); ma+=o; mb-=o; p+=o; if (o!=n) break; } return(p); } static uint64 _tiffSeekProc(thandle_t fd, uint64 off, int whence) { LARGE_INTEGER offli; DWORD dwMoveMethod; offli.QuadPart = off; switch(whence) { case SEEK_SET: dwMoveMethod = FILE_BEGIN; break; case SEEK_CUR: dwMoveMethod = FILE_CURRENT; break; case SEEK_END: dwMoveMethod = FILE_END; break; default: dwMoveMethod = FILE_BEGIN; break; } offli.LowPart=SetFilePointer(fd,offli.LowPart,&offli.HighPart,dwMoveMethod); if ((offli.LowPart==INVALID_SET_FILE_POINTER)&&(GetLastError()!=NO_ERROR)) offli.QuadPart=0; return(offli.QuadPart); } static int _tiffCloseProc(thandle_t fd) { return (CloseHandle(fd) ? 0 : -1); } static uint64 _tiffSizeProc(thandle_t fd) { ULARGE_INTEGER m; m.LowPart=GetFileSize(fd,&m.HighPart); return(m.QuadPart); } static int _tiffDummyMapProc(thandle_t fd, void** pbase, toff_t* psize) { (void) fd; (void) pbase; (void) psize; return (0); } /* * From "Hermann Josef Hill" : * * Windows uses both a handle and a pointer for file mapping, * but according to the SDK documentation and Richter's book * "Advanced Windows Programming" it is safe to free the handle * after obtaining the file mapping pointer * * This removes a nasty OS dependency and cures a problem * with Visual C++ 5.0 */ static int _tiffMapProc(thandle_t fd, void** pbase, toff_t* psize) { uint64 size; tmsize_t sizem; HANDLE hMapFile; size = _tiffSizeProc(fd); sizem = (tmsize_t)size; if ((uint64)sizem!=size) return (0); /* By passing in 0 for the maximum file size, it specifies that we create a file mapping object for the full file size. */ hMapFile = CreateFileMapping(fd, NULL, PAGE_READONLY, 0, 0, NULL); if (hMapFile == NULL) return (0); *pbase = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0); CloseHandle(hMapFile); if (*pbase == NULL) return (0); *psize = size; return(1); } static void _tiffDummyUnmapProc(thandle_t fd, void* base, toff_t size) { (void) fd; (void) base; (void) size; } static void _tiffUnmapProc(thandle_t fd, void* base, toff_t size) { (void) fd; (void) size; UnmapViewOfFile(base); } /* * Open a TIFF file descriptor for read/writing. * Note that TIFFFdOpen and TIFFOpen recognise the character 'u' in the mode * string, which forces the file to be opened unmapped. */ TIFF* TIFFFdOpen(int ifd, const char* name, const char* mode) { TIFF* tif; int fSuppressMap; int m; fSuppressMap=0; for (m=0; mode[m]!=0; m++) { if (mode[m]=='u') { fSuppressMap=1; break; } } tif = TIFFClientOpen(name, mode, (thandle_t)ifd, _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, fSuppressMap ? _tiffDummyMapProc : _tiffMapProc, fSuppressMap ? _tiffDummyUnmapProc : _tiffUnmapProc); if (tif) tif->tif_fd = ifd; return (tif); } #ifndef _WIN32_WCE /* * Open a TIFF file for read/writing. */ TIFF* TIFFOpen(const char* name, const char* mode) { static const char module[] = "TIFFOpen"; thandle_t fd; int m; DWORD dwMode; TIFF* tif; m = _TIFFgetMode(mode, module); switch(m) { case O_RDONLY: dwMode = OPEN_EXISTING; break; case O_RDWR: dwMode = OPEN_ALWAYS; break; case O_RDWR|O_CREAT: dwMode = OPEN_ALWAYS; break; case O_RDWR|O_TRUNC: dwMode = CREATE_ALWAYS; break; case O_RDWR|O_CREAT|O_TRUNC: dwMode = CREATE_ALWAYS; break; default: return ((TIFF*)0); } fd = (thandle_t)CreateFileA(name, (m == O_RDONLY)?GENERIC_READ:(GENERIC_READ | GENERIC_WRITE), FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode, (m == O_RDONLY)?FILE_ATTRIBUTE_READONLY:FILE_ATTRIBUTE_NORMAL, NULL); if (fd == INVALID_HANDLE_VALUE) { TIFFErrorExt(0, module, "%s: Cannot open", name); return ((TIFF *)0); } tif = TIFFFdOpen((int)fd, name, mode); if(!tif) CloseHandle(fd); return tif; } /* * Open a TIFF file with a Unicode filename, for read/writing. */ TIFF* TIFFOpenW(const wchar_t* name, const char* mode) { static const char module[] = "TIFFOpenW"; thandle_t fd; int m; DWORD dwMode; int mbsize; char *mbname; TIFF *tif; m = _TIFFgetMode(mode, module); switch(m) { case O_RDONLY: dwMode = OPEN_EXISTING; break; case O_RDWR: dwMode = OPEN_ALWAYS; break; case O_RDWR|O_CREAT: dwMode = OPEN_ALWAYS; break; case O_RDWR|O_TRUNC: dwMode = CREATE_ALWAYS; break; case O_RDWR|O_CREAT|O_TRUNC: dwMode = CREATE_ALWAYS; break; default: return ((TIFF*)0); } fd = (thandle_t)CreateFileW(name, (m == O_RDONLY)?GENERIC_READ:(GENERIC_READ|GENERIC_WRITE), FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode, (m == O_RDONLY)?FILE_ATTRIBUTE_READONLY:FILE_ATTRIBUTE_NORMAL, NULL); if (fd == INVALID_HANDLE_VALUE) { TIFFErrorExt(0, module, "%S: Cannot open", name); return ((TIFF *)0); } mbname = NULL; mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL); if (mbsize > 0) { mbname = (char *)_TIFFmalloc(mbsize); if (!mbname) { TIFFErrorExt(0, module, "Can't allocate space for filename conversion buffer"); return ((TIFF*)0); } WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize, NULL, NULL); } tif = TIFFFdOpen((int)fd, (mbname != NULL) ? mbname : "", mode); if(!tif) CloseHandle(fd); _TIFFfree(mbname); return tif; } #endif /* ndef _WIN32_WCE */ void* _TIFFmalloc(tmsize_t s) { return (malloc((size_t) s)); } void _TIFFfree(void* p) { free(p); } void* _TIFFrealloc(void* p, tmsize_t s) { return (realloc(p, (size_t) s)); } void _TIFFmemset(void* p, int v, tmsize_t c) { memset(p, v, (size_t) c); } void _TIFFmemcpy(void* d, const void* s, tmsize_t c) { memcpy(d, s, (size_t) c); } int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c) { return (memcmp(p1, p2, (size_t) c)); } #ifndef _WIN32_WCE #if (_MSC_VER < 1500) # define vsnprintf _vsnprintf #endif static void Win32WarningHandler(const char* module, const char* fmt, va_list ap) { #ifndef TIF_PLATFORM_CONSOLE LPTSTR szTitle; LPTSTR szTmp; LPCTSTR szTitleText = "%s Warning"; LPCTSTR szDefaultModule = "LIBTIFF"; LPCTSTR szTmpModule = (module == NULL) ? szDefaultModule : module; SIZE_T nBufSize = (strlen(szTmpModule) + strlen(szTitleText) + strlen(fmt) + 256)*sizeof(char); if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, nBufSize)) == NULL) return; sprintf(szTitle, szTitleText, szTmpModule); szTmp = szTitle + (strlen(szTitle)+2)*sizeof(char); vsnprintf(szTmp, nBufSize-(strlen(szTitle)+2)*sizeof(char), fmt, ap); MessageBoxA(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONINFORMATION); LocalFree(szTitle); return; #else if (module != NULL) fprintf(stderr, "%s: ", module); fprintf(stderr, "Warning, "); vfprintf(stderr, fmt, ap); fprintf(stderr, ".\n"); #endif } TIFFErrorHandler _TIFFwarningHandler = Win32WarningHandler; static void Win32ErrorHandler(const char* module, const char* fmt, va_list ap) { #ifndef TIF_PLATFORM_CONSOLE LPTSTR szTitle; LPTSTR szTmp; LPCTSTR szTitleText = "%s Error"; LPCTSTR szDefaultModule = "LIBTIFF"; LPCTSTR szTmpModule = (module == NULL) ? szDefaultModule : module; SIZE_T nBufSize = (strlen(szTmpModule) + strlen(szTitleText) + strlen(fmt) + 256)*sizeof(char); if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, nBufSize)) == NULL) return; sprintf(szTitle, szTitleText, szTmpModule); szTmp = szTitle + (strlen(szTitle)+2)*sizeof(char); vsnprintf(szTmp, nBufSize-(strlen(szTitle)+2)*sizeof(char), fmt, ap); MessageBoxA(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONEXCLAMATION); LocalFree(szTitle); return; #else if (module != NULL) fprintf(stderr, "%s: ", module); vfprintf(stderr, fmt, ap); fprintf(stderr, ".\n"); #endif } TIFFErrorHandler _TIFFerrorHandler = Win32ErrorHandler; #endif /* ndef _WIN32_WCE */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_dumpmode.c0000644000212300117540000000747511545706361013653 00000000000000/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dumpmode.c,v 1.14 2011-04-02 20:54:09 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * "Null" Compression Algorithm Support. */ #include "tiffiop.h" static int DumpFixupTags(TIFF* tif) { (void) tif; return (1); } /* * Encode a hunk of pixels. */ static int DumpModeEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s) { (void) s; while (cc > 0) { tmsize_t n; n = cc; if (tif->tif_rawcc + n > tif->tif_rawdatasize) n = tif->tif_rawdatasize - tif->tif_rawcc; assert( n > 0 ); /* * Avoid copy if client has setup raw * data buffer to avoid extra copy. */ if (tif->tif_rawcp != pp) _TIFFmemcpy(tif->tif_rawcp, pp, n); tif->tif_rawcp += n; tif->tif_rawcc += n; pp += n; cc -= n; if (tif->tif_rawcc >= tif->tif_rawdatasize && !TIFFFlushData1(tif)) return (-1); } return (1); } /* * Decode a hunk of pixels. */ static int DumpModeDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) { static const char module[] = "DumpModeDecode"; (void) s; if (tif->tif_rawcc < cc) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Not enough data for scanline %lu, expected a request for at most %I64d bytes, got a request for %I64d bytes", (unsigned long) tif->tif_row, (signed __int64) tif->tif_rawcc, (signed __int64) cc); #else TIFFErrorExt(tif->tif_clientdata, module, "Not enough data for scanline %lu, expected a request for at most %lld bytes, got a request for %lld bytes", (unsigned long) tif->tif_row, (signed long long) tif->tif_rawcc, (signed long long) cc); #endif return (0); } /* * Avoid copy if client has setup raw * data buffer to avoid extra copy. */ if (tif->tif_rawcp != buf) _TIFFmemcpy(buf, tif->tif_rawcp, cc); tif->tif_rawcp += cc; tif->tif_rawcc -= cc; return (1); } /* * Seek forwards nrows in the current strip. */ static int DumpModeSeek(TIFF* tif, uint32 nrows) { tif->tif_rawcp += nrows * tif->tif_scanlinesize; tif->tif_rawcc -= nrows * tif->tif_scanlinesize; return (1); } /* * Initialize dump mode. */ int TIFFInitDumpMode(TIFF* tif, int scheme) { (void) scheme; tif->tif_fixuptags = DumpFixupTags; tif->tif_decoderow = DumpModeDecode; tif->tif_decodestrip = DumpModeDecode; tif->tif_decodetile = DumpModeDecode; tif->tif_encoderow = DumpModeEncode; tif->tif_encodestrip = DumpModeEncode; tif->tif_encodetile = DumpModeEncode; tif->tif_seek = DumpModeSeek; return (1); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_getimage.c0000644000212300117540000022007611763656232013620 00000000000000/* $Id: tif_getimage.c,v 1.82 2012-06-06 00:17:49 fwarmerdam Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Read and return a packed RGBA image. */ #include "tiffiop.h" #include static int gtTileContig(TIFFRGBAImage*, uint32*, uint32, uint32); static int gtTileSeparate(TIFFRGBAImage*, uint32*, uint32, uint32); static int gtStripContig(TIFFRGBAImage*, uint32*, uint32, uint32); static int gtStripSeparate(TIFFRGBAImage*, uint32*, uint32, uint32); static int PickContigCase(TIFFRGBAImage*); static int PickSeparateCase(TIFFRGBAImage*); static int BuildMapUaToAa(TIFFRGBAImage* img); static int BuildMapBitdepth16To8(TIFFRGBAImage* img); static const char photoTag[] = "PhotometricInterpretation"; /* * Helper constants used in Orientation tag handling */ #define FLIP_VERTICALLY 0x01 #define FLIP_HORIZONTALLY 0x02 /* * Color conversion constants. We will define display types here. */ static const TIFFDisplay display_sRGB = { { /* XYZ -> luminance matrix */ { 3.2410F, -1.5374F, -0.4986F }, { -0.9692F, 1.8760F, 0.0416F }, { 0.0556F, -0.2040F, 1.0570F } }, 100.0F, 100.0F, 100.0F, /* Light o/p for reference white */ 255, 255, 255, /* Pixel values for ref. white */ 1.0F, 1.0F, 1.0F, /* Residual light o/p for black pixel */ 2.4F, 2.4F, 2.4F, /* Gamma values for the three guns */ }; /* * Check the image to see if TIFFReadRGBAImage can deal with it. * 1/0 is returned according to whether or not the image can * be handled. If 0 is returned, emsg contains the reason * why it is being rejected. */ int TIFFRGBAImageOK(TIFF* tif, char emsg[1024]) { TIFFDirectory* td = &tif->tif_dir; uint16 photometric; int colorchannels; if (!tif->tif_decodestatus) { sprintf(emsg, "Sorry, requested compression method is not configured"); return (0); } switch (td->td_bitspersample) { case 1: case 2: case 4: case 8: case 16: break; default: sprintf(emsg, "Sorry, can not handle images with %d-bit samples", td->td_bitspersample); return (0); } colorchannels = td->td_samplesperpixel - td->td_extrasamples; if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric)) { switch (colorchannels) { case 1: photometric = PHOTOMETRIC_MINISBLACK; break; case 3: photometric = PHOTOMETRIC_RGB; break; default: sprintf(emsg, "Missing needed %s tag", photoTag); return (0); } } switch (photometric) { case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: case PHOTOMETRIC_PALETTE: if (td->td_planarconfig == PLANARCONFIG_CONTIG && td->td_samplesperpixel != 1 && td->td_bitspersample < 8 ) { sprintf(emsg, "Sorry, can not handle contiguous data with %s=%d, " "and %s=%d and Bits/Sample=%d", photoTag, photometric, "Samples/pixel", td->td_samplesperpixel, td->td_bitspersample); return (0); } /* * We should likely validate that any extra samples are either * to be ignored, or are alpha, and if alpha we should try to use * them. But for now we won't bother with this. */ break; case PHOTOMETRIC_YCBCR: /* * TODO: if at all meaningful and useful, make more complete * support check here, or better still, refactor to let supporting * code decide whether there is support and what meaningfull * error to return */ break; case PHOTOMETRIC_RGB: if (colorchannels < 3) { sprintf(emsg, "Sorry, can not handle RGB image with %s=%d", "Color channels", colorchannels); return (0); } break; case PHOTOMETRIC_SEPARATED: { uint16 inkset; TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset); if (inkset != INKSET_CMYK) { sprintf(emsg, "Sorry, can not handle separated image with %s=%d", "InkSet", inkset); return 0; } if (td->td_samplesperpixel < 4) { sprintf(emsg, "Sorry, can not handle separated image with %s=%d", "Samples/pixel", td->td_samplesperpixel); return 0; } break; } case PHOTOMETRIC_LOGL: if (td->td_compression != COMPRESSION_SGILOG) { sprintf(emsg, "Sorry, LogL data must have %s=%d", "Compression", COMPRESSION_SGILOG); return (0); } break; case PHOTOMETRIC_LOGLUV: if (td->td_compression != COMPRESSION_SGILOG && td->td_compression != COMPRESSION_SGILOG24) { sprintf(emsg, "Sorry, LogLuv data must have %s=%d or %d", "Compression", COMPRESSION_SGILOG, COMPRESSION_SGILOG24); return (0); } if (td->td_planarconfig != PLANARCONFIG_CONTIG) { sprintf(emsg, "Sorry, can not handle LogLuv images with %s=%d", "Planarconfiguration", td->td_planarconfig); return (0); } break; case PHOTOMETRIC_CIELAB: break; default: sprintf(emsg, "Sorry, can not handle image with %s=%d", photoTag, photometric); return (0); } return (1); } void TIFFRGBAImageEnd(TIFFRGBAImage* img) { if (img->Map) _TIFFfree(img->Map), img->Map = NULL; if (img->BWmap) _TIFFfree(img->BWmap), img->BWmap = NULL; if (img->PALmap) _TIFFfree(img->PALmap), img->PALmap = NULL; if (img->ycbcr) _TIFFfree(img->ycbcr), img->ycbcr = NULL; if (img->cielab) _TIFFfree(img->cielab), img->cielab = NULL; if (img->UaToAa) _TIFFfree(img->UaToAa), img->UaToAa = NULL; if (img->Bitdepth16To8) _TIFFfree(img->Bitdepth16To8), img->Bitdepth16To8 = NULL; if( img->redcmap ) { _TIFFfree( img->redcmap ); _TIFFfree( img->greencmap ); _TIFFfree( img->bluecmap ); img->redcmap = img->greencmap = img->bluecmap = NULL; } } static int isCCITTCompression(TIFF* tif) { uint16 compress; TIFFGetField(tif, TIFFTAG_COMPRESSION, &compress); return (compress == COMPRESSION_CCITTFAX3 || compress == COMPRESSION_CCITTFAX4 || compress == COMPRESSION_CCITTRLE || compress == COMPRESSION_CCITTRLEW); } int TIFFRGBAImageBegin(TIFFRGBAImage* img, TIFF* tif, int stop, char emsg[1024]) { uint16* sampleinfo; uint16 extrasamples; uint16 planarconfig; uint16 compress; int colorchannels; uint16 *red_orig, *green_orig, *blue_orig; int n_color; /* Initialize to normal values */ img->row_offset = 0; img->col_offset = 0; img->redcmap = NULL; img->greencmap = NULL; img->bluecmap = NULL; img->req_orientation = ORIENTATION_BOTLEFT; /* It is the default */ img->tif = tif; img->stoponerr = stop; TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &img->bitspersample); switch (img->bitspersample) { case 1: case 2: case 4: case 8: case 16: break; default: sprintf(emsg, "Sorry, can not handle images with %d-bit samples", img->bitspersample); goto fail_return; } img->alpha = 0; TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &img->samplesperpixel); TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, &extrasamples, &sampleinfo); if (extrasamples >= 1) { switch (sampleinfo[0]) { case EXTRASAMPLE_UNSPECIFIED: /* Workaround for some images without */ if (img->samplesperpixel > 3) /* correct info about alpha channel */ img->alpha = EXTRASAMPLE_ASSOCALPHA; break; case EXTRASAMPLE_ASSOCALPHA: /* data is pre-multiplied */ case EXTRASAMPLE_UNASSALPHA: /* data is not pre-multiplied */ img->alpha = sampleinfo[0]; break; } } #ifdef DEFAULT_EXTRASAMPLE_AS_ALPHA if( !TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric)) img->photometric = PHOTOMETRIC_MINISWHITE; if( extrasamples == 0 && img->samplesperpixel == 4 && img->photometric == PHOTOMETRIC_RGB ) { img->alpha = EXTRASAMPLE_ASSOCALPHA; extrasamples = 1; } #endif colorchannels = img->samplesperpixel - extrasamples; TIFFGetFieldDefaulted(tif, TIFFTAG_COMPRESSION, &compress); TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planarconfig); if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric)) { switch (colorchannels) { case 1: if (isCCITTCompression(tif)) img->photometric = PHOTOMETRIC_MINISWHITE; else img->photometric = PHOTOMETRIC_MINISBLACK; break; case 3: img->photometric = PHOTOMETRIC_RGB; break; default: sprintf(emsg, "Missing needed %s tag", photoTag); goto fail_return; } } switch (img->photometric) { case PHOTOMETRIC_PALETTE: if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &red_orig, &green_orig, &blue_orig)) { sprintf(emsg, "Missing required \"Colormap\" tag"); goto fail_return; } /* copy the colormaps so we can modify them */ n_color = (1L << img->bitspersample); img->redcmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color); img->greencmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color); img->bluecmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color); if( !img->redcmap || !img->greencmap || !img->bluecmap ) { sprintf(emsg, "Out of memory for colormap copy"); goto fail_return; } _TIFFmemcpy( img->redcmap, red_orig, n_color * 2 ); _TIFFmemcpy( img->greencmap, green_orig, n_color * 2 ); _TIFFmemcpy( img->bluecmap, blue_orig, n_color * 2 ); /* fall thru... */ case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: if (planarconfig == PLANARCONFIG_CONTIG && img->samplesperpixel != 1 && img->bitspersample < 8 ) { sprintf(emsg, "Sorry, can not handle contiguous data with %s=%d, " "and %s=%d and Bits/Sample=%d", photoTag, img->photometric, "Samples/pixel", img->samplesperpixel, img->bitspersample); goto fail_return; } break; case PHOTOMETRIC_YCBCR: /* It would probably be nice to have a reality check here. */ if (planarconfig == PLANARCONFIG_CONTIG) /* can rely on libjpeg to convert to RGB */ /* XXX should restore current state on exit */ switch (compress) { case COMPRESSION_JPEG: /* * TODO: when complete tests verify complete desubsampling * and YCbCr handling, remove use of TIFFTAG_JPEGCOLORMODE in * favor of tif_getimage.c native handling */ TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); img->photometric = PHOTOMETRIC_RGB; break; default: /* do nothing */; break; } /* * TODO: if at all meaningful and useful, make more complete * support check here, or better still, refactor to let supporting * code decide whether there is support and what meaningfull * error to return */ break; case PHOTOMETRIC_RGB: if (colorchannels < 3) { sprintf(emsg, "Sorry, can not handle RGB image with %s=%d", "Color channels", colorchannels); goto fail_return; } break; case PHOTOMETRIC_SEPARATED: { uint16 inkset; TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset); if (inkset != INKSET_CMYK) { sprintf(emsg, "Sorry, can not handle separated image with %s=%d", "InkSet", inkset); goto fail_return; } if (img->samplesperpixel < 4) { sprintf(emsg, "Sorry, can not handle separated image with %s=%d", "Samples/pixel", img->samplesperpixel); goto fail_return; } } break; case PHOTOMETRIC_LOGL: if (compress != COMPRESSION_SGILOG) { sprintf(emsg, "Sorry, LogL data must have %s=%d", "Compression", COMPRESSION_SGILOG); goto fail_return; } TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT); img->photometric = PHOTOMETRIC_MINISBLACK; /* little white lie */ img->bitspersample = 8; break; case PHOTOMETRIC_LOGLUV: if (compress != COMPRESSION_SGILOG && compress != COMPRESSION_SGILOG24) { sprintf(emsg, "Sorry, LogLuv data must have %s=%d or %d", "Compression", COMPRESSION_SGILOG, COMPRESSION_SGILOG24); goto fail_return; } if (planarconfig != PLANARCONFIG_CONTIG) { sprintf(emsg, "Sorry, can not handle LogLuv images with %s=%d", "Planarconfiguration", planarconfig); return (0); } TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT); img->photometric = PHOTOMETRIC_RGB; /* little white lie */ img->bitspersample = 8; break; case PHOTOMETRIC_CIELAB: break; default: sprintf(emsg, "Sorry, can not handle image with %s=%d", photoTag, img->photometric); goto fail_return; } img->Map = NULL; img->BWmap = NULL; img->PALmap = NULL; img->ycbcr = NULL; img->cielab = NULL; img->UaToAa = NULL; img->Bitdepth16To8 = NULL; TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &img->width); TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &img->height); TIFFGetFieldDefaulted(tif, TIFFTAG_ORIENTATION, &img->orientation); img->isContig = !(planarconfig == PLANARCONFIG_SEPARATE && img->samplesperpixel > 1); if (img->isContig) { if (!PickContigCase(img)) { sprintf(emsg, "Sorry, can not handle image"); goto fail_return; } } else { if (!PickSeparateCase(img)) { sprintf(emsg, "Sorry, can not handle image"); goto fail_return; } } return 1; fail_return: _TIFFfree( img->redcmap ); _TIFFfree( img->greencmap ); _TIFFfree( img->bluecmap ); img->redcmap = img->greencmap = img->bluecmap = NULL; return 0; } int TIFFRGBAImageGet(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) { if (img->get == NULL) { TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No \"get\" routine setup"); return (0); } if (img->put.any == NULL) { TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No \"put\" routine setupl; probably can not handle image format"); return (0); } return (*img->get)(img, raster, w, h); } /* * Read the specified image into an ABGR-format rastertaking in account * specified orientation. */ int TIFFReadRGBAImageOriented(TIFF* tif, uint32 rwidth, uint32 rheight, uint32* raster, int orientation, int stop) { char emsg[1024] = ""; TIFFRGBAImage img; int ok; if (TIFFRGBAImageOK(tif, emsg) && TIFFRGBAImageBegin(&img, tif, stop, emsg)) { img.req_orientation = orientation; /* XXX verify rwidth and rheight against width and height */ ok = TIFFRGBAImageGet(&img, raster+(rheight-img.height)*rwidth, rwidth, img.height); TIFFRGBAImageEnd(&img); } else { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", emsg); ok = 0; } return (ok); } /* * Read the specified image into an ABGR-format raster. Use bottom left * origin for raster by default. */ int TIFFReadRGBAImage(TIFF* tif, uint32 rwidth, uint32 rheight, uint32* raster, int stop) { return TIFFReadRGBAImageOriented(tif, rwidth, rheight, raster, ORIENTATION_BOTLEFT, stop); } static int setorientation(TIFFRGBAImage* img) { switch (img->orientation) { case ORIENTATION_TOPLEFT: case ORIENTATION_LEFTTOP: if (img->req_orientation == ORIENTATION_TOPRIGHT || img->req_orientation == ORIENTATION_RIGHTTOP) return FLIP_HORIZONTALLY; else if (img->req_orientation == ORIENTATION_BOTRIGHT || img->req_orientation == ORIENTATION_RIGHTBOT) return FLIP_HORIZONTALLY | FLIP_VERTICALLY; else if (img->req_orientation == ORIENTATION_BOTLEFT || img->req_orientation == ORIENTATION_LEFTBOT) return FLIP_VERTICALLY; else return 0; case ORIENTATION_TOPRIGHT: case ORIENTATION_RIGHTTOP: if (img->req_orientation == ORIENTATION_TOPLEFT || img->req_orientation == ORIENTATION_LEFTTOP) return FLIP_HORIZONTALLY; else if (img->req_orientation == ORIENTATION_BOTRIGHT || img->req_orientation == ORIENTATION_RIGHTBOT) return FLIP_VERTICALLY; else if (img->req_orientation == ORIENTATION_BOTLEFT || img->req_orientation == ORIENTATION_LEFTBOT) return FLIP_HORIZONTALLY | FLIP_VERTICALLY; else return 0; case ORIENTATION_BOTRIGHT: case ORIENTATION_RIGHTBOT: if (img->req_orientation == ORIENTATION_TOPLEFT || img->req_orientation == ORIENTATION_LEFTTOP) return FLIP_HORIZONTALLY | FLIP_VERTICALLY; else if (img->req_orientation == ORIENTATION_TOPRIGHT || img->req_orientation == ORIENTATION_RIGHTTOP) return FLIP_VERTICALLY; else if (img->req_orientation == ORIENTATION_BOTLEFT || img->req_orientation == ORIENTATION_LEFTBOT) return FLIP_HORIZONTALLY; else return 0; case ORIENTATION_BOTLEFT: case ORIENTATION_LEFTBOT: if (img->req_orientation == ORIENTATION_TOPLEFT || img->req_orientation == ORIENTATION_LEFTTOP) return FLIP_VERTICALLY; else if (img->req_orientation == ORIENTATION_TOPRIGHT || img->req_orientation == ORIENTATION_RIGHTTOP) return FLIP_HORIZONTALLY | FLIP_VERTICALLY; else if (img->req_orientation == ORIENTATION_BOTRIGHT || img->req_orientation == ORIENTATION_RIGHTBOT) return FLIP_HORIZONTALLY; else return 0; default: /* NOTREACHED */ return 0; } } /* * Get an tile-organized image that has * PlanarConfiguration contiguous if SamplesPerPixel > 1 * or * SamplesPerPixel == 1 */ static int gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) { TIFF* tif = img->tif; tileContigRoutine put = img->put.contig; uint32 col, row, y, rowstoread; tmsize_t pos; uint32 tw, th; unsigned char* buf; int32 fromskew, toskew; uint32 nrow; int ret = 1, flip; buf = (unsigned char*) _TIFFmalloc(TIFFTileSize(tif)); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", "No space for tile buffer"); return (0); } _TIFFmemset(buf, 0, TIFFTileSize(tif)); TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw); TIFFGetField(tif, TIFFTAG_TILELENGTH, &th); flip = setorientation(img); if (flip & FLIP_VERTICALLY) { y = h - 1; toskew = -(int32)(tw + w); } else { y = 0; toskew = -(int32)(tw - w); } for (row = 0; row < h; row += nrow) { rowstoread = th - (row + img->row_offset) % th; nrow = (row + rowstoread > h ? h - row : rowstoread); for (col = 0; col < w; col += tw) { if (TIFFReadTile(tif, buf, col+img->col_offset, row+img->row_offset, 0, 0)==(tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif); if (col + tw > w) { /* * Tile is clipped horizontally. Calculate * visible portion and skewing factors. */ uint32 npix = w - col; fromskew = tw - npix; (*put)(img, raster+y*w+col, col, y, npix, nrow, fromskew, toskew + fromskew, buf + pos); } else { (*put)(img, raster+y*w+col, col, y, tw, nrow, 0, toskew, buf + pos); } } y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow); } _TIFFfree(buf); if (flip & FLIP_HORIZONTALLY) { uint32 line; for (line = 0; line < h; line++) { uint32 *left = raster + (line * w); uint32 *right = left + w - 1; while ( left < right ) { uint32 temp = *left; *left = *right; *right = temp; left++, right--; } } } return (ret); } /* * Get an tile-organized image that has * SamplesPerPixel > 1 * PlanarConfiguration separated * We assume that all such images are RGB. */ static int gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) { TIFF* tif = img->tif; tileSeparateRoutine put = img->put.separate; uint32 col, row, y, rowstoread; tmsize_t pos; uint32 tw, th; unsigned char* buf; unsigned char* p0; unsigned char* p1; unsigned char* p2; unsigned char* pa; tmsize_t tilesize; tmsize_t bufsize; int32 fromskew, toskew; int alpha = img->alpha; uint32 nrow; int ret = 1, flip; int colorchannels; tilesize = TIFFTileSize(tif); bufsize = TIFFSafeMultiply(tmsize_t,alpha?4:3,tilesize); if (bufsize == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Integer overflow in %s", "gtTileSeparate"); return (0); } buf = (unsigned char*) _TIFFmalloc(bufsize); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", "No space for tile buffer"); return (0); } _TIFFmemset(buf, 0, bufsize); p0 = buf; p1 = p0 + tilesize; p2 = p1 + tilesize; pa = (alpha?(p2+tilesize):NULL); TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw); TIFFGetField(tif, TIFFTAG_TILELENGTH, &th); flip = setorientation(img); if (flip & FLIP_VERTICALLY) { y = h - 1; toskew = -(int32)(tw + w); } else { y = 0; toskew = -(int32)(tw - w); } switch( img->photometric ) { case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: case PHOTOMETRIC_PALETTE: colorchannels = 1; p2 = p1 = p0; break; default: colorchannels = 3; break; } for (row = 0; row < h; row += nrow) { rowstoread = th - (row + img->row_offset) % th; nrow = (row + rowstoread > h ? h - row : rowstoread); for (col = 0; col < w; col += tw) { if (TIFFReadTile(tif, p0, col+img->col_offset, row+img->row_offset,0,0)==(tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } if (colorchannels > 1 && TIFFReadTile(tif, p1, col+img->col_offset, row+img->row_offset,0,1) == (tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } if (colorchannels > 1 && TIFFReadTile(tif, p2, col+img->col_offset, row+img->row_offset,0,2) == (tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } if (alpha && TIFFReadTile(tif,pa,col+img->col_offset, row+img->row_offset,0,colorchannels) == (tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif); if (col + tw > w) { /* * Tile is clipped horizontally. Calculate * visible portion and skewing factors. */ uint32 npix = w - col; fromskew = tw - npix; (*put)(img, raster+y*w+col, col, y, npix, nrow, fromskew, toskew + fromskew, p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL)); } else { (*put)(img, raster+y*w+col, col, y, tw, nrow, 0, toskew, p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL)); } } y += (flip & FLIP_VERTICALLY ?-(int32) nrow : (int32) nrow); } if (flip & FLIP_HORIZONTALLY) { uint32 line; for (line = 0; line < h; line++) { uint32 *left = raster + (line * w); uint32 *right = left + w - 1; while ( left < right ) { uint32 temp = *left; *left = *right; *right = temp; left++, right--; } } } _TIFFfree(buf); return (ret); } /* * Get a strip-organized image that has * PlanarConfiguration contiguous if SamplesPerPixel > 1 * or * SamplesPerPixel == 1 */ static int gtStripContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) { TIFF* tif = img->tif; tileContigRoutine put = img->put.contig; uint32 row, y, nrow, nrowsub, rowstoread; tmsize_t pos; unsigned char* buf; uint32 rowsperstrip; uint16 subsamplinghor,subsamplingver; uint32 imagewidth = img->width; tmsize_t scanline; int32 fromskew, toskew; int ret = 1, flip; buf = (unsigned char*) _TIFFmalloc(TIFFStripSize(tif)); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for strip buffer"); return (0); } _TIFFmemset(buf, 0, TIFFStripSize(tif)); flip = setorientation(img); if (flip & FLIP_VERTICALLY) { y = h - 1; toskew = -(int32)(w + w); } else { y = 0; toskew = -(int32)(w - w); } TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING, &subsamplinghor, &subsamplingver); scanline = TIFFScanlineSize(tif); fromskew = (w < imagewidth ? imagewidth - w : 0); for (row = 0; row < h; row += nrow) { rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip; nrow = (row + rowstoread > h ? h - row : rowstoread); nrowsub = nrow; if ((nrowsub%subsamplingver)!=0) nrowsub+=subsamplingver-nrowsub%subsamplingver; if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif,row+img->row_offset, 0), buf, ((row + img->row_offset)%rowsperstrip + nrowsub) * scanline)==(tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } pos = ((row + img->row_offset) % rowsperstrip) * scanline; (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, buf + pos); y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow); } if (flip & FLIP_HORIZONTALLY) { uint32 line; for (line = 0; line < h; line++) { uint32 *left = raster + (line * w); uint32 *right = left + w - 1; while ( left < right ) { uint32 temp = *left; *left = *right; *right = temp; left++, right--; } } } _TIFFfree(buf); return (ret); } /* * Get a strip-organized image with * SamplesPerPixel > 1 * PlanarConfiguration separated * We assume that all such images are RGB. */ static int gtStripSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) { TIFF* tif = img->tif; tileSeparateRoutine put = img->put.separate; unsigned char *buf; unsigned char *p0, *p1, *p2, *pa; uint32 row, y, nrow, rowstoread; tmsize_t pos; tmsize_t scanline; uint32 rowsperstrip, offset_row; uint32 imagewidth = img->width; tmsize_t stripsize; tmsize_t bufsize; int32 fromskew, toskew; int alpha = img->alpha; int ret = 1, flip, colorchannels; stripsize = TIFFStripSize(tif); bufsize = TIFFSafeMultiply(tmsize_t,alpha?4:3,stripsize); if (bufsize == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Integer overflow in %s", "gtStripSeparate"); return (0); } p0 = buf = (unsigned char *)_TIFFmalloc(bufsize); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for tile buffer"); return (0); } _TIFFmemset(buf, 0, bufsize); p1 = p0 + stripsize; p2 = p1 + stripsize; pa = (alpha?(p2+stripsize):NULL); flip = setorientation(img); if (flip & FLIP_VERTICALLY) { y = h - 1; toskew = -(int32)(w + w); } else { y = 0; toskew = -(int32)(w - w); } switch( img->photometric ) { case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: case PHOTOMETRIC_PALETTE: colorchannels = 1; p2 = p1 = p0; break; default: colorchannels = 3; break; } TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); scanline = TIFFScanlineSize(tif); fromskew = (w < imagewidth ? imagewidth - w : 0); for (row = 0; row < h; row += nrow) { rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip; nrow = (row + rowstoread > h ? h - row : rowstoread); offset_row = row + img->row_offset; if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 0), p0, ((row + img->row_offset)%rowsperstrip + nrow) * scanline)==(tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } if (colorchannels > 1 && TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 1), p1, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) == (tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } if (colorchannels > 1 && TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 2), p2, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) == (tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } if (alpha) { if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, colorchannels), pa, ((row + img->row_offset)%rowsperstrip + nrow) * scanline)==(tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } } pos = ((row + img->row_offset) % rowsperstrip) * scanline; (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL)); y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow); } if (flip & FLIP_HORIZONTALLY) { uint32 line; for (line = 0; line < h; line++) { uint32 *left = raster + (line * w); uint32 *right = left + w - 1; while ( left < right ) { uint32 temp = *left; *left = *right; *right = temp; left++, right--; } } } _TIFFfree(buf); return (ret); } /* * The following routines move decoded data returned * from the TIFF library into rasters filled with packed * ABGR pixels (i.e. suitable for passing to lrecwrite.) * * The routines have been created according to the most * important cases and optimized. PickContigCase and * PickSeparateCase analyze the parameters and select * the appropriate "get" and "put" routine to use. */ #define REPEAT8(op) REPEAT4(op); REPEAT4(op) #define REPEAT4(op) REPEAT2(op); REPEAT2(op) #define REPEAT2(op) op; op #define CASE8(x,op) \ switch (x) { \ case 7: op; case 6: op; case 5: op; \ case 4: op; case 3: op; case 2: op; \ case 1: op; \ } #define CASE4(x,op) switch (x) { case 3: op; case 2: op; case 1: op; } #define NOP #define UNROLL8(w, op1, op2) { \ uint32 _x; \ for (_x = w; _x >= 8; _x -= 8) { \ op1; \ REPEAT8(op2); \ } \ if (_x > 0) { \ op1; \ CASE8(_x,op2); \ } \ } #define UNROLL4(w, op1, op2) { \ uint32 _x; \ for (_x = w; _x >= 4; _x -= 4) { \ op1; \ REPEAT4(op2); \ } \ if (_x > 0) { \ op1; \ CASE4(_x,op2); \ } \ } #define UNROLL2(w, op1, op2) { \ uint32 _x; \ for (_x = w; _x >= 2; _x -= 2) { \ op1; \ REPEAT2(op2); \ } \ if (_x) { \ op1; \ op2; \ } \ } #define SKEW(r,g,b,skew) { r += skew; g += skew; b += skew; } #define SKEW4(r,g,b,a,skew) { r += skew; g += skew; b += skew; a+= skew; } #define A1 (((uint32)0xffL)<<24) #define PACK(r,g,b) \ ((uint32)(r)|((uint32)(g)<<8)|((uint32)(b)<<16)|A1) #define PACK4(r,g,b,a) \ ((uint32)(r)|((uint32)(g)<<8)|((uint32)(b)<<16)|((uint32)(a)<<24)) #define W2B(v) (((v)>>8)&0xff) /* TODO: PACKW should have be made redundant in favor of Bitdepth16To8 LUT */ #define PACKW(r,g,b) \ ((uint32)W2B(r)|((uint32)W2B(g)<<8)|((uint32)W2B(b)<<16)|A1) #define PACKW4(r,g,b,a) \ ((uint32)W2B(r)|((uint32)W2B(g)<<8)|((uint32)W2B(b)<<16)|((uint32)W2B(a)<<24)) #define DECLAREContigPutFunc(name) \ static void name(\ TIFFRGBAImage* img, \ uint32* cp, \ uint32 x, uint32 y, \ uint32 w, uint32 h, \ int32 fromskew, int32 toskew, \ unsigned char* pp \ ) /* * 8-bit palette => colormap/RGB */ DECLAREContigPutFunc(put8bitcmaptile) { uint32** PALmap = img->PALmap; int samplesperpixel = img->samplesperpixel; (void) y; while (h-- > 0) { for (x = w; x-- > 0;) { *cp++ = PALmap[*pp][0]; pp += samplesperpixel; } cp += toskew; pp += fromskew; } } /* * 4-bit palette => colormap/RGB */ DECLAREContigPutFunc(put4bitcmaptile) { uint32** PALmap = img->PALmap; (void) x; (void) y; fromskew /= 2; while (h-- > 0) { uint32* bw; UNROLL2(w, bw = PALmap[*pp++], *cp++ = *bw++); cp += toskew; pp += fromskew; } } /* * 2-bit palette => colormap/RGB */ DECLAREContigPutFunc(put2bitcmaptile) { uint32** PALmap = img->PALmap; (void) x; (void) y; fromskew /= 4; while (h-- > 0) { uint32* bw; UNROLL4(w, bw = PALmap[*pp++], *cp++ = *bw++); cp += toskew; pp += fromskew; } } /* * 1-bit palette => colormap/RGB */ DECLAREContigPutFunc(put1bitcmaptile) { uint32** PALmap = img->PALmap; (void) x; (void) y; fromskew /= 8; while (h-- > 0) { uint32* bw; UNROLL8(w, bw = PALmap[*pp++], *cp++ = *bw++); cp += toskew; pp += fromskew; } } /* * 8-bit greyscale => colormap/RGB */ DECLAREContigPutFunc(putgreytile) { int samplesperpixel = img->samplesperpixel; uint32** BWmap = img->BWmap; (void) y; while (h-- > 0) { for (x = w; x-- > 0;) { *cp++ = BWmap[*pp][0]; pp += samplesperpixel; } cp += toskew; pp += fromskew; } } /* * 8-bit greyscale with associated alpha => colormap/RGBA */ DECLAREContigPutFunc(putagreytile) { int samplesperpixel = img->samplesperpixel; uint32** BWmap = img->BWmap; (void) y; while (h-- > 0) { for (x = w; x-- > 0;) { *cp++ = BWmap[*pp][0] & (*(pp+1) << 24 | ~A1); pp += samplesperpixel; } cp += toskew; pp += fromskew; } } /* * 16-bit greyscale => colormap/RGB */ DECLAREContigPutFunc(put16bitbwtile) { int samplesperpixel = img->samplesperpixel; uint32** BWmap = img->BWmap; (void) y; while (h-- > 0) { uint16 *wp = (uint16 *) pp; for (x = w; x-- > 0;) { /* use high order byte of 16bit value */ *cp++ = BWmap[*wp >> 8][0]; pp += 2 * samplesperpixel; wp += samplesperpixel; } cp += toskew; pp += fromskew; } } /* * 1-bit bilevel => colormap/RGB */ DECLAREContigPutFunc(put1bitbwtile) { uint32** BWmap = img->BWmap; (void) x; (void) y; fromskew /= 8; while (h-- > 0) { uint32* bw; UNROLL8(w, bw = BWmap[*pp++], *cp++ = *bw++); cp += toskew; pp += fromskew; } } /* * 2-bit greyscale => colormap/RGB */ DECLAREContigPutFunc(put2bitbwtile) { uint32** BWmap = img->BWmap; (void) x; (void) y; fromskew /= 4; while (h-- > 0) { uint32* bw; UNROLL4(w, bw = BWmap[*pp++], *cp++ = *bw++); cp += toskew; pp += fromskew; } } /* * 4-bit greyscale => colormap/RGB */ DECLAREContigPutFunc(put4bitbwtile) { uint32** BWmap = img->BWmap; (void) x; (void) y; fromskew /= 2; while (h-- > 0) { uint32* bw; UNROLL2(w, bw = BWmap[*pp++], *cp++ = *bw++); cp += toskew; pp += fromskew; } } /* * 8-bit packed samples, no Map => RGB */ DECLAREContigPutFunc(putRGBcontig8bittile) { int samplesperpixel = img->samplesperpixel; (void) x; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { UNROLL8(w, NOP, *cp++ = PACK(pp[0], pp[1], pp[2]); pp += samplesperpixel); cp += toskew; pp += fromskew; } } /* * 8-bit packed samples => RGBA w/ associated alpha * (known to have Map == NULL) */ DECLAREContigPutFunc(putRGBAAcontig8bittile) { int samplesperpixel = img->samplesperpixel; (void) x; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { UNROLL8(w, NOP, *cp++ = PACK4(pp[0], pp[1], pp[2], pp[3]); pp += samplesperpixel); cp += toskew; pp += fromskew; } } /* * 8-bit packed samples => RGBA w/ unassociated alpha * (known to have Map == NULL) */ DECLAREContigPutFunc(putRGBUAcontig8bittile) { int samplesperpixel = img->samplesperpixel; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { uint32 r, g, b, a; uint8* m; for (x = w; x-- > 0;) { a = pp[3]; m = img->UaToAa+(a<<8); r = m[pp[0]]; g = m[pp[1]]; b = m[pp[2]]; *cp++ = PACK4(r,g,b,a); pp += samplesperpixel; } cp += toskew; pp += fromskew; } } /* * 16-bit packed samples => RGB */ DECLAREContigPutFunc(putRGBcontig16bittile) { int samplesperpixel = img->samplesperpixel; uint16 *wp = (uint16 *)pp; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { for (x = w; x-- > 0;) { *cp++ = PACK(img->Bitdepth16To8[wp[0]], img->Bitdepth16To8[wp[1]], img->Bitdepth16To8[wp[2]]); wp += samplesperpixel; } cp += toskew; wp += fromskew; } } /* * 16-bit packed samples => RGBA w/ associated alpha * (known to have Map == NULL) */ DECLAREContigPutFunc(putRGBAAcontig16bittile) { int samplesperpixel = img->samplesperpixel; uint16 *wp = (uint16 *)pp; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { for (x = w; x-- > 0;) { *cp++ = PACK4(img->Bitdepth16To8[wp[0]], img->Bitdepth16To8[wp[1]], img->Bitdepth16To8[wp[2]], img->Bitdepth16To8[wp[3]]); wp += samplesperpixel; } cp += toskew; wp += fromskew; } } /* * 16-bit packed samples => RGBA w/ unassociated alpha * (known to have Map == NULL) */ DECLAREContigPutFunc(putRGBUAcontig16bittile) { int samplesperpixel = img->samplesperpixel; uint16 *wp = (uint16 *)pp; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { uint32 r,g,b,a; uint8* m; for (x = w; x-- > 0;) { a = img->Bitdepth16To8[wp[3]]; m = img->UaToAa+(a<<8); r = m[img->Bitdepth16To8[wp[0]]]; g = m[img->Bitdepth16To8[wp[1]]]; b = m[img->Bitdepth16To8[wp[2]]]; *cp++ = PACK4(r,g,b,a); wp += samplesperpixel; } cp += toskew; wp += fromskew; } } /* * 8-bit packed CMYK samples w/o Map => RGB * * NB: The conversion of CMYK->RGB is *very* crude. */ DECLAREContigPutFunc(putRGBcontig8bitCMYKtile) { int samplesperpixel = img->samplesperpixel; uint16 r, g, b, k; (void) x; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { UNROLL8(w, NOP, k = 255 - pp[3]; r = (k*(255-pp[0]))/255; g = (k*(255-pp[1]))/255; b = (k*(255-pp[2]))/255; *cp++ = PACK(r, g, b); pp += samplesperpixel); cp += toskew; pp += fromskew; } } /* * 8-bit packed CMYK samples w/Map => RGB * * NB: The conversion of CMYK->RGB is *very* crude. */ DECLAREContigPutFunc(putRGBcontig8bitCMYKMaptile) { int samplesperpixel = img->samplesperpixel; TIFFRGBValue* Map = img->Map; uint16 r, g, b, k; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { for (x = w; x-- > 0;) { k = 255 - pp[3]; r = (k*(255-pp[0]))/255; g = (k*(255-pp[1]))/255; b = (k*(255-pp[2]))/255; *cp++ = PACK(Map[r], Map[g], Map[b]); pp += samplesperpixel; } pp += fromskew; cp += toskew; } } #define DECLARESepPutFunc(name) \ static void name(\ TIFFRGBAImage* img,\ uint32* cp,\ uint32 x, uint32 y, \ uint32 w, uint32 h,\ int32 fromskew, int32 toskew,\ unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a\ ) /* * 8-bit unpacked samples => RGB */ DECLARESepPutFunc(putRGBseparate8bittile) { (void) img; (void) x; (void) y; (void) a; while (h-- > 0) { UNROLL8(w, NOP, *cp++ = PACK(*r++, *g++, *b++)); SKEW(r, g, b, fromskew); cp += toskew; } } /* * 8-bit unpacked samples => RGBA w/ associated alpha */ DECLARESepPutFunc(putRGBAAseparate8bittile) { (void) img; (void) x; (void) y; while (h-- > 0) { UNROLL8(w, NOP, *cp++ = PACK4(*r++, *g++, *b++, *a++)); SKEW4(r, g, b, a, fromskew); cp += toskew; } } /* * 8-bit unpacked CMYK samples => RGBA */ DECLARESepPutFunc(putCMYKseparate8bittile) { (void) img; (void) y; while (h-- > 0) { uint32 rv, gv, bv, kv; for (x = w; x-- > 0;) { kv = 255 - *a++; rv = (kv*(255-*r++))/255; gv = (kv*(255-*g++))/255; bv = (kv*(255-*b++))/255; *cp++ = PACK4(rv,gv,bv,255); } SKEW4(r, g, b, a, fromskew); cp += toskew; } } /* * 8-bit unpacked samples => RGBA w/ unassociated alpha */ DECLARESepPutFunc(putRGBUAseparate8bittile) { (void) img; (void) y; while (h-- > 0) { uint32 rv, gv, bv, av; uint8* m; for (x = w; x-- > 0;) { av = *a++; m = img->UaToAa+(av<<8); rv = m[*r++]; gv = m[*g++]; bv = m[*b++]; *cp++ = PACK4(rv,gv,bv,av); } SKEW4(r, g, b, a, fromskew); cp += toskew; } } /* * 16-bit unpacked samples => RGB */ DECLARESepPutFunc(putRGBseparate16bittile) { uint16 *wr = (uint16*) r; uint16 *wg = (uint16*) g; uint16 *wb = (uint16*) b; (void) img; (void) y; (void) a; while (h-- > 0) { for (x = 0; x < w; x++) *cp++ = PACK(img->Bitdepth16To8[*wr++], img->Bitdepth16To8[*wg++], img->Bitdepth16To8[*wb++]); SKEW(wr, wg, wb, fromskew); cp += toskew; } } /* * 16-bit unpacked samples => RGBA w/ associated alpha */ DECLARESepPutFunc(putRGBAAseparate16bittile) { uint16 *wr = (uint16*) r; uint16 *wg = (uint16*) g; uint16 *wb = (uint16*) b; uint16 *wa = (uint16*) a; (void) img; (void) y; while (h-- > 0) { for (x = 0; x < w; x++) *cp++ = PACK4(img->Bitdepth16To8[*wr++], img->Bitdepth16To8[*wg++], img->Bitdepth16To8[*wb++], img->Bitdepth16To8[*wa++]); SKEW4(wr, wg, wb, wa, fromskew); cp += toskew; } } /* * 16-bit unpacked samples => RGBA w/ unassociated alpha */ DECLARESepPutFunc(putRGBUAseparate16bittile) { uint16 *wr = (uint16*) r; uint16 *wg = (uint16*) g; uint16 *wb = (uint16*) b; uint16 *wa = (uint16*) a; (void) img; (void) y; while (h-- > 0) { uint32 r,g,b,a; uint8* m; for (x = w; x-- > 0;) { a = img->Bitdepth16To8[*wa++]; m = img->UaToAa+(a<<8); r = m[img->Bitdepth16To8[*wr++]]; g = m[img->Bitdepth16To8[*wg++]]; b = m[img->Bitdepth16To8[*wb++]]; *cp++ = PACK4(r,g,b,a); } SKEW4(wr, wg, wb, wa, fromskew); cp += toskew; } } /* * 8-bit packed CIE L*a*b 1976 samples => RGB */ DECLAREContigPutFunc(putcontig8bitCIELab) { float X, Y, Z; uint32 r, g, b; (void) y; fromskew *= 3; while (h-- > 0) { for (x = w; x-- > 0;) { TIFFCIELabToXYZ(img->cielab, (unsigned char)pp[0], (signed char)pp[1], (signed char)pp[2], &X, &Y, &Z); TIFFXYZToRGB(img->cielab, X, Y, Z, &r, &g, &b); *cp++ = PACK(r, g, b); pp += 3; } cp += toskew; pp += fromskew; } } /* * YCbCr -> RGB conversion and packing routines. */ #define YCbCrtoRGB(dst, Y) { \ uint32 r, g, b; \ TIFFYCbCrtoRGB(img->ycbcr, (Y), Cb, Cr, &r, &g, &b); \ dst = PACK(r, g, b); \ } /* * 8-bit packed YCbCr samples => RGB * This function is generic for different sampling sizes, * and can handle blocks sizes that aren't multiples of the * sampling size. However, it is substantially less optimized * than the specific sampling cases. It is used as a fallback * for difficult blocks. */ #ifdef notdef static void putcontig8bitYCbCrGenericTile( TIFFRGBAImage* img, uint32* cp, uint32 x, uint32 y, uint32 w, uint32 h, int32 fromskew, int32 toskew, unsigned char* pp, int h_group, int v_group ) { uint32* cp1 = cp+w+toskew; uint32* cp2 = cp1+w+toskew; uint32* cp3 = cp2+w+toskew; int32 incr = 3*w+4*toskew; int32 Cb, Cr; int group_size = v_group * h_group + 2; (void) y; fromskew = (fromskew * group_size) / h_group; for( yy = 0; yy < h; yy++ ) { unsigned char *pp_line; int y_line_group = yy / v_group; int y_remainder = yy - y_line_group * v_group; pp_line = pp + v_line_group * for( xx = 0; xx < w; xx++ ) { Cb = pp } } for (; h >= 4; h -= 4) { x = w>>2; do { Cb = pp[16]; Cr = pp[17]; YCbCrtoRGB(cp [0], pp[ 0]); YCbCrtoRGB(cp [1], pp[ 1]); YCbCrtoRGB(cp [2], pp[ 2]); YCbCrtoRGB(cp [3], pp[ 3]); YCbCrtoRGB(cp1[0], pp[ 4]); YCbCrtoRGB(cp1[1], pp[ 5]); YCbCrtoRGB(cp1[2], pp[ 6]); YCbCrtoRGB(cp1[3], pp[ 7]); YCbCrtoRGB(cp2[0], pp[ 8]); YCbCrtoRGB(cp2[1], pp[ 9]); YCbCrtoRGB(cp2[2], pp[10]); YCbCrtoRGB(cp2[3], pp[11]); YCbCrtoRGB(cp3[0], pp[12]); YCbCrtoRGB(cp3[1], pp[13]); YCbCrtoRGB(cp3[2], pp[14]); YCbCrtoRGB(cp3[3], pp[15]); cp += 4, cp1 += 4, cp2 += 4, cp3 += 4; pp += 18; } while (--x); cp += incr, cp1 += incr, cp2 += incr, cp3 += incr; pp += fromskew; } } #endif /* * 8-bit packed YCbCr samples w/ 4,4 subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr44tile) { uint32* cp1 = cp+w+toskew; uint32* cp2 = cp1+w+toskew; uint32* cp3 = cp2+w+toskew; int32 incr = 3*w+4*toskew; (void) y; /* adjust fromskew */ fromskew = (fromskew * 18) / 4; if ((h & 3) == 0 && (w & 3) == 0) { for (; h >= 4; h -= 4) { x = w>>2; do { int32 Cb = pp[16]; int32 Cr = pp[17]; YCbCrtoRGB(cp [0], pp[ 0]); YCbCrtoRGB(cp [1], pp[ 1]); YCbCrtoRGB(cp [2], pp[ 2]); YCbCrtoRGB(cp [3], pp[ 3]); YCbCrtoRGB(cp1[0], pp[ 4]); YCbCrtoRGB(cp1[1], pp[ 5]); YCbCrtoRGB(cp1[2], pp[ 6]); YCbCrtoRGB(cp1[3], pp[ 7]); YCbCrtoRGB(cp2[0], pp[ 8]); YCbCrtoRGB(cp2[1], pp[ 9]); YCbCrtoRGB(cp2[2], pp[10]); YCbCrtoRGB(cp2[3], pp[11]); YCbCrtoRGB(cp3[0], pp[12]); YCbCrtoRGB(cp3[1], pp[13]); YCbCrtoRGB(cp3[2], pp[14]); YCbCrtoRGB(cp3[3], pp[15]); cp += 4, cp1 += 4, cp2 += 4, cp3 += 4; pp += 18; } while (--x); cp += incr, cp1 += incr, cp2 += incr, cp3 += incr; pp += fromskew; } } else { while (h > 0) { for (x = w; x > 0;) { int32 Cb = pp[16]; int32 Cr = pp[17]; switch (x) { default: switch (h) { default: YCbCrtoRGB(cp3[3], pp[15]); /* FALLTHROUGH */ case 3: YCbCrtoRGB(cp2[3], pp[11]); /* FALLTHROUGH */ case 2: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 3: switch (h) { default: YCbCrtoRGB(cp3[2], pp[14]); /* FALLTHROUGH */ case 3: YCbCrtoRGB(cp2[2], pp[10]); /* FALLTHROUGH */ case 2: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 2: switch (h) { default: YCbCrtoRGB(cp3[1], pp[13]); /* FALLTHROUGH */ case 3: YCbCrtoRGB(cp2[1], pp[ 9]); /* FALLTHROUGH */ case 2: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 1: switch (h) { default: YCbCrtoRGB(cp3[0], pp[12]); /* FALLTHROUGH */ case 3: YCbCrtoRGB(cp2[0], pp[ 8]); /* FALLTHROUGH */ case 2: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */ } /* FALLTHROUGH */ } if (x < 4) { cp += x; cp1 += x; cp2 += x; cp3 += x; x = 0; } else { cp += 4; cp1 += 4; cp2 += 4; cp3 += 4; x -= 4; } pp += 18; } if (h <= 4) break; h -= 4; cp += incr, cp1 += incr, cp2 += incr, cp3 += incr; pp += fromskew; } } } /* * 8-bit packed YCbCr samples w/ 4,2 subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr42tile) { uint32* cp1 = cp+w+toskew; int32 incr = 2*toskew+w; (void) y; fromskew = (fromskew * 10) / 4; if ((h & 3) == 0 && (w & 1) == 0) { for (; h >= 2; h -= 2) { x = w>>2; do { int32 Cb = pp[8]; int32 Cr = pp[9]; YCbCrtoRGB(cp [0], pp[0]); YCbCrtoRGB(cp [1], pp[1]); YCbCrtoRGB(cp [2], pp[2]); YCbCrtoRGB(cp [3], pp[3]); YCbCrtoRGB(cp1[0], pp[4]); YCbCrtoRGB(cp1[1], pp[5]); YCbCrtoRGB(cp1[2], pp[6]); YCbCrtoRGB(cp1[3], pp[7]); cp += 4, cp1 += 4; pp += 10; } while (--x); cp += incr, cp1 += incr; pp += fromskew; } } else { while (h > 0) { for (x = w; x > 0;) { int32 Cb = pp[8]; int32 Cr = pp[9]; switch (x) { default: switch (h) { default: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 3: switch (h) { default: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 2: switch (h) { default: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 1: switch (h) { default: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */ } /* FALLTHROUGH */ } if (x < 4) { cp += x; cp1 += x; x = 0; } else { cp += 4; cp1 += 4; x -= 4; } pp += 10; } if (h <= 2) break; h -= 2; cp += incr, cp1 += incr; pp += fromskew; } } } /* * 8-bit packed YCbCr samples w/ 4,1 subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr41tile) { (void) y; /* XXX adjust fromskew */ do { x = w>>2; do { int32 Cb = pp[4]; int32 Cr = pp[5]; YCbCrtoRGB(cp [0], pp[0]); YCbCrtoRGB(cp [1], pp[1]); YCbCrtoRGB(cp [2], pp[2]); YCbCrtoRGB(cp [3], pp[3]); cp += 4; pp += 6; } while (--x); if( (w&3) != 0 ) { int32 Cb = pp[4]; int32 Cr = pp[5]; switch( (w&3) ) { case 3: YCbCrtoRGB(cp [2], pp[2]); case 2: YCbCrtoRGB(cp [1], pp[1]); case 1: YCbCrtoRGB(cp [0], pp[0]); case 0: break; } cp += (w&3); pp += 6; } cp += toskew; pp += fromskew; } while (--h); } /* * 8-bit packed YCbCr samples w/ 2,2 subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr22tile) { uint32* cp2; int32 incr = 2*toskew+w; (void) y; fromskew = (fromskew / 2) * 6; cp2 = cp+w+toskew; while (h>=2) { x = w; while (x>=2) { uint32 Cb = pp[4]; uint32 Cr = pp[5]; YCbCrtoRGB(cp[0], pp[0]); YCbCrtoRGB(cp[1], pp[1]); YCbCrtoRGB(cp2[0], pp[2]); YCbCrtoRGB(cp2[1], pp[3]); cp += 2; cp2 += 2; pp += 6; x -= 2; } if (x==1) { uint32 Cb = pp[4]; uint32 Cr = pp[5]; YCbCrtoRGB(cp[0], pp[0]); YCbCrtoRGB(cp2[0], pp[2]); cp ++ ; cp2 ++ ; pp += 6; } cp += incr; cp2 += incr; pp += fromskew; h-=2; } if (h==1) { x = w; while (x>=2) { uint32 Cb = pp[4]; uint32 Cr = pp[5]; YCbCrtoRGB(cp[0], pp[0]); YCbCrtoRGB(cp[1], pp[1]); cp += 2; cp2 += 2; pp += 6; x -= 2; } if (x==1) { uint32 Cb = pp[4]; uint32 Cr = pp[5]; YCbCrtoRGB(cp[0], pp[0]); } } } /* * 8-bit packed YCbCr samples w/ 2,1 subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr21tile) { (void) y; fromskew = (fromskew * 4) / 2; do { x = w>>1; do { int32 Cb = pp[2]; int32 Cr = pp[3]; YCbCrtoRGB(cp[0], pp[0]); YCbCrtoRGB(cp[1], pp[1]); cp += 2; pp += 4; } while (--x); if( (w&1) != 0 ) { int32 Cb = pp[2]; int32 Cr = pp[3]; YCbCrtoRGB(cp[0], pp[0]); cp += 1; pp += 4; } cp += toskew; pp += fromskew; } while (--h); } /* * 8-bit packed YCbCr samples w/ 1,2 subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr12tile) { uint32* cp2; int32 incr = 2*toskew+w; (void) y; fromskew = (fromskew / 2) * 4; cp2 = cp+w+toskew; while (h>=2) { x = w; do { uint32 Cb = pp[2]; uint32 Cr = pp[3]; YCbCrtoRGB(cp[0], pp[0]); YCbCrtoRGB(cp2[0], pp[1]); cp ++; cp2 ++; pp += 4; } while (--x); cp += incr; cp2 += incr; pp += fromskew; h-=2; } if (h==1) { x = w; do { uint32 Cb = pp[2]; uint32 Cr = pp[3]; YCbCrtoRGB(cp[0], pp[0]); cp ++; pp += 4; } while (--x); } } /* * 8-bit packed YCbCr samples w/ no subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr11tile) { (void) y; fromskew *= 3; do { x = w; /* was x = w>>1; patched 2000/09/25 warmerda@home.com */ do { int32 Cb = pp[1]; int32 Cr = pp[2]; YCbCrtoRGB(*cp++, pp[0]); pp += 3; } while (--x); cp += toskew; pp += fromskew; } while (--h); } /* * 8-bit packed YCbCr samples w/ no subsampling => RGB */ DECLARESepPutFunc(putseparate8bitYCbCr11tile) { (void) y; (void) a; /* TODO: naming of input vars is still off, change obfuscating declaration inside define, or resolve obfuscation */ while (h-- > 0) { x = w; do { uint32 dr, dg, db; TIFFYCbCrtoRGB(img->ycbcr,*r++,*g++,*b++,&dr,&dg,&db); *cp++ = PACK(dr,dg,db); } while (--x); SKEW(r, g, b, fromskew); cp += toskew; } } #undef YCbCrtoRGB static int initYCbCrConversion(TIFFRGBAImage* img) { static const char module[] = "initYCbCrConversion"; float *luma, *refBlackWhite; if (img->ycbcr == NULL) { img->ycbcr = (TIFFYCbCrToRGB*) _TIFFmalloc( TIFFroundup_32(sizeof (TIFFYCbCrToRGB), sizeof (long)) + 4*256*sizeof (TIFFRGBValue) + 2*256*sizeof (int) + 3*256*sizeof (int32) ); if (img->ycbcr == NULL) { TIFFErrorExt(img->tif->tif_clientdata, module, "No space for YCbCr->RGB conversion state"); return (0); } } TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRCOEFFICIENTS, &luma); TIFFGetFieldDefaulted(img->tif, TIFFTAG_REFERENCEBLACKWHITE, &refBlackWhite); if (TIFFYCbCrToRGBInit(img->ycbcr, luma, refBlackWhite) < 0) return(0); return (1); } static tileContigRoutine initCIELabConversion(TIFFRGBAImage* img) { static const char module[] = "initCIELabConversion"; float *whitePoint; float refWhite[3]; if (!img->cielab) { img->cielab = (TIFFCIELabToRGB *) _TIFFmalloc(sizeof(TIFFCIELabToRGB)); if (!img->cielab) { TIFFErrorExt(img->tif->tif_clientdata, module, "No space for CIE L*a*b*->RGB conversion state."); return NULL; } } TIFFGetFieldDefaulted(img->tif, TIFFTAG_WHITEPOINT, &whitePoint); refWhite[1] = 100.0F; refWhite[0] = whitePoint[0] / whitePoint[1] * refWhite[1]; refWhite[2] = (1.0F - whitePoint[0] - whitePoint[1]) / whitePoint[1] * refWhite[1]; if (TIFFCIELabToRGBInit(img->cielab, &display_sRGB, refWhite) < 0) { TIFFErrorExt(img->tif->tif_clientdata, module, "Failed to initialize CIE L*a*b*->RGB conversion state."); _TIFFfree(img->cielab); return NULL; } return putcontig8bitCIELab; } /* * Greyscale images with less than 8 bits/sample are handled * with a table to avoid lots of shifts and masks. The table * is setup so that put*bwtile (below) can retrieve 8/bitspersample * pixel values simply by indexing into the table with one * number. */ static int makebwmap(TIFFRGBAImage* img) { TIFFRGBValue* Map = img->Map; int bitspersample = img->bitspersample; int nsamples = 8 / bitspersample; int i; uint32* p; if( nsamples == 0 ) nsamples = 1; img->BWmap = (uint32**) _TIFFmalloc( 256*sizeof (uint32 *)+(256*nsamples*sizeof(uint32))); if (img->BWmap == NULL) { TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No space for B&W mapping table"); return (0); } p = (uint32*)(img->BWmap + 256); for (i = 0; i < 256; i++) { TIFFRGBValue c; img->BWmap[i] = p; switch (bitspersample) { #define GREY(x) c = Map[x]; *p++ = PACK(c,c,c); case 1: GREY(i>>7); GREY((i>>6)&1); GREY((i>>5)&1); GREY((i>>4)&1); GREY((i>>3)&1); GREY((i>>2)&1); GREY((i>>1)&1); GREY(i&1); break; case 2: GREY(i>>6); GREY((i>>4)&3); GREY((i>>2)&3); GREY(i&3); break; case 4: GREY(i>>4); GREY(i&0xf); break; case 8: case 16: GREY(i); break; } #undef GREY } return (1); } /* * Construct a mapping table to convert from the range * of the data samples to [0,255] --for display. This * process also handles inverting B&W images when needed. */ static int setupMap(TIFFRGBAImage* img) { int32 x, range; range = (int32)((1L<bitspersample)-1); /* treat 16 bit the same as eight bit */ if( img->bitspersample == 16 ) range = (int32) 255; img->Map = (TIFFRGBValue*) _TIFFmalloc((range+1) * sizeof (TIFFRGBValue)); if (img->Map == NULL) { TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No space for photometric conversion table"); return (0); } if (img->photometric == PHOTOMETRIC_MINISWHITE) { for (x = 0; x <= range; x++) img->Map[x] = (TIFFRGBValue) (((range - x) * 255) / range); } else { for (x = 0; x <= range; x++) img->Map[x] = (TIFFRGBValue) ((x * 255) / range); } if (img->bitspersample <= 16 && (img->photometric == PHOTOMETRIC_MINISBLACK || img->photometric == PHOTOMETRIC_MINISWHITE)) { /* * Use photometric mapping table to construct * unpacking tables for samples <= 8 bits. */ if (!makebwmap(img)) return (0); /* no longer need Map, free it */ _TIFFfree(img->Map), img->Map = NULL; } return (1); } static int checkcmap(TIFFRGBAImage* img) { uint16* r = img->redcmap; uint16* g = img->greencmap; uint16* b = img->bluecmap; long n = 1L<bitspersample; while (n-- > 0) if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256) return (16); return (8); } static void cvtcmap(TIFFRGBAImage* img) { uint16* r = img->redcmap; uint16* g = img->greencmap; uint16* b = img->bluecmap; long i; for (i = (1L<bitspersample)-1; i >= 0; i--) { #define CVT(x) ((uint16)((x)>>8)) r[i] = CVT(r[i]); g[i] = CVT(g[i]); b[i] = CVT(b[i]); #undef CVT } } /* * Palette images with <= 8 bits/sample are handled * with a table to avoid lots of shifts and masks. The table * is setup so that put*cmaptile (below) can retrieve 8/bitspersample * pixel values simply by indexing into the table with one * number. */ static int makecmap(TIFFRGBAImage* img) { int bitspersample = img->bitspersample; int nsamples = 8 / bitspersample; uint16* r = img->redcmap; uint16* g = img->greencmap; uint16* b = img->bluecmap; uint32 *p; int i; img->PALmap = (uint32**) _TIFFmalloc( 256*sizeof (uint32 *)+(256*nsamples*sizeof(uint32))); if (img->PALmap == NULL) { TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No space for Palette mapping table"); return (0); } p = (uint32*)(img->PALmap + 256); for (i = 0; i < 256; i++) { TIFFRGBValue c; img->PALmap[i] = p; #define CMAP(x) c = (TIFFRGBValue) x; *p++ = PACK(r[c]&0xff, g[c]&0xff, b[c]&0xff); switch (bitspersample) { case 1: CMAP(i>>7); CMAP((i>>6)&1); CMAP((i>>5)&1); CMAP((i>>4)&1); CMAP((i>>3)&1); CMAP((i>>2)&1); CMAP((i>>1)&1); CMAP(i&1); break; case 2: CMAP(i>>6); CMAP((i>>4)&3); CMAP((i>>2)&3); CMAP(i&3); break; case 4: CMAP(i>>4); CMAP(i&0xf); break; case 8: CMAP(i); break; } #undef CMAP } return (1); } /* * Construct any mapping table used * by the associated put routine. */ static int buildMap(TIFFRGBAImage* img) { switch (img->photometric) { case PHOTOMETRIC_RGB: case PHOTOMETRIC_YCBCR: case PHOTOMETRIC_SEPARATED: if (img->bitspersample == 8) break; /* fall thru... */ case PHOTOMETRIC_MINISBLACK: case PHOTOMETRIC_MINISWHITE: if (!setupMap(img)) return (0); break; case PHOTOMETRIC_PALETTE: /* * Convert 16-bit colormap to 8-bit (unless it looks * like an old-style 8-bit colormap). */ if (checkcmap(img) == 16) cvtcmap(img); else TIFFWarningExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "Assuming 8-bit colormap"); /* * Use mapping table and colormap to construct * unpacking tables for samples < 8 bits. */ if (img->bitspersample <= 8 && !makecmap(img)) return (0); break; } return (1); } /* * Select the appropriate conversion routine for packed data. */ static int PickContigCase(TIFFRGBAImage* img) { img->get = TIFFIsTiled(img->tif) ? gtTileContig : gtStripContig; img->put.contig = NULL; switch (img->photometric) { case PHOTOMETRIC_RGB: switch (img->bitspersample) { case 8: if (img->alpha == EXTRASAMPLE_ASSOCALPHA) img->put.contig = putRGBAAcontig8bittile; else if (img->alpha == EXTRASAMPLE_UNASSALPHA) { if (BuildMapUaToAa(img)) img->put.contig = putRGBUAcontig8bittile; } else img->put.contig = putRGBcontig8bittile; break; case 16: if (img->alpha == EXTRASAMPLE_ASSOCALPHA) { if (BuildMapBitdepth16To8(img)) img->put.contig = putRGBAAcontig16bittile; } else if (img->alpha == EXTRASAMPLE_UNASSALPHA) { if (BuildMapBitdepth16To8(img) && BuildMapUaToAa(img)) img->put.contig = putRGBUAcontig16bittile; } else { if (BuildMapBitdepth16To8(img)) img->put.contig = putRGBcontig16bittile; } break; } break; case PHOTOMETRIC_SEPARATED: if (buildMap(img)) { if (img->bitspersample == 8) { if (!img->Map) img->put.contig = putRGBcontig8bitCMYKtile; else img->put.contig = putRGBcontig8bitCMYKMaptile; } } break; case PHOTOMETRIC_PALETTE: if (buildMap(img)) { switch (img->bitspersample) { case 8: img->put.contig = put8bitcmaptile; break; case 4: img->put.contig = put4bitcmaptile; break; case 2: img->put.contig = put2bitcmaptile; break; case 1: img->put.contig = put1bitcmaptile; break; } } break; case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: if (buildMap(img)) { switch (img->bitspersample) { case 16: img->put.contig = put16bitbwtile; break; case 8: if (img->alpha && img->samplesperpixel == 2) img->put.contig = putagreytile; else img->put.contig = putgreytile; break; case 4: img->put.contig = put4bitbwtile; break; case 2: img->put.contig = put2bitbwtile; break; case 1: img->put.contig = put1bitbwtile; break; } } break; case PHOTOMETRIC_YCBCR: if ((img->bitspersample==8) && (img->samplesperpixel==3)) { if (initYCbCrConversion(img)!=0) { /* * The 6.0 spec says that subsampling must be * one of 1, 2, or 4, and that vertical subsampling * must always be <= horizontal subsampling; so * there are only a few possibilities and we just * enumerate the cases. * Joris: added support for the [1,2] case, nonetheless, to accomodate * some OJPEG files */ uint16 SubsamplingHor; uint16 SubsamplingVer; TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING, &SubsamplingHor, &SubsamplingVer); switch ((SubsamplingHor<<4)|SubsamplingVer) { case 0x44: img->put.contig = putcontig8bitYCbCr44tile; break; case 0x42: img->put.contig = putcontig8bitYCbCr42tile; break; case 0x41: img->put.contig = putcontig8bitYCbCr41tile; break; case 0x22: img->put.contig = putcontig8bitYCbCr22tile; break; case 0x21: img->put.contig = putcontig8bitYCbCr21tile; break; case 0x12: img->put.contig = putcontig8bitYCbCr12tile; break; case 0x11: img->put.contig = putcontig8bitYCbCr11tile; break; } } } break; case PHOTOMETRIC_CIELAB: if (buildMap(img)) { if (img->bitspersample == 8) img->put.contig = initCIELabConversion(img); break; } } return ((img->get!=NULL) && (img->put.contig!=NULL)); } /* * Select the appropriate conversion routine for unpacked data. * * NB: we assume that unpacked single channel data is directed * to the "packed routines. */ static int PickSeparateCase(TIFFRGBAImage* img) { img->get = TIFFIsTiled(img->tif) ? gtTileSeparate : gtStripSeparate; img->put.separate = NULL; switch (img->photometric) { case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: /* greyscale images processed pretty much as RGB by gtTileSeparate */ case PHOTOMETRIC_RGB: switch (img->bitspersample) { case 8: if (img->alpha == EXTRASAMPLE_ASSOCALPHA) img->put.separate = putRGBAAseparate8bittile; else if (img->alpha == EXTRASAMPLE_UNASSALPHA) { if (BuildMapUaToAa(img)) img->put.separate = putRGBUAseparate8bittile; } else img->put.separate = putRGBseparate8bittile; break; case 16: if (img->alpha == EXTRASAMPLE_ASSOCALPHA) { if (BuildMapBitdepth16To8(img)) img->put.separate = putRGBAAseparate16bittile; } else if (img->alpha == EXTRASAMPLE_UNASSALPHA) { if (BuildMapBitdepth16To8(img) && BuildMapUaToAa(img)) img->put.separate = putRGBUAseparate16bittile; } else { if (BuildMapBitdepth16To8(img)) img->put.separate = putRGBseparate16bittile; } break; } break; case PHOTOMETRIC_SEPARATED: if (img->bitspersample == 8 && img->samplesperpixel == 4) { img->alpha = 1; // Not alpha, but seems like the only way to get 4th band img->put.separate = putCMYKseparate8bittile; } break; case PHOTOMETRIC_YCBCR: if ((img->bitspersample==8) && (img->samplesperpixel==3)) { if (initYCbCrConversion(img)!=0) { uint16 hs, vs; TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING, &hs, &vs); switch ((hs<<4)|vs) { case 0x11: img->put.separate = putseparate8bitYCbCr11tile; break; /* TODO: add other cases here */ } } } break; } return ((img->get!=NULL) && (img->put.separate!=NULL)); } static int BuildMapUaToAa(TIFFRGBAImage* img) { static const char module[]="BuildMapUaToAa"; uint8* m; uint16 na,nv; assert(img->UaToAa==NULL); img->UaToAa=_TIFFmalloc(65536); if (img->UaToAa==NULL) { TIFFErrorExt(img->tif->tif_clientdata,module,"Out of memory"); return(0); } m=img->UaToAa; for (na=0; na<256; na++) { for (nv=0; nv<256; nv++) *m++=(nv*na+127)/255; } return(1); } static int BuildMapBitdepth16To8(TIFFRGBAImage* img) { static const char module[]="BuildMapBitdepth16To8"; uint8* m; uint32 n; assert(img->Bitdepth16To8==NULL); img->Bitdepth16To8=_TIFFmalloc(65536); if (img->Bitdepth16To8==NULL) { TIFFErrorExt(img->tif->tif_clientdata,module,"Out of memory"); return(0); } m=img->Bitdepth16To8; for (n=0; n<65536; n++) *m++=(n+128)/257; return(1); } /* * Read a whole strip off data from the file, and convert to RGBA form. * If this is the last strip, then it will only contain the portion of * the strip that is actually within the image space. The result is * organized in bottom to top form. */ int TIFFReadRGBAStrip(TIFF* tif, uint32 row, uint32 * raster ) { char emsg[1024] = ""; TIFFRGBAImage img; int ok; uint32 rowsperstrip, rows_to_read; if( TIFFIsTiled( tif ) ) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Can't use TIFFReadRGBAStrip() with tiled file."); return (0); } TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); if( (row % rowsperstrip) != 0 ) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Row passed to TIFFReadRGBAStrip() must be first in a strip."); return (0); } if (TIFFRGBAImageOK(tif, emsg) && TIFFRGBAImageBegin(&img, tif, 0, emsg)) { img.row_offset = row; img.col_offset = 0; if( row + rowsperstrip > img.height ) rows_to_read = img.height - row; else rows_to_read = rowsperstrip; ok = TIFFRGBAImageGet(&img, raster, img.width, rows_to_read ); TIFFRGBAImageEnd(&img); } else { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", emsg); ok = 0; } return (ok); } /* * Read a whole tile off data from the file, and convert to RGBA form. * The returned RGBA data is organized from bottom to top of tile, * and may include zeroed areas if the tile extends off the image. */ int TIFFReadRGBATile(TIFF* tif, uint32 col, uint32 row, uint32 * raster) { char emsg[1024] = ""; TIFFRGBAImage img; int ok; uint32 tile_xsize, tile_ysize; uint32 read_xsize, read_ysize; uint32 i_row; /* * Verify that our request is legal - on a tile file, and on a * tile boundary. */ if( !TIFFIsTiled( tif ) ) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Can't use TIFFReadRGBATile() with stripped file."); return (0); } TIFFGetFieldDefaulted(tif, TIFFTAG_TILEWIDTH, &tile_xsize); TIFFGetFieldDefaulted(tif, TIFFTAG_TILELENGTH, &tile_ysize); if( (col % tile_xsize) != 0 || (row % tile_ysize) != 0 ) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Row/col passed to TIFFReadRGBATile() must be top" "left corner of a tile."); return (0); } /* * Setup the RGBA reader. */ if (!TIFFRGBAImageOK(tif, emsg) || !TIFFRGBAImageBegin(&img, tif, 0, emsg)) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", emsg); return( 0 ); } /* * The TIFFRGBAImageGet() function doesn't allow us to get off the * edge of the image, even to fill an otherwise valid tile. So we * figure out how much we can read, and fix up the tile buffer to * a full tile configuration afterwards. */ if( row + tile_ysize > img.height ) read_ysize = img.height - row; else read_ysize = tile_ysize; if( col + tile_xsize > img.width ) read_xsize = img.width - col; else read_xsize = tile_xsize; /* * Read the chunk of imagery. */ img.row_offset = row; img.col_offset = col; ok = TIFFRGBAImageGet(&img, raster, read_xsize, read_ysize ); TIFFRGBAImageEnd(&img); /* * If our read was incomplete we will need to fix up the tile by * shifting the data around as if a full tile of data is being returned. * * This is all the more complicated because the image is organized in * bottom to top format. */ if( read_xsize == tile_xsize && read_ysize == tile_ysize ) return( ok ); for( i_row = 0; i_row < read_ysize; i_row++ ) { memmove( raster + (tile_ysize - i_row - 1) * tile_xsize, raster + (read_ysize - i_row - 1) * read_xsize, read_xsize * sizeof(uint32) ); _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize+read_xsize, 0, sizeof(uint32) * (tile_xsize - read_xsize) ); } for( i_row = read_ysize; i_row < tile_ysize; i_row++ ) { _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize, 0, sizeof(uint32) * tile_xsize ); } return (ok); } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_codec.c0000644000212300117540000001157511501676264013112 00000000000000/* $Id: tif_codec.c,v 1.15 2010-12-14 12:53:00 dron Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Builtin Compression Scheme Configuration Support. */ #include "tiffiop.h" static int NotConfigured(TIFF*, int); #ifndef LZW_SUPPORT #define TIFFInitLZW NotConfigured #endif #ifndef PACKBITS_SUPPORT #define TIFFInitPackBits NotConfigured #endif #ifndef THUNDER_SUPPORT #define TIFFInitThunderScan NotConfigured #endif #ifndef NEXT_SUPPORT #define TIFFInitNeXT NotConfigured #endif #ifndef JPEG_SUPPORT #define TIFFInitJPEG NotConfigured #endif #ifndef OJPEG_SUPPORT #define TIFFInitOJPEG NotConfigured #endif #ifndef CCITT_SUPPORT #define TIFFInitCCITTRLE NotConfigured #define TIFFInitCCITTRLEW NotConfigured #define TIFFInitCCITTFax3 NotConfigured #define TIFFInitCCITTFax4 NotConfigured #endif #ifndef JBIG_SUPPORT #define TIFFInitJBIG NotConfigured #endif #ifndef ZIP_SUPPORT #define TIFFInitZIP NotConfigured #endif #ifndef PIXARLOG_SUPPORT #define TIFFInitPixarLog NotConfigured #endif #ifndef LOGLUV_SUPPORT #define TIFFInitSGILog NotConfigured #endif #ifndef LZMA_SUPPORT #define TIFFInitLZMA NotConfigured #endif /* * Compression schemes statically built into the library. */ #ifdef VMS const TIFFCodec _TIFFBuiltinCODECS[] = { #else TIFFCodec _TIFFBuiltinCODECS[] = { #endif { "None", COMPRESSION_NONE, TIFFInitDumpMode }, { "LZW", COMPRESSION_LZW, TIFFInitLZW }, { "PackBits", COMPRESSION_PACKBITS, TIFFInitPackBits }, { "ThunderScan", COMPRESSION_THUNDERSCAN,TIFFInitThunderScan }, { "NeXT", COMPRESSION_NEXT, TIFFInitNeXT }, { "JPEG", COMPRESSION_JPEG, TIFFInitJPEG }, { "Old-style JPEG", COMPRESSION_OJPEG, TIFFInitOJPEG }, { "CCITT RLE", COMPRESSION_CCITTRLE, TIFFInitCCITTRLE }, { "CCITT RLE/W", COMPRESSION_CCITTRLEW, TIFFInitCCITTRLEW }, { "CCITT Group 3", COMPRESSION_CCITTFAX3, TIFFInitCCITTFax3 }, { "CCITT Group 4", COMPRESSION_CCITTFAX4, TIFFInitCCITTFax4 }, { "ISO JBIG", COMPRESSION_JBIG, TIFFInitJBIG }, { "Deflate", COMPRESSION_DEFLATE, TIFFInitZIP }, { "AdobeDeflate", COMPRESSION_ADOBE_DEFLATE , TIFFInitZIP }, { "PixarLog", COMPRESSION_PIXARLOG, TIFFInitPixarLog }, { "SGILog", COMPRESSION_SGILOG, TIFFInitSGILog }, { "SGILog24", COMPRESSION_SGILOG24, TIFFInitSGILog }, { "LZMA", COMPRESSION_LZMA, TIFFInitLZMA }, { NULL, 0, NULL } }; static int _notConfigured(TIFF* tif) { const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression); char compression_code[20]; sprintf( compression_code, "%d", tif->tif_dir.td_compression ); TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%s compression support is not configured", c ? c->name : compression_code ); return (0); } static int NotConfigured(TIFF* tif, int scheme) { (void) scheme; tif->tif_fixuptags = _notConfigured; tif->tif_decodestatus = FALSE; tif->tif_setupdecode = _notConfigured; tif->tif_encodestatus = FALSE; tif->tif_setupencode = _notConfigured; return (1); } /************************************************************************/ /* TIFFIsCODECConfigured() */ /************************************************************************/ /** * Check whether we have working codec for the specific coding scheme. * * @return returns 1 if the codec is configured and working. Otherwise * 0 will be returned. */ int TIFFIsCODECConfigured(uint16 scheme) { const TIFFCodec* codec = TIFFFindCODEC(scheme); if(codec == NULL) { return 0; } if(codec->init == NULL) { return 0; } if(codec->init != NotConfigured){ return 1; } return 0; } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_error.c0000644000212300117540000000445711345765560013173 00000000000000/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_error.c,v 1.5 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. */ #include "tiffiop.h" TIFFErrorHandlerExt _TIFFerrorHandlerExt = NULL; TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler handler) { TIFFErrorHandler prev = _TIFFerrorHandler; _TIFFerrorHandler = handler; return (prev); } TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt handler) { TIFFErrorHandlerExt prev = _TIFFerrorHandlerExt; _TIFFerrorHandlerExt = handler; return (prev); } void TIFFError(const char* module, const char* fmt, ...) { va_list ap; va_start(ap, fmt); if (_TIFFerrorHandler) (*_TIFFerrorHandler)(module, fmt, ap); if (_TIFFerrorHandlerExt) (*_TIFFerrorHandlerExt)(0, module, fmt, ap); va_end(ap); } void TIFFErrorExt(thandle_t fd, const char* module, const char* fmt, ...) { va_list ap; va_start(ap, fmt); if (_TIFFerrorHandler) (*_TIFFerrorHandler)(module, fmt, ap); if (_TIFFerrorHandlerExt) (*_TIFFerrorHandlerExt)(fd, module, fmt, ap); va_end(ap); } /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_fax3sm.c0000644000212300117540000031444411345765044013240 00000000000000/* WARNING, this file was automatically generated by the mkg3states program */ #include "tiff.h" #include "tif_fax3.h" const TIFFFaxTabEnt TIFFFaxMainTable[128] = { {12,7,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0}, {5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{5,6,2},{3,1,0},{5,3,1},{3,1,0}, {2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0}, {4,3,1},{3,1,0},{5,7,3},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0}, {1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{4,6,2},{3,1,0}, {5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0},{5,3,1},{3,1,0}, {2,3,0},{3,1,0},{4,3,1},{3,1,0},{6,7,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0}, {4,3,1},{3,1,0},{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0}, {5,6,2},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0}, {5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{4,7,3},{3,1,0},{5,3,1},{3,1,0}, {2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0}, {4,3,1},{3,1,0},{4,6,2},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0}, {1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0} }; const TIFFFaxTabEnt TIFFFaxWhiteTable[4096] = { {12,11,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, {7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, {7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6}, {7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7}, {7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6},{7,8,31},{7,5,8}, {7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, {7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1792},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, {7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16}, {9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128}, {7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1600},{7,4,5}, {7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3}, {7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, {9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5}, {7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4}, {7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6}, {7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3}, {7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15}, {7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5},{7,8,43},{7,6,17}, {9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128}, {7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5}, {7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,768},{7,4,6}, {7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1856},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7}, {7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6},{7,7,19},{7,5,8}, {7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5}, {7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17},{9,9,1408},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14}, {7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16}, {9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128}, {7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5}, {7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3}, {7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9}, {9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5}, {7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4}, {7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6}, {7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3}, {7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15}, {9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17}, {9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {11,12,2112},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, {7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, {7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6}, {7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7}, {7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8}, {7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, {7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, {7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16}, {9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128}, {7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5}, {7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3}, {7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, {9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2368},{7,4,3},{7,5,11},{7,4,5}, {7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4}, {7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6}, {7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3}, {7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15}, {7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17}, {9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128}, {7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5}, {7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6}, {7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7}, {7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8}, {7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5}, {7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14}, {7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16}, {9,9,960},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128}, {7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5}, {7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{11,12,1984},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3}, {7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9}, {9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5}, {7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4}, {7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6}, {7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3}, {7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15}, {9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17}, {9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, {7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, {7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6}, {7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {9,9,1536},{7,4,5},{7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7}, {7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8}, {7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, {7,7,26},{7,5,9},{9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1920},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, {7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16}, {9,9,896},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128}, {7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5}, {7,8,44},{7,6,17},{9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3}, {7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, {9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5}, {7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4}, {7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6}, {7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3}, {7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15}, {7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17}, {9,9,1216},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128}, {7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5}, {7,8,41},{7,6,16},{9,9,960},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6}, {7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2240},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7}, {7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8}, {7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5}, {7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14}, {7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16}, {9,9,1088},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128}, {7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5}, {7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3}, {7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9}, {9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{9,9,1536},{7,4,5},{7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5}, {7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4}, {7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6}, {7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3}, {7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15}, {9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17}, {9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {11,12,2496},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, {7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, {7,8,40},{7,6,16},{9,9,896},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6}, {7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {9,9,1728},{7,4,5},{7,8,44},{7,6,17},{9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7}, {7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8}, {7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, {7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{12,11,0},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, {7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16}, {9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128}, {7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1472},{7,4,5}, {7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3}, {7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, {9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1792},{7,4,3},{7,5,11},{7,4,5}, {7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4}, {7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,832},{7,4,6}, {7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3}, {7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15}, {7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1600},{7,4,5},{7,8,44},{7,6,17}, {9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128}, {7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5}, {7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6}, {7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7}, {7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8}, {7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5}, {7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5},{7,8,43},{7,6,17},{9,9,1280},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14}, {7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16}, {9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,768},{7,4,6},{7,8,37},{9,5,128}, {7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5}, {7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{11,11,1856},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3}, {7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9}, {9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17},{9,9,1408},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5}, {7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4}, {7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1152},{7,4,6}, {7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3}, {7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15}, {9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17}, {9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, {7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, {7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6}, {7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7}, {7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6},{7,8,31},{7,5,8}, {7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, {7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2176},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, {7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16}, {9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128}, {7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1600},{7,4,5}, {7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3}, {7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, {9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5}, {7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4}, {7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6}, {7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3}, {7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15}, {7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5},{7,8,43},{7,6,17}, {9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128}, {7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5}, {7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,768},{7,4,6}, {7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2432},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7}, {7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6},{7,7,19},{7,5,8}, {7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5}, {7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17},{9,9,1408},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14}, {7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16}, {9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128}, {7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5}, {7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3}, {7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9}, {9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5}, {7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4}, {7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6}, {7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3}, {7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15}, {9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17}, {9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {11,12,2048},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, {7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, {7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6}, {7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7}, {7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8}, {7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, {7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, {7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16}, {9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128}, {7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5}, {7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3}, {7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, {9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1920},{7,4,3},{7,5,11},{7,4,5}, {7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4}, {7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6}, {7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3}, {7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15}, {7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17}, {9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128}, {7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5}, {7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6}, {7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7}, {7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8}, {7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5}, {7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14}, {7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16}, {9,9,960},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128}, {7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5}, {7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{11,12,2304},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3}, {7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9}, {9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5}, {7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4}, {7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6}, {7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3}, {7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15}, {9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17}, {9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128}, {7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5}, {7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6}, {7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3}, {9,9,1536},{7,4,5},{7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9}, {9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7}, {7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8}, {7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5}, {7,7,26},{7,5,9},{9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4}, {7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6}, {7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2560},{7,4,3}, {7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14}, {7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16}, {9,9,896},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7}, {7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128}, {7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5}, {7,8,44},{7,6,17},{9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4}, {7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6}, {7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3}, {7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64}, {7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9}, {9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7}, {7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8}, {9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7} }; const TIFFFaxTabEnt TIFFFaxBlackTable[8192] = { {12,11,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,18},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,17},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1792},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,11,23},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,20},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,11,25},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,128},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,56},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,30},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1856},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,57},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,11,21},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,54},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,52},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,48},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {11,12,2112},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,44},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,36},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,384},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,28},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,60},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,40},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2368},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,16},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {10,10,64},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,18},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,10,17},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{11,12,1984},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,50},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,34},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1664},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,26},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1408},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,32},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1920},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,61},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,42},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{10,13,1024},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {10,13,768},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,62},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2240},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,46},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,38},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,512},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,11,19},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,24},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,22},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {11,12,2496},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,10,16},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,0},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,10,64},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{12,11,0},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,10,18},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,17},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1792},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,23},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,20},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,11,25},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{10,12,192},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1280},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,31},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{11,11,1856},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,58},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,11,21},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,896},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,640},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,49},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2176},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,45},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,37},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{10,12,448},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,29},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {10,13,1536},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,41},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2432},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,16},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,10,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,10,64},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,18},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,17},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {11,12,2048},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,51},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,35},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,320},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,27},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,59},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,33},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1920},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,256},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,43},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {10,13,1152},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,55},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,63},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{11,12,2304},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,47},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,39},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,53},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,19},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,24},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,22},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2560},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,10,16},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,0},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{10,10,64},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{12,11,0},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,10,18},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,10,17},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1792},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,23},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,11,20},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,25},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {10,12,128},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,56},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,30},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {11,11,1856},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,57},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,21},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,54},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,52},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,48},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2112},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,44},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,36},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {10,12,384},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,28},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,60},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,40},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{11,12,2368},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,16},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,10,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,10,64},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,18},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,17},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,1984},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,50},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,34},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{10,13,1728},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,26},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {10,13,1472},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,32},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1920},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,61},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,42},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1088},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,832},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,62},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {11,12,2240},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,46},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,38},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,576},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,19},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,11,24},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,22},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2496},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,16},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {10,10,64},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{12,11,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,18},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,10,17},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{11,11,1792},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,23},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,11,20},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,25},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,192},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1344},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,31},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,11,1856},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,58},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,21},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{10,13,960},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {10,13,704},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,49},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2176},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,45},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,37},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,448},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,29},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1600},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,41},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {11,12,2432},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,10,16},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,0},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,10,64},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,10,18},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,17},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2048},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,51},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,35},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {10,12,320},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,27},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,59},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,33},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{11,11,1920},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,12,256},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,43},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,13,1216},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {0,0,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,8,13},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,9,15},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,55},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,63},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2304},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,12,47},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,12,39},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,12,53},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,12},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{0,0,0},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,8,13},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,11,19},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,11,24},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,11,22},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{11,12,2560},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,7,10},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,10,16},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2},{8,10,0},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2}, {8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{10,10,64},{8,2,3}, {8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,9},{8,2,3},{8,3,1},{8,2,2}, {8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,11},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3}, {8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2}, {8,8,14},{8,2,3},{8,3,1},{8,2,2},{8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,6,8},{8,2,3}, {8,3,1},{8,2,2},{8,4,5},{8,2,3},{8,3,4},{8,2,2},{8,7,12},{8,2,3},{8,3,1},{8,2,2}, {8,4,6},{8,2,3},{8,3,4},{8,2,2},{8,5,7},{8,2,3},{8,3,1},{8,2,2},{8,4,5},{8,2,3}, {8,3,4},{8,2,2} }; /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_luv.c0000644000212300117540000012356711545706361012650 00000000000000/* $Id: tif_luv.c,v 1.35 2011-04-02 20:54:09 bfriesen Exp $ */ /* * Copyright (c) 1997 Greg Ward Larson * Copyright (c) 1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler, Greg Larson and Silicon Graphics may not be used in any * advertising or publicity relating to the software without the specific, * prior written permission of Sam Leffler, Greg Larson and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER, GREG LARSON OR SILICON GRAPHICS BE LIABLE * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef LOGLUV_SUPPORT /* * TIFF Library. * LogLuv compression support for high dynamic range images. * * Contributed by Greg Larson. * * LogLuv image support uses the TIFF library to store 16 or 10-bit * log luminance values with 8 bits each of u and v or a 14-bit index. * * The codec can take as input and produce as output 32-bit IEEE float values * as well as 16-bit integer values. A 16-bit luminance is interpreted * as a sign bit followed by a 15-bit integer that is converted * to and from a linear magnitude using the transformation: * * L = 2^( (Le+.5)/256 - 64 ) # real from 15-bit * * Le = floor( 256*(log2(L) + 64) ) # 15-bit from real * * The actual conversion to world luminance units in candelas per sq. meter * requires an additional multiplier, which is stored in the TIFFTAG_STONITS. * This value is usually set such that a reasonable exposure comes from * clamping decoded luminances above 1 to 1 in the displayed image. * * The 16-bit values for u and v may be converted to real values by dividing * each by 32768. (This allows for negative values, which aren't useful as * far as we know, but are left in case of future improvements in human * color vision.) * * Conversion from (u,v), which is actually the CIE (u',v') system for * you color scientists, is accomplished by the following transformation: * * u = 4*x / (-2*x + 12*y + 3) * v = 9*y / (-2*x + 12*y + 3) * * x = 9*u / (6*u - 16*v + 12) * y = 4*v / (6*u - 16*v + 12) * * This process is greatly simplified by passing 32-bit IEEE floats * for each of three CIE XYZ coordinates. The codec then takes care * of conversion to and from LogLuv, though the application is still * responsible for interpreting the TIFFTAG_STONITS calibration factor. * * By definition, a CIE XYZ vector of [1 1 1] corresponds to a neutral white * point of (x,y)=(1/3,1/3). However, most color systems assume some other * white point, such as D65, and an absolute color conversion to XYZ then * to another color space with a different white point may introduce an * unwanted color cast to the image. It is often desirable, therefore, to * perform a white point conversion that maps the input white to [1 1 1] * in XYZ, then record the original white point using the TIFFTAG_WHITEPOINT * tag value. A decoder that demands absolute color calibration may use * this white point tag to get back the original colors, but usually it * will be ignored and the new white point will be used instead that * matches the output color space. * * Pixel information is compressed into one of two basic encodings, depending * on the setting of the compression tag, which is one of COMPRESSION_SGILOG * or COMPRESSION_SGILOG24. For COMPRESSION_SGILOG, greyscale data is * stored as: * * 1 15 * |-+---------------| * * COMPRESSION_SGILOG color data is stored as: * * 1 15 8 8 * |-+---------------|--------+--------| * S Le ue ve * * For the 24-bit COMPRESSION_SGILOG24 color format, the data is stored as: * * 10 14 * |----------|--------------| * Le' Ce * * There is no sign bit in the 24-bit case, and the (u,v) chromaticity is * encoded as an index for optimal color resolution. The 10 log bits are * defined by the following conversions: * * L = 2^((Le'+.5)/64 - 12) # real from 10-bit * * Le' = floor( 64*(log2(L) + 12) ) # 10-bit from real * * The 10 bits of the smaller format may be converted into the 15 bits of * the larger format by multiplying by 4 and adding 13314. Obviously, * a smaller range of magnitudes is covered (about 5 orders of magnitude * instead of 38), and the lack of a sign bit means that negative luminances * are not allowed. (Well, they aren't allowed in the real world, either, * but they are useful for certain types of image processing.) * * The desired user format is controlled by the setting the internal * pseudo tag TIFFTAG_SGILOGDATAFMT to one of: * SGILOGDATAFMT_FLOAT = IEEE 32-bit float XYZ values * SGILOGDATAFMT_16BIT = 16-bit integer encodings of logL, u and v * Raw data i/o is also possible using: * SGILOGDATAFMT_RAW = 32-bit unsigned integer with encoded pixel * In addition, the following decoding is provided for ease of display: * SGILOGDATAFMT_8BIT = 8-bit default RGB gamma-corrected values * * For grayscale images, we provide the following data formats: * SGILOGDATAFMT_FLOAT = IEEE 32-bit float Y values * SGILOGDATAFMT_16BIT = 16-bit integer w/ encoded luminance * SGILOGDATAFMT_8BIT = 8-bit gray monitor values * * Note that the COMPRESSION_SGILOG applies a simple run-length encoding * scheme by separating the logL, u and v bytes for each row and applying * a PackBits type of compression. Since the 24-bit encoding is not * adaptive, the 32-bit color format takes less space in many cases. * * Further control is provided over the conversion from higher-resolution * formats to final encoded values through the pseudo tag * TIFFTAG_SGILOGENCODE: * SGILOGENCODE_NODITHER = do not dither encoded values * SGILOGENCODE_RANDITHER = apply random dithering during encoding * * The default value of this tag is SGILOGENCODE_NODITHER for * COMPRESSION_SGILOG to maximize run-length encoding and * SGILOGENCODE_RANDITHER for COMPRESSION_SGILOG24 to turn * quantization errors into noise. */ #include #include #include /* * State block for each open TIFF * file using LogLuv compression/decompression. */ typedef struct logLuvState LogLuvState; struct logLuvState { int user_datafmt; /* user data format */ int encode_meth; /* encoding method */ int pixel_size; /* bytes per pixel */ uint8* tbuf; /* translation buffer */ tmsize_t tbuflen; /* buffer length */ void (*tfunc)(LogLuvState*, uint8*, tmsize_t); TIFFVSetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ }; #define DecoderState(tif) ((LogLuvState*) (tif)->tif_data) #define EncoderState(tif) ((LogLuvState*) (tif)->tif_data) #define SGILOGDATAFMT_UNKNOWN -1 #define MINRUN 4 /* minimum run length */ /* * Decode a string of 16-bit gray pixels. */ static int LogL16Decode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s) { static const char module[] = "LogL16Decode"; LogLuvState* sp = DecoderState(tif); int shft; tmsize_t i; tmsize_t npixels; unsigned char* bp; int16* tp; int16 b; tmsize_t cc; int rc; assert(s == 0); assert(sp != NULL); npixels = occ / sp->pixel_size; if (sp->user_datafmt == SGILOGDATAFMT_16BIT) tp = (int16*) op; else { assert(sp->tbuflen >= npixels); tp = (int16*) sp->tbuf; } _TIFFmemset((void*) tp, 0, npixels*sizeof (tp[0])); bp = (unsigned char*) tif->tif_rawcp; cc = tif->tif_rawcc; /* get each byte string */ for (shft = 2*8; (shft -= 8) >= 0; ) { for (i = 0; i < npixels && cc > 0; ) if (*bp >= 128) { /* run */ rc = *bp++ + (2-128); /* TODO: potential input buffer overrun when decoding corrupt or truncated data */ b = (int16)(*bp++ << shft); cc -= 2; while (rc-- && i < npixels) tp[i++] |= b; } else { /* non-run */ rc = *bp++; /* nul is noop */ while (--cc && rc-- && i < npixels) tp[i++] |= (int16)*bp++ << shft; } if (i != npixels) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at row %lu (short %I64d pixels)", (unsigned long) tif->tif_row, (unsigned __int64) (npixels - i)); #else TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at row %lu (short %llu pixels)", (unsigned long) tif->tif_row, (unsigned long long) (npixels - i)); #endif tif->tif_rawcp = (uint8*) bp; tif->tif_rawcc = cc; return (0); } } (*sp->tfunc)(sp, op, npixels); tif->tif_rawcp = (uint8*) bp; tif->tif_rawcc = cc; return (1); } /* * Decode a string of 24-bit pixels. */ static int LogLuvDecode24(TIFF* tif, uint8* op, tmsize_t occ, uint16 s) { static const char module[] = "LogLuvDecode24"; LogLuvState* sp = DecoderState(tif); tmsize_t cc; tmsize_t i; tmsize_t npixels; unsigned char* bp; uint32* tp; assert(s == 0); assert(sp != NULL); npixels = occ / sp->pixel_size; if (sp->user_datafmt == SGILOGDATAFMT_RAW) tp = (uint32 *)op; else { assert(sp->tbuflen >= npixels); tp = (uint32 *) sp->tbuf; } /* copy to array of uint32 */ bp = (unsigned char*) tif->tif_rawcp; cc = tif->tif_rawcc; for (i = 0; i < npixels && cc > 0; i++) { tp[i] = bp[0] << 16 | bp[1] << 8 | bp[2]; bp += 3; cc -= 3; } tif->tif_rawcp = (uint8*) bp; tif->tif_rawcc = cc; if (i != npixels) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at row %lu (short %I64d pixels)", (unsigned long) tif->tif_row, (unsigned __int64) (npixels - i)); #else TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at row %lu (short %llu pixels)", (unsigned long) tif->tif_row, (unsigned long long) (npixels - i)); #endif return (0); } (*sp->tfunc)(sp, op, npixels); return (1); } /* * Decode a string of 32-bit pixels. */ static int LogLuvDecode32(TIFF* tif, uint8* op, tmsize_t occ, uint16 s) { static const char module[] = "LogLuvDecode32"; LogLuvState* sp; int shft; tmsize_t i; tmsize_t npixels; unsigned char* bp; uint32* tp; uint32 b; tmsize_t cc; int rc; assert(s == 0); sp = DecoderState(tif); assert(sp != NULL); npixels = occ / sp->pixel_size; if (sp->user_datafmt == SGILOGDATAFMT_RAW) tp = (uint32*) op; else { assert(sp->tbuflen >= npixels); tp = (uint32*) sp->tbuf; } _TIFFmemset((void*) tp, 0, npixels*sizeof (tp[0])); bp = (unsigned char*) tif->tif_rawcp; cc = tif->tif_rawcc; /* get each byte string */ for (shft = 4*8; (shft -= 8) >= 0; ) { for (i = 0; i < npixels && cc > 0; ) if (*bp >= 128) { /* run */ rc = *bp++ + (2-128); b = (uint32)*bp++ << shft; cc -= 2; /* TODO: potential input buffer overrun when decoding corrupt or truncated data */ while (rc-- && i < npixels) tp[i++] |= b; } else { /* non-run */ rc = *bp++; /* nul is noop */ while (--cc && rc-- && i < npixels) tp[i++] |= (uint32)*bp++ << shft; } if (i != npixels) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at row %lu (short %I64d pixels)", (unsigned long) tif->tif_row, (unsigned __int64) (npixels - i)); #else TIFFErrorExt(tif->tif_clientdata, module, "Not enough data at row %lu (short %llu pixels)", (unsigned long) tif->tif_row, (unsigned long long) (npixels - i)); #endif tif->tif_rawcp = (uint8*) bp; tif->tif_rawcc = cc; return (0); } } (*sp->tfunc)(sp, op, npixels); tif->tif_rawcp = (uint8*) bp; tif->tif_rawcc = cc; return (1); } /* * Decode a strip of pixels. We break it into rows to * maintain synchrony with the encode algorithm, which * is row by row. */ static int LogLuvDecodeStrip(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { tmsize_t rowlen = TIFFScanlineSize(tif); assert(cc%rowlen == 0); while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s)) bp += rowlen, cc -= rowlen; return (cc == 0); } /* * Decode a tile of pixels. We break it into rows to * maintain synchrony with the encode algorithm, which * is row by row. */ static int LogLuvDecodeTile(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { tmsize_t rowlen = TIFFTileRowSize(tif); assert(cc%rowlen == 0); while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s)) bp += rowlen, cc -= rowlen; return (cc == 0); } /* * Encode a row of 16-bit pixels. */ static int LogL16Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { LogLuvState* sp = EncoderState(tif); int shft; tmsize_t i; tmsize_t j; tmsize_t npixels; uint8* op; int16* tp; int16 b; tmsize_t occ; int rc=0, mask; tmsize_t beg; assert(s == 0); assert(sp != NULL); npixels = cc / sp->pixel_size; if (sp->user_datafmt == SGILOGDATAFMT_16BIT) tp = (int16*) bp; else { tp = (int16*) sp->tbuf; assert(sp->tbuflen >= npixels); (*sp->tfunc)(sp, bp, npixels); } /* compress each byte string */ op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; for (shft = 2*8; (shft -= 8) >= 0; ) for (i = 0; i < npixels; i += rc) { if (occ < 4) { tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; } mask = 0xff << shft; /* find next run */ for (beg = i; beg < npixels; beg += rc) { b = (int16) (tp[beg] & mask); rc = 1; while (rc < 127+2 && beg+rc < npixels && (tp[beg+rc] & mask) == b) rc++; if (rc >= MINRUN) break; /* long enough */ } if (beg-i > 1 && beg-i < MINRUN) { b = (int16) (tp[i] & mask);/*check short run */ j = i+1; while ((tp[j++] & mask) == b) if (j == beg) { *op++ = (uint8)(128-2+j-i); *op++ = (uint8)(b >> shft); occ -= 2; i = beg; break; } } while (i < beg) { /* write out non-run */ if ((j = beg-i) > 127) j = 127; if (occ < j+3) { tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; } *op++ = (uint8) j; occ--; while (j--) { *op++ = (uint8) (tp[i++] >> shft & 0xff); occ--; } } if (rc >= MINRUN) { /* write out run */ *op++ = (uint8) (128-2+rc); *op++ = (uint8) (tp[beg] >> shft & 0xff); occ -= 2; } else rc = 0; } tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; return (1); } /* * Encode a row of 24-bit pixels. */ static int LogLuvEncode24(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { LogLuvState* sp = EncoderState(tif); tmsize_t i; tmsize_t npixels; tmsize_t occ; uint8* op; uint32* tp; assert(s == 0); assert(sp != NULL); npixels = cc / sp->pixel_size; if (sp->user_datafmt == SGILOGDATAFMT_RAW) tp = (uint32*) bp; else { tp = (uint32*) sp->tbuf; assert(sp->tbuflen >= npixels); (*sp->tfunc)(sp, bp, npixels); } /* write out encoded pixels */ op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; for (i = npixels; i--; ) { if (occ < 3) { tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; } *op++ = (uint8)(*tp >> 16); *op++ = (uint8)(*tp >> 8 & 0xff); *op++ = (uint8)(*tp++ & 0xff); occ -= 3; } tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; return (1); } /* * Encode a row of 32-bit pixels. */ static int LogLuvEncode32(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { LogLuvState* sp = EncoderState(tif); int shft; tmsize_t i; tmsize_t j; tmsize_t npixels; uint8* op; uint32* tp; uint32 b; tmsize_t occ; int rc=0, mask; tmsize_t beg; assert(s == 0); assert(sp != NULL); npixels = cc / sp->pixel_size; if (sp->user_datafmt == SGILOGDATAFMT_RAW) tp = (uint32*) bp; else { tp = (uint32*) sp->tbuf; assert(sp->tbuflen >= npixels); (*sp->tfunc)(sp, bp, npixels); } /* compress each byte string */ op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; for (shft = 4*8; (shft -= 8) >= 0; ) for (i = 0; i < npixels; i += rc) { if (occ < 4) { tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; } mask = 0xff << shft; /* find next run */ for (beg = i; beg < npixels; beg += rc) { b = tp[beg] & mask; rc = 1; while (rc < 127+2 && beg+rc < npixels && (tp[beg+rc] & mask) == b) rc++; if (rc >= MINRUN) break; /* long enough */ } if (beg-i > 1 && beg-i < MINRUN) { b = tp[i] & mask; /* check short run */ j = i+1; while ((tp[j++] & mask) == b) if (j == beg) { *op++ = (uint8)(128-2+j-i); *op++ = (uint8)(b >> shft); occ -= 2; i = beg; break; } } while (i < beg) { /* write out non-run */ if ((j = beg-i) > 127) j = 127; if (occ < j+3) { tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; } *op++ = (uint8) j; occ--; while (j--) { *op++ = (uint8)(tp[i++] >> shft & 0xff); occ--; } } if (rc >= MINRUN) { /* write out run */ *op++ = (uint8) (128-2+rc); *op++ = (uint8)(tp[beg] >> shft & 0xff); occ -= 2; } else rc = 0; } tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; return (1); } /* * Encode a strip of pixels. We break it into rows to * avoid encoding runs across row boundaries. */ static int LogLuvEncodeStrip(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { tmsize_t rowlen = TIFFScanlineSize(tif); assert(cc%rowlen == 0); while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 1) bp += rowlen, cc -= rowlen; return (cc == 0); } /* * Encode a tile of pixels. We break it into rows to * avoid encoding runs across row boundaries. */ static int LogLuvEncodeTile(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) { tmsize_t rowlen = TIFFTileRowSize(tif); assert(cc%rowlen == 0); while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 1) bp += rowlen, cc -= rowlen; return (cc == 0); } /* * Encode/Decode functions for converting to and from user formats. */ #include "uvcode.h" #ifndef UVSCALE #define U_NEU 0.210526316 #define V_NEU 0.473684211 #define UVSCALE 410. #endif #ifndef M_LN2 #define M_LN2 0.69314718055994530942 #endif #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #define log2(x) ((1./M_LN2)*log(x)) #define exp2(x) exp(M_LN2*(x)) #define itrunc(x,m) ((m)==SGILOGENCODE_NODITHER ? \ (int)(x) : \ (int)((x) + rand()*(1./RAND_MAX) - .5)) #if !LOGLUV_PUBLIC static #endif double LogL16toY(int p16) /* compute luminance from 16-bit LogL */ { int Le = p16 & 0x7fff; double Y; if (!Le) return (0.); Y = exp(M_LN2/256.*(Le+.5) - M_LN2*64.); return (!(p16 & 0x8000) ? Y : -Y); } #if !LOGLUV_PUBLIC static #endif int LogL16fromY(double Y, int em) /* get 16-bit LogL from Y */ { if (Y >= 1.8371976e19) return (0x7fff); if (Y <= -1.8371976e19) return (0xffff); if (Y > 5.4136769e-20) return itrunc(256.*(log2(Y) + 64.), em); if (Y < -5.4136769e-20) return (~0x7fff | itrunc(256.*(log2(-Y) + 64.), em)); return (0); } static void L16toY(LogLuvState* sp, uint8* op, tmsize_t n) { int16* l16 = (int16*) sp->tbuf; float* yp = (float*) op; while (n-- > 0) *yp++ = (float)LogL16toY(*l16++); } static void L16toGry(LogLuvState* sp, uint8* op, tmsize_t n) { int16* l16 = (int16*) sp->tbuf; uint8* gp = (uint8*) op; while (n-- > 0) { double Y = LogL16toY(*l16++); *gp++ = (uint8) ((Y <= 0.) ? 0 : (Y >= 1.) ? 255 : (int)(256.*sqrt(Y))); } } static void L16fromY(LogLuvState* sp, uint8* op, tmsize_t n) { int16* l16 = (int16*) sp->tbuf; float* yp = (float*) op; while (n-- > 0) *l16++ = (int16) (LogL16fromY(*yp++, sp->encode_meth)); } #if !LOGLUV_PUBLIC static #endif void XYZtoRGB24(float xyz[3], uint8 rgb[3]) { double r, g, b; /* assume CCIR-709 primaries */ r = 2.690*xyz[0] + -1.276*xyz[1] + -0.414*xyz[2]; g = -1.022*xyz[0] + 1.978*xyz[1] + 0.044*xyz[2]; b = 0.061*xyz[0] + -0.224*xyz[1] + 1.163*xyz[2]; /* assume 2.0 gamma for speed */ /* could use integer sqrt approx., but this is probably faster */ rgb[0] = (uint8)((r<=0.) ? 0 : (r >= 1.) ? 255 : (int)(256.*sqrt(r))); rgb[1] = (uint8)((g<=0.) ? 0 : (g >= 1.) ? 255 : (int)(256.*sqrt(g))); rgb[2] = (uint8)((b<=0.) ? 0 : (b >= 1.) ? 255 : (int)(256.*sqrt(b))); } #if !LOGLUV_PUBLIC static #endif double LogL10toY(int p10) /* compute luminance from 10-bit LogL */ { if (p10 == 0) return (0.); return (exp(M_LN2/64.*(p10+.5) - M_LN2*12.)); } #if !LOGLUV_PUBLIC static #endif int LogL10fromY(double Y, int em) /* get 10-bit LogL from Y */ { if (Y >= 15.742) return (0x3ff); else if (Y <= .00024283) return (0); else return itrunc(64.*(log2(Y) + 12.), em); } #define NANGLES 100 #define uv2ang(u, v) ( (NANGLES*.499999999/M_PI) \ * atan2((v)-V_NEU,(u)-U_NEU) + .5*NANGLES ) static int oog_encode(double u, double v) /* encode out-of-gamut chroma */ { static int oog_table[NANGLES]; static int initialized = 0; register int i; if (!initialized) { /* set up perimeter table */ double eps[NANGLES], ua, va, ang, epsa; int ui, vi, ustep; for (i = NANGLES; i--; ) eps[i] = 2.; for (vi = UV_NVS; vi--; ) { va = UV_VSTART + (vi+.5)*UV_SQSIZ; ustep = uv_row[vi].nus-1; if (vi == UV_NVS-1 || vi == 0 || ustep <= 0) ustep = 1; for (ui = uv_row[vi].nus-1; ui >= 0; ui -= ustep) { ua = uv_row[vi].ustart + (ui+.5)*UV_SQSIZ; ang = uv2ang(ua, va); i = (int) ang; epsa = fabs(ang - (i+.5)); if (epsa < eps[i]) { oog_table[i] = uv_row[vi].ncum + ui; eps[i] = epsa; } } } for (i = NANGLES; i--; ) /* fill any holes */ if (eps[i] > 1.5) { int i1, i2; for (i1 = 1; i1 < NANGLES/2; i1++) if (eps[(i+i1)%NANGLES] < 1.5) break; for (i2 = 1; i2 < NANGLES/2; i2++) if (eps[(i+NANGLES-i2)%NANGLES] < 1.5) break; if (i1 < i2) oog_table[i] = oog_table[(i+i1)%NANGLES]; else oog_table[i] = oog_table[(i+NANGLES-i2)%NANGLES]; } initialized = 1; } i = (int) uv2ang(u, v); /* look up hue angle */ return (oog_table[i]); } #undef uv2ang #undef NANGLES #if !LOGLUV_PUBLIC static #endif int uv_encode(double u, double v, int em) /* encode (u',v') coordinates */ { register int vi, ui; if (v < UV_VSTART) return oog_encode(u, v); vi = itrunc((v - UV_VSTART)*(1./UV_SQSIZ), em); if (vi >= UV_NVS) return oog_encode(u, v); if (u < uv_row[vi].ustart) return oog_encode(u, v); ui = itrunc((u - uv_row[vi].ustart)*(1./UV_SQSIZ), em); if (ui >= uv_row[vi].nus) return oog_encode(u, v); return (uv_row[vi].ncum + ui); } #if !LOGLUV_PUBLIC static #endif int uv_decode(double *up, double *vp, int c) /* decode (u',v') index */ { int upper, lower; register int ui, vi; if (c < 0 || c >= UV_NDIVS) return (-1); lower = 0; /* binary search */ upper = UV_NVS; while (upper - lower > 1) { vi = (lower + upper) >> 1; ui = c - uv_row[vi].ncum; if (ui > 0) lower = vi; else if (ui < 0) upper = vi; else { lower = vi; break; } } vi = lower; ui = c - uv_row[vi].ncum; *up = uv_row[vi].ustart + (ui+.5)*UV_SQSIZ; *vp = UV_VSTART + (vi+.5)*UV_SQSIZ; return (0); } #if !LOGLUV_PUBLIC static #endif void LogLuv24toXYZ(uint32 p, float XYZ[3]) { int Ce; double L, u, v, s, x, y; /* decode luminance */ L = LogL10toY(p>>14 & 0x3ff); if (L <= 0.) { XYZ[0] = XYZ[1] = XYZ[2] = 0.; return; } /* decode color */ Ce = p & 0x3fff; if (uv_decode(&u, &v, Ce) < 0) { u = U_NEU; v = V_NEU; } s = 1./(6.*u - 16.*v + 12.); x = 9.*u * s; y = 4.*v * s; /* convert to XYZ */ XYZ[0] = (float)(x/y * L); XYZ[1] = (float)L; XYZ[2] = (float)((1.-x-y)/y * L); } #if !LOGLUV_PUBLIC static #endif uint32 LogLuv24fromXYZ(float XYZ[3], int em) { int Le, Ce; double u, v, s; /* encode luminance */ Le = LogL10fromY(XYZ[1], em); /* encode color */ s = XYZ[0] + 15.*XYZ[1] + 3.*XYZ[2]; if (!Le || s <= 0.) { u = U_NEU; v = V_NEU; } else { u = 4.*XYZ[0] / s; v = 9.*XYZ[1] / s; } Ce = uv_encode(u, v, em); if (Ce < 0) /* never happens */ Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER); /* combine encodings */ return (Le << 14 | Ce); } static void Luv24toXYZ(LogLuvState* sp, uint8* op, tmsize_t n) { uint32* luv = (uint32*) sp->tbuf; float* xyz = (float*) op; while (n-- > 0) { LogLuv24toXYZ(*luv, xyz); xyz += 3; luv++; } } static void Luv24toLuv48(LogLuvState* sp, uint8* op, tmsize_t n) { uint32* luv = (uint32*) sp->tbuf; int16* luv3 = (int16*) op; while (n-- > 0) { double u, v; *luv3++ = (int16)((*luv >> 12 & 0xffd) + 13314); if (uv_decode(&u, &v, *luv&0x3fff) < 0) { u = U_NEU; v = V_NEU; } *luv3++ = (int16)(u * (1L<<15)); *luv3++ = (int16)(v * (1L<<15)); luv++; } } static void Luv24toRGB(LogLuvState* sp, uint8* op, tmsize_t n) { uint32* luv = (uint32*) sp->tbuf; uint8* rgb = (uint8*) op; while (n-- > 0) { float xyz[3]; LogLuv24toXYZ(*luv++, xyz); XYZtoRGB24(xyz, rgb); rgb += 3; } } static void Luv24fromXYZ(LogLuvState* sp, uint8* op, tmsize_t n) { uint32* luv = (uint32*) sp->tbuf; float* xyz = (float*) op; while (n-- > 0) { *luv++ = LogLuv24fromXYZ(xyz, sp->encode_meth); xyz += 3; } } static void Luv24fromLuv48(LogLuvState* sp, uint8* op, tmsize_t n) { uint32* luv = (uint32*) sp->tbuf; int16* luv3 = (int16*) op; while (n-- > 0) { int Le, Ce; if (luv3[0] <= 0) Le = 0; else if (luv3[0] >= (1<<12)+3314) Le = (1<<10) - 1; else if (sp->encode_meth == SGILOGENCODE_NODITHER) Le = (luv3[0]-3314) >> 2; else Le = itrunc(.25*(luv3[0]-3314.), sp->encode_meth); Ce = uv_encode((luv3[1]+.5)/(1<<15), (luv3[2]+.5)/(1<<15), sp->encode_meth); if (Ce < 0) /* never happens */ Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER); *luv++ = (uint32)Le << 14 | Ce; luv3 += 3; } } #if !LOGLUV_PUBLIC static #endif void LogLuv32toXYZ(uint32 p, float XYZ[3]) { double L, u, v, s, x, y; /* decode luminance */ L = LogL16toY((int)p >> 16); if (L <= 0.) { XYZ[0] = XYZ[1] = XYZ[2] = 0.; return; } /* decode color */ u = 1./UVSCALE * ((p>>8 & 0xff) + .5); v = 1./UVSCALE * ((p & 0xff) + .5); s = 1./(6.*u - 16.*v + 12.); x = 9.*u * s; y = 4.*v * s; /* convert to XYZ */ XYZ[0] = (float)(x/y * L); XYZ[1] = (float)L; XYZ[2] = (float)((1.-x-y)/y * L); } #if !LOGLUV_PUBLIC static #endif uint32 LogLuv32fromXYZ(float XYZ[3], int em) { unsigned int Le, ue, ve; double u, v, s; /* encode luminance */ Le = (unsigned int)LogL16fromY(XYZ[1], em); /* encode color */ s = XYZ[0] + 15.*XYZ[1] + 3.*XYZ[2]; if (!Le || s <= 0.) { u = U_NEU; v = V_NEU; } else { u = 4.*XYZ[0] / s; v = 9.*XYZ[1] / s; } if (u <= 0.) ue = 0; else ue = itrunc(UVSCALE*u, em); if (ue > 255) ue = 255; if (v <= 0.) ve = 0; else ve = itrunc(UVSCALE*v, em); if (ve > 255) ve = 255; /* combine encodings */ return (Le << 16 | ue << 8 | ve); } static void Luv32toXYZ(LogLuvState* sp, uint8* op, tmsize_t n) { uint32* luv = (uint32*) sp->tbuf; float* xyz = (float*) op; while (n-- > 0) { LogLuv32toXYZ(*luv++, xyz); xyz += 3; } } static void Luv32toLuv48(LogLuvState* sp, uint8* op, tmsize_t n) { uint32* luv = (uint32*) sp->tbuf; int16* luv3 = (int16*) op; while (n-- > 0) { double u, v; *luv3++ = (int16)(*luv >> 16); u = 1./UVSCALE * ((*luv>>8 & 0xff) + .5); v = 1./UVSCALE * ((*luv & 0xff) + .5); *luv3++ = (int16)(u * (1L<<15)); *luv3++ = (int16)(v * (1L<<15)); luv++; } } static void Luv32toRGB(LogLuvState* sp, uint8* op, tmsize_t n) { uint32* luv = (uint32*) sp->tbuf; uint8* rgb = (uint8*) op; while (n-- > 0) { float xyz[3]; LogLuv32toXYZ(*luv++, xyz); XYZtoRGB24(xyz, rgb); rgb += 3; } } static void Luv32fromXYZ(LogLuvState* sp, uint8* op, tmsize_t n) { uint32* luv = (uint32*) sp->tbuf; float* xyz = (float*) op; while (n-- > 0) { *luv++ = LogLuv32fromXYZ(xyz, sp->encode_meth); xyz += 3; } } static void Luv32fromLuv48(LogLuvState* sp, uint8* op, tmsize_t n) { uint32* luv = (uint32*) sp->tbuf; int16* luv3 = (int16*) op; if (sp->encode_meth == SGILOGENCODE_NODITHER) { while (n-- > 0) { *luv++ = (uint32)luv3[0] << 16 | (luv3[1]*(uint32)(UVSCALE+.5) >> 7 & 0xff00) | (luv3[2]*(uint32)(UVSCALE+.5) >> 15 & 0xff); luv3 += 3; } return; } while (n-- > 0) { *luv++ = (uint32)luv3[0] << 16 | (itrunc(luv3[1]*(UVSCALE/(1<<15)), sp->encode_meth) << 8 & 0xff00) | (itrunc(luv3[2]*(UVSCALE/(1<<15)), sp->encode_meth) & 0xff); luv3 += 3; } } static void _logLuvNop(LogLuvState* sp, uint8* op, tmsize_t n) { (void) sp; (void) op; (void) n; } static int LogL16GuessDataFmt(TIFFDirectory *td) { #define PACK(s,b,f) (((b)<<6)|((s)<<3)|(f)) switch (PACK(td->td_samplesperpixel, td->td_bitspersample, td->td_sampleformat)) { case PACK(1, 32, SAMPLEFORMAT_IEEEFP): return (SGILOGDATAFMT_FLOAT); case PACK(1, 16, SAMPLEFORMAT_VOID): case PACK(1, 16, SAMPLEFORMAT_INT): case PACK(1, 16, SAMPLEFORMAT_UINT): return (SGILOGDATAFMT_16BIT); case PACK(1, 8, SAMPLEFORMAT_VOID): case PACK(1, 8, SAMPLEFORMAT_UINT): return (SGILOGDATAFMT_8BIT); } #undef PACK return (SGILOGDATAFMT_UNKNOWN); } static tmsize_t multiply_ms(tmsize_t m1, tmsize_t m2) { tmsize_t bytes = m1 * m2; if (m1 && bytes / m1 != m2) bytes = 0; return bytes; } static int LogL16InitState(TIFF* tif) { static const char module[] = "LogL16InitState"; TIFFDirectory *td = &tif->tif_dir; LogLuvState* sp = DecoderState(tif); assert(sp != NULL); assert(td->td_photometric == PHOTOMETRIC_LOGL); /* for some reason, we can't do this in TIFFInitLogL16 */ if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN) sp->user_datafmt = LogL16GuessDataFmt(td); switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->pixel_size = sizeof (float); break; case SGILOGDATAFMT_16BIT: sp->pixel_size = sizeof (int16); break; case SGILOGDATAFMT_8BIT: sp->pixel_size = sizeof (uint8); break; default: TIFFErrorExt(tif->tif_clientdata, module, "No support for converting user data format to LogL"); return (0); } if( isTiled(tif) ) sp->tbuflen = multiply_ms(td->td_tilewidth, td->td_tilelength); else sp->tbuflen = multiply_ms(td->td_imagewidth, td->td_rowsperstrip); if (multiply_ms(sp->tbuflen, sizeof (int16)) == 0 || (sp->tbuf = (uint8*) _TIFFmalloc(sp->tbuflen * sizeof (int16))) == NULL) { TIFFErrorExt(tif->tif_clientdata, module, "No space for SGILog translation buffer"); return (0); } return (1); } static int LogLuvGuessDataFmt(TIFFDirectory *td) { int guess; /* * If the user didn't tell us their datafmt, * take our best guess from the bitspersample. */ #define PACK(a,b) (((a)<<3)|(b)) switch (PACK(td->td_bitspersample, td->td_sampleformat)) { case PACK(32, SAMPLEFORMAT_IEEEFP): guess = SGILOGDATAFMT_FLOAT; break; case PACK(32, SAMPLEFORMAT_VOID): case PACK(32, SAMPLEFORMAT_UINT): case PACK(32, SAMPLEFORMAT_INT): guess = SGILOGDATAFMT_RAW; break; case PACK(16, SAMPLEFORMAT_VOID): case PACK(16, SAMPLEFORMAT_INT): case PACK(16, SAMPLEFORMAT_UINT): guess = SGILOGDATAFMT_16BIT; break; case PACK( 8, SAMPLEFORMAT_VOID): case PACK( 8, SAMPLEFORMAT_UINT): guess = SGILOGDATAFMT_8BIT; break; default: guess = SGILOGDATAFMT_UNKNOWN; break; #undef PACK } /* * Double-check samples per pixel. */ switch (td->td_samplesperpixel) { case 1: if (guess != SGILOGDATAFMT_RAW) guess = SGILOGDATAFMT_UNKNOWN; break; case 3: if (guess == SGILOGDATAFMT_RAW) guess = SGILOGDATAFMT_UNKNOWN; break; default: guess = SGILOGDATAFMT_UNKNOWN; break; } return (guess); } static int LogLuvInitState(TIFF* tif) { static const char module[] = "LogLuvInitState"; TIFFDirectory* td = &tif->tif_dir; LogLuvState* sp = DecoderState(tif); assert(sp != NULL); assert(td->td_photometric == PHOTOMETRIC_LOGLUV); /* for some reason, we can't do this in TIFFInitLogLuv */ if (td->td_planarconfig != PLANARCONFIG_CONTIG) { TIFFErrorExt(tif->tif_clientdata, module, "SGILog compression cannot handle non-contiguous data"); return (0); } if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN) sp->user_datafmt = LogLuvGuessDataFmt(td); switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->pixel_size = 3*sizeof (float); break; case SGILOGDATAFMT_16BIT: sp->pixel_size = 3*sizeof (int16); break; case SGILOGDATAFMT_RAW: sp->pixel_size = sizeof (uint32); break; case SGILOGDATAFMT_8BIT: sp->pixel_size = 3*sizeof (uint8); break; default: TIFFErrorExt(tif->tif_clientdata, module, "No support for converting user data format to LogLuv"); return (0); } if( isTiled(tif) ) sp->tbuflen = multiply_ms(td->td_tilewidth, td->td_tilelength); else sp->tbuflen = multiply_ms(td->td_imagewidth, td->td_rowsperstrip); if (multiply_ms(sp->tbuflen, sizeof (uint32)) == 0 || (sp->tbuf = (uint8*) _TIFFmalloc(sp->tbuflen * sizeof (uint32))) == NULL) { TIFFErrorExt(tif->tif_clientdata, module, "No space for SGILog translation buffer"); return (0); } return (1); } static int LogLuvFixupTags(TIFF* tif) { (void) tif; return (1); } static int LogLuvSetupDecode(TIFF* tif) { static const char module[] = "LogLuvSetupDecode"; LogLuvState* sp = DecoderState(tif); TIFFDirectory* td = &tif->tif_dir; tif->tif_postdecode = _TIFFNoPostDecode; switch (td->td_photometric) { case PHOTOMETRIC_LOGLUV: if (!LogLuvInitState(tif)) break; if (td->td_compression == COMPRESSION_SGILOG24) { tif->tif_decoderow = LogLuvDecode24; switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->tfunc = Luv24toXYZ; break; case SGILOGDATAFMT_16BIT: sp->tfunc = Luv24toLuv48; break; case SGILOGDATAFMT_8BIT: sp->tfunc = Luv24toRGB; break; } } else { tif->tif_decoderow = LogLuvDecode32; switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->tfunc = Luv32toXYZ; break; case SGILOGDATAFMT_16BIT: sp->tfunc = Luv32toLuv48; break; case SGILOGDATAFMT_8BIT: sp->tfunc = Luv32toRGB; break; } } return (1); case PHOTOMETRIC_LOGL: if (!LogL16InitState(tif)) break; tif->tif_decoderow = LogL16Decode; switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->tfunc = L16toY; break; case SGILOGDATAFMT_8BIT: sp->tfunc = L16toGry; break; } return (1); default: TIFFErrorExt(tif->tif_clientdata, module, "Inappropriate photometric interpretation %d for SGILog compression; %s", td->td_photometric, "must be either LogLUV or LogL"); break; } return (0); } static int LogLuvSetupEncode(TIFF* tif) { static const char module[] = "LogLuvSetupEncode"; LogLuvState* sp = EncoderState(tif); TIFFDirectory* td = &tif->tif_dir; switch (td->td_photometric) { case PHOTOMETRIC_LOGLUV: if (!LogLuvInitState(tif)) break; if (td->td_compression == COMPRESSION_SGILOG24) { tif->tif_encoderow = LogLuvEncode24; switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->tfunc = Luv24fromXYZ; break; case SGILOGDATAFMT_16BIT: sp->tfunc = Luv24fromLuv48; break; case SGILOGDATAFMT_RAW: break; default: goto notsupported; } } else { tif->tif_encoderow = LogLuvEncode32; switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->tfunc = Luv32fromXYZ; break; case SGILOGDATAFMT_16BIT: sp->tfunc = Luv32fromLuv48; break; case SGILOGDATAFMT_RAW: break; default: goto notsupported; } } break; case PHOTOMETRIC_LOGL: if (!LogL16InitState(tif)) break; tif->tif_encoderow = LogL16Encode; switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->tfunc = L16fromY; break; case SGILOGDATAFMT_16BIT: break; default: goto notsupported; } break; default: TIFFErrorExt(tif->tif_clientdata, module, "Inappropriate photometric interpretation %d for SGILog compression; %s", td->td_photometric, "must be either LogLUV or LogL"); break; } return (1); notsupported: TIFFErrorExt(tif->tif_clientdata, module, "SGILog compression supported only for %s, or raw data", td->td_photometric == PHOTOMETRIC_LOGL ? "Y, L" : "XYZ, Luv"); return (0); } static void LogLuvClose(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; /* * For consistency, we always want to write out the same * bitspersample and sampleformat for our TIFF file, * regardless of the data format being used by the application. * Since this routine is called after tags have been set but * before they have been recorded in the file, we reset them here. */ td->td_samplesperpixel = (td->td_photometric == PHOTOMETRIC_LOGL) ? 1 : 3; td->td_bitspersample = 16; td->td_sampleformat = SAMPLEFORMAT_INT; } static void LogLuvCleanup(TIFF* tif) { LogLuvState* sp = (LogLuvState *)tif->tif_data; assert(sp != 0); tif->tif_tagmethods.vgetfield = sp->vgetparent; tif->tif_tagmethods.vsetfield = sp->vsetparent; if (sp->tbuf) _TIFFfree(sp->tbuf); _TIFFfree(sp); tif->tif_data = NULL; _TIFFSetDefaultCompressionState(tif); } static int LogLuvVSetField(TIFF* tif, uint32 tag, va_list ap) { static const char module[] = "LogLuvVSetField"; LogLuvState* sp = DecoderState(tif); int bps, fmt; switch (tag) { case TIFFTAG_SGILOGDATAFMT: sp->user_datafmt = (int) va_arg(ap, int); /* * Tweak the TIFF header so that the rest of libtiff knows what * size of data will be passed between app and library, and * assume that the app knows what it is doing and is not * confused by these header manipulations... */ switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: bps = 32, fmt = SAMPLEFORMAT_IEEEFP; break; case SGILOGDATAFMT_16BIT: bps = 16, fmt = SAMPLEFORMAT_INT; break; case SGILOGDATAFMT_RAW: bps = 32, fmt = SAMPLEFORMAT_UINT; TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1); break; case SGILOGDATAFMT_8BIT: bps = 8, fmt = SAMPLEFORMAT_UINT; break; default: TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Unknown data format %d for LogLuv compression", sp->user_datafmt); return (0); } TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, fmt); /* * Must recalculate sizes should bits/sample change. */ tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tmsize_t) -1; tif->tif_scanlinesize = TIFFScanlineSize(tif); return (1); case TIFFTAG_SGILOGENCODE: sp->encode_meth = (int) va_arg(ap, int); if (sp->encode_meth != SGILOGENCODE_NODITHER && sp->encode_meth != SGILOGENCODE_RANDITHER) { TIFFErrorExt(tif->tif_clientdata, module, "Unknown encoding %d for LogLuv compression", sp->encode_meth); return (0); } return (1); default: return (*sp->vsetparent)(tif, tag, ap); } } static int LogLuvVGetField(TIFF* tif, uint32 tag, va_list ap) { LogLuvState *sp = (LogLuvState *)tif->tif_data; switch (tag) { case TIFFTAG_SGILOGDATAFMT: *va_arg(ap, int*) = sp->user_datafmt; return (1); default: return (*sp->vgetparent)(tif, tag, ap); } } static const TIFFField LogLuvFields[] = { { TIFFTAG_SGILOGDATAFMT, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "SGILogDataFmt", NULL}, { TIFFTAG_SGILOGENCODE, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "SGILogEncode", NULL} }; int TIFFInitSGILog(TIFF* tif, int scheme) { static const char module[] = "TIFFInitSGILog"; LogLuvState* sp; assert(scheme == COMPRESSION_SGILOG24 || scheme == COMPRESSION_SGILOG); /* * Merge codec-specific tag information. */ if (!_TIFFMergeFields(tif, LogLuvFields, TIFFArrayCount(LogLuvFields))) { TIFFErrorExt(tif->tif_clientdata, module, "Merging SGILog codec-specific tags failed"); return 0; } /* * Allocate state block so tag methods have storage to record values. */ tif->tif_data = (uint8*) _TIFFmalloc(sizeof (LogLuvState)); if (tif->tif_data == NULL) goto bad; sp = (LogLuvState*) tif->tif_data; _TIFFmemset((void*)sp, 0, sizeof (*sp)); sp->user_datafmt = SGILOGDATAFMT_UNKNOWN; sp->encode_meth = (scheme == COMPRESSION_SGILOG24) ? SGILOGENCODE_RANDITHER : SGILOGENCODE_NODITHER; sp->tfunc = _logLuvNop; /* * Install codec methods. * NB: tif_decoderow & tif_encoderow are filled * in at setup time. */ tif->tif_fixuptags = LogLuvFixupTags; tif->tif_setupdecode = LogLuvSetupDecode; tif->tif_decodestrip = LogLuvDecodeStrip; tif->tif_decodetile = LogLuvDecodeTile; tif->tif_setupencode = LogLuvSetupEncode; tif->tif_encodestrip = LogLuvEncodeStrip; tif->tif_encodetile = LogLuvEncodeTile; tif->tif_close = LogLuvClose; tif->tif_cleanup = LogLuvCleanup; /* * Override parent get/set field methods. */ sp->vgetparent = tif->tif_tagmethods.vgetfield; tif->tif_tagmethods.vgetfield = LogLuvVGetField; /* hook for codec tags */ sp->vsetparent = tif->tif_tagmethods.vsetfield; tif->tif_tagmethods.vsetfield = LogLuvVSetField; /* hook for codec tags */ return (1); bad: TIFFErrorExt(tif->tif_clientdata, module, "%s: No space for LogLuv state block", tif->tif_name); return (0); } #endif /* LOGLUV_SUPPORT */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_aux.c0000644000212300117540000002216011415374157012622 00000000000000/* $Id: tif_aux.c,v 1.26 2010-07-01 15:33:28 dron Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Auxiliary Support Routines. */ #include "tiffiop.h" #include "tif_predict.h" #include uint32 _TIFFMultiply32(TIFF* tif, uint32 first, uint32 second, const char* where) { uint32 bytes = first * second; if (second && bytes / second != first) { TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where); bytes = 0; } return bytes; } uint64 _TIFFMultiply64(TIFF* tif, uint64 first, uint64 second, const char* where) { uint64 bytes = first * second; if (second && bytes / second != first) { TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where); bytes = 0; } return bytes; } void* _TIFFCheckRealloc(TIFF* tif, void* buffer, tmsize_t nmemb, tmsize_t elem_size, const char* what) { void* cp = NULL; tmsize_t bytes = nmemb * elem_size; /* * XXX: Check for integer overflow. */ if (nmemb && elem_size && bytes / elem_size == nmemb) cp = _TIFFrealloc(buffer, bytes); if (cp == NULL) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Failed to allocate memory for %s " "(%ld elements of %ld bytes each)", what,(long) nmemb, (long) elem_size); } return cp; } void* _TIFFCheckMalloc(TIFF* tif, tmsize_t nmemb, tmsize_t elem_size, const char* what) { return _TIFFCheckRealloc(tif, NULL, nmemb, elem_size, what); } static int TIFFDefaultTransferFunction(TIFFDirectory* td) { uint16 **tf = td->td_transferfunction; tmsize_t i, n, nbytes; tf[0] = tf[1] = tf[2] = 0; if (td->td_bitspersample >= sizeof(tmsize_t) * 8 - 2) return 0; n = ((tmsize_t)1)<td_bitspersample; nbytes = n * sizeof (uint16); if (!(tf[0] = (uint16 *)_TIFFmalloc(nbytes))) return 0; tf[0][0] = 0; for (i = 1; i < n; i++) { double t = (double)i/((double) n-1.); tf[0][i] = (uint16)floor(65535.*pow(t, 2.2) + .5); } if (td->td_samplesperpixel - td->td_extrasamples > 1) { if (!(tf[1] = (uint16 *)_TIFFmalloc(nbytes))) goto bad; _TIFFmemcpy(tf[1], tf[0], nbytes); if (!(tf[2] = (uint16 *)_TIFFmalloc(nbytes))) goto bad; _TIFFmemcpy(tf[2], tf[0], nbytes); } return 1; bad: if (tf[0]) _TIFFfree(tf[0]); if (tf[1]) _TIFFfree(tf[1]); if (tf[2]) _TIFFfree(tf[2]); tf[0] = tf[1] = tf[2] = 0; return 0; } static int TIFFDefaultRefBlackWhite(TIFFDirectory* td) { int i; if (!(td->td_refblackwhite = (float *)_TIFFmalloc(6*sizeof (float)))) return 0; if (td->td_photometric == PHOTOMETRIC_YCBCR) { /* * YCbCr (Class Y) images must have the ReferenceBlackWhite * tag set. Fix the broken images, which lacks that tag. */ td->td_refblackwhite[0] = 0.0F; td->td_refblackwhite[1] = td->td_refblackwhite[3] = td->td_refblackwhite[5] = 255.0F; td->td_refblackwhite[2] = td->td_refblackwhite[4] = 128.0F; } else { /* * Assume RGB (Class R) */ for (i = 0; i < 3; i++) { td->td_refblackwhite[2*i+0] = 0; td->td_refblackwhite[2*i+1] = (float)((1L<td_bitspersample)-1L); } } return 1; } /* * Like TIFFGetField, but return any default * value if the tag is not present in the directory. * * NB: We use the value in the directory, rather than * explcit values so that defaults exist only one * place in the library -- in TIFFDefaultDirectory. */ int TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap) { TIFFDirectory *td = &tif->tif_dir; if (TIFFVGetField(tif, tag, ap)) return (1); switch (tag) { case TIFFTAG_SUBFILETYPE: *va_arg(ap, uint32 *) = td->td_subfiletype; return (1); case TIFFTAG_BITSPERSAMPLE: *va_arg(ap, uint16 *) = td->td_bitspersample; return (1); case TIFFTAG_THRESHHOLDING: *va_arg(ap, uint16 *) = td->td_threshholding; return (1); case TIFFTAG_FILLORDER: *va_arg(ap, uint16 *) = td->td_fillorder; return (1); case TIFFTAG_ORIENTATION: *va_arg(ap, uint16 *) = td->td_orientation; return (1); case TIFFTAG_SAMPLESPERPIXEL: *va_arg(ap, uint16 *) = td->td_samplesperpixel; return (1); case TIFFTAG_ROWSPERSTRIP: *va_arg(ap, uint32 *) = td->td_rowsperstrip; return (1); case TIFFTAG_MINSAMPLEVALUE: *va_arg(ap, uint16 *) = td->td_minsamplevalue; return (1); case TIFFTAG_MAXSAMPLEVALUE: *va_arg(ap, uint16 *) = td->td_maxsamplevalue; return (1); case TIFFTAG_PLANARCONFIG: *va_arg(ap, uint16 *) = td->td_planarconfig; return (1); case TIFFTAG_RESOLUTIONUNIT: *va_arg(ap, uint16 *) = td->td_resolutionunit; return (1); case TIFFTAG_PREDICTOR: { TIFFPredictorState* sp = (TIFFPredictorState*) tif->tif_data; *va_arg(ap, uint16*) = (uint16) sp->predictor; return 1; } case TIFFTAG_DOTRANGE: *va_arg(ap, uint16 *) = 0; *va_arg(ap, uint16 *) = (1<td_bitspersample)-1; return (1); case TIFFTAG_INKSET: *va_arg(ap, uint16 *) = INKSET_CMYK; return 1; case TIFFTAG_NUMBEROFINKS: *va_arg(ap, uint16 *) = 4; return (1); case TIFFTAG_EXTRASAMPLES: *va_arg(ap, uint16 *) = td->td_extrasamples; *va_arg(ap, uint16 **) = td->td_sampleinfo; return (1); case TIFFTAG_MATTEING: *va_arg(ap, uint16 *) = (td->td_extrasamples == 1 && td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA); return (1); case TIFFTAG_TILEDEPTH: *va_arg(ap, uint32 *) = td->td_tiledepth; return (1); case TIFFTAG_DATATYPE: *va_arg(ap, uint16 *) = td->td_sampleformat-1; return (1); case TIFFTAG_SAMPLEFORMAT: *va_arg(ap, uint16 *) = td->td_sampleformat; return(1); case TIFFTAG_IMAGEDEPTH: *va_arg(ap, uint32 *) = td->td_imagedepth; return (1); case TIFFTAG_YCBCRCOEFFICIENTS: { /* defaults are from CCIR Recommendation 601-1 */ static float ycbcrcoeffs[] = { 0.299f, 0.587f, 0.114f }; *va_arg(ap, float **) = ycbcrcoeffs; return 1; } case TIFFTAG_YCBCRSUBSAMPLING: *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[0]; *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[1]; return (1); case TIFFTAG_YCBCRPOSITIONING: *va_arg(ap, uint16 *) = td->td_ycbcrpositioning; return (1); case TIFFTAG_WHITEPOINT: { static float whitepoint[2]; /* TIFF 6.0 specification tells that it is no default value for the WhitePoint, but AdobePhotoshop TIFF Technical Note tells that it should be CIE D50. */ whitepoint[0] = D50_X0 / (D50_X0 + D50_Y0 + D50_Z0); whitepoint[1] = D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0); *va_arg(ap, float **) = whitepoint; return 1; } case TIFFTAG_TRANSFERFUNCTION: if (!td->td_transferfunction[0] && !TIFFDefaultTransferFunction(td)) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "No space for \"TransferFunction\" tag"); return (0); } *va_arg(ap, uint16 **) = td->td_transferfunction[0]; if (td->td_samplesperpixel - td->td_extrasamples > 1) { *va_arg(ap, uint16 **) = td->td_transferfunction[1]; *va_arg(ap, uint16 **) = td->td_transferfunction[2]; } return (1); case TIFFTAG_REFERENCEBLACKWHITE: if (!td->td_refblackwhite && !TIFFDefaultRefBlackWhite(td)) return (0); *va_arg(ap, float **) = td->td_refblackwhite; return (1); } return 0; } /* * Like TIFFGetField, but return any default * value if the tag is not present in the directory. */ int TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...) { int ok; va_list ap; va_start(ap, tag); ok = TIFFVGetFieldDefaulted(tif, tag, ap); va_end(ap); return (ok); } struct _Int64Parts { int32 low, high; }; typedef union { struct _Int64Parts part; int64 value; } _Int64; float _TIFFUInt64ToFloat(uint64 ui64) { _Int64 i; i.value = ui64; if (i.part.high >= 0) { return (float)i.value; } else { long double df; df = (long double)i.value; df += 18446744073709551616.0; /* adding 2**64 */ return (float)df; } } double _TIFFUInt64ToDouble(uint64 ui64) { _Int64 i; i.value = ui64; if (i.part.high >= 0) { return (double)i.value; } else { long double df; df = (long double)i.value; df += 18446744073709551616.0; /* adding 2**64 */ return (double)df; } } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_predict.h0000644000212300117540000000546611345765561013503 00000000000000/* $Id: tif_predict.h,v 1.8 2010-03-10 18:56:49 bfriesen Exp $ */ /* * Copyright (c) 1995-1997 Sam Leffler * Copyright (c) 1995-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFFPREDICT_ #define _TIFFPREDICT_ /* * ``Library-private'' Support for the Predictor Tag */ /* * Codecs that want to support the Predictor tag must place * this structure first in their private state block so that * the predictor code can cast tif_data to find its state. */ typedef struct { int predictor; /* predictor tag value */ tmsize_t stride; /* sample stride over data */ tmsize_t rowsize; /* tile/strip row size */ TIFFCodeMethod encoderow; /* parent codec encode/decode row */ TIFFCodeMethod encodestrip; /* parent codec encode/decode strip */ TIFFCodeMethod encodetile; /* parent codec encode/decode tile */ TIFFPostMethod encodepfunc; /* horizontal differencer */ TIFFCodeMethod decoderow; /* parent codec encode/decode row */ TIFFCodeMethod decodestrip; /* parent codec encode/decode strip */ TIFFCodeMethod decodetile; /* parent codec encode/decode tile */ TIFFPostMethod decodepfunc; /* horizontal accumulator */ TIFFVGetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ TIFFPrintMethod printdir; /* super-class method */ TIFFBoolMethod setupdecode; /* super-class method */ TIFFBoolMethod setupencode; /* super-class method */ } TIFFPredictorState; #if defined(__cplusplus) extern "C" { #endif extern int TIFFPredictorInit(TIFF*); extern int TIFFPredictorCleanup(TIFF*); #if defined(__cplusplus) } #endif #endif /* _TIFFPREDICT_ */ /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/libtiff.def0000644000212300117540000000546512005263022013107 00000000000000EXPORTS TIFFOpen TIFFOpenW TIFFGetVersion TIFFCleanup TIFFClose TIFFFlush TIFFFlushData TIFFGetField TIFFVGetField TIFFGetFieldDefaulted TIFFVGetFieldDefaulted TIFFGetTagListEntry TIFFGetTagListCount TIFFReadDirectory TIFFScanlineSize64 TIFFScanlineSize TIFFStripSize64 TIFFStripSize TIFFVStripSize64 TIFFVStripSize TIFFRawStripSize64 TIFFRawStripSize TIFFTileRowSize64 TIFFTileRowSize TIFFTileSize64 TIFFTileSize TIFFVTileSize64 TIFFVTileSize TIFFFileno TIFFSetFileno TIFFGetMode TIFFIsTiled TIFFIsByteSwapped TIFFIsBigEndian TIFFIsMSB2LSB TIFFIsUpSampled TIFFCIELabToRGBInit TIFFCIELabToXYZ TIFFXYZToRGB TIFFYCbCrToRGBInit TIFFYCbCrtoRGB TIFFCurrentRow TIFFCurrentDirectory TIFFCurrentStrip TIFFCurrentTile TIFFDataWidth TIFFReadBufferSetup TIFFWriteBufferSetup TIFFSetupStrips TIFFLastDirectory TIFFSetDirectory TIFFSetSubDirectory TIFFUnlinkDirectory TIFFSetField TIFFVSetField TIFFCheckpointDirectory TIFFWriteDirectory TIFFRewriteDirectory TIFFPrintDirectory TIFFReadScanline TIFFWriteScanline TIFFReadRGBAImage TIFFReadRGBAImageOriented TIFFFdOpen TIFFClientOpen TIFFFileName TIFFError TIFFErrorExt TIFFWarning TIFFWarningExt TIFFSetErrorHandler TIFFSetErrorHandlerExt TIFFSetWarningHandler TIFFSetWarningHandlerExt TIFFComputeTile TIFFCheckTile TIFFNumberOfTiles TIFFReadTile TIFFWriteTile TIFFComputeStrip TIFFNumberOfStrips TIFFRGBAImageBegin TIFFRGBAImageGet TIFFRGBAImageEnd TIFFReadEncodedStrip TIFFReadRawStrip TIFFReadEncodedTile TIFFReadRawTile TIFFReadRGBATile TIFFReadRGBAStrip TIFFWriteEncodedStrip TIFFWriteRawStrip TIFFWriteEncodedTile TIFFWriteRawTile TIFFSetWriteOffset TIFFSwabFloat TIFFSwabDouble TIFFSwabShort TIFFSwabLong TIFFSwabArrayOfShort TIFFSwabArrayOfLong TIFFSwabArrayOfFloat TIFFSwabArrayOfDouble TIFFSwabArrayOfTriples TIFFReverseBits TIFFGetBitRevTable TIFFDefaultStripSize TIFFDefaultTileSize TIFFRasterScanlineSize64 TIFFRasterScanlineSize _TIFFmalloc _TIFFrealloc _TIFFfree _TIFFmemset _TIFFmemcpy _TIFFmemcmp _TIFFCheckMalloc TIFFCreateDirectory TIFFSetTagExtender TIFFFieldWithName TIFFFieldWithTag TIFFFieldTag TIFFFieldName TIFFFieldDataType TIFFFieldPassCount TIFFFieldReadCount TIFFFieldWriteCount TIFFCurrentDirOffset TIFFWriteCheck TIFFRGBAImageOK TIFFNumberOfDirectories TIFFSetFileName TIFFSetClientdata TIFFSetMode TIFFClientdata TIFFGetReadProc TIFFGetWriteProc TIFFGetSeekProc TIFFGetCloseProc TIFFGetSizeProc TIFFGetMapFileProc TIFFGetUnmapFileProc TIFFIsCODECConfigured TIFFGetConfiguredCODECs TIFFFindCODEC TIFFRegisterCODEC TIFFUnRegisterCODEC TIFFFreeDirectory TIFFReadCustomDirectory TIFFReadEXIFDirectory TIFFAccessTagMethods TIFFGetClientInfo TIFFSetClientInfo TIFFSwabLong8 TIFFSwabArrayOfLong8 TIFFFindField TIFFUnsetField TIFFMergeFieldInfo tiff-4.0.3/libtiff/tif_fax3.h0000644000212300117540000003746711544110275012703 00000000000000/* $Id: tif_fax3.h,v 1.9 2011-03-10 20:23:07 fwarmerdam Exp $ */ /* * Copyright (c) 1990-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _FAX3_ #define _FAX3_ /* * TIFF Library. * * CCITT Group 3 (T.4) and Group 4 (T.6) Decompression Support. * * Decoder support is derived, with permission, from the code * in Frank Cringle's viewfax program; * Copyright (C) 1990, 1995 Frank D. Cringle. */ #include "tiff.h" /* * To override the default routine used to image decoded * spans one can use the pseduo tag TIFFTAG_FAXFILLFUNC. * The routine must have the type signature given below; * for example: * * fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) * * where buf is place to set the bits, runs is the array of b&w run * lengths (white then black), erun is the last run in the array, and * lastx is the width of the row in pixels. Fill routines can assume * the run array has room for at least lastx runs and can overwrite * data in the run array as needed (e.g. to append zero runs to bring * the count up to a nice multiple). */ typedef void (*TIFFFaxFillFunc)(unsigned char*, uint32*, uint32*, uint32); /* * The default run filler; made external for other decoders. */ #if defined(__cplusplus) extern "C" { #endif extern void _TIFFFax3fillruns(unsigned char*, uint32*, uint32*, uint32); #if defined(__cplusplus) } #endif /* finite state machine codes */ #define S_Null 0 #define S_Pass 1 #define S_Horiz 2 #define S_V0 3 #define S_VR 4 #define S_VL 5 #define S_Ext 6 #define S_TermW 7 #define S_TermB 8 #define S_MakeUpW 9 #define S_MakeUpB 10 #define S_MakeUp 11 #define S_EOL 12 typedef struct { /* state table entry */ unsigned char State; /* see above */ unsigned char Width; /* width of code in bits */ uint32 Param; /* unsigned 32-bit run length in bits */ } TIFFFaxTabEnt; extern const TIFFFaxTabEnt TIFFFaxMainTable[]; extern const TIFFFaxTabEnt TIFFFaxWhiteTable[]; extern const TIFFFaxTabEnt TIFFFaxBlackTable[]; /* * The following macros define the majority of the G3/G4 decoder * algorithm using the state tables defined elsewhere. To build * a decoder you need some setup code and some glue code. Note * that you may also need/want to change the way the NeedBits* * macros get input data if, for example, you know the data to be * decoded is properly aligned and oriented (doing so before running * the decoder can be a big performance win). * * Consult the decoder in the TIFF library for an idea of what you * need to define and setup to make use of these definitions. * * NB: to enable a debugging version of these macros define FAX3_DEBUG * before including this file. Trace output goes to stdout. */ #ifndef EndOfData #define EndOfData() (cp >= ep) #endif /* * Need <=8 or <=16 bits of input data. Unlike viewfax we * cannot use/assume a word-aligned, properly bit swizzled * input data set because data may come from an arbitrarily * aligned, read-only source such as a memory-mapped file. * Note also that the viewfax decoder does not check for * running off the end of the input data buffer. This is * possible for G3-encoded data because it prescans the input * data to count EOL markers, but can cause problems for G4 * data. In any event, we don't prescan and must watch for * running out of data since we can't permit the library to * scan past the end of the input data buffer. * * Finally, note that we must handle remaindered data at the end * of a strip specially. The coder asks for a fixed number of * bits when scanning for the next code. This may be more bits * than are actually present in the data stream. If we appear * to run out of data but still have some number of valid bits * remaining then we makeup the requested amount with zeros and * return successfully. If the returned data is incorrect then * we should be called again and get a premature EOF error; * otherwise we should get the right answer. */ #ifndef NeedBits8 #define NeedBits8(n,eoflab) do { \ if (BitsAvail < (n)) { \ if (EndOfData()) { \ if (BitsAvail == 0) /* no valid bits */ \ goto eoflab; \ BitsAvail = (n); /* pad with zeros */ \ } else { \ BitAcc |= ((uint32) bitmap[*cp++])<>= (n); \ } while (0) #ifdef FAX3_DEBUG static const char* StateNames[] = { "Null ", "Pass ", "Horiz ", "V0 ", "VR ", "VL ", "Ext ", "TermW ", "TermB ", "MakeUpW", "MakeUpB", "MakeUp ", "EOL ", }; #define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0') #define LOOKUP8(wid,tab,eoflab) do { \ int t; \ NeedBits8(wid,eoflab); \ TabEnt = tab + GetBits(wid); \ printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \ StateNames[TabEnt->State], TabEnt->Param); \ for (t = 0; t < TabEnt->Width; t++) \ DEBUG_SHOW; \ putchar('\n'); \ fflush(stdout); \ ClrBits(TabEnt->Width); \ } while (0) #define LOOKUP16(wid,tab,eoflab) do { \ int t; \ NeedBits16(wid,eoflab); \ TabEnt = tab + GetBits(wid); \ printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \ StateNames[TabEnt->State], TabEnt->Param); \ for (t = 0; t < TabEnt->Width; t++) \ DEBUG_SHOW; \ putchar('\n'); \ fflush(stdout); \ ClrBits(TabEnt->Width); \ } while (0) #define SETVALUE(x) do { \ *pa++ = RunLength + (x); \ printf("SETVALUE: %d\t%d\n", RunLength + (x), a0); \ a0 += x; \ RunLength = 0; \ } while (0) #else #define LOOKUP8(wid,tab,eoflab) do { \ NeedBits8(wid,eoflab); \ TabEnt = tab + GetBits(wid); \ ClrBits(TabEnt->Width); \ } while (0) #define LOOKUP16(wid,tab,eoflab) do { \ NeedBits16(wid,eoflab); \ TabEnt = tab + GetBits(wid); \ ClrBits(TabEnt->Width); \ } while (0) /* * Append a run to the run length array for the * current row and reset decoding state. */ #define SETVALUE(x) do { \ *pa++ = RunLength + (x); \ a0 += (x); \ RunLength = 0; \ } while (0) #endif /* * Synchronize input decoding at the start of each * row by scanning for an EOL (if appropriate) and * skipping any trash data that might be present * after a decoding error. Note that the decoding * done elsewhere that recognizes an EOL only consumes * 11 consecutive zero bits. This means that if EOLcnt * is non-zero then we still need to scan for the final flag * bit that is part of the EOL code. */ #define SYNC_EOL(eoflab) do { \ if (EOLcnt == 0) { \ for (;;) { \ NeedBits16(11,eoflab); \ if (GetBits(11) == 0) \ break; \ ClrBits(1); \ } \ } \ for (;;) { \ NeedBits8(8,eoflab); \ if (GetBits(8)) \ break; \ ClrBits(8); \ } \ while (GetBits(1) == 0) \ ClrBits(1); \ ClrBits(1); /* EOL bit */ \ EOLcnt = 0; /* reset EOL counter/flag */ \ } while (0) /* * Cleanup the array of runs after decoding a row. * We adjust final runs to insure the user buffer is not * overwritten and/or undecoded area is white filled. */ #define CLEANUP_RUNS() do { \ if (RunLength) \ SETVALUE(0); \ if (a0 != lastx) { \ badlength(a0, lastx); \ while (a0 > lastx && pa > thisrun) \ a0 -= *--pa; \ if (a0 < lastx) { \ if (a0 < 0) \ a0 = 0; \ if ((pa-thisrun)&1) \ SETVALUE(0); \ SETVALUE(lastx - a0); \ } else if (a0 > lastx) { \ SETVALUE(lastx); \ SETVALUE(0); \ } \ } \ } while (0) /* * Decode a line of 1D-encoded data. * * The line expanders are written as macros so that they can be reused * but still have direct access to the local variables of the "calling" * function. * * Note that unlike the original version we have to explicitly test for * a0 >= lastx after each black/white run is decoded. This is because * the original code depended on the input data being zero-padded to * insure the decoder recognized an EOL before running out of data. */ #define EXPAND1D(eoflab) do { \ for (;;) { \ for (;;) { \ LOOKUP16(12, TIFFFaxWhiteTable, eof1d); \ switch (TabEnt->State) { \ case S_EOL: \ EOLcnt = 1; \ goto done1d; \ case S_TermW: \ SETVALUE(TabEnt->Param); \ goto doneWhite1d; \ case S_MakeUpW: \ case S_MakeUp: \ a0 += TabEnt->Param; \ RunLength += TabEnt->Param; \ break; \ default: \ unexpected("WhiteTable", a0); \ goto done1d; \ } \ } \ doneWhite1d: \ if (a0 >= lastx) \ goto done1d; \ for (;;) { \ LOOKUP16(13, TIFFFaxBlackTable, eof1d); \ switch (TabEnt->State) { \ case S_EOL: \ EOLcnt = 1; \ goto done1d; \ case S_TermB: \ SETVALUE(TabEnt->Param); \ goto doneBlack1d; \ case S_MakeUpB: \ case S_MakeUp: \ a0 += TabEnt->Param; \ RunLength += TabEnt->Param; \ break; \ default: \ unexpected("BlackTable", a0); \ goto done1d; \ } \ } \ doneBlack1d: \ if (a0 >= lastx) \ goto done1d; \ if( *(pa-1) == 0 && *(pa-2) == 0 ) \ pa -= 2; \ } \ eof1d: \ prematureEOF(a0); \ CLEANUP_RUNS(); \ goto eoflab; \ done1d: \ CLEANUP_RUNS(); \ } while (0) /* * Update the value of b1 using the array * of runs for the reference line. */ #define CHECK_b1 do { \ if (pa != thisrun) while (b1 <= a0 && b1 < lastx) { \ b1 += pb[0] + pb[1]; \ pb += 2; \ } \ } while (0) /* * Expand a row of 2D-encoded data. */ #define EXPAND2D(eoflab) do { \ while (a0 < lastx) { \ LOOKUP8(7, TIFFFaxMainTable, eof2d); \ switch (TabEnt->State) { \ case S_Pass: \ CHECK_b1; \ b1 += *pb++; \ RunLength += b1 - a0; \ a0 = b1; \ b1 += *pb++; \ break; \ case S_Horiz: \ if ((pa-thisrun)&1) { \ for (;;) { /* black first */ \ LOOKUP16(13, TIFFFaxBlackTable, eof2d); \ switch (TabEnt->State) { \ case S_TermB: \ SETVALUE(TabEnt->Param); \ goto doneWhite2da; \ case S_MakeUpB: \ case S_MakeUp: \ a0 += TabEnt->Param; \ RunLength += TabEnt->Param; \ break; \ default: \ goto badBlack2d; \ } \ } \ doneWhite2da:; \ for (;;) { /* then white */ \ LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \ switch (TabEnt->State) { \ case S_TermW: \ SETVALUE(TabEnt->Param); \ goto doneBlack2da; \ case S_MakeUpW: \ case S_MakeUp: \ a0 += TabEnt->Param; \ RunLength += TabEnt->Param; \ break; \ default: \ goto badWhite2d; \ } \ } \ doneBlack2da:; \ } else { \ for (;;) { /* white first */ \ LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \ switch (TabEnt->State) { \ case S_TermW: \ SETVALUE(TabEnt->Param); \ goto doneWhite2db; \ case S_MakeUpW: \ case S_MakeUp: \ a0 += TabEnt->Param; \ RunLength += TabEnt->Param; \ break; \ default: \ goto badWhite2d; \ } \ } \ doneWhite2db:; \ for (;;) { /* then black */ \ LOOKUP16(13, TIFFFaxBlackTable, eof2d); \ switch (TabEnt->State) { \ case S_TermB: \ SETVALUE(TabEnt->Param); \ goto doneBlack2db; \ case S_MakeUpB: \ case S_MakeUp: \ a0 += TabEnt->Param; \ RunLength += TabEnt->Param; \ break; \ default: \ goto badBlack2d; \ } \ } \ doneBlack2db:; \ } \ CHECK_b1; \ break; \ case S_V0: \ CHECK_b1; \ SETVALUE(b1 - a0); \ b1 += *pb++; \ break; \ case S_VR: \ CHECK_b1; \ SETVALUE(b1 - a0 + TabEnt->Param); \ b1 += *pb++; \ break; \ case S_VL: \ CHECK_b1; \ if (b1 <= (int) (a0 + TabEnt->Param)) { \ if (b1 < (int) (a0 + TabEnt->Param) || pa != thisrun) { \ unexpected("VL", a0); \ goto eol2d; \ } \ } \ SETVALUE(b1 - a0 - TabEnt->Param); \ b1 -= *--pb; \ break; \ case S_Ext: \ *pa++ = lastx - a0; \ extension(a0); \ goto eol2d; \ case S_EOL: \ *pa++ = lastx - a0; \ NeedBits8(4,eof2d); \ if (GetBits(4)) \ unexpected("EOL", a0); \ ClrBits(4); \ EOLcnt = 1; \ goto eol2d; \ default: \ badMain2d: \ unexpected("MainTable", a0); \ goto eol2d; \ badBlack2d: \ unexpected("BlackTable", a0); \ goto eol2d; \ badWhite2d: \ unexpected("WhiteTable", a0); \ goto eol2d; \ eof2d: \ prematureEOF(a0); \ CLEANUP_RUNS(); \ goto eoflab; \ } \ } \ if (RunLength) { \ if (RunLength + a0 < lastx) { \ /* expect a final V0 */ \ NeedBits8(1,eof2d); \ if (!GetBits(1)) \ goto badMain2d; \ ClrBits(1); \ } \ SETVALUE(0); \ } \ eol2d: \ CLEANUP_RUNS(); \ } while (0) #endif /* _FAX3_ */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_write.c0000644000212300117540000006000712014213627013147 00000000000000/* $Id: tif_write.c,v 1.37 2012-08-13 22:10:17 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Scanline-oriented Write Support */ #include "tiffiop.h" #include #define STRIPINCR 20 /* expansion factor on strip array */ #define WRITECHECKSTRIPS(tif, module) \ (((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),0,module)) #define WRITECHECKTILES(tif, module) \ (((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),1,module)) #define BUFFERCHECK(tif) \ ((((tif)->tif_flags & TIFF_BUFFERSETUP) && tif->tif_rawdata) || \ TIFFWriteBufferSetup((tif), NULL, (tmsize_t) -1)) static int TIFFGrowStrips(TIFF* tif, uint32 delta, const char* module); static int TIFFAppendToStrip(TIFF* tif, uint32 strip, uint8* data, tmsize_t cc); int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample) { static const char module[] = "TIFFWriteScanline"; register TIFFDirectory *td; int status, imagegrew = 0; uint32 strip; if (!WRITECHECKSTRIPS(tif, module)) return (-1); /* * Handle delayed allocation of data buffer. This * permits it to be sized more intelligently (using * directory information). */ if (!BUFFERCHECK(tif)) return (-1); tif->tif_flags |= TIFF_BUF4WRITE; /* not strictly sure this is right*/ td = &tif->tif_dir; /* * Extend image length if needed * (but only for PlanarConfig=1). */ if (row >= td->td_imagelength) { /* extend image */ if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { TIFFErrorExt(tif->tif_clientdata, module, "Can not change \"ImageLength\" when using separate planes"); return (-1); } td->td_imagelength = row+1; imagegrew = 1; } /* * Calculate strip and check for crossings. */ if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { if (sample >= td->td_samplesperpixel) { TIFFErrorExt(tif->tif_clientdata, module, "%lu: Sample out of range, max %lu", (unsigned long) sample, (unsigned long) td->td_samplesperpixel); return (-1); } strip = sample*td->td_stripsperimage + row/td->td_rowsperstrip; } else strip = row / td->td_rowsperstrip; /* * Check strip array to make sure there's space. We don't support * dynamically growing files that have data organized in separate * bitplanes because it's too painful. In that case we require that * the imagelength be set properly before the first write (so that the * strips array will be fully allocated above). */ if (strip >= td->td_nstrips && !TIFFGrowStrips(tif, 1, module)) return (-1); if (strip != tif->tif_curstrip) { /* * Changing strips -- flush any data present. */ if (!TIFFFlushData(tif)) return (-1); tif->tif_curstrip = strip; /* * Watch out for a growing image. The value of strips/image * will initially be 1 (since it can't be deduced until the * imagelength is known). */ if (strip >= td->td_stripsperimage && imagegrew) td->td_stripsperimage = TIFFhowmany_32(td->td_imagelength,td->td_rowsperstrip); tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupencode)(tif)) return (-1); tif->tif_flags |= TIFF_CODERSETUP; } tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; if( td->td_stripbytecount[strip] > 0 ) { /* if we are writing over existing tiles, zero length */ td->td_stripbytecount[strip] = 0; /* this forces TIFFAppendToStrip() to do a seek */ tif->tif_curoff = 0; } if (!(*tif->tif_preencode)(tif, sample)) return (-1); tif->tif_flags |= TIFF_POSTENCODE; } /* * Ensure the write is either sequential or at the * beginning of a strip (or that we can randomly * access the data -- i.e. no encoding). */ if (row != tif->tif_row) { if (row < tif->tif_row) { /* * Moving backwards within the same strip: * backup to the start and then decode * forward (below). */ tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; tif->tif_rawcp = tif->tif_rawdata; } /* * Seek forward to the desired row. */ if (!(*tif->tif_seek)(tif, row - tif->tif_row)) return (-1); tif->tif_row = row; } /* swab if needed - note that source buffer will be altered */ tif->tif_postdecode( tif, (uint8*) buf, tif->tif_scanlinesize ); status = (*tif->tif_encoderow)(tif, (uint8*) buf, tif->tif_scanlinesize, sample); /* we are now poised at the beginning of the next row */ tif->tif_row = row + 1; return (status); } /* * Encode the supplied data and write it to the * specified strip. * * NB: Image length must be setup before writing. */ tmsize_t TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc) { static const char module[] = "TIFFWriteEncodedStrip"; TIFFDirectory *td = &tif->tif_dir; uint16 sample; if (!WRITECHECKSTRIPS(tif, module)) return ((tmsize_t) -1); /* * Check strip array to make sure there's space. * We don't support dynamically growing files that * have data organized in separate bitplanes because * it's too painful. In that case we require that * the imagelength be set properly before the first * write (so that the strips array will be fully * allocated above). */ if (strip >= td->td_nstrips) { if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { TIFFErrorExt(tif->tif_clientdata, module, "Can not grow image by strips when using separate planes"); return ((tmsize_t) -1); } if (!TIFFGrowStrips(tif, 1, module)) return ((tmsize_t) -1); td->td_stripsperimage = TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip); } /* * Handle delayed allocation of data buffer. This * permits it to be sized according to the directory * info. */ if (!BUFFERCHECK(tif)) return ((tmsize_t) -1); tif->tif_flags |= TIFF_BUF4WRITE; tif->tif_curstrip = strip; tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupencode)(tif)) return ((tmsize_t) -1); tif->tif_flags |= TIFF_CODERSETUP; } if( td->td_stripbytecount[strip] > 0 ) { /* Make sure that at the first attempt of rewriting the tile, we will have */ /* more bytes available in the output buffer than the previous byte count, */ /* so that TIFFAppendToStrip() will detect the overflow when it is called the first */ /* time if the new compressed tile is bigger than the older one. (GDAL #4771) */ if( tif->tif_rawdatasize <= td->td_stripbytecount[strip] ) { if( !(TIFFWriteBufferSetup(tif, NULL, (tmsize_t)TIFFroundup_64((uint64)(td->td_stripbytecount[strip] + 1), 1024))) ) return ((tmsize_t)(-1)); } /* Force TIFFAppendToStrip() to consider placing data at end of file. */ tif->tif_curoff = 0; } tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; tif->tif_flags &= ~TIFF_POSTENCODE; sample = (uint16)(strip / td->td_stripsperimage); if (!(*tif->tif_preencode)(tif, sample)) return ((tmsize_t) -1); /* swab if needed - note that source buffer will be altered */ tif->tif_postdecode( tif, (uint8*) data, cc ); if (!(*tif->tif_encodestrip)(tif, (uint8*) data, cc, sample)) return (0); if (!(*tif->tif_postencode)(tif)) return ((tmsize_t) -1); if (!isFillOrder(tif, td->td_fillorder) && (tif->tif_flags & TIFF_NOBITREV) == 0) TIFFReverseBits(tif->tif_rawdata, tif->tif_rawcc); if (tif->tif_rawcc > 0 && !TIFFAppendToStrip(tif, strip, tif->tif_rawdata, tif->tif_rawcc)) return ((tmsize_t) -1); tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; return (cc); } /* * Write the supplied data to the specified strip. * * NB: Image length must be setup before writing. */ tmsize_t TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc) { static const char module[] = "TIFFWriteRawStrip"; TIFFDirectory *td = &tif->tif_dir; if (!WRITECHECKSTRIPS(tif, module)) return ((tmsize_t) -1); /* * Check strip array to make sure there's space. * We don't support dynamically growing files that * have data organized in separate bitplanes because * it's too painful. In that case we require that * the imagelength be set properly before the first * write (so that the strips array will be fully * allocated above). */ if (strip >= td->td_nstrips) { if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { TIFFErrorExt(tif->tif_clientdata, module, "Can not grow image by strips when using separate planes"); return ((tmsize_t) -1); } /* * Watch out for a growing image. The value of * strips/image will initially be 1 (since it * can't be deduced until the imagelength is known). */ if (strip >= td->td_stripsperimage) td->td_stripsperimage = TIFFhowmany_32(td->td_imagelength,td->td_rowsperstrip); if (!TIFFGrowStrips(tif, 1, module)) return ((tmsize_t) -1); } tif->tif_curstrip = strip; tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; return (TIFFAppendToStrip(tif, strip, (uint8*) data, cc) ? cc : (tmsize_t) -1); } /* * Write and compress a tile of data. The * tile is selected by the (x,y,z,s) coordinates. */ tmsize_t TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s) { if (!TIFFCheckTile(tif, x, y, z, s)) return ((tmsize_t)(-1)); /* * NB: A tile size of -1 is used instead of tif_tilesize knowing * that TIFFWriteEncodedTile will clamp this to the tile size. * This is done because the tile size may not be defined until * after the output buffer is setup in TIFFWriteBufferSetup. */ return (TIFFWriteEncodedTile(tif, TIFFComputeTile(tif, x, y, z, s), buf, (tmsize_t)(-1))); } /* * Encode the supplied data and write it to the * specified tile. There must be space for the * data. The function clamps individual writes * to a tile to the tile size, but does not (and * can not) check that multiple writes to the same * tile do not write more than tile size data. * * NB: Image length must be setup before writing; this * interface does not support automatically growing * the image on each write (as TIFFWriteScanline does). */ tmsize_t TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc) { static const char module[] = "TIFFWriteEncodedTile"; TIFFDirectory *td; uint16 sample; if (!WRITECHECKTILES(tif, module)) return ((tmsize_t)(-1)); td = &tif->tif_dir; if (tile >= td->td_nstrips) { TIFFErrorExt(tif->tif_clientdata, module, "Tile %lu out of range, max %lu", (unsigned long) tile, (unsigned long) td->td_nstrips); return ((tmsize_t)(-1)); } /* * Handle delayed allocation of data buffer. This * permits it to be sized more intelligently (using * directory information). */ if (!BUFFERCHECK(tif)) return ((tmsize_t)(-1)); tif->tif_flags |= TIFF_BUF4WRITE; tif->tif_curtile = tile; if( td->td_stripbytecount[tile] > 0 ) { /* Make sure that at the first attempt of rewriting the tile, we will have */ /* more bytes available in the output buffer than the previous byte count, */ /* so that TIFFAppendToStrip() will detect the overflow when it is called the first */ /* time if the new compressed tile is bigger than the older one. (GDAL #4771) */ if( tif->tif_rawdatasize <= td->td_stripbytecount[tile] ) { if( !(TIFFWriteBufferSetup(tif, NULL, (tmsize_t)TIFFroundup_64((uint64)(td->td_stripbytecount[tile] + 1), 1024))) ) return ((tmsize_t)(-1)); } /* Force TIFFAppendToStrip() to consider placing data at end of file. */ tif->tif_curoff = 0; } tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; /* * Compute tiles per row & per column to compute * current row and column */ tif->tif_row = (tile % TIFFhowmany_32(td->td_imagelength, td->td_tilelength)) * td->td_tilelength; tif->tif_col = (tile % TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth)) * td->td_tilewidth; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupencode)(tif)) return ((tmsize_t)(-1)); tif->tif_flags |= TIFF_CODERSETUP; } tif->tif_flags &= ~TIFF_POSTENCODE; sample = (uint16)(tile/td->td_stripsperimage); if (!(*tif->tif_preencode)(tif, sample)) return ((tmsize_t)(-1)); /* * Clamp write amount to the tile size. This is mostly * done so that callers can pass in some large number * (e.g. -1) and have the tile size used instead. */ if ( cc < 1 || cc > tif->tif_tilesize) cc = tif->tif_tilesize; /* swab if needed - note that source buffer will be altered */ tif->tif_postdecode( tif, (uint8*) data, cc ); if (!(*tif->tif_encodetile)(tif, (uint8*) data, cc, sample)) return (0); if (!(*tif->tif_postencode)(tif)) return ((tmsize_t)(-1)); if (!isFillOrder(tif, td->td_fillorder) && (tif->tif_flags & TIFF_NOBITREV) == 0) TIFFReverseBits((uint8*)tif->tif_rawdata, tif->tif_rawcc); if (tif->tif_rawcc > 0 && !TIFFAppendToStrip(tif, tile, tif->tif_rawdata, tif->tif_rawcc)) return ((tmsize_t)(-1)); tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; return (cc); } /* * Write the supplied data to the specified strip. * There must be space for the data; we don't check * if strips overlap! * * NB: Image length must be setup before writing; this * interface does not support automatically growing * the image on each write (as TIFFWriteScanline does). */ tmsize_t TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc) { static const char module[] = "TIFFWriteRawTile"; if (!WRITECHECKTILES(tif, module)) return ((tmsize_t)(-1)); if (tile >= tif->tif_dir.td_nstrips) { TIFFErrorExt(tif->tif_clientdata, module, "Tile %lu out of range, max %lu", (unsigned long) tile, (unsigned long) tif->tif_dir.td_nstrips); return ((tmsize_t)(-1)); } return (TIFFAppendToStrip(tif, tile, (uint8*) data, cc) ? cc : (tmsize_t)(-1)); } #define isUnspecified(tif, f) \ (TIFFFieldSet(tif,f) && (tif)->tif_dir.td_imagelength == 0) int TIFFSetupStrips(TIFF* tif) { TIFFDirectory* td = &tif->tif_dir; if (isTiled(tif)) td->td_stripsperimage = isUnspecified(tif, FIELD_TILEDIMENSIONS) ? td->td_samplesperpixel : TIFFNumberOfTiles(tif); else td->td_stripsperimage = isUnspecified(tif, FIELD_ROWSPERSTRIP) ? td->td_samplesperpixel : TIFFNumberOfStrips(tif); td->td_nstrips = td->td_stripsperimage; if (td->td_planarconfig == PLANARCONFIG_SEPARATE) td->td_stripsperimage /= td->td_samplesperpixel; td->td_stripoffset = (uint64 *) _TIFFmalloc(td->td_nstrips * sizeof (uint64)); td->td_stripbytecount = (uint64 *) _TIFFmalloc(td->td_nstrips * sizeof (uint64)); if (td->td_stripoffset == NULL || td->td_stripbytecount == NULL) return (0); /* * Place data at the end-of-file * (by setting offsets to zero). */ _TIFFmemset(td->td_stripoffset, 0, td->td_nstrips*sizeof (uint64)); _TIFFmemset(td->td_stripbytecount, 0, td->td_nstrips*sizeof (uint64)); TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS); TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS); return (1); } #undef isUnspecified /* * Verify file is writable and that the directory * information is setup properly. In doing the latter * we also "freeze" the state of the directory so * that important information is not changed. */ int TIFFWriteCheck(TIFF* tif, int tiles, const char* module) { if (tif->tif_mode == O_RDONLY) { TIFFErrorExt(tif->tif_clientdata, module, "File not open for writing"); return (0); } if (tiles ^ isTiled(tif)) { TIFFErrorExt(tif->tif_clientdata, module, tiles ? "Can not write tiles to a stripped image" : "Can not write scanlines to a tiled image"); return (0); } _TIFFFillStriles( tif ); /* * On the first write verify all the required information * has been setup and initialize any data structures that * had to wait until directory information was set. * Note that a lot of our work is assumed to remain valid * because we disallow any of the important parameters * from changing after we start writing (i.e. once * TIFF_BEENWRITING is set, TIFFSetField will only allow * the image's length to be changed). */ if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) { TIFFErrorExt(tif->tif_clientdata, module, "Must set \"ImageWidth\" before writing data"); return (0); } if (tif->tif_dir.td_samplesperpixel == 1) { /* * Planarconfiguration is irrelevant in case of single band * images and need not be included. We will set it anyway, * because this field is used in other parts of library even * in the single band case. */ if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) tif->tif_dir.td_planarconfig = PLANARCONFIG_CONTIG; } else { if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) { TIFFErrorExt(tif->tif_clientdata, module, "Must set \"PlanarConfiguration\" before writing data"); return (0); } } if (tif->tif_dir.td_stripoffset == NULL && !TIFFSetupStrips(tif)) { tif->tif_dir.td_nstrips = 0; TIFFErrorExt(tif->tif_clientdata, module, "No space for %s arrays", isTiled(tif) ? "tile" : "strip"); return (0); } if (isTiled(tif)) { tif->tif_tilesize = TIFFTileSize(tif); if (tif->tif_tilesize == 0) return (0); } else tif->tif_tilesize = (tmsize_t)(-1); tif->tif_scanlinesize = TIFFScanlineSize(tif); if (tif->tif_scanlinesize == 0) return (0); tif->tif_flags |= TIFF_BEENWRITING; return (1); } /* * Setup the raw data buffer used for encoding. */ int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size) { static const char module[] = "TIFFWriteBufferSetup"; if (tif->tif_rawdata) { if (tif->tif_flags & TIFF_MYBUFFER) { _TIFFfree(tif->tif_rawdata); tif->tif_flags &= ~TIFF_MYBUFFER; } tif->tif_rawdata = NULL; } if (size == (tmsize_t)(-1)) { size = (isTiled(tif) ? tif->tif_tilesize : TIFFStripSize(tif)); /* * Make raw data buffer at least 8K */ if (size < 8*1024) size = 8*1024; bp = NULL; /* NB: force malloc */ } if (bp == NULL) { bp = _TIFFmalloc(size); if (bp == NULL) { TIFFErrorExt(tif->tif_clientdata, module, "No space for output buffer"); return (0); } tif->tif_flags |= TIFF_MYBUFFER; } else tif->tif_flags &= ~TIFF_MYBUFFER; tif->tif_rawdata = (uint8*) bp; tif->tif_rawdatasize = size; tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; tif->tif_flags |= TIFF_BUFFERSETUP; return (1); } /* * Grow the strip data structures by delta strips. */ static int TIFFGrowStrips(TIFF* tif, uint32 delta, const char* module) { TIFFDirectory *td = &tif->tif_dir; uint64* new_stripoffset; uint64* new_stripbytecount; assert(td->td_planarconfig == PLANARCONFIG_CONTIG); new_stripoffset = (uint64*)_TIFFrealloc(td->td_stripoffset, (td->td_nstrips + delta) * sizeof (uint64)); new_stripbytecount = (uint64*)_TIFFrealloc(td->td_stripbytecount, (td->td_nstrips + delta) * sizeof (uint64)); if (new_stripoffset == NULL || new_stripbytecount == NULL) { if (new_stripoffset) _TIFFfree(new_stripoffset); if (new_stripbytecount) _TIFFfree(new_stripbytecount); td->td_nstrips = 0; TIFFErrorExt(tif->tif_clientdata, module, "No space to expand strip arrays"); return (0); } td->td_stripoffset = new_stripoffset; td->td_stripbytecount = new_stripbytecount; _TIFFmemset(td->td_stripoffset + td->td_nstrips, 0, delta*sizeof (uint64)); _TIFFmemset(td->td_stripbytecount + td->td_nstrips, 0, delta*sizeof (uint64)); td->td_nstrips += delta; tif->tif_flags |= TIFF_DIRTYDIRECT; return (1); } /* * Append the data to the specified strip. */ static int TIFFAppendToStrip(TIFF* tif, uint32 strip, uint8* data, tmsize_t cc) { static const char module[] = "TIFFAppendToStrip"; TIFFDirectory *td = &tif->tif_dir; uint64 m; int64 old_byte_count = -1; if (td->td_stripoffset[strip] == 0 || tif->tif_curoff == 0) { assert(td->td_nstrips > 0); if( td->td_stripbytecount[strip] != 0 && td->td_stripoffset[strip] != 0 && td->td_stripbytecount[strip] >= (uint64) cc ) { /* * There is already tile data on disk, and the new tile * data we have will fit in the same space. The only * aspect of this that is risky is that there could be * more data to append to this strip before we are done * depending on how we are getting called. */ if (!SeekOK(tif, td->td_stripoffset[strip])) { TIFFErrorExt(tif->tif_clientdata, module, "Seek error at scanline %lu", (unsigned long)tif->tif_row); return (0); } } else { /* * Seek to end of file, and set that as our location to * write this strip. */ td->td_stripoffset[strip] = TIFFSeekFile(tif, 0, SEEK_END); tif->tif_flags |= TIFF_DIRTYSTRIP; } tif->tif_curoff = td->td_stripoffset[strip]; /* * We are starting a fresh strip/tile, so set the size to zero. */ old_byte_count = td->td_stripbytecount[strip]; td->td_stripbytecount[strip] = 0; } m = tif->tif_curoff+cc; if (!(tif->tif_flags&TIFF_BIGTIFF)) m = (uint32)m; if ((mtif_curoff)||(m<(uint64)cc)) { TIFFErrorExt(tif->tif_clientdata, module, "Maximum TIFF file size exceeded"); return (0); } if (!WriteOK(tif, data, cc)) { TIFFErrorExt(tif->tif_clientdata, module, "Write error at scanline %lu", (unsigned long) tif->tif_row); return (0); } tif->tif_curoff = m; td->td_stripbytecount[strip] += cc; if( (int64) td->td_stripbytecount[strip] != old_byte_count ) tif->tif_flags |= TIFF_DIRTYSTRIP; return (1); } /* * Internal version of TIFFFlushData that can be * called by ``encodestrip routines'' w/o concern * for infinite recursion. */ int TIFFFlushData1(TIFF* tif) { if (tif->tif_rawcc > 0 && tif->tif_flags & TIFF_BUF4WRITE ) { if (!isFillOrder(tif, tif->tif_dir.td_fillorder) && (tif->tif_flags & TIFF_NOBITREV) == 0) TIFFReverseBits((uint8*)tif->tif_rawdata, tif->tif_rawcc); if (!TIFFAppendToStrip(tif, isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip, tif->tif_rawdata, tif->tif_rawcc)) return (0); tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; } return (1); } /* * Set the current write offset. This should only be * used to set the offset to a known previous location * (very carefully), or to 0 so that the next write gets * appended to the end of the file. */ void TIFFSetWriteOffset(TIFF* tif, toff_t off) { tif->tif_curoff = off; } /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/tif_unix.c0000644000212300117540000001463211763656233013021 00000000000000/* $Id: tif_unix.c,v 1.23 2012-06-01 21:40:59 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library UNIX-specific Routines. These are should also work with the * Windows Common RunTime Library. */ #include "tif_config.h" #ifdef HAVE_SYS_TYPES_H # include #endif #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_IO_H # include #endif #include "tiffiop.h" static tmsize_t _tiffReadProc(thandle_t fd, void* buf, tmsize_t size) { size_t size_io = (size_t) size; if ((tmsize_t) size_io != size) { errno=EINVAL; return (tmsize_t) -1; } return ((tmsize_t) read((int) fd, buf, size_io)); } static tmsize_t _tiffWriteProc(thandle_t fd, void* buf, tmsize_t size) { size_t size_io = (size_t) size; if ((tmsize_t) size_io != size) { errno=EINVAL; return (tmsize_t) -1; } return ((tmsize_t) write((int) fd, buf, size_io)); } static uint64 _tiffSeekProc(thandle_t fd, uint64 off, int whence) { off_t off_io = (off_t) off; if ((uint64) off_io != off) { errno=EINVAL; return (uint64) -1; /* this is really gross */ } return((uint64)lseek((int)fd,off_io,whence)); } static int _tiffCloseProc(thandle_t fd) { return(close((int)fd)); } static uint64 _tiffSizeProc(thandle_t fd) { struct stat sb; if (fstat((int)fd,&sb)<0) return(0); else return((uint64)sb.st_size); } #ifdef HAVE_MMAP #include static int _tiffMapProc(thandle_t fd, void** pbase, toff_t* psize) { uint64 size64 = _tiffSizeProc(fd); tmsize_t sizem = (tmsize_t)size64; if ((uint64)sizem==size64) { *pbase = (void*) mmap(0, (size_t)sizem, PROT_READ, MAP_SHARED, (int) fd, 0); if (*pbase != (void*) -1) { *psize = (tmsize_t)sizem; return (1); } } return (0); } static void _tiffUnmapProc(thandle_t fd, void* base, toff_t size) { (void) fd; (void) munmap(base, (off_t) size); } #else /* !HAVE_MMAP */ static int _tiffMapProc(thandle_t fd, void** pbase, toff_t* psize) { (void) fd; (void) pbase; (void) psize; return (0); } static void _tiffUnmapProc(thandle_t fd, void* base, toff_t size) { (void) fd; (void) base; (void) size; } #endif /* !HAVE_MMAP */ /* * Open a TIFF file descriptor for read/writing. */ TIFF* TIFFFdOpen(int fd, const char* name, const char* mode) { TIFF* tif; tif = TIFFClientOpen(name, mode, (thandle_t) fd, _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, _tiffMapProc, _tiffUnmapProc); if (tif) tif->tif_fd = fd; return (tif); } /* * Open a TIFF file for read/writing. */ TIFF* TIFFOpen(const char* name, const char* mode) { static const char module[] = "TIFFOpen"; int m, fd; TIFF* tif; m = _TIFFgetMode(mode, module); if (m == -1) return ((TIFF*)0); /* for cygwin and mingw */ #ifdef O_BINARY m |= O_BINARY; #endif fd = open(name, m, 0666); if (fd < 0) { if (errno > 0 && strerror(errno) != NULL ) { TIFFErrorExt(0, module, "%s: %s", name, strerror(errno) ); } else { TIFFErrorExt(0, module, "%s: Cannot open", name); } return ((TIFF *)0); } tif = TIFFFdOpen((int)fd, name, mode); if(!tif) close(fd); return tif; } #ifdef __WIN32__ #include /* * Open a TIFF file with a Unicode filename, for read/writing. */ TIFF* TIFFOpenW(const wchar_t* name, const char* mode) { static const char module[] = "TIFFOpenW"; int m, fd; int mbsize; char *mbname; TIFF* tif; m = _TIFFgetMode(mode, module); if (m == -1) return ((TIFF*)0); /* for cygwin and mingw */ #ifdef O_BINARY m |= O_BINARY; #endif fd = _wopen(name, m, 0666); if (fd < 0) { TIFFErrorExt(0, module, "%s: Cannot open", name); return ((TIFF *)0); } mbname = NULL; mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL); if (mbsize > 0) { mbname = _TIFFmalloc(mbsize); if (!mbname) { TIFFErrorExt(0, module, "Can't allocate space for filename conversion buffer"); return ((TIFF*)0); } WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize, NULL, NULL); } tif = TIFFFdOpen((int)fd, (mbname != NULL) ? mbname : "", mode); _TIFFfree(mbname); if(!tif) close(fd); return tif; } #endif void* _TIFFmalloc(tmsize_t s) { return (malloc((size_t) s)); } void _TIFFfree(void* p) { free(p); } void* _TIFFrealloc(void* p, tmsize_t s) { return (realloc(p, (size_t) s)); } void _TIFFmemset(void* p, int v, tmsize_t c) { memset(p, v, (size_t) c); } void _TIFFmemcpy(void* d, const void* s, tmsize_t c) { memcpy(d, s, (size_t) c); } int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c) { return (memcmp(p1, p2, (size_t) c)); } static void unixWarningHandler(const char* module, const char* fmt, va_list ap) { if (module != NULL) fprintf(stderr, "%s: ", module); fprintf(stderr, "Warning, "); vfprintf(stderr, fmt, ap); fprintf(stderr, ".\n"); } TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler; static void unixErrorHandler(const char* module, const char* fmt, va_list ap) { if (module != NULL) fprintf(stderr, "%s: ", module); vfprintf(stderr, fmt, ap); fprintf(stderr, ".\n"); } TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler; /* vim: set ts=8 sts=8 sw=8 noet: */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/libtiff/t4.h0000644000212300117540000002616311345765560011532 00000000000000/* $Id: t4.h,v 1.3 2010-03-10 18:56:48 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _T4_ #define _T4_ /* * CCITT T.4 1D Huffman runlength codes and * related definitions. Given the small sizes * of these tables it does not seem * worthwhile to make code & length 8 bits. */ typedef struct tableentry { unsigned short length; /* bit length of g3 code */ unsigned short code; /* g3 code */ short runlen; /* run length in bits */ } tableentry; #define EOL 0x001 /* EOL code value - 0000 0000 0000 1 */ /* status values returned instead of a run length */ #define G3CODE_EOL -1 /* NB: ACT_EOL - ACT_WRUNT */ #define G3CODE_INVALID -2 /* NB: ACT_INVALID - ACT_WRUNT */ #define G3CODE_EOF -3 /* end of input data */ #define G3CODE_INCOMP -4 /* incomplete run code */ /* * Note that these tables are ordered such that the * index into the table is known to be either the * run length, or (run length / 64) + a fixed offset. * * NB: The G3CODE_INVALID entries are only used * during state generation (see mkg3states.c). */ #ifdef G3CODES const tableentry TIFFFaxWhiteCodes[] = { { 8, 0x35, 0 }, /* 0011 0101 */ { 6, 0x7, 1 }, /* 0001 11 */ { 4, 0x7, 2 }, /* 0111 */ { 4, 0x8, 3 }, /* 1000 */ { 4, 0xB, 4 }, /* 1011 */ { 4, 0xC, 5 }, /* 1100 */ { 4, 0xE, 6 }, /* 1110 */ { 4, 0xF, 7 }, /* 1111 */ { 5, 0x13, 8 }, /* 1001 1 */ { 5, 0x14, 9 }, /* 1010 0 */ { 5, 0x7, 10 }, /* 0011 1 */ { 5, 0x8, 11 }, /* 0100 0 */ { 6, 0x8, 12 }, /* 0010 00 */ { 6, 0x3, 13 }, /* 0000 11 */ { 6, 0x34, 14 }, /* 1101 00 */ { 6, 0x35, 15 }, /* 1101 01 */ { 6, 0x2A, 16 }, /* 1010 10 */ { 6, 0x2B, 17 }, /* 1010 11 */ { 7, 0x27, 18 }, /* 0100 111 */ { 7, 0xC, 19 }, /* 0001 100 */ { 7, 0x8, 20 }, /* 0001 000 */ { 7, 0x17, 21 }, /* 0010 111 */ { 7, 0x3, 22 }, /* 0000 011 */ { 7, 0x4, 23 }, /* 0000 100 */ { 7, 0x28, 24 }, /* 0101 000 */ { 7, 0x2B, 25 }, /* 0101 011 */ { 7, 0x13, 26 }, /* 0010 011 */ { 7, 0x24, 27 }, /* 0100 100 */ { 7, 0x18, 28 }, /* 0011 000 */ { 8, 0x2, 29 }, /* 0000 0010 */ { 8, 0x3, 30 }, /* 0000 0011 */ { 8, 0x1A, 31 }, /* 0001 1010 */ { 8, 0x1B, 32 }, /* 0001 1011 */ { 8, 0x12, 33 }, /* 0001 0010 */ { 8, 0x13, 34 }, /* 0001 0011 */ { 8, 0x14, 35 }, /* 0001 0100 */ { 8, 0x15, 36 }, /* 0001 0101 */ { 8, 0x16, 37 }, /* 0001 0110 */ { 8, 0x17, 38 }, /* 0001 0111 */ { 8, 0x28, 39 }, /* 0010 1000 */ { 8, 0x29, 40 }, /* 0010 1001 */ { 8, 0x2A, 41 }, /* 0010 1010 */ { 8, 0x2B, 42 }, /* 0010 1011 */ { 8, 0x2C, 43 }, /* 0010 1100 */ { 8, 0x2D, 44 }, /* 0010 1101 */ { 8, 0x4, 45 }, /* 0000 0100 */ { 8, 0x5, 46 }, /* 0000 0101 */ { 8, 0xA, 47 }, /* 0000 1010 */ { 8, 0xB, 48 }, /* 0000 1011 */ { 8, 0x52, 49 }, /* 0101 0010 */ { 8, 0x53, 50 }, /* 0101 0011 */ { 8, 0x54, 51 }, /* 0101 0100 */ { 8, 0x55, 52 }, /* 0101 0101 */ { 8, 0x24, 53 }, /* 0010 0100 */ { 8, 0x25, 54 }, /* 0010 0101 */ { 8, 0x58, 55 }, /* 0101 1000 */ { 8, 0x59, 56 }, /* 0101 1001 */ { 8, 0x5A, 57 }, /* 0101 1010 */ { 8, 0x5B, 58 }, /* 0101 1011 */ { 8, 0x4A, 59 }, /* 0100 1010 */ { 8, 0x4B, 60 }, /* 0100 1011 */ { 8, 0x32, 61 }, /* 0011 0010 */ { 8, 0x33, 62 }, /* 0011 0011 */ { 8, 0x34, 63 }, /* 0011 0100 */ { 5, 0x1B, 64 }, /* 1101 1 */ { 5, 0x12, 128 }, /* 1001 0 */ { 6, 0x17, 192 }, /* 0101 11 */ { 7, 0x37, 256 }, /* 0110 111 */ { 8, 0x36, 320 }, /* 0011 0110 */ { 8, 0x37, 384 }, /* 0011 0111 */ { 8, 0x64, 448 }, /* 0110 0100 */ { 8, 0x65, 512 }, /* 0110 0101 */ { 8, 0x68, 576 }, /* 0110 1000 */ { 8, 0x67, 640 }, /* 0110 0111 */ { 9, 0xCC, 704 }, /* 0110 0110 0 */ { 9, 0xCD, 768 }, /* 0110 0110 1 */ { 9, 0xD2, 832 }, /* 0110 1001 0 */ { 9, 0xD3, 896 }, /* 0110 1001 1 */ { 9, 0xD4, 960 }, /* 0110 1010 0 */ { 9, 0xD5, 1024 }, /* 0110 1010 1 */ { 9, 0xD6, 1088 }, /* 0110 1011 0 */ { 9, 0xD7, 1152 }, /* 0110 1011 1 */ { 9, 0xD8, 1216 }, /* 0110 1100 0 */ { 9, 0xD9, 1280 }, /* 0110 1100 1 */ { 9, 0xDA, 1344 }, /* 0110 1101 0 */ { 9, 0xDB, 1408 }, /* 0110 1101 1 */ { 9, 0x98, 1472 }, /* 0100 1100 0 */ { 9, 0x99, 1536 }, /* 0100 1100 1 */ { 9, 0x9A, 1600 }, /* 0100 1101 0 */ { 6, 0x18, 1664 }, /* 0110 00 */ { 9, 0x9B, 1728 }, /* 0100 1101 1 */ { 11, 0x8, 1792 }, /* 0000 0001 000 */ { 11, 0xC, 1856 }, /* 0000 0001 100 */ { 11, 0xD, 1920 }, /* 0000 0001 101 */ { 12, 0x12, 1984 }, /* 0000 0001 0010 */ { 12, 0x13, 2048 }, /* 0000 0001 0011 */ { 12, 0x14, 2112 }, /* 0000 0001 0100 */ { 12, 0x15, 2176 }, /* 0000 0001 0101 */ { 12, 0x16, 2240 }, /* 0000 0001 0110 */ { 12, 0x17, 2304 }, /* 0000 0001 0111 */ { 12, 0x1C, 2368 }, /* 0000 0001 1100 */ { 12, 0x1D, 2432 }, /* 0000 0001 1101 */ { 12, 0x1E, 2496 }, /* 0000 0001 1110 */ { 12, 0x1F, 2560 }, /* 0000 0001 1111 */ { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */ { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */ { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */ { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */ { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */ }; const tableentry TIFFFaxBlackCodes[] = { { 10, 0x37, 0 }, /* 0000 1101 11 */ { 3, 0x2, 1 }, /* 010 */ { 2, 0x3, 2 }, /* 11 */ { 2, 0x2, 3 }, /* 10 */ { 3, 0x3, 4 }, /* 011 */ { 4, 0x3, 5 }, /* 0011 */ { 4, 0x2, 6 }, /* 0010 */ { 5, 0x3, 7 }, /* 0001 1 */ { 6, 0x5, 8 }, /* 0001 01 */ { 6, 0x4, 9 }, /* 0001 00 */ { 7, 0x4, 10 }, /* 0000 100 */ { 7, 0x5, 11 }, /* 0000 101 */ { 7, 0x7, 12 }, /* 0000 111 */ { 8, 0x4, 13 }, /* 0000 0100 */ { 8, 0x7, 14 }, /* 0000 0111 */ { 9, 0x18, 15 }, /* 0000 1100 0 */ { 10, 0x17, 16 }, /* 0000 0101 11 */ { 10, 0x18, 17 }, /* 0000 0110 00 */ { 10, 0x8, 18 }, /* 0000 0010 00 */ { 11, 0x67, 19 }, /* 0000 1100 111 */ { 11, 0x68, 20 }, /* 0000 1101 000 */ { 11, 0x6C, 21 }, /* 0000 1101 100 */ { 11, 0x37, 22 }, /* 0000 0110 111 */ { 11, 0x28, 23 }, /* 0000 0101 000 */ { 11, 0x17, 24 }, /* 0000 0010 111 */ { 11, 0x18, 25 }, /* 0000 0011 000 */ { 12, 0xCA, 26 }, /* 0000 1100 1010 */ { 12, 0xCB, 27 }, /* 0000 1100 1011 */ { 12, 0xCC, 28 }, /* 0000 1100 1100 */ { 12, 0xCD, 29 }, /* 0000 1100 1101 */ { 12, 0x68, 30 }, /* 0000 0110 1000 */ { 12, 0x69, 31 }, /* 0000 0110 1001 */ { 12, 0x6A, 32 }, /* 0000 0110 1010 */ { 12, 0x6B, 33 }, /* 0000 0110 1011 */ { 12, 0xD2, 34 }, /* 0000 1101 0010 */ { 12, 0xD3, 35 }, /* 0000 1101 0011 */ { 12, 0xD4, 36 }, /* 0000 1101 0100 */ { 12, 0xD5, 37 }, /* 0000 1101 0101 */ { 12, 0xD6, 38 }, /* 0000 1101 0110 */ { 12, 0xD7, 39 }, /* 0000 1101 0111 */ { 12, 0x6C, 40 }, /* 0000 0110 1100 */ { 12, 0x6D, 41 }, /* 0000 0110 1101 */ { 12, 0xDA, 42 }, /* 0000 1101 1010 */ { 12, 0xDB, 43 }, /* 0000 1101 1011 */ { 12, 0x54, 44 }, /* 0000 0101 0100 */ { 12, 0x55, 45 }, /* 0000 0101 0101 */ { 12, 0x56, 46 }, /* 0000 0101 0110 */ { 12, 0x57, 47 }, /* 0000 0101 0111 */ { 12, 0x64, 48 }, /* 0000 0110 0100 */ { 12, 0x65, 49 }, /* 0000 0110 0101 */ { 12, 0x52, 50 }, /* 0000 0101 0010 */ { 12, 0x53, 51 }, /* 0000 0101 0011 */ { 12, 0x24, 52 }, /* 0000 0010 0100 */ { 12, 0x37, 53 }, /* 0000 0011 0111 */ { 12, 0x38, 54 }, /* 0000 0011 1000 */ { 12, 0x27, 55 }, /* 0000 0010 0111 */ { 12, 0x28, 56 }, /* 0000 0010 1000 */ { 12, 0x58, 57 }, /* 0000 0101 1000 */ { 12, 0x59, 58 }, /* 0000 0101 1001 */ { 12, 0x2B, 59 }, /* 0000 0010 1011 */ { 12, 0x2C, 60 }, /* 0000 0010 1100 */ { 12, 0x5A, 61 }, /* 0000 0101 1010 */ { 12, 0x66, 62 }, /* 0000 0110 0110 */ { 12, 0x67, 63 }, /* 0000 0110 0111 */ { 10, 0xF, 64 }, /* 0000 0011 11 */ { 12, 0xC8, 128 }, /* 0000 1100 1000 */ { 12, 0xC9, 192 }, /* 0000 1100 1001 */ { 12, 0x5B, 256 }, /* 0000 0101 1011 */ { 12, 0x33, 320 }, /* 0000 0011 0011 */ { 12, 0x34, 384 }, /* 0000 0011 0100 */ { 12, 0x35, 448 }, /* 0000 0011 0101 */ { 13, 0x6C, 512 }, /* 0000 0011 0110 0 */ { 13, 0x6D, 576 }, /* 0000 0011 0110 1 */ { 13, 0x4A, 640 }, /* 0000 0010 0101 0 */ { 13, 0x4B, 704 }, /* 0000 0010 0101 1 */ { 13, 0x4C, 768 }, /* 0000 0010 0110 0 */ { 13, 0x4D, 832 }, /* 0000 0010 0110 1 */ { 13, 0x72, 896 }, /* 0000 0011 1001 0 */ { 13, 0x73, 960 }, /* 0000 0011 1001 1 */ { 13, 0x74, 1024 }, /* 0000 0011 1010 0 */ { 13, 0x75, 1088 }, /* 0000 0011 1010 1 */ { 13, 0x76, 1152 }, /* 0000 0011 1011 0 */ { 13, 0x77, 1216 }, /* 0000 0011 1011 1 */ { 13, 0x52, 1280 }, /* 0000 0010 1001 0 */ { 13, 0x53, 1344 }, /* 0000 0010 1001 1 */ { 13, 0x54, 1408 }, /* 0000 0010 1010 0 */ { 13, 0x55, 1472 }, /* 0000 0010 1010 1 */ { 13, 0x5A, 1536 }, /* 0000 0010 1101 0 */ { 13, 0x5B, 1600 }, /* 0000 0010 1101 1 */ { 13, 0x64, 1664 }, /* 0000 0011 0010 0 */ { 13, 0x65, 1728 }, /* 0000 0011 0010 1 */ { 11, 0x8, 1792 }, /* 0000 0001 000 */ { 11, 0xC, 1856 }, /* 0000 0001 100 */ { 11, 0xD, 1920 }, /* 0000 0001 101 */ { 12, 0x12, 1984 }, /* 0000 0001 0010 */ { 12, 0x13, 2048 }, /* 0000 0001 0011 */ { 12, 0x14, 2112 }, /* 0000 0001 0100 */ { 12, 0x15, 2176 }, /* 0000 0001 0101 */ { 12, 0x16, 2240 }, /* 0000 0001 0110 */ { 12, 0x17, 2304 }, /* 0000 0001 0111 */ { 12, 0x1C, 2368 }, /* 0000 0001 1100 */ { 12, 0x1D, 2432 }, /* 0000 0001 1101 */ { 12, 0x1E, 2496 }, /* 0000 0001 1110 */ { 12, 0x1F, 2560 }, /* 0000 0001 1111 */ { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */ { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */ { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */ { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */ { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */ }; #else extern const tableentry TIFFFaxWhiteCodes[]; extern const tableentry TIFFFaxBlackCodes[]; #endif #endif /* _T4_ */ /* * Local Variables: * mode: c * c-basic-offset: 8 * fill-column: 78 * End: */ tiff-4.0.3/config/0000755000212300117540000000000012027361331010712 500000000000000tiff-4.0.3/config/depcomp0000755000212300117540000004224610640237031012215 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2006-10-15.18 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software # Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: tiff-4.0.3/config/missing0000755000212300117540000002557710640237022012247 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2006-05-10.23 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case $1 in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $1 in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: tiff-4.0.3/config/test-driver0000755000212300117540000000763512014215363013042 00000000000000#! /bin/sh # test-driver - basic driver script for the 'parallel-tests' mode. scriptversion=2012-06-27.10; # UTC # Copyright (C) 2011-2012 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then estatus=1 fi case $estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: tiff-4.0.3/config/install-sh0000755000212300117540000003160010640237022012634 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2006-10-14.15 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" posix_glob= posix_mkdir= # Desired mode of installed file. mode=0755 chmodcmd=$chmodprog chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) mode=$2 shift shift case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac done if test $# -ne 0 && test -z "$dir_arg$dstarg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix=/ ;; -*) prefix=./ ;; *) prefix= ;; esac case $posix_glob in '') if (set -f) 2>/dev/null; then posix_glob=true else posix_glob=false fi ;; esac oIFS=$IFS IFS=/ $posix_glob && set -f set fnord $dstdir shift $posix_glob && set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dst"; then $doit $rmcmd -f "$dst" 2>/dev/null \ || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } } || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: tiff-4.0.3/config/compile0000755000212300117540000000717310640237022012216 00000000000000#! /bin/sh # Wrapper for compilers which do not understand `-c -o'. scriptversion=2005-05-14.22 # Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand `-c -o'. Remove `-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file `INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; esac ofile= cfile= eat= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as `compile cc -o foo foo.c'. # So we strip `-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no `-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # `.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` # Create the lock directory. # Note: use `[/.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: tiff-4.0.3/config/config.guess0000755000212300117540000012751611011074256013165 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-01-08' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: tiff-4.0.3/config/mkinstalldirs0000755000212300117540000000664710640237031013453 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2006-05-11.19 # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" errstatus=0 dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue pathcomp=$pathcomp$d case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr= chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp=$pathcomp/ done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: tiff-4.0.3/config/config.sub0000755000212300117540000010115311011074256012615 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-01-16' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: tiff-4.0.3/config/ltmain.sh0000644000212300117540000105153712026614335012472 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 tiff-4.0.3/SConstruct0000644000212300117540000001350010573702751011427 00000000000000# $Id: SConstruct,v 1.4 2007/02/24 15:03:47 dron Exp $ # Tag Image File Format (TIFF) Software # # Copyright (C) 2005, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # This file contains rules to build software with the SCons tool # (see the http://www.scons.org/ for details on SCons). import os env = Environment() # Read the user supplied options opts = Options('libtiff.conf') opts.Add(PathOption('PREFIX', \ 'install architecture-independent files in this directory', \ '/usr/local', PathOption.PathIsDirCreate)) opts.Add(BoolOption('ccitt', \ 'enable support for CCITT Group 3 & 4 algorithms', \ 'yes')) opts.Add(BoolOption('packbits', \ 'enable support for Macintosh PackBits algorithm', \ 'yes')) opts.Add(BoolOption('lzw', \ 'enable support for LZW algorithm', \ 'yes')) opts.Add(BoolOption('thunder', \ 'enable support for ThunderScan 4-bit RLE algorithm', \ 'yes')) opts.Add(BoolOption('next', \ 'enable support for NeXT 2-bit RLE algorithm', \ 'yes')) opts.Add(BoolOption('logluv', \ 'enable support for LogLuv high dynamic range encoding', \ 'yes')) opts.Add(BoolOption('strip_chopping', \ 'support for strip chopping (whether or not to convert single-strip uncompressed images to mutiple strips of ~8Kb to reduce memory usage)', \ 'yes')) opts.Add(BoolOption('extrasample_as_alpha', \ 'the RGBA interface will treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many packages produce RGBA files but don\'t mark the alpha properly', \ 'yes')) opts.Add(BoolOption('check_ycbcr_subsampling', \ 'disable picking up YCbCr subsampling info from the JPEG data stream to support files lacking the tag', \ 'yes')) opts.Update(env) opts.Save('libtiff.conf', env) Help(opts.GenerateHelpText(env)) # Here are our installation paths: idir_prefix = '$PREFIX' idir_lib = '$PREFIX/lib' idir_bin = '$PREFIX/bin' idir_inc = '$PREFIX/include' idir_doc = '$PREFIX/doc' Export([ 'env', 'idir_prefix', 'idir_lib', 'idir_bin', 'idir_inc', 'idir_doc' ]) # Now proceed to system feature checks target_cpu, target_vendor, target_kernel, target_os = \ os.popen("./config/config.guess").readlines()[0].split("-") def Define(context, key, have): import SCons.Conftest SCons.Conftest._Have(context, key, have) def CheckCustomOption(context, name): context.Message('Checking is the ' + name + ' option set... ') ret = env[name] Define(context, name + '_SUPPORT', ret) context.Result(ret) return ret def CheckFillorderOption(context): context.Message('Checking for the native cpu bit order... ') if target_cpu[0] == 'i' and target_cpu[2:] == '86': Define(context, 'HOST_FILLORDER', 'FILLORDER_LSB2MSB') context.Result('lsb2msb') else: Define(context, 'HOST_FILLORDER', 'FILLORDER_MSB2LSB') context.Result('msb2lsb') return 1 def CheckIEEEFPOption(context): context.Message('Checking for the IEEE floating point format... ') Define(context, 'HAVE_IEEEFP', 1) context.Result(1) return 1 def CheckOtherOption(context, name): context.Message('Checking is the ' + name + ' option set... ') ret = env[name] Define(context, 'HAVE_' + name, ret) context.Result(ret) return ret custom_tests = { \ 'CheckCustomOption' : CheckCustomOption, \ 'CheckFillorderOption' : CheckFillorderOption, \ 'CheckIEEEFPOption' : CheckIEEEFPOption, \ 'CheckOtherOption' : CheckOtherOption \ } conf = Configure(env, custom_tests = custom_tests, \ config_h = 'libtiff/tif_config.h') # Check for standard library conf.CheckLib('c') if target_os != 'cygwin' \ and target_os != 'mingw32' \ and target_os != 'beos' \ and target_os != 'darwin': conf.CheckLib('m') # Check for system headers conf.CheckCHeader('assert.h') conf.CheckCHeader('fcntl.h') conf.CheckCHeader('io.h') conf.CheckCHeader('limits.h') conf.CheckCHeader('malloc.h') conf.CheckCHeader('search.h') conf.CheckCHeader('sys/time.h') conf.CheckCHeader('unistd.h') # Check for standard library functions conf.CheckFunc('floor') conf.CheckFunc('isascii') conf.CheckFunc('memmove') conf.CheckFunc('memset') conf.CheckFunc('mmap') conf.CheckFunc('pow') conf.CheckFunc('setmode') conf.CheckFunc('sqrt') conf.CheckFunc('strchr') conf.CheckFunc('strrchr') conf.CheckFunc('strstr') conf.CheckFunc('strtol') conf.CheckFillorderOption() conf.CheckIEEEFPOption() conf.CheckCustomOption('ccitt') conf.CheckCustomOption('packbits') conf.CheckCustomOption('lzw') conf.CheckCustomOption('thunder') conf.CheckCustomOption('next') conf.CheckCustomOption('logluv') conf.CheckOtherOption('strip_chopping') conf.CheckOtherOption('extrasample_as_alpha') conf.CheckOtherOption('check_ycbcr_subsampling') env = conf.Finish() # Ok, now go to build files in the subdirectories SConscript(dirs = [ 'libtiff' ], name = 'SConstruct') tiff-4.0.3/RELEASE-DATE0000644000212300117540000000001112027361253011076 0000000000000020120922 tiff-4.0.3/m4/0000755000212300117540000000000012027361330007764 500000000000000tiff-4.0.3/m4/ltsugar.m40000644000212300117540000001042412026614335011635 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) tiff-4.0.3/m4/lt~obsolete.m40000644000212300117540000001375612026614336012542 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) tiff-4.0.3/m4/ltoptions.m40000644000212300117540000003007312026614335012211 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) tiff-4.0.3/m4/acinclude.m40000644000212300117540000010010511415374157012105 00000000000000dnl --------------------------------------------------------------------------- dnl Message output dnl --------------------------------------------------------------------------- AC_DEFUN([LOC_MSG],[echo "$1"]) dnl --------------------------------------------------------------------------- dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/vl_prog_cc_warnings.html dnl --------------------------------------------------------------------------- dnl @synopsis VL_PROG_CC_WARNINGS([ANSI]) dnl dnl Enables a reasonable set of warnings for the C compiler. dnl Optionally, if the first argument is nonempty, turns on flags which dnl enforce and/or enable proper ANSI C if such are known with the dnl compiler used. dnl dnl Currently this macro knows about GCC, Solaris C compiler, Digital dnl Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C dnl compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos dnl 10.0.0.8) C compiler. dnl dnl @category C dnl @author Ville Laurikari dnl @version 2002-04-04 dnl @license AllPermissive AC_DEFUN([VL_PROG_CC_WARNINGS], [ ansi=$1 if test -z "$ansi"; then msg="for C compiler warning flags" else msg="for C compiler warning and ANSI conformance flags" fi AC_CACHE_CHECK($msg, vl_cv_prog_cc_warnings, [ if test -n "$CC"; then cat > conftest.c <&1 | grep -i "WorkShop" > /dev/null 2>&1 && $CC -c -v -Xc conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-v" else vl_cv_prog_cc_warnings="-v -Xc" fi dnl Digital Unix C compiler elif $CC -V 2>&1 | grep -i "Digital UNIX Compiler" > /dev/null 2>&1 && $CC -c -verbose -w0 -warnprotos -std1 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos" else vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos -std1" fi dnl C for AIX Compiler elif $CC 2>&1 | grep -i "C for AIX Compiler" > /dev/null 2>&1 && $CC -c -qlanglvl=ansi -qinfo=all conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" else vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd -qlanglvl=ansi" fi dnl IRIX C compiler elif $CC -version 2>&1 | grep -i "MIPSpro Compilers" > /dev/null 2>&1 && $CC -c -fullwarn -ansi -ansiE conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-fullwarn" else vl_cv_prog_cc_warnings="-fullwarn -ansi -ansiE" fi dnl HP-UX C compiler elif what $CC 2>&1 | grep -i "HP C Compiler" > /dev/null 2>&1 && $CC -c -Aa +w1 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="+w1" else vl_cv_prog_cc_warnings="+w1 -Aa" fi dnl The NEC SX-5 (Super-UX 10) C compiler elif $CC -V 2>&1 | grep "/SX" > /dev/null 2>&1 && $CC -c -pvctl[,]fullmsg -Xc conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-pvctl[,]fullmsg" else vl_cv_prog_cc_warnings="-pvctl[,]fullmsg -Xc" fi dnl The Cray C compiler (Unicos) elif $CC -V 2>&1 | grep -i "Cray" > /dev/null 2>&1 && $CC -c -h msglevel 2 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-h msglevel 2" else vl_cv_prog_cc_warnings="-h msglevel 2 -h conform" fi fi rm -f conftest.* fi if test -n "$vl_cv_prog_cc_warnings"; then CFLAGS="$CFLAGS $vl_cv_prog_cc_warnings" else vl_cv_prog_cc_warnings="unknown" fi ]) ])dnl dnl --------------------------------------------------------------------------- dnl Available from the GNU Autoconf Macro Archive at: dnl http://autoconf-archive.cryp.to/ax_lang_compiler_ms.html dnl --------------------------------------------------------------------------- dnl @synopsis AX_LANG_COMPILER_MS dnl dnl Check whether the compiler for the current language is Microsoft. dnl dnl This macro is modeled after _AC_LANG_COMPILER_GNU in the GNU dnl Autoconf implementation. dnl dnl @category InstalledPackages dnl @author Braden McDaniel dnl @version 2004-11-15 dnl @license AllPermissive AC_DEFUN([AX_LANG_COMPILER_MS], [AC_CACHE_CHECK([whether we are using the Microsoft _AC_LANG compiler], [ax_cv_[]_AC_LANG_ABBREV[]_compiler_ms], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[#ifndef _MSC_VER choke me #endif ]])], [ax_compiler_ms=yes], [ax_compiler_ms=no]) ax_cv_[]_AC_LANG_ABBREV[]_compiler_ms=$ax_compiler_ms ])]) dnl --------------------------------------------------------------------------- dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/ax_check_gl.html dnl --------------------------------------------------------------------------- dnl SYNOPSIS dnl dnl AX_CHECK_GL dnl dnl DESCRIPTION dnl dnl Check for an OpenGL implementation. If GL is found, the required dnl compiler and linker flags are included in the output variables dnl "GL_CFLAGS" and "GL_LIBS", respectively. If no usable GL implementation dnl is found, "no_gl" is set to "yes". dnl dnl If the header "GL/gl.h" is found, "HAVE_GL_GL_H" is defined. If the dnl header "OpenGL/gl.h" is found, HAVE_OPENGL_GL_H is defined. These dnl preprocessor definitions may not be mutually exclusive. dnl dnl LICENSE dnl dnl Copyright (c) 2009 Braden McDaniel dnl dnl This program is free software; you can redistribute it and/or modify it dnl under the terms of the GNU General Public License as published by the dnl Free Software Foundation; either version 2 of the License, or (at your dnl option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General dnl Public License for more details. dnl dnl You should have received a copy of the GNU General Public License along dnl with this program. If not, see . dnl dnl As a special exception, the respective Autoconf Macro's copyright owner dnl gives unlimited permission to copy, distribute and modify the configure dnl scripts that are the output of Autoconf when processing the Macro. You dnl need not follow the terms of the GNU General Public License when using dnl or distributing such scripts, even though portions of the text of the dnl Macro appear in them. The GNU General Public License (GPL) does govern dnl all other use of the material that constitutes the Autoconf Macro. dnl dnl This special exception to the GPL applies to versions of the Autoconf dnl Macro released by the Autoconf Archive. When you make and distribute a dnl modified version of the Autoconf Macro, you may extend this special dnl exception to the GPL to apply to your modified version as well. AC_DEFUN([AX_CHECK_GL], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PATH_X])dnl AC_REQUIRE([AX_PTHREAD])dnl AC_LANG_PUSH([C]) AX_LANG_COMPILER_MS AS_IF([test X$ax_compiler_ms = Xno], [GL_CFLAGS="${PTHREAD_CFLAGS}"; GL_LIBS="${PTHREAD_LIBS} -lm"]) dnl dnl Use x_includes and x_libraries if they have been set (presumably by dnl AC_PATH_X). dnl AS_IF([test "X$no_x" != "Xyes"], [AS_IF([test -n "$x_includes"], [GL_CFLAGS="-I${x_includes} ${GL_CFLAGS}"])] AS_IF([test -n "$x_libraries"], [GL_LIBS="-L${x_libraries} -lX11 ${GL_LIBS}"])) ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" AC_CHECK_HEADERS([GL/gl.h OpenGL/gl.h]) CPPFLAGS="${ax_save_CPPFLAGS}" AC_CHECK_HEADERS([windows.h]) m4_define([AX_CHECK_GL_PROGRAM], [AC_LANG_PROGRAM([[ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GL_H # include # elif defined(HAVE_OPENGL_GL_H) # include # else # error no gl.h # endif]], [[glBegin(0)]])]) AC_CACHE_CHECK([for OpenGL library], [ax_cv_check_gl_libgl], [ax_cv_check_gl_libgl="no" case $host_cpu in x86_64) ax_check_gl_libdir=lib64 ;; *) ax_check_gl_libdir=lib ;; esac ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="" ax_check_libs="-lopengl32 -lGL" for ax_lib in ${ax_check_libs}; do AS_IF([test X$ax_compiler_ms = Xyes], [ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'`], [ax_try_lib="${ax_lib}"]) LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}" AC_LINK_IFELSE([AX_CHECK_GL_PROGRAM], [ax_cv_check_gl_libgl="${ax_try_lib}"; break], [ax_check_gl_nvidia_flags="-L/usr/${ax_check_gl_libdir}/nvidia" LIBS="${ax_try_lib} ${ax_check_gl_nvidia_flags} ${GL_LIBS} ${ax_save_LIBS}" AC_LINK_IFELSE([AX_CHECK_GL_PROGRAM], [ax_cv_check_gl_libgl="${ax_try_lib} ${ax_check_gl_nvidia_flags}"; break], [ax_check_gl_dylib_flag='-dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib' LIBS="${ax_try_lib} ${ax_check_gl_dylib_flag} ${GL_LIBS} ${ax_save_LIBS}" AC_LINK_IFELSE([AX_CHECK_GL_PROGRAM], [ax_cv_check_gl_libgl="${ax_try_lib} ${ax_check_gl_dylib_flag}"; break])])]) done AS_IF([test "X$ax_cv_check_gl_libgl" = Xno -a "X$no_x" = Xyes], [LIBS='-framework OpenGL' AC_LINK_IFELSE([AX_CHECK_GL_PROGRAM], [ax_cv_check_gl_libgl="$LIBS"])]) LIBS=${ax_save_LIBS} CPPFLAGS=${ax_save_CPPFLAGS}]) AS_IF([test "X$ax_cv_check_gl_libgl" = Xno], [no_gl=yes; GL_CFLAGS=""; GL_LIBS=""], [GL_LIBS="${ax_cv_check_gl_libgl} ${GL_LIBS}"]) AC_LANG_POP([C]) AC_SUBST([GL_CFLAGS]) AC_SUBST([GL_LIBS]) ])dnl dnl --------------------------------------------------------------------------- dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/ax_check_glu.html dnl --------------------------------------------------------------------------- dnl SYNOPSIS dnl dnl AX_CHECK_GLU dnl dnl DESCRIPTION dnl dnl Check for GLU. If GLU is found, the required preprocessor and linker dnl flags are included in the output variables "GLU_CFLAGS" and "GLU_LIBS", dnl respectively. If no GLU implementation is found, "no_glu" is set to dnl "yes". dnl dnl If the header "GL/glu.h" is found, "HAVE_GL_GLU_H" is defined. If the dnl header "OpenGL/glu.h" is found, HAVE_OPENGL_GLU_H is defined. These dnl preprocessor definitions may not be mutually exclusive. dnl dnl Some implementations (in particular, some versions of Mac OS X) are dnl known to treat the GLU tesselator callback function type as "GLvoid dnl (*)(...)" rather than the standard "GLvoid (*)()". If the former dnl condition is detected, this macro defines "HAVE_VARARGS_GLU_TESSCB". dnl dnl LICENSE dnl dnl Copyright (c) 2009 Braden McDaniel dnl dnl This program is free software; you can redistribute it and/or modify it dnl under the terms of the GNU General Public License as published by the dnl Free Software Foundation; either version 2 of the License, or (at your dnl option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General dnl Public License for more details. dnl dnl You should have received a copy of the GNU General Public License along dnl with this program. If not, see . dnl dnl As a special exception, the respective Autoconf Macro's copyright owner dnl gives unlimited permission to copy, distribute and modify the configure dnl scripts that are the output of Autoconf when processing the Macro. You dnl need not follow the terms of the GNU General Public License when using dnl or distributing such scripts, even though portions of the text of the dnl Macro appear in them. The GNU General Public License (GPL) does govern dnl all other use of the material that constitutes the Autoconf Macro. dnl dnl This special exception to the GPL applies to versions of the Autoconf dnl Macro released by the Autoconf Archive. When you make and distribute a dnl modified version of the Autoconf Macro, you may extend this special dnl exception to the GPL to apply to your modified version as well. AC_DEFUN([AX_CHECK_GLU], [AC_REQUIRE([AX_CHECK_GL])dnl AC_REQUIRE([AC_PROG_CXX])dnl GLU_CFLAGS="${GL_CFLAGS}" ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" AC_CHECK_HEADERS([GL/glu.h OpenGL/glu.h]) CPPFLAGS="${ax_save_CPPFLAGS}" m4_define([AX_CHECK_GLU_PROGRAM], [AC_LANG_PROGRAM([[ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GLU_H # include # elif defined(HAVE_OPENGL_GLU_H) # include # else # error no glu.h # endif]], [[gluBeginCurve(0)]])]) AC_CACHE_CHECK([for OpenGL Utility library], [ax_cv_check_glu_libglu], [ax_cv_check_glu_libglu="no" ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" dnl dnl First, check for the possibility that everything we need is already in dnl GL_LIBS. dnl LIBS="${GL_LIBS} ${ax_save_LIBS}" dnl dnl libGLU typically links with libstdc++ on POSIX platforms. dnl However, setting the language to C++ means that test program dnl source is named "conftest.cc"; and Microsoft cl doesn't know what dnl to do with such a file. dnl AC_LANG_PUSH([C++]) AS_IF([test X$ax_compiler_ms = Xyes], [AC_LANG_PUSH([C])]) AC_LINK_IFELSE( [AX_CHECK_GLU_PROGRAM], [ax_cv_check_glu_libglu=yes], [LIBS="" ax_check_libs="-lglu32 -lGLU" for ax_lib in ${ax_check_libs}; do AS_IF([test X$ax_compiler_ms = Xyes], [ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'`], [ax_try_lib="${ax_lib}"]) LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}" AC_LINK_IFELSE([AX_CHECK_GLU_PROGRAM], [ax_cv_check_glu_libglu="${ax_try_lib}"; break]) done ]) AS_IF([test X$ax_compiler_ms = Xyes], [AC_LANG_POP([C])]) AC_LANG_POP([C++]) LIBS=${ax_save_LIBS} CPPFLAGS=${ax_save_CPPFLAGS}]) AS_IF([test "X$ax_cv_check_glu_libglu" = Xno], [no_glu=yes; GLU_CFLAGS=""; GLU_LIBS=""], [AS_IF([test "X$ax_cv_check_glu_libglu" = Xyes], [GLU_LIBS="$GL_LIBS"], [GLU_LIBS="${ax_cv_check_glu_libglu} ${GL_LIBS}"])]) AC_SUBST([GLU_CFLAGS]) AC_SUBST([GLU_LIBS]) dnl dnl Some versions of Mac OS X include a broken interpretation of the GLU dnl tesselation callback function signature. dnl AS_IF([test "X$ax_cv_check_glu_libglu" != Xno], [AC_CACHE_CHECK([for varargs GLU tesselator callback function type], [ax_cv_varargs_glu_tesscb], [ax_cv_varargs_glu_tesscb=no ax_save_CFLAGS="$CFLAGS" CFLAGS="$GL_CFLAGS $CFLAGS" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ # ifdef HAVE_GL_GLU_H # include # else # include # endif]], [[GLvoid (*func)(...); gluTessCallback(0, 0, func)]])], [ax_cv_varargs_glu_tesscb=yes]) CFLAGS="$ax_save_CFLAGS"]) AS_IF([test X$ax_cv_varargs_glu_tesscb = Xyes], [AC_DEFINE([HAVE_VARARGS_GLU_TESSCB], [1], [Use nonstandard varargs form for the GLU tesselator callback])])]) ]) dnl --------------------------------------------------------------------------- dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/ax_check_glut.html dnl --------------------------------------------------------------------------- dnl dnl SYNOPSIS dnl dnl AX_CHECK_GLUT dnl dnl DESCRIPTION dnl dnl Check for GLUT. If GLUT is found, the required compiler and linker flags dnl are included in the output variables "GLUT_CFLAGS" and "GLUT_LIBS", dnl respectively. If GLUT is not found, "no_glut" is set to "yes". dnl dnl If the header "GL/glut.h" is found, "HAVE_GL_GLUT_H" is defined. If the dnl header "GLUT/glut.h" is found, HAVE_GLUT_GLUT_H is defined. These dnl preprocessor definitions may not be mutually exclusive. dnl dnl LICENSE dnl dnl Copyright (c) 2009 Braden McDaniel dnl dnl This program is free software; you can redistribute it and/or modify it dnl under the terms of the GNU General Public License as published by the dnl Free Software Foundation; either version 2 of the License, or (at your dnl option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General dnl Public License for more details. dnl dnl You should have received a copy of the GNU General Public License along dnl with this program. If not, see . dnl dnl As a special exception, the respective Autoconf Macro's copyright owner dnl gives unlimited permission to copy, distribute and modify the configure dnl scripts that are the output of Autoconf when processing the Macro. You dnl need not follow the terms of the GNU General Public License when using dnl or distributing such scripts, even though portions of the text of the dnl Macro appear in them. The GNU General Public License (GPL) does govern dnl all other use of the material that constitutes the Autoconf Macro. dnl dnl This special exception to the GPL applies to versions of the Autoconf dnl Macro released by the Autoconf Archive. When you make and distribute a dnl modified version of the Autoconf Macro, you may extend this special dnl exception to the GPL to apply to your modified version as well. AC_DEFUN([AX_CHECK_GLUT], [AC_REQUIRE([AX_CHECK_GLU])dnl AC_REQUIRE([AC_PATH_XTRA])dnl ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GLU_CFLAGS} ${CPPFLAGS}" AC_CHECK_HEADERS([GL/glut.h GLUT/glut.h]) CPPFLAGS="${ax_save_CPPFLAGS}" GLUT_CFLAGS=${GLU_CFLAGS} GLUT_LIBS=${GLU_LIBS} m4_define([AX_CHECK_GLUT_PROGRAM], [AC_LANG_PROGRAM([[ # if HAVE_WINDOWS_H && defined(_WIN32) # include # endif # ifdef HAVE_GL_GLUT_H # include # elif defined(HAVE_GLUT_GLUT_H) # include # else # error no glut.h # endif]], [[glutMainLoop()]])]) dnl dnl If X is present, assume GLUT depends on it. dnl AS_IF([test X$no_x != Xyes], [GLUT_LIBS="${X_PRE_LIBS} -lXi ${X_EXTRA_LIBS} ${GLUT_LIBS}"]) AC_CACHE_CHECK([for GLUT library], [ax_cv_check_glut_libglut], [ax_cv_check_glut_libglut="no" AC_LANG_PUSH(C) ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GLUT_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="" ax_check_libs="-lglut32 -lglut" for ax_lib in ${ax_check_libs}; do AS_IF([test X$ax_compiler_ms = Xyes], [ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'`], [ax_try_lib="${ax_lib}"]) LIBS="${ax_try_lib} ${GLUT_LIBS} ${ax_save_LIBS}" AC_LINK_IFELSE([AX_CHECK_GLUT_PROGRAM], [ax_cv_check_glut_libglut="${ax_try_lib}"; break]) done AS_IF([test "X$ax_cv_check_glut_libglut" = Xno -a "X$no_x" = Xyes], [LIBS='-framework GLUT' AC_LINK_IFELSE([AX_CHECK_GLUT_PROGRAM], [ax_cv_check_glut_libglut="$LIBS"])]) CPPFLAGS="${ax_save_CPPFLAGS}" LIBS="${ax_save_LIBS}" AC_LANG_POP(C)]) AS_IF([test "X$ax_cv_check_glut_libglut" = Xno], [no_glut="yes"; GLUT_CFLAGS=""; GLUT_LIBS=""], [GLUT_LIBS="${ax_cv_check_glut_libglut} ${GLUT_LIBS}"]) AC_SUBST([GLUT_CFLAGS]) AC_SUBST([GLUT_LIBS]) ])dnl dnl --------------------------------------------------------------------------- dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/autoconf-archive/ax_pthread.html dnl --------------------------------------------------------------------------- dnl SYNOPSIS dnl dnl AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) dnl dnl DESCRIPTION dnl dnl This macro figures out how to build C programs using POSIX threads. It dnl sets the PTHREAD_LIBS output variable to the threads library and linker dnl flags, and the PTHREAD_CFLAGS output variable to any special C compiler dnl flags that are needed. (The user can also force certain compiler dnl flags/libs to be tested by setting these environment variables.) dnl dnl Also sets PTHREAD_CC to any special C compiler that is needed for dnl multi-threaded programs (defaults to the value of CC otherwise). (This dnl is necessary on AIX to use the special cc_r compiler alias.) dnl dnl NOTE: You are assumed to not only compile your program with these flags, dnl but also link it with them as well. e.g. you should link with dnl $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS dnl dnl If you are only building threads programs, you may wish to use these dnl variables in your default LIBS, CFLAGS, and CC: dnl dnl LIBS="$PTHREAD_LIBS $LIBS" dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" dnl CC="$PTHREAD_CC" dnl dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant dnl has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name dnl (e.g. PTHREAD_CREATE_UNDETACHED on AIX). dnl dnl ACTION-IF-FOUND is a list of shell commands to run if a threads library dnl is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it dnl is not found. If ACTION-IF-FOUND is not specified, the default action dnl will define HAVE_PTHREAD. dnl dnl Please let the authors know if this macro fails on any platform, or if dnl you have any other suggestions or comments. This macro was based on work dnl by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help dnl from M. Frigo), as well as ac_pthread and hb_pthread macros posted by dnl Alejandro Forero Cuervo to the autoconf macro repository. We are also dnl grateful for the helpful feedback of numerous users. dnl dnl LICENSE dnl dnl Copyright (c) 2008 Steven G. Johnson dnl dnl This program is free software: you can redistribute it and/or modify it dnl under the terms of the GNU General Public License as published by the dnl Free Software Foundation, either version 3 of the License, or (at your dnl option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General dnl Public License for more details. dnl dnl You should have received a copy of the GNU General Public License along dnl with this program. If not, see . dnl dnl As a special exception, the respective Autoconf Macro's copyright owner dnl gives unlimited permission to copy, distribute and modify the configure dnl scripts that are the output of Autoconf when processing the Macro. You dnl need not follow the terms of the GNU General Public License when using dnl or distributing such scripts, even though portions of the text of the dnl Macro appear in them. The GNU General Public License (GPL) does govern dnl all other use of the material that constitutes the Autoconf Macro. dnl dnl This special exception to the GPL applies to versions of the Autoconf dnl Macro released by the Autoconf Archive. When you make and distribute a dnl modified version of the Autoconf Macro, you may extend this special dnl exception to the GPL to apply to your modified version as well. AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_SAVE AC_LANG_C ax_pthread_ok=no dnl We used to check for pthread.h first, but this fails if pthread.h dnl requires special compiler flags (e.g. on True64 or Sequent). dnl It gets checked for in the link test anyway. dnl First of all, check if the user has set any of the PTHREAD_LIBS, dnl etcetera environment variables, and if threads linking works using dnl them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) AC_MSG_RESULT($ax_pthread_ok) if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi dnl We must check for the threads library under a number of different dnl names; the ordering is very important because some systems dnl (e.g. DEC) have both -lpthread and -lpthreads, where one of the dnl libraries is broken (non-POSIX). dnl Create a list of thread flags to try. Items starting with a "-" are dnl C compiler flags, and other items are library names, except for "none" dnl which indicates that we try without any flags at all, and "pthread-config" dnl which is a program returning the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" dnl The ordering *is* (sometimes) important. Some notes on the dnl individual items follow: dnl pthreads: AIX (must check this before -lpthread) dnl none: in case threads are in libc; should be tried before -Kthread and dnl other compiler flags to prevent continual compiler warnings dnl -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) dnl -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) dnl lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) dnl -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) dnl -pthreads: Solaris/gcc dnl -mthreads: Mingw32/gcc, Lynx/gcc dnl -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it dnl doesn't hurt to check since this sometimes defines pthreads too; dnl also defines -D_REENTRANT) dnl ... -mt is also the pthreads flag for HP/aCC dnl pthread: Linux, etcetera dnl --thread-safe: KAI C++ dnl pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) dnl On Solaris (at least, for some versions), libc contains stubbed dnl (non-functional) versions of the pthreads routines, so link-based dnl tests will erroneously succeed. (We need to link with -pthreads/-mt/ dnl -lpthread.) (The stubs are missing pthread_cleanup_push, or rather dnl a function called by this macro, so we could check for that, but dnl who knows whether they'll stub that too in a future libc.) So, dnl we'll just look for -pthreads and -lpthread first: ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" ;; *-darwin*) ax_pthread_flags="-pthread $ax_pthread_flags" ;; esac if test x"$ax_pthread_ok" = xno; then for flag in $ax_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) if test x"$ax_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" dnl Check for various functions. We must include pthread.h, dnl since some functions may be macros. (On the Sequent, we dnl need a special flag -Kthread to make this header compile.) dnl We check for pthread_join because it is in -lpthread on IRIX dnl while pthread_create is in libc. We check for pthread_attr_init dnl due to DEC craziness with -lpthreads. We check for dnl pthread_cleanup_push because it is one of the few pthread dnl functions on Solaris that doesn't have a non-functional libc stub. dnl We try pthread_create on general principles. AC_TRY_LINK([#include static void routine(void* a) {a=0;} static void* start_routine(void* a) {return a;}], [pthread_t th; pthread_attr_t attr; pthread_create(&th,0,start_routine,0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0); ], [ax_pthread_ok=yes]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($ax_pthread_ok) if test "x$ax_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi dnl Various other checks: if test "x$ax_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" dnl Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_TRY_LINK([#include ], [int attr=$attr; return attr;], [attr_name=$attr; break]) done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" dnl More AIX lossage: must compile with xlc_r or cc_r if test x"$GCC" != xyes; then AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) else PTHREAD_CC=$CC fi else PTHREAD_CC="$CC" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) dnl Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$ax_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else ax_pthread_ok=no $2 fi AC_LANG_RESTORE ])dnl AX_PTHREAD tiff-4.0.3/m4/ltversion.m40000644000212300117540000000126212026614335012201 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) tiff-4.0.3/m4/libtool.m40000644000212300117540000105724012026614335011630 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS tiff-4.0.3/html/0000755000212300117540000000000012027361331010411 500000000000000tiff-4.0.3/html/libtiff.html0000644000212300117540000011107110354614524012645 00000000000000 Using The TIFF Library

Using The TIFF Library

libtiff is a set of C functions (a library) that support the manipulation of TIFF image files. The library requires an ANSI C compilation environment for building and presumes an ANSI C environment for use.


libtiff provides interfaces to image data at several layers of abstraction (and cost). At the highest level image data can be read into an 8-bit/sample, ABGR pixel raster format without regard for the underlying data organization, colorspace, or compression scheme. Below this high-level interface the library provides scanline-, strip-, and tile-oriented interfaces that return data decompressed but otherwise untransformed. These interfaces require that the application first identify the organization of stored data and select either a strip-based or tile-based API for manipulating data. At the lowest level the library provides access to the raw uncompressed strips or tiles, returning the data exactly as it appears in the file.

The material presented in this chapter is a basic introduction to the capabilities of the library; it is not an attempt to describe everything a developer needs to know about the library or about TIFF. Detailed information on the interfaces to the library are given in the UNIX manual pages that accompany this software.

Michael Still has also written a useful introduction to libtiff for the IBM DeveloperWorks site available at http://www.ibm.com/developerworks/linux/library/l-libtiff.

The following sections are found in this chapter:


How to tell which version you have

The software version can be found by looking at the file named VERSION that is located at the top of the source tree; the precise alpha number is given in the file dist/tiff.alpha. If you have need to refer to this specific software, you should identify it as:

TIFF <version> <alpha>

where <version> is whatever you get from "cat VERSION" and <alpha> is what you get from "cat dist/tiff.alpha".

Within an application that uses libtiff the TIFFGetVersion routine will return a pointer to a string that contains software version information. The library include file <tiffio.h> contains a C pre-processor define TIFFLIB_VERSION that can be used to check library version compatiblity at compile time.


Library Datatypes

libtiff defines a portable programming interface through the use of a set of C type definitions. These definitions, defined in in the files tiff.h and tiffio.h, isolate the libtiff API from the characteristics of the underlying machine. To insure portable code and correct operation, applications that use libtiff should use the typedefs and follow the function prototypes for the library API.


Memory Management

libtiff uses a machine-specific set of routines for managing dynamically allocated memory. _TIFFmalloc, _TIFFrealloc, and _TIFFfree mimic the normal ANSI C routines. Any dynamically allocated memory that is to be passed into the library should be allocated using these interfaces in order to insure pointer compatibility on machines with a segmented architecture. (On 32-bit UNIX systems these routines just call the normal malloc, realloc, and free routines in the C library.)

To deal with segmented pointer issues libtiff also provides _TIFFmemcpy, _TIFFmemset, and _TIFFmemmove routines that mimic the equivalent ANSI C routines, but that are intended for use with memory allocated through _TIFFmalloc and _TIFFrealloc.


Error Handling

libtiff handles most errors by returning an invalid/erroneous value when returning from a function call. Various diagnostic messages may also be generated by the library. All error messages are directed to a single global error handler routine that can be specified with a call to TIFFSetErrorHandler. Likewise warning messages are directed to a single handler routine that can be specified with a call to TIFFSetWarningHandler


Basic File Handling

The library is modeled after the normal UNIX stdio library. For example, to read from an existing TIFF image the file must first be opened:

#include "tiffio.h"
main()
{
    TIFF* tif = TIFFOpen("foo.tif", "r");
    ... do stuff ...
    TIFFClose(tif);
}

The handle returned by TIFFOpen is opaque, that is the application is not permitted to know about its contents. All subsequent library calls for this file must pass the handle as an argument.

To create or overwrite a TIFF image the file is also opened, but with a "w" argument:

#include "tiffio.h"
main()
{
    TIFF* tif = TIFFOpen("foo.tif", "w");
    ... do stuff ...
    TIFFClose(tif);
}

If the file already exists it is first truncated to zero length.

Note that unlike the stdio library TIFF image files may not be opened for both reading and writing; there is no support for altering the contents of a TIFF file.

libtiff buffers much information associated with writing a valid TIFF image. Consequently, when writing a TIFF image it is necessary to always call TIFFClose or TIFFFlush to flush any buffered information to a file. Note that if you call TIFFClose you do not need to call TIFFFlush.


TIFF Directories

TIFF supports the storage of multiple images in a single file. Each image has an associated data structure termed a directory that houses all the information about the format and content of the image data. Images in a file are usually related but they do not need to be; it is perfectly alright to store a color image together with a black and white image. Note however that while images may be related their directories are not. That is, each directory stands on its own; their is no need to read an unrelated directory in order to properly interpret the contents of an image.

libtiff provides several routines for reading and writing directories. In normal use there is no need to explicitly read or write a directory: the library automatically reads the first directory in a file when opened for reading, and directory information to be written is automatically accumulated and written when writing (assuming TIFFClose or TIFFFlush are called).

For a file open for reading the TIFFSetDirectory routine can be used to select an arbitrary directory; directories are referenced by number with the numbering starting at 0. Otherwise the TIFFReadDirectory and TIFFWriteDirectory routines can be used for sequential access to directories. For example, to count the number of directories in a file the following code might be used:

#include "tiffio.h"
main(int argc, char* argv[])
{
    TIFF* tif = TIFFOpen(argv[1], "r");
    if (tif) {
        int dircount = 0;
        do {
            dircount++;
        } while (TIFFReadDirectory(tif));
        printf("%d directories in %s\n", dircount, argv[1]);
        TIFFClose(tif);
    }
    exit(0);
}

Finally, note that there are several routines for querying the directory status of an open file: TIFFCurrentDirectory returns the index of the current directory and TIFFLastDirectory returns an indication of whether the current directory is the last directory in a file. There is also a routine, TIFFPrintDirectory, that can be called to print a formatted description of the contents of the current directory; consult the manual page for complete details.


TIFF Tags

Image-related information such as the image width and height, number of samples, orientation, colorimetric information, etc. are stored in each image directory in fields or tags. Tags are identified by a number that is usually a value registered with the Aldus (now Adobe) Corporation. Beware however that some vendors write TIFF images with tags that are unregistered; in this case interpreting their contents is usually a waste of time.

libtiff reads the contents of a directory all at once and converts the on-disk information to an appropriate in-memory form. While the TIFF specification permits an arbitrary set of tags to be defined and used in a file, the library only understands a limited set of tags. Any unknown tags that are encountered in a file are ignored. There is a mechanism to extend the set of tags the library handles without modifying the library itself; this is described elsewhere.

libtiff provides two interfaces for getting and setting tag values: TIFFGetField and TIFFSetField. These routines use a variable argument list-style interface to pass parameters of different type through a single function interface. The get interface takes one or more pointers to memory locations where the tag values are to be returned and also returns one or zero according to whether the requested tag is defined in the directory. The set interface takes the tag values either by-reference or by-value. The TIFF specification defines default values for some tags. To get the value of a tag, or its default value if it is undefined, the TIFFGetFieldDefaulted interface may be used.

The manual pages for the tag get and set routines specifiy the exact data types and calling conventions required for each tag supported by the library.


TIFF Compression Schemes

libtiff includes support for a wide variety of data compression schemes. In normal operation a compression scheme is automatically used when the TIFF Compression tag is set, either by opening a file for reading, or by setting the tag when writing.

Compression schemes are implemented by software modules termed codecs that implement decoder and encoder routines that hook into the core library i/o support. Codecs other than those bundled with the library can be registered for use with the TIFFRegisterCODEC routine. This interface can also be used to override the core-library implementation for a compression scheme.


Byte Order

The TIFF specification says, and has always said, that a correct TIFF reader must handle images in big-endian and little-endian byte order. libtiff conforms in this respect. Consequently there is no means to force a specific byte order for the data written to a TIFF image file (data is written in the native order of the host CPU unless appending to an existing file, in which case it is written in the byte order specified in the file).


Data Placement

The TIFF specification requires that all information except an 8-byte header can be placed anywhere in a file. In particular, it is perfectly legitimate for directory information to be written after the image data itself. Consequently TIFF is inherently not suitable for passing through a stream-oriented mechanism such as UNIX pipes. Software that require that data be organized in a file in a particular order (e.g. directory information before image data) does not correctly support TIFF. libtiff provides no mechanism for controlling the placement of data in a file; image data is typically written before directory information.


TIFFRGBAImage Support

libtiff provides a high-level interface for reading image data from a TIFF file. This interface handles the details of data organization and format for a wide variety of TIFF files; at least the large majority of those files that one would normally encounter. Image data is, by default, returned as ABGR pixels packed into 32-bit words (8 bits per sample). Rectangular rasters can be read or data can be intercepted at an intermediate level and packed into memory in a format more suitable to the application. The library handles all the details of the format of data stored on disk and, in most cases, if any colorspace conversions are required: bilevel to RGB, greyscale to RGB, CMYK to RGB, YCbCr to RGB, 16-bit samples to 8-bit samples, associated/unassociated alpha, etc.

There are two ways to read image data using this interface. If all the data is to be stored in memory and manipulated at once, then the routine TIFFReadRGBAImage can be used:

#include "tiffio.h"
main(int argc, char* argv[])
{
    TIFF* tif = TIFFOpen(argv[1], "r");
    if (tif) {
        uint32 w, h;
        size_t npixels;
        uint32* raster;
        
        TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);
        TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
        npixels = w * h;
        raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32));
        if (raster != NULL) {
            if (TIFFReadRGBAImage(tif, w, h, raster, 0)) {
                ...process raster data...
            }
            _TIFFfree(raster);
        }
        TIFFClose(tif);
    }
    exit(0);
}

Note above that _TIFFmalloc is used to allocate memory for the raster passed to TIFFReadRGBAImage; this is important to insure the ``appropriate type of memory'' is passed on machines with segmented architectures.

Alternatively, TIFFReadRGBAImage can be replaced with a more low-level interface that permits an application to have more control over this reading procedure. The equivalent to the above is:

#include "tiffio.h"
main(int argc, char* argv[])
{
    TIFF* tif = TIFFOpen(argv[1], "r");
    if (tif) {
        TIFFRGBAImage img;
        char emsg[1024];
        
        if (TIFFRGBAImageBegin(&img, tif, 0, emsg)) {
            size_t npixels;
            uint32* raster;
            
            npixels = img.width * img.height;
            raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32));
            if (raster != NULL) {
                if (TIFFRGBAImageGet(&img, raster, img.width, img.height)) {
                    ...process raster data...
                }
                _TIFFfree(raster);
            }
            TIFFRGBAImageEnd(&img);
        } else
            TIFFError(argv[1], emsg);
        TIFFClose(tif);
    }
    exit(0);
}

However this usage does not take advantage of the more fine-grained control that's possible. That is, by using this interface it is possible to:

  • repeatedly fetch (and manipulate) an image without opening and closing the file
  • interpose a method for packing raster pixel data according to application-specific needs (or write the data at all)
  • interpose methods that handle TIFF formats that are not already handled by the core library

The first item means that, for example, image viewers that want to handle multiple files can cache decoding information in order to speedup the work required to display a TIFF image.

The second item is the main reason for this interface. By interposing a "put method" (the routine that is called to pack pixel data in the raster) it is possible share the core logic that understands how to deal with TIFF while packing the resultant pixels in a format that is optimized for the application. This alternate format might be very different than the 8-bit per sample ABGR format the library writes by default. For example, if the application is going to display the image on an 8-bit colormap display the put routine might take the data and convert it on-the-fly to the best colormap indices for display.

The last item permits an application to extend the library without modifying the core code. By overriding the code provided an application might add support for some esoteric flavor of TIFF that it needs, or it might substitute a packing routine that is able to do optimizations using application/environment-specific information.

The TIFF image viewer found in tools/sgigt.c is an example of an application that makes use of the TIFFRGBAImage support.


Scanline-based Image I/O

The simplest interface provided by libtiff is a scanline-oriented interface that can be used to read TIFF images that have their image data organized in strips (trying to use this interface to read data written in tiles will produce errors.) A scanline is a one pixel high row of image data whose width is the width of the image. Data is returned packed if the image data is stored with samples packed together, or as arrays of separate samples if the data is stored with samples separated. The major limitation of the scanline-oriented interface, other than the need to first identify an existing file as having a suitable organization, is that random access to individual scanlines can only be provided when data is not stored in a compressed format, or when the number of rows in a strip of image data is set to one (RowsPerStrip is one).

Two routines are provided for scanline-based i/o: TIFFReadScanline and TIFFWriteScanline. For example, to read the contents of a file that is assumed to be organized in strips, the following might be used:

#include "tiffio.h"
main()
{
    TIFF* tif = TIFFOpen("myfile.tif", "r");
    if (tif) {
        uint32 imagelength;
        tdata_t buf;
        uint32 row;
        
        TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
        buf = _TIFFmalloc(TIFFScanlineSize(tif));
        for (row = 0; row < imagelength; row++)
            tiffreadscanline(tif, buf, row);
        _tifffree(buf);
        tiffclose(tif);
    }
}

TIFFScanlineSize returns the number of bytes in a decoded scanline, as returned by TIFFReadScanline. Note however that if the file had been create with samples written in separate planes, then the above code would only read data that contained the first sample of each pixel; to handle either case one might use the following instead:

#include "tiffio.h"
main()
{
    TIFF* tif = TIFFOpen("myfile.tif", "r");
    if (tif) {
        uint32 imagelength;
        tdata_t buf;
        uint32 row;
        
        TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
        TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &config);
        buf = _TIFFmalloc(TIFFScanlineSize(tif));
        if (config == PLANARCONFIG_CONTIG) {
            for (row = 0; row < imagelength; row++)
                tiffreadscanline(tif, buf, row);
        } else if (config == planarconfig_separate) {
            uint16 s, nsamples;
            
            tiffgetfield(tif, tifftag_samplesperpixel, &nsamples);
            for (s = 0; s < nsamples; s++)
                for (row = 0; row < imagelength; row++)
                    tiffreadscanline(tif, buf, row, s);
        }
        _tifffree(buf);
        tiffclose(tif);
    }
}

Beware however that if the following code were used instead to read data in the case PLANARCONFIG_SEPARATE,...

            for (row = 0; row < imagelength; row++)
                for (s = 0; s < nsamples; s++)
                    tiffreadscanline(tif, buf, row, s);

...then problems would arise if RowsPerStrip was not one because the order in which scanlines are requested would require random access to data within strips (something that is not supported by the library when strips are compressed).


Strip-oriented Image I/O

The strip-oriented interfaces provided by the library provide access to entire strips of data. Unlike the scanline-oriented calls, data can be read or written compressed or uncompressed. Accessing data at a strip (or tile) level is often desirable because there are no complications with regard to random access to data within strips.

A simple example of reading an image by strips is:

#include "tiffio.h"
main()
{
    TIFF* tif = TIFFOpen("myfile.tif", "r");
    if (tif) {
        tdata_t buf;
        tstrip_t strip;
        
        buf = _TIFFmalloc(TIFFStripSize(tif));
        for (strip = 0; strip < tiffnumberofstrips(tif); strip++)
            tiffreadencodedstrip(tif, strip, buf, (tsize_t) -1);
        _tifffree(buf);
        tiffclose(tif);
    }
}

Notice how a strip size of -1 is used; TIFFReadEncodedStrip will calculate the appropriate size in this case.

The above code reads strips in the order in which the data is physically stored in the file. If multiple samples are present and data is stored with PLANARCONFIG_SEPARATE then all the strips of data holding the first sample will be read, followed by strips for the second sample, etc.

Finally, note that the last strip of data in an image may have fewer rows in it than specified by the RowsPerStrip tag. A reader should not assume that each decoded strip contains a full set of rows in it.

The following is an example of how to read raw strips of data from a file:

#include "tiffio.h"
main()
{
    TIFF* tif = TIFFOpen("myfile.tif", "r");
    if (tif) {
        tdata_t buf;
        tstrip_t strip;
        uint32* bc;
        uint32 stripsize;
        
        TIFFGetField(tif, TIFFTAG_STRIPBYTECOUNTS, &bc);
        stripsize = bc[0];
        buf = _TIFFmalloc(stripsize);
        for (strip = 0; strip < tiffnumberofstrips(tif); strip++) {
            if (bc[strip] > stripsize) {
                buf = _TIFFrealloc(buf, bc[strip]);
                stripsize = bc[strip];
            }
            TIFFReadRawStrip(tif, strip, buf, bc[strip]);
        }
        _TIFFfree(buf);
        TIFFClose(tif);
    }
}

As above the strips are read in the order in which they are physically stored in the file; this may be different from the logical ordering expected by an application.


Tile-oriented Image I/O

Tiles of data may be read and written in a manner similar to strips. With this interface, an image is broken up into a set of rectangular areas that may have dimensions less than the image width and height. All the tiles in an image have the same size, and the tile width and length must each be a multiple of 16 pixels. Tiles are ordered left-to-right and top-to-bottom in an image. As for scanlines, samples can be packed contiguously or separately. When separated, all the tiles for a sample are colocated in the file. That is, all the tiles for sample 0 appear before the tiles for sample 1, etc.

Tiles and strips may also be extended in a z dimension to form volumes. Data volumes are organized as "slices". That is, all the data for a slice is colocated. Volumes whose data is organized in tiles can also have a tile depth so that data can be organized in cubes.

There are actually two interfaces for tiles. One interface is similar to scanlines, to read a tiled image, code of the following sort might be used:

main()
{
    TIFF* tif = TIFFOpen("myfile.tif", "r");
    if (tif) {
        uint32 imageWidth, imageLength;
        uint32 tileWidth, tileLength;
        uint32 x, y;
        tdata_t buf;
        
        TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &imageWidth);
        TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imageLength);
        TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tileWidth);
        TIFFGetField(tif, TIFFTAG_TILELENGTH, &tileLength);
        buf = _TIFFmalloc(TIFFTileSize(tif));
        for (y = 0; y < imagelength; y += tilelength)
            for (x = 0; x < imagewidth; x += tilewidth)
                tiffreadtile(tif, buf, x, y, 0);
        _tifffree(buf);
        tiffclose(tif);
    }
}

(once again, we assume samples are packed contiguously.)

Alternatively a direct interface to the low-level data is provided a la strips. Tiles can be read with TIFFReadEncodedTile or TIFFReadRawTile, and written with TIFFWriteEncodedTile or TIFFWriteRawTile. For example, to read all the tiles in an image:

#include "tiffio.h"
main()
{
    TIFF* tif = TIFFOpen("myfile.tif", "r");
    if (tif) {
        tdata_t buf;
        ttile_t tile;
        
        buf = _TIFFmalloc(TIFFTileSize(tif));
        for (tile = 0; tile < tiffnumberoftiles(tif); tile++)
            tiffreadencodedtile(tif, tile, buf, (tsize_t) -1);
        _tifffree(buf);
        tiffclose(tif);
    }
}


Other Stuff

Some other stuff will almost certainly go here...


Last updated: $Date: 2005/12/28 06:53:18 $

tiff-4.0.3/html/v3.7.2.html0000644000212300117540000001753210216050144012057 00000000000000 Changes in TIFF v3.7.2 TIFF CHANGE INFORMATION

This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


MAJOR CHANGES:
  • Maintainance release. Many bugfixes in the build environment and compatibility improvements.


CHANGES IN THE SOFTWARE CONFIGURATION:


CHANGES IN LIBTIFF:


CHANGES IN THE TOOLS:


CHANGES IN THE CONTRIB AREA:
  • No changes.
Last updated $Date: 2005/03/15 15:17:44 $. tiff-4.0.3/html/index.html0000644000212300117540000001170512027357652012345 00000000000000 LibTIFF - TIFF Library and Utilities

LibTIFF - TIFF Library and Utilities


Home Page http://www.remotesensing.org/libtiff/
Home Page Mirror http://libtiff.maptools.org/
Latest Stable Release v4.0.3
Master Download Site download.osgeo.org, directory libtiff
Windows Binaries GnuWin32 Project
Mailing List tiff@lists.maptools.org, Subscription, Archive. Please, read the TIFF FAQ before asking questions.
Anonymous CVS export CVSROOT=:pserver:cvsanon@cvs.maptools.org:/cvs/maptools/cvsroot
cvs login

(use empty password)
cvs checkout libtiff
to get the stable libtiff code or
cvs checkout -r branch-3-9 libtiff
to get the previous stable branch supporting the 3.9.X release series.

This software provides support for the Tag Image File Format (TIFF), a widely used format for storing image data. The latest version of the TIFF specification is available on-line in several different formats.

Included in this software distribution is a library, libtiff, for reading and writing TIFF, a small collection of tools for doing simple manipulations of TIFF images, and documentation on the library and tools. Libtiff is a portable software, it was built and tested on various systems: UNIX flavors (Linux, BSD, Solaris, MacOS X), Windows, and OpenVMS. It should be possible to port libtiff and additional tools on other OSes.

The library, along with associated tool programs, should handle most of your needs for reading and writing TIFF images on 32- and 64-bit machines.

The software was originally authored and maintained by Sam Leffler.

Questions should be sent to the TIFF mailing list: tiff@lists.maptools.org, with a subscription interface at http://lists.maptools.org/mailman/listinfo/tiff.

The persons responsible for putting up this site and putting together versions >= 3.5.1 are Frank Warmerdam, Andrey Kiselev, Bob Friesenhahn, Joris Van Damme and Lee Howard.

The following sections are included in this documentation:

BigTIFF News


Last updated $Date: 2012-06-16 00:19:37 $.

tiff-4.0.3/html/v3.6.0.html0000644000212300117540000004062107737530451012071 00000000000000 Changes in TIFF v3.6.0 TIFF CHANGE INFORMATION

This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


MAJOR CHANGES:
  • New utility raw2tiff for converting raw rasters into TIFF files.
  • Lots of new tiff2ps options.
  • Lots of new fax2tiff options.
  • Lots of bug fixes for LZW, JPEG and OJPEG compression.

Custom Tag Support

The approach to extending libtiff with custom tags has changed radically. Previously, all internally supported TIFF tags had a place in the private TIFFDirectory structure within libtiff to hold the values (if read), and a "field number" (ie. FIELD_SUBFILETYPE) used to identify that tag. However, every time a new tag was added to the core, the size of the TIFFDirectory structure would changing, breaking any dynamically linked software that used the private data structures.

Also, any tag not recognised by libtiff would not be read and accessable to applications without some fairly complicated work on the applications part to pre-register the tags as exemplified by the support for "Geo"TIFF tags by libgeotiff layered on libtiff.

Amoung other things this approach required the extension code to access the private libtiff structures ... which made the higher level non-libtiff code be locked into a specific version of libtiff at compile time. This caused no end of bug reports!

The new approach is for libtiff to read all tags from TIFF files. Those that aren't recognised as "core tags" (those having an associated FIELD_ value, and place for storage in the TIFFDirectory structure) are now read into a dynamic list of extra tags (td_customValues in TIFFDirectory). When a new tag code is encountered for the first time in a given TIFF file, a new anonymous tag definition is created for the tag in the tag definition list. The type, and some other metadata is worked out from the instance encountered. These fields are known as "custom tags".

Custom tags can be set and fetched normally using TIFFSetField() and TIFFGetField(), and appear pretty much like normal tags to application code. However, they have no impact on internal libtiff processing (such as compression). Some utilities, such as tiffcp will now copy these custom tags to the new output files.

As well as the internal work with custom tags, new C API entry points were added so that extension libraries, such as libgeotiff, could define new tags more easily without accessing internal data structures. Because tag handling of extension tags is done via the "custom fields" mechanism as well, the definition provided externally mostly serves to provide a meaningful name for the tag. The addition of "custom tags" and the altered approach to extending libtiff with externally defined tags is the primary reason for the shift to the 3.6.x version number from 3.5.x.


CHANGES IN THE SOFTWARE CONFIGURATION:
  • configure, config.site: Fix for large files (>2GiB) support. New option in the config.site: LARGEFILE="yes". Should be enougth for the large files I/O.
  • configure: Set -DPIXARLOG_SUPPORT option along with -DZIP_SUPPORT.
  • html/Makefile.in: Updated to use groffhtml for generating html pages from man pages.
  • configure, libtiff/Makefile.in: Added SCO OpenServer 5.0.6 support from John H. DuBois III.
  • libtiff/{Makefile.vc, libtiff.def}: Missed declarations added.
  • libtiff/Makefile.in, tools/Makefile.in: Shared library will not be stripped when installing, utility binaries will do be stripped. As per bug 93.
  • man/Makefile.in: Patch DESTDIR handling as per bug 95.
  • configure: OpenBSD changes for Sparc64 and DSO version as per bug 96.
  • config.site/configure: added support for OJPEG=yes option to enable OJPEG support from config.site.
  • config.guess, config.sub: Updated from ftp.gnu.org/pub/config.
  • configure: Modify CheckForBigEndian so it can work in a cross compiled situation.
  • configure, libtiff/Makefile.in: Changes for building on MacOS 10.1 as per bug 94.
  • html/Makefile.in: added missing images per bug 92.
  • port/Makefile.in: fixed clean target per bug 92.


CHANGES IN LIBTIFF:
  • libtiff/tif_getimage.c: New function TIFFReadRGBAImageOriented() implemented to retrieve raster array with user-specified origin position.
  • libtiff/tif_fax3.c: Fix wrong line numbering.
  • libtiff/tif_dirread.c: Check field counter against number of fields.
  • Store a list of opened IFD to prevent directory looping.
  • libtiff/tif_jpeg.c: modified segment_height calculation to always be a full height tile for tiled images. Also changed error to just be a warning.
  • libtiff/tif_lzw.c: fixed so that decoder state isn't allocated till LZWSetupDecode(). Needed to read LZW files in "r+" mode.
  • libtiff/tif_dir.c: fixed up the tif_postdecode settings responsible for byte swapping complex image data.
  • libtiff/tif_open.c: Removed error if opening a compressed file in update mode bug (198).
  • libtiff/tif_write.c: TIFFWriteCheck() now fails if the image is a pre-existing compressed image. That is, image writing to pre-existing compressed images is not allowed.
  • html/man/*.html: Web pages regenerated from man pages.
  • libtiff/tif_jpeg.c: Hack to ensure that "boolean" is defined properly on Windows so as to avoid the structure size mismatch error from libjpeg (bug 188).
  • libtiff/tiff.h: #ifdef USING_VISUALAGE around previous Visual Age AIX porting hack as it screwed up gcc. (bug 39)
  • libtiff/tiff.h: added COMPRESSION_JP2000 (34712) for LEAD tools custom compression.
  • libtiff/tif_dirread.c: Another fix for the fetching SBYTE arrays by the TIFFFetchByteArray() function. (bug 52)
  • libtiff/tif_dirread.c: Expand v[2] to v[4] in TIFFFetchShortPair() as per bug 196.
  • libtiff/tif_lzw.c: Additional consistency checking added in LZWDecode() and LZWDecodeCompat() fixing bugs 190 and 100.
  • libtiff/tif_lzw.c: Added check for valid code lengths in LZWDecode() and LZWDecodeCompat(). Fixes bug 115.
  • tif_getimage.c: Ensure that TIFFRGBAImageBegin() returns the return code from the underlying pick function as per bug 177.
  • libtiff/{tif_jpeg.c,tif_strip.c,tif_print.c}: Hacked tif_jpeg.c to fetch TIFFTAG_YCBCRSUBSAMPLING from the jpeg data stream if it isn't present in the tiff tags as per bug 168.
  • libtiff/tif_jpeg.c: Fixed problem with setting of nrows in JPEGDecode() as per bug 129.
  • libtiff/tif_read.c, libtiff/tif_write.c: TIFFReadScanline() and TIFFWriteScanline() now set tif_row explicitly in case the codec has fooled with the value as per bug 129.
  • libtiff/tif_ojpeg.c: Major upgrade from Scott. Details in bug 156.
  • libtiff/tif_open.c: Pointers to custom procedures in TIFFClientOpen() are checked to be not NULL-pointers.
  • libtiff/tif_lzw.c: Assertions in LZWDecode and LZWDecodeCompat replaced by warnings. Now libtiff should read corrupted LZW-compressed files by skipping bad strips as per bug 100.
  • libtiff/: tif_dirwrite.c, tif_write.c, tiffio.h: TIFFCheckpointDirectory() routine added as per bug 124. The TIFFWriteDirectory man page discusses this new function as well as the related TIFFRewriteDirectory().
  • libtiff/: tif_codec.c, tif_compress.c, tiffiop.h, tif_getimage.c: Introduced additional members tif->tif_decodestatus and tif->tif_encodestatus for correct handling of unconfigured codecs (we should not try to read data or to define data size without correct codecs). See bug 119.
  • tif_dirread.c: avoid div-by-zero if rowbytes is zero in chop func as per bug 111.
  • libtiff/: tiff.h, tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_dirread.c, tif_dirwrite.c: Dwight Kelly added get/put code for new tag XMLPACKET as defined in Adobe XMP Technote. Added missing INKSET tag value from TIFF 6.0 spec INKSET_MULTIINK (=2). Added missing tags from Adobe TIFF technotes: CLIPPATH, XCLIPPATHUNITS, YCLIPPATHUNITS, OPIIMAGEID, OPIPROXY and INDEXED. Added PHOTOMETRIC tag value from TIFF technote 4 ICCLAB (=9).
  • libtiff/tif_getimage.c: Additional check for supported codecs added in TIFFRGBAImageOK, TIFFReadRGBAImage, TIFFReadRGBAStrip and TIFFReadRGBATile now use TIFFRGBAImageOK before reading a per bug 110.
  • libtiff/: tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_dirread.c, tif_dirwrite.c: Added routine TIFFDataWidth for determining TIFFDataType sizes instead of working with tiffDataWidth array directly as per bug 109.
  • libtiff/: tif_dirinfo.c, tif_dirwrite.c: Added possibility to read broken TIFFs with LONG type used for TIFFTAG_COMPRESSION, TIFFTAG_BITSPERSAMPLE, TIFFTAG_PHOTOMETRIC as per bug 99.
  • libtiff/{tiff.h,tif_fax3.c}: Add support for __arch64__ as per bug 94.
  • libtiff/tif_read.c: Fixed TIFFReadEncodedStrip() to fail if the decodestrip function returns anything not greater than zero as per bug 97.
  • libtiff/tif_jpeg.c: fixed computation of segment_width for tiles files to avoid error about it not matching the cinfo.d.image_width values ("JPEGPreDecode: Improper JPEG strip/tile size.") for ITIFF files. Apparently the problem was incorporated since 3.5.5, presumably during the OJPEG/JPEG work recently.
  • libtiff/tif_getimage.c: If DEFAULT_EXTRASAMPLE_AS_ALPHA is 1 (defined in tiffconf.h - 1 by default) then the RGBA interface will assume that a fourth extra sample is ASSOCALPHA if the EXTRASAMPLE value isn't set for it. This changes the behaviour of the library, but makes it work better with RGBA files produced by lots of applications that don't mark the alpha values properly. As per bugs 93 and 65.
  • libtiff/tif_jpeg.c: allow jpeg data stream sampling values to override those from tiff directory. This makes this work with ImageGear generated files.


CHANGES IN THE TOOLS:
  • tiff2ps: Added page size setting when creating PS Level 2.
  • tiff2ps: Fixed PS comment emitted when FlateDecode is being used.
  • tiffsplit: increased the maximum number of pages that can be split.
  • raw2tiff: Added option `-p' to explicitly select color space of input image data.
  • tiffmedian: Suppiort for large (> 2GB) images.
  • ppm2tiff: Fixed possible endless loop.
  • tiff2rgba: Switched to use TIFFReadRGBAImageOriented() instead of TIFFReadRGBAImage().
  • tiffcmp: Fixed problem with unused data comparing (bug 349). `-z' option now can be used to set the number of reported different bytes.
  • tiffcp: Added possibility to specify value -1 to -r option to get the entire image as one strip (bug 343).
  • tiffcp: Set the correct RowsPerStrip and PageNumber values (bug 343).
  • fax2tiff: Page numbering fixed (bug 341).
  • ppm2tiff: PPM header parser improved: now able to skip comments.
  • tiff2ps: Force deadzone printing when EPS output specified (bug 325).
  • tiff2ps: Add ability to generate PS Level 3. It basically allows one to use the /flateDecode filter for ZIP compressed TIFF images. Patch supplied by Tom Kacvinsky (bug 328).
  • tiffcp: Fixed problem with colorspace conversion for JPEG encoded images (bugs 23 and 275)
  • fax2tiff: Applied patch from Julien Gaulmin. More switches for fax2tiff tool for better control of input and output (bugs 272 and 293).
  • raw2tiff: New utility for turning raw raster images into TIFF files written by Andrey Kiselev.
  • tiff2ps: Sebastian Eken provided patches (bug 200) to add new these new switches:
    • -b #: for a bottom margin of # inches
    • -c: center image
    • -l #: for a left margin of # inches
    • -r: rotate the image by 180 degrees
    Also, new features merged with code for shrinking/overlapping.
  • tiff2ps: Don't emit BeginData/EndData DSC comments since we are unable to properly include the amount to skip as per bug 80.
  • tiff2ps: Added workaround for some software that may crash when last strip of image contains fewer number of scanlines than specified by the `/Height' variable as per bug 164.
  • tiff2ps: Patch from John Williams to add new functionality for tiff2ps utility splitting long images in several pages as per bug 142. New switches:
    • -H #: split image if height is more than # inches
    • -L #: overLap split images by # inches
  • tiff2ps: New commandline switches to override resolution units obtained from the input file per bug 131:
    • -x: override resolution units as centimeters
    • -y: override resolution units as inches
  • fax2tiff: Updated to reflect latest changes in libtiff per bug 125.
  • tiff2ps: Division by zero fixed as per bug 88.
  • tiffcp: Added support for 'Orientation' tag.
  • tiffdump: include TIFFTAG_JPEGTABLES in tag list.
  • tiffset: fix bug in error reporting.


CHANGES IN THE CONTRIB AREA:
  • Fixed distribution to include contrib/addtiffo/tif_ovrcache.{c,h}.
  • libtiff/contrib/win95: renamed to contrib/win_dib. Added new Tiffile.cpp example of converting TIFF files into a DIB on Win32 as per bug 143.
CHANGES IN THE LZW COMPRESSION KIT:
  • LZW compression kit synchronized with actual libtiff version.
TIFF home page.

Last updated $Date: 2003/10/04 11:38:17 $. tiff-4.0.3/html/v3.4beta031.html0000644000212300117540000000637506753634101013013 00000000000000 Changes in TIFF v3.4beta031 TIFF CHANGE INFORMATION

This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


CHANGES IN THE SOFTWARE CONFIGURATION:
  • configure now captures significantly more information in the config.log file and provides more information when it is unable to setup a configuration
  • support was added for building shared libraries on more systems: AIX, HPUX, Solaris, and Linux.
  • a new configuration parameter LIBCOPTS was added for passing arguments to the C compiler to use when building only the library; this is part of the enhanced support for building shared libraries
  • include files for optional packages that reside in /usr/include are now handled correctly
  • build trees may now be configured using either relative or absolute pathnames to the source distribution
  • several new configuration parameters were added, mainly for building shared libraries: DIST_MAJOR, DIST_MINOR, DIST_ALPHA, and DSOSUF_VERSION


CHANGES IN LIBTIFF:
  • the Deflate support has been revised: it requires version 0.99 of the zlib software distribution, the output format has changed and is incompatible with previous versions of this library (each strip now includes a header read and written by the zlib library)
  • the codec name printed by the TIFFPrintDirectory routine is now taken from the codec table instead of from a builtin table; this means that application-defined codecs are handled correctly
  • a new symbol was added that contains the library version number; this can be used to do a compile-time compatibility check of the library version


CHANGES IN THE MANUAL PAGES:
  • the creation and installation of manual pages was redone; it now implements the documented ``configuration scheme''
TIFF home page.

Sam Leffler / sam@engr.sgi.com Last updated $Date: 1999/08/09 20:21:21 $.
tiff-4.0.3/html/v3.8.2.html0000644000212300117540000001030210410533211012041 00000000000000 Changes in TIFF v3.8.2 TIFF CHANGE INFORMATION

This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


MAJOR CHANGES:
  • Bug-fix release.


CHANGES IN THE SOFTWARE CONFIGURATION:


CHANGES IN LIBTIFF:
  • tif_strip.c: Take subsampling in account when calculating TIFFScanlineSize().
  • tif_jpeg.c, tif_fax3.c, tif_zip.c, tif_pixarlog.c, tif_lzw.c, tif_luv.c: Use _TIFFSetDefaultCompressionState() in all codec cleanup methods. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1120
  • tif_jpeg.c: Do not cleanup codec state in TIFFInitJPEG(). As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1119
  • tif_dir.c: Use double type instead of dblparam_t.
  • tif_dirread.c: Do not check the PlanarConfig tag presence in TIFFReadDirectory, because it is always set at the start of function and we allow TIFFs without that tag set.


CHANGES IN THE TOOLS:


CHANGES IN THE CONTRIB AREA:
Last updated $Date: 2006/03/23 14:54:01 $. tiff-4.0.3/html/images/0000755000212300117540000000000012027361331011656 500000000000000tiff-4.0.3/html/images/Makefile.in0000644000212300117540000003614112027361163013653 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = html/images DIST_COMMON = $(dist_doc_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(docdir)" DATA = $(dist_doc_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = $(LIBTIFF_DOCDIR)/html/images dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ docfiles = \ back.gif \ bali.jpg \ cat.gif \ cover.jpg \ cramps.gif \ dave.gif \ info.gif \ jello.jpg \ jim.gif \ note.gif \ oxford.gif \ quad.jpg \ ring.gif \ smallliz.jpg \ strike.gif \ warning.gif dist_doc_DATA = $(docfiles) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign html/images/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign html/images/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_docDATA: $(dist_doc_DATA) @$(NORMAL_INSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-dist_docDATA: @$(NORMAL_UNINSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_docDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_docDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dist_docDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-dist_docDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/html/images/jim.gif0000644000212300117540000003423506747424643013075 00000000000000GIF89a‹ªõ†††ƒƒƒ¥¥¥¤¤¤HHHFFF666444|||yyyœœœ›››´´´²²²‹‹‹ˆˆˆQQQNNN &&&$$$---***©©©§§§bbb___‘‘‘ŽŽŽ333iiifffDDDYYYUUU""" @@@<<<¢¢¢rrrnnnvvv¯¯¯KKK€€€˜˜˜(((]]]000999¬¬¬ŸŸŸ•••,‹ªEþ@¥G,öX¬g™<)H%§Ãq:«ÈlvÉeqN«.ËKâz+%±‰Ã­’?µ±ÈLljU¹—NÍ/ñR}R\X^„a+?a?8ŠˆHˆ‹ˆŒ'<8&m8'œ&–8<Œc??HŒ+&(">>//"5$()˜ŠZ,o‹›‘?¥‘’Ô<–—–?&ÛnÐ?•ZoÌ<“¨'Û&'š×I<9$55ú!.--dÈààÃ-Z v(ܱ`€B> HðÂ_ˆ‹"BhðçÂ… HÜ#v¤E¨P­†Y"Gá±Çâ[$v‰LˆiS*Ëþ 0àmj”ÈÕˆF-@ F„%DB˜Z£_¿e9¸åcÆ*T`È€AÁ ƒx ÀÚfôðáƒ@á"hñ"Aˆ6Ü@‹tÒå´0JZš³¦(š#”’û´‘"‡˜Aä@¡Ti §%¢jYbƒ>®"HkÐÃŒaè @,†*vä^¨ÂCm± ~(›Áá‚>>¨õÀC‹H=žÎÙ9*£iBe­Ù£—2Y˜8ÂÆL¤2UÈaá@±b)R ˜?"Bi~.^Ȫ[ÐXÚdé  006@` 8 :  Œ…ÛC3ÐÒÕ.þ„P‚ÍL§ÌJÐrtaœ£ˆ%&X³I)*5žŒ ØpYe(XVYò¡@€h!Ô–Aµä6€6À€“ D)å”Q2˜ „Ž%ÀW_½f‹ Qe¸ÔÝaà°M64vGÊNj¾É *mĸ“2hˆQ\‚jÙØ`Ûˆ”Q t‹Wº mVXaƒ0(8!jJ¡l°dm „™aA¬9€ÀGv#™” žvÓA☉Ò9%ílR †Z`ÁÈZpèŸBBPCGIÚÕ©VJÛµd‹à„Bèm©@TËh:– þ©Ð3ø°@»|²’.ºH ±J¢f;Óý¤¢`)NÉ DˆÁ;ÜlÓ§ åý™Â1äóËD@ƒŽ#PB’Ç![ž«›Xøð À&înº €Ûq*øQàÝÊ ½öÐI.µ'–”ÂØOìæ’9mlãȾìTP P$_xå@]Ìð.rí¾6Ã^ i ¤4DÛBa*$sq¹ÁìPÌ(äÃ(TF#õî݆ß5¢ÂA"²:rÀ„-Â:pF³'Ÿ˜¨çg³ù„ í¹¶nmKʼÀ 4U@t¥m…éƒ ˜^k.¸º±›\þ Pd/1¶bcШM"Fk×wÖÔ{N9h0bI3¯³&Û`²§fléjî†u¡ié’Ks¯íP\©—’U*¦_Ù")-ì{°‹#Dw|z&¬bpýŽ­äFvú„{cº£Õ:ŠwwN%>»È@1lÃ(@ ¬·œÕÕ 9hF@²€HJ!å’ݺTp)ܤŽZµp€ BÐA6N톂e9±4$&¸€e¬¹´ ? @ ¬ƒ´€@B`ƒ›s!Ç9€åx°À“nÀåZ@è¡Jè%R,¸À!PäÀ;ð*LIþõ¶ˆÔIZK#` I;ÿ È(œø ÁRzr`†XŸ¥þX2' Ú€‚„R@Þj jrÈú2@À @‚4r`ˆ‰°]0—ËÀâ—¡'•À8`BpáI@ "ÚЄ*¤!'ADÁNÀP¨@>Xeä1^ e@@A \€쀌©Ñ`ɧ7^` öf€¼àÞlÄ"‘¬E&ð!ÿ:`h>øÂo쬰’&° ¢GàAR™A‰.° ƺ€ àxIéµ1öÈ3IP·ÔE H^$\˜M€ÓAœãîUÉâ…£E9iƒ3¡¸Á$n8&–蕨HWb ÆKÀQZc&0ŠFue´þ %ƒ›Q¸£ÿ½dÜÑŽyÇ œí`6x…iúÑ$ ÉÅVÂÇ®³t¥·À5:¢‘ ˜F$èf ÎS?ïÈjq6¤´%M!]NxÁŽó ƒueÄŒnˆzx¦0Ñ4\Ñ”EMåªÙ©h|¥Þ•B #`/ÿàK´d@‘½{ƒ£XyCÃD¢¨fŶ·|Síà7J+Ÿ TQć0fíZ³ørpq‹pƒ.S¹ £õR’À¦*[Ô"LÇi—Af€¶´ ¿‘Æp†›w¾;ËtùÅÉ„QǸÀ?•¾0ÎàéJvô’ þõYß r©r]J@²!Ë’¬8 ›f‰BáªÛB2Ä•| }9ëIR" ¦¯NHMI¯`d‰JàJ†abëuXÃêaUš‹¼ Ý˜p§hª%‘ AÝ‚’æ7¯ƒt^A¡š ìTð®ýÞ‚{®* È™?íLâxŒXѶé¤z²ˆ‹ëŽ9y†=)Ýa)0€r@|Ë Ÿ3õhb‘°Åu]6Ÿƒœ%*1àAŸÊÖ–NÙ›Ü-­q@ h 美JvRñÂÂ5fwžI&šÚCJYÊ*VŸÎÛ@úƒù\±u 3è2>¥BvÒ-¢€ hþSb*¤÷Ñ5¤?ŽÀJ¿sp/² ³òmé‘&<mèÅt`@KÈrKÉâ0Ù€T$nÁ¸†kÀoùvk¥J˜ò)µ¡Þ7lòqOœÁbn1)”¢.]ñ!0‘0©’Ç ÊQ90 MÈwÛ¡iŠÓrÒ?‡) \&‹U<5adE–Tjrx ,6 ß· poµXð%ÑÖR&§./ a>  =FRÃid|²þ˜À…Ùè@<tá"”x™K@»ã+ŠpôNSMT1–ú{9¶û#T.«c)Áõµ ‘5±Õ Qk àq/ €6Ðlæ·s‘¦&18.Ñ4b '1æ×´{cœñµõñönV÷oV*5s¦É}äÂ.÷v¹pŠt±k^RŠ· ºP¿ -7†Œ,Û 3Û¥ÃÉë˜Ã8Ч="|Ä÷žÁ(ÄÛ(5cú;«O”Í¡¡0@*âsZzë2E[ Á%Û&¥Ø=/08l~è ˆ¤Ôq<Òð4QtÁG¶æ!|ˆþ²ÇW5$$0¥‘VuøÛAvv¨)œ3cA!™B!Ä\•Çí²5ïyæÇ¹Á’"Š`°§iØtD{BŒc«œF'(=£¢O¹P×§5‘—” Á:[eS BÌz â-e'zë{BIé.GØ!!@Z8Nø&Ê£=C;m1Ù/Ñ€`ÇBÐÀ‰4|J×RÛ:kxQ¦³9˜Ç OB}OÒ)×7}r}Xv¥Âƒ¿ÖîƒÆÔAjbàBTë¡v²1‘Ü“v”¯Tx°7õ7|@òÅГ±û0Pôù.äby¤IÒþSR}Y=}-m)·±ôF `Ó¦7&ÇÓ@ BÑ>li^Vû&*²µù’jâ'z\|Žd|òA²úxÁÌÀUÕU*™÷$Ö·ÕWrÌ;È%Àv¶` ¡F“ œÖ÷2L)¸ó÷/íä~?¤xI,ÄçH @(Ã'|)À|M$ÿ°Rt2±}_ ×y†­Ò÷*ê3Ç‘¸Ðu‘P©žl0±WÖ5|£hY–ÙµÝVfE(äJ®ˆå,¸(Dò“éK ^ãc)ƒÍ-ö| ÅÜ-âua—Ô’!¬ß(Q|·ƒ6ñ~£++–”iNÈÙÁò…€BþUÇb,SAõPË"ð—ÃËÚXJØ Þ’€™×)Ý_V.bóïrzºÑ@Ö@pÌ«,Rw—¯×<\j"ø=aûâfoÔ'U…(~d5XÇË¢ÌÕ’¶(Þ.½ªuÓ.².UJUÙ%Ô²á à. Z8/ºs¶#3q/© ݰÐeù´Óà{60L^è©RóFÊ2|òÁ‚¦ak—3˜“ Rùýp6kaAd±ª¹Ðо°/Ð!"Â Ž¡ì-€Œf©iÆ Pæ x0…è9¤7䤩–¬.¤0ˆåHJ]5 Ûª¿¡Ž°b·à"þ±¤à* ´Qr¦Ä:§r!'Ók-J·²’CÒº$ $€ð6`áŠÃq-³žç1ƒëá@¸²{3‰*’ –ŒW˜ ÔÜTÒP/Ã<~ó¹Íú¥XK)@Ë¡yk¹†$ˆëríd-ð¡¯->'”*±Þ·¸$§$3®ˆ/`Ém8úîwùNì˜Ù¼$RÜÖñ’·w8Ró¨™à©¹Ä‚ùÀ ù—ô¶uí¢S€f&§D³~^mÞWT!p37§Õ¼h'!_…©f߆Ѵþåj%¾XŽH]ë`I\YîÑ(V7”p±Ï`Á:BüU´A}ÑÉqo2ð4…:¦R÷¦ÔŽd%‰-#Å#ƒsiƒ¡j×Ðzu$CÉXˆªVfi´h¾gM°Si 4ãΖrbgaÂß³ LÉ:â3>¨ã9À6-€ùر€âã;ïÔÉjëV³'Š>Ghp¬?ÃS©[ßw5Â…­@¸©Ñ­±u® ‘÷‚Iù.c7äSB¦Ävº¶Ïß7P+ô /’;LHò9Ó](ÁÍÐPœSï"´,¿ÒwÏÈ„âŸU åâÊC¢- ¬2ƒ$¶$/8 Êƒ„þøË@°2ª…j§š-<€Oˆf’âp¼ët¢ZWUÞï÷ý­À½Õy|V£Oh1˜Œ3Q½Ü07Îs:ÿ_âÆï¦ç„Â"§`Cä%ÀÃgg‡éã! EcC#á%AÀòÁcrGAu C``@EafÆã¡Å¥`…ƒc…¤âäG΄§Ìw¯Â·‹kÍù¬"Žîù‡Å𥇅¹°ÛÛ[ûÐ¥DÃ¥!Ô!ÀÀÁáÃÁÃcaÇUchhuu iò€RehåÃC‹$J\Xaâ e.P PÁ¢‰6WX¤Ñöì *j¬õàÀâB9 HÄa â ƒ¾ÕtãF‡þldxœ€h#Lj1 h@÷¨ÞU2`È׉‡u>ÐSà¯é*¦ @0Á‚CÄ_ZpT(k‘…´@X0‘ƒ˜-yÒ\éq"9;p0FŽÙ4Ü퇀Á6‡A€P¸b…d!‚^páËÔ…þ…,HKKÉêuò„ZÁ›“NH”*𣃠bHÐ ȱÍâ÷«Ä‹sØ¬Èæ#k~¨ß~mˆÌ Fõ hÀ‹¬àb&~€¨‚ˆÑh…Ü€Æ@‡ˆ…)Öù@Ê€*âÑÀP(A,4À¨™tƒÑÄ p€¼¤N³Šd”²Å‹XøÁO6˜ìõ…fÈCâ0›‹Pa\ɽ8Ò¾÷ £#0Éö”A'1@1pIjà€BC F³0š\  P€SP ß3 zp¾?‹à2ÁÞf£“&1(õn„'l¤þ!! YÆ0®á ÷N ‡5e´Ikˆ’!Ì¢ÇDcƒ€0E„1€_\\_x`XN9ˆÀ.Ð í BWȵÓ"FÒ*™N>¥_ Øè’È0mð€P fà¨f\ƒ>¹ˆôB¤ÀÈ+$°b[*b›”À( @ .’ƒ,âÁ:düaÌ*AÉ·½ØÈD-R‘Þ¤Êî"_a8CI>â%ßXã:ôìÈ4€0 9o8Ð 8ƒ”€å€€`P1(VгTè²j>ù‡ÅÏ= ŒLt£3òþZzA¡6Gz²I»ØÉGÚtƒ’4è˜réIrŠRYéǘ›®“5 RA€ "p‹°_ Ý=¡Ê/9èª]¸ÆVµç äA ]Ðð†:#Rk€s…4¤—px+VIÒ³âòªšçX茗ž.hH. [7àAl%I0 P4Je‘ƒ-ßg–íi# ÑXO u0à¥K]l Z\"I$ò”‹ÞÀ‘¬Æ¡,«¾®!´¡HD+Ú0È,s ÷B"¥( C _Éé½:²¥/á Qª† ™½®ö·Rí‚loIVÃÖ±þ"ÉtÏРҭ`·$ù ]©Ö†Ø*c t/^è …e°˜íž%! ˵@3ò*A»(ä5ep„«¾áÉgI'Øï®áAp¨‚æè%œ&I±sØjËØûYŸ°PÇ=Ïo·DÃzBä ˆ'à‹ýù g Øß,f€Zh íA rp> ´«hƒ Û“Ù¸v}|Å×hyÞ°½ëck¾œa‡È…RÇÌ–‚‘åÕHÁ%€[g1 «*óðÁ 2u˜©… D¨@((p*X*‡yÖE»Ø…«\„Û˜³¦A·dF]¨¬¯Ô‚w…aýíyk™SÀc5þAtX×:@Œ!1ƒSŒ ¦8s,ó— OíŠ vl ÿõÊxŒK—¥1é1$:¯á­<Á»eJ…6•š @€ö$k%œ±Ü v–Žw¬y§$‘m§! ›Y‰&2¡‰èH‡P7¡ °¦]3X¯^ÒkÜÐ…';èjd°Æ¿x+døz Úí@%+P3™=ÍvÀ£ÔSÌ‘0ƒÈÀrçPÎ1ǬpS®Üå"JÕàZ6Ö– FCéFâ†ôæ¥aÐwUŽÞ:~µâ ´6ÆAu÷‰25àÌ9(Wô÷€¦ÔúS‡”bø 6fþµflÑ™@áw&VRƒDQ KýžçØ«ð ; ·X¶U¬z¯ @{׬Ž%ö 0 P%Ѽΰî=ïqLáØìÌð÷O‚ÍBÔ ŽÆ< ëd@6ê($žá¯°,LÂä*pžªJ®@³l€B°„f°„Öð¬öôŽ!êoÌ0O3\Î>€ äcš€4àé\Ì\ äCOmé´Eœæâ^à²/õÔK ãÀÂ@‚Øâ  Á*€fz H ÀÖÏîF`Ý(ÚìüK3Zç} LÃð²mÔP>^aé$AP! B'lͪþÂøüEAB èà NÂNN¯r1IÌ~äÆÇ&ÑšÖ¯lo^ÔMDXBD(‡Ì@­ùèÁSF#C Fã\ANƒˆ +èƒ48Æ*aš$J vMÈÞê× çN.$¬,«8â8€ä"cTÅ@(ØoÀjÒÍà.Ú\àd‘À)t€>˜B b ‚ñ'CœÂ)†À4\á逯,æR£¯xB°K¸lîí^rî­"«¯ôêDpQćÒâ1’±ýPÀcåOÒ “…u,#¤bÍða4@C‚F+2h¦h4D€T`RC~Íþfàø,¢¡žVO è­–Xhä çLËÁà@ª¶ŠÌç,€Hz¡,hÅÙö²G؃þÈM9v†ðöç2`V†F*—  “*÷A ŠÔ,뢦(*)-ÉXnɾª­†ìÁ~ã­ é|l¾`¸Sà|ÊHðDDÚxÕØá÷–Î4ˆœ’1æ‘ a€H‰ð‡T€4üad!<3^€l{ôk I“.Àbõ¤ ¯kå‘#R¬"èM ¶†|Ì"Ôcåo,'ÜÊÐ`L [¦²a&að“a?i%h‚&CÈ1Õ³Ô|€þñà·ê­ê`µ„ Ì+û€ã¸¼€­„¥Xž„žÈ@|æÒÀ…Ö(Äî .:Œ÷àK­Gƒ‡&a0`?…“V€h8ï3hœr#õŸNqHÀ!úì$ƒ½„k r!.x‚WOØð‰z!žÂ‡Th&v´fF4Y3–OÔL­£)a„“LË”a†*¥Ò0ÁÑpÿF­R Ñ@ï¥ê£ÒòˆYN#$…&µ—²A…ÄG•H\“Çz®ö4ááÌ÷Xq4š¦ ËÔRÉta\Tp”‰ÀQÆÒ`¬Í4 þ¢­"l»ú´'FHßÐK²zþbä‹Kn. àh¯* Å$q `]DÙãO‚0•3"'•VæR/õL³'sÚ,CÕDÀ¥6¸¬' íµòm[+%oê#¶'CÍgÁ¥Py¬fd2ÆÌ G“À4ò#s*7?Æ?ÿ3_9Ò ŒÀ Í|à£1˯L8„CñËHÇŠ æ@îp ¶j¸Ô" U¿\òÒx(D4u˜CÔVqÛ"Ò*…†*õS‰ðUh²"+í!ðâáøl æ´ ‚+´"ˆt( üÀ*ªÞ@Oáà–άD AÊG Çg=‰b6is9ŽÛþ®¢^3Re•27R#óUV´Â01À³M*rÐ9ªï$‡±ØD~8L$pi5„-§b2ÃR¶F=*¨IÆÇJ^£f¾°\Ú³u``l•È”*T*²*…¯Å/Í6·,à¥Ê®´À,x@1Vh$(½\nÁèÂí8̱`Hc{L U%p_öÈ…Q§ÍbäaÍö F#R1Ä_ÿ“e@*E1ÛÜ”TÀÒ°ìब'®àɈ ûVN{pN#¼kÁäRJ'|>T ©ÄI¬d=ð®ÓÚªñ >Ò0ËVr‘×x™’q‰`4BÇä“Ô–nB þyª¡¶èJ¾lɱU@kÈ˰4" 2Ö<'ÕSGTè®–wÕP7I£l™"+4ò)³´E`W'3?Õøü°ŠL.ŒØjN®¬¢ûŒÂ¤À¹&=¬äWgóï¶4Í/Ø]T”iê•>.Wš“Ô‚÷ŽH^Q1äpHÀN먎¨@®äkN±ïÓIö –¶I¸G$j#""W—Ñî‚Õœ]¯èlÎdÐð"…†"—À@c$D0&䳑àé¯þJ»0+§ vö!î……@׬Vî“S¯#Š$Ë.â1(â5œ6¤þ‰\H dÐi0:V™(ºNZ§g°r5äöGha°Dgê ×L4BšE®Š…P•ÞXhknætm«³ö#òK ! |" æxc¿ÅšÆÅ=cÖ’¥(rÀ0€\0ÆöHà"Ax—Èg÷—5#>cfi–>'a~™" 8v+ ¾JÈH/%·ïªDÂÁe Ãt¼9\e/S ý¨´=”#ŠH36@ÝÊÁdV@"Yd `TVažB€è³"UáZ°¥Û– ¤fR´°Õ É’ÍK‹ÒRÏ-… ,E6ˆdÜæEè¡ùÜáøþ,F>À)2àyK^ÁÞW1«—3€W+i¶€ ú6¢ž¶d‹…Ú€tµÏüâ Va§Á®¬'n ( #PgXGëŽ.ÜAÍJ-Vq[Ö%AZÇ–NG»ÍX´˜³¶MŒ€ J†ÝòQ¬`…¤ÌÞG0²¹gsZ¸p®åÈêúpk@ò« Уú…`rw‰¹tZCuÍÎ,Ü:£=à$›RM%a³YQ+]€î0$°±®ê#¬…vúÞ¸ ¶@w#ð¨ËZ ý"øA1´6|áõ*„þŽLÖ÷~[T¡]llu¢Æ\äU)L¹åðòÁƒõaþ9™¦Eàê%E RBÂ,‘ô°&ì¼D{Árú{q * /fîÜÅê€2{ž@(H`9>à*ìuca71D#‘s²EÅ[gXº¬†EKp$šÌm¹ Á·¯|"5"t‡\îÏbâÁ*ÄQ¦?åj™3àžœ`ÌšbAxMýÁŸÅ<ˆº€¿SÞÔ@p¸ (Pípδ¯oÂck¹ˆ,æÀ§  k`°yþO<àÔXt¬ †BD"€B&g =ƒøÛ0_ý’Ùì F—–ëGÓz·yé °¸¹<ëÈXí"8·`•¶¥ 6€ÂO” Áƒ7×jÜ#ÀZà®zSØ ²e B1¹° ´+µì”³+ ôäãîuÉXµP¯ô’vå¶ä<´Ì1Æ·f8âzWøÁle!!î÷€7U«ñÇd!‰/Ä€¹Äj6FëAÈø™ 1 KµÈË<"Žx­í> &ÔÚqÕ<Æ(Œ0>Ÿû¡ÎiH²Sú¯qÝžïƒ Ôá÷Ú,êÀúš èg¨ÑžþÒÒ ]ÈVU§_ë%­À’z»¾O­[¸¦fŠâ=–8Eḭ̈Î2–¸KM-žû¹Oq ÀB¡ÍbAÝ¡J€,òÀ’™ôÁ nUלHuÚëóMÞX»¯)ô<Èx[1b @%ÞÃä ¡|ÞE\Pðî Ö4`Çà¥Díw™æÉ)áø²¤ *%z©ftËÙ@XÎäm‹¨\J(–µô(®$=´°áFÜç,òÒEdgè^+!ªGlÞr:áˆF!hñª›‚Ñ[±Ž.‚“C‹›¬':ý Jë£ð»Ê_æŒDb˸™ÿ御d#ÅP !‰Û”ÓþÎìlÁþTÇÇã8|Ån§Ê˜€¹ðù>VгúâL&nõÃýÒ_ž˜¼ÂpnÞú÷5ßñ?žúž–÷­°¬ðáÀ±tÜH,26.*žUXl´ 8x,Ìø8!´¸h\"|}`a-,¨¨ ¼ª(,x|(l”P°pü´™ÐPTŒñœ$›œ<.£ æÅ ú½íÑåõ±x_ *:Š;6ÞxáTØ Äh´$œz<Ðë<Èä¨ÎxxÌ(P±# 2Äj2ãÃ>8°ÐA/Z€(càȒUˆ#æM™?ÀåI¹&Ÿ/ßXôèЃ›þc:”Ë™ó‹'(X`·AÄ‹ ,¾@â×T2`ˆõ Á)M®|å àS Qv €Ã€œŽšU ÐñÛd®yS©ÒÎo<8x¹ÂRH”‘¢‡r:ó܃ƒ‚ (D(A‚Dx>ÌpâJTt@uÅ€|0)hPÁ.F”1q†‰³ax¤õèÑ‚ &~K׌!C.ar`a¡„†Rø^‘Èðáêæâ #{RŠj´HêÁ@Pi¢‚S®›2;yª .,ðèÁÁ226O¬`PäFÃØP7iaÈtyÃA+Xpþ$‚!†ã(BuÖ5â…M8Sbm¤€ áíSÄŸ € }ÐTNL!•·l`€ Âü`¿Ià iñçÑ1À æAGƒi²2+à%ቤ(X )䀗†Õ‚Ó‡Èä“ p˜xÖ ä@€d$DP@àÞ³È2‹@æÁ¢‚5¤`‚ 2mT!ÎÂŒnJÚÁ 0ÐJT2x’0¼yá (DA ¸` JÍó úéwƒ«&A(„Pj<òª#pà›¹˜Ã£¶À?ê `,¢Ð#\€Ã ÂÜÀmµ­©¦lÇì†B `þ –^Ї («„6‰¢¼É;̰Р?f‰a7`È/¥@ ØÀ‚aÊúc6pÉ "˜†Y@¬Q<DÐëA $¤@AnP»ÝiU° 3p«Hj Cr¹¤Ÿ¬7¤c@)ÄàÀ:ðüY-ó* ùá“¥Ó©Ëk"¹ú«¡®>²arŒPà ̰A¡Wï!C#§ØÈj4øCbÈ–GoÚpFq?b·‡ Âà”¸£-8°ƒ$ 6ÒFx®ßØÑƒÛ/ƒq††—ó+“„Ynž¯„+ô ¹Ýaüwnh5³&|þðA iCo4 Ôl€BPYh$÷à1S4œp!„€À/cã@¼ºEãÔÁ^¢0B¨@ƒ÷Dð—0B Ø|3¾Ñ¡8ÎÔÒ¢ÎDcˆMp`9,±0¬nƒÀPÔÀ”@ðq@ Z‚ b‚`ÄëG `è†6‡4ýàE$ª@õó2Dð H9 ÂÆó$ ¤ØÀjÐöE3ì]ÇŒôŸ5ÙÏ~Šbܼ±E71Ô°ÅÊÎ$?f€žpÁ€€’taD N ÂÔ¯¤Ýà((þÊx„ U2áWè4„—”`$(_öRô œ P>–W„ª9ÔÀ!G`E‘á- c ¦‘œô ‚ 3Ó¶Øà P)%.Pj"D#pB€ oÊÁ¾:ø°&€@x£„˜°Ž Ý…’ƒƒ8!kó˜<3p @\00ÈdМ´b "k0™¾0O‡"LT‡%^ #É!DmØÐÉ®ïH€±0ÍPJ‹ª, 9:‚j( "2¹Æh@H€€±ÀóÚü…~ ÂcAŸ(*`—ñÁþ ¢q5<ã  ƒ,@íHÀ‹†ð¢SÅP‡Ð!l¢›u¦CQµ™ÃhnUàx¸ð9˜à?Ç XÀ®µ+¸Á º³¢Ì¼ 1€BpÂȪ0Â(&{˜™ØÁ“¿\Õ¯Ðýï1°axdð€”Ô3ëIU ƒìià PÀ  ¢v8h ¶•±m6•¥@ À€LZ9°Á Ìdל€xA LÀàpAQÞეvCç˜Þ*=XUH9E; Òò£á&vt!1¤l€¦X˜‡þÑ ¼ Ÿe@Uþ@6ÙáµIª B S6BÀ‘³a[e™LQhKë":ÀÈ”PÑ`0]¦«’°€¬8‡®,¡ðyÝ\æ>:cFV6²Ñ‚û sÁd&'Ð(ùÚ± à+`K4`R¨@—b`KæU/Ù^¦4n¬l À;]âÆ²&GhÀ)ZQˆ• cCØP€WÂäœ«Þ¶Žº¦«Éç"fètxäZårpþ´î3¹ðIÐ6Œ¤n’Ps¦¹ÒÈ ›"¨ŒvYøÀJz¥Ž•½(à9bn fR:p: `XúÆÂþ°›• kÕ-†¼QÇÐé‡A«{TÜvS›/È--Q 2ÖiŒ HÖ<ðH.àRаÆ3Ÿq)yÀ³ƒ¤T­6HÁ   Œ #9aÁ—Á)@éD æ+!~-]⸜–µu~Ô=hɪ|’¸%Ý{{Ùè¶E¼¡6Ftí¢Tmž †.Hž^ÁÒ ( )…Á#~\á. غȮÆJ1Pè ¬ ¾ýŠš«êª¡èy»˜Áe«¾‡8ÀaÙøV Þ0‚x”€;Œc€HÆ4ä¤:p)¥rÒ++ 8òþF¨q¾à ±ìøá÷xæfF³Œ?\]TFð˜á`CDPS0!Ĥ {! C1}¢êˆ®ŽåGšÍo"Õ‚D%¥Ÿíç Pƒ}8@Žt6rN€•ÉѺ92·mœÄÊ_ߺLhBò h r(ÃÙa:9¬¡%GrÁYð’LÒõC5@÷ΤEZ8xSw ‚`Ÿ,@†'æ @ŠÈÁð!õ‡›i….LYvt)&09»ÝÀð1Ð$“à ‹XàYü¹êAe/`Ä@TÚÁÀv×È@l1@x›ZÅJ@È@þ Õõ`Ø9 æ=^@ÍÌ\Îô$Ç´èM0Ž0Œ›¬Îq @¸xF\ÀO¸„•%ÕßjÁà ¸@ ˆ@ ÚðÛøXŠä@ÀLÌZ]…Ý^@*XR¹ÕtxEaÛ9¸Šõ)BE%Mç€vô |Ú Ø8|Ã: p¥„€€c$€W Ç¢ÀaEÀ;0’¸@  r |¬ Œ¾Ãhš]íŒNPTeþœV‡p›ºdØL¬›n äœÀKx¹ D:X ,ÀIqרTŒ@ Ø€$ä@ ŒÇ ÀÁa Üù Û˜Àx@Ð<À @÷ôY9t«‰ èÇV}µ‰Áaƒeˆ˜€ÛÍ„„@I\dX”xßטMÈP–ðHhÔ✅3ü@1Qƒ$,ä›X¬ Ä– À_$P?D€àˆœ ˆðÓÖQ ÒØÑ…|Þ9Æž§Mˆf˜¾$WèTÒ¬Q@ÑD–YËèiÇÉ}Áì;„€„TV’™€·dÄs€,ò#UÁJ®À #Rß6Mõ%C®Ý¦lCÖ$æu€ÛÔ$L¤Ã]`ÈxÄ\@ŠOd &È€EˆïdBxdQ;tiff-4.0.3/html/images/strike.gif0000644000212300117540000001275206747424643013617 00000000000000GIF89a€dõý±Yâ´`tH s=ùñ½ùå—¼k2½d&`L'^A _-\ Š>….7':è¿uΫuq3r¥Šu¨ˆO÷7ú„)Ío-Îa ©LœHÑÀÈÓ¸™vstkc[ͨ\¿˜Wöv%ðlHGHB9+O=>1þµFüž@ÇY¹T¬[&›Y&§‡FûÊ]ßq)Üb‹I(!%c1nX,õÓxL" â„8º”K›{>‰n:,€dEþÀŸpH,ȤrÉl:ŸÐht±Z¯XlÊ׃‰r±¯Æ¬!|# —ª¦x@LªU¡¶Þh»²f()6? >wYB ./=ŽL /›lŽ:/]0/ 6—M6 8#4 © )8 90\4 ·O 5(8>8'808!_ !7>>7))5 [>ˆ\ÞXy(6Êà)‚ÆxË0<<"<#<Á8 pxCQo¹&j˜XXcœ‘d8îÁ‰@Ĉ ÌtM°Q„EŒo܈ˆräL%AÑe„/þ#‚.‘$Å5„À‚þ  JQ¹Sè­z“޳QäÈ’'©m˜ Á€„8'BBŽ$¨éñ¢ƒƒ X˜ð¡ZµÂNàqFn#I–Gî‡0`€•Æ ˆ 0 Jtü«ï¾üöë/,]ÀC8Ä]å0Â"çòkÃ6>ô/¾ÿ2pÃDô€€ÁHØ‚40`‰5ôàQàfúŠÀ <â¨THEJ¯ô ûÐØÊœ¼`_=B*h¤@:èFÚÀ¯°6­;»Ñ kÀ0Ö¸ u¸@’Ї¦á¦¨€‹Wð (ÀB` °IÈN{Ð5o°m øè–x” 'YÆ NÀ ž^ÁtOAÈ0jÜ]Ñ[b²xƒsP¸ƒµœÑƒ T·+ €5Fà\œÖ¥nÆk®àÂþo˜T Ϙ]œ‹€ÜF 2cêDF>ddum«×’n¡¤倨Yå µx[;a9b‘õvá.QœX¢¹ ¬·­IåP7<ç^UslKèF|"äâò͇ŠÉT÷#°ð‚Á^øeå]·¡¬PÀ…ûƒáËZS+ ?EÊØèªàˆ¢ô%yB0X2„Sd‹*äØI N° Fzßh]åîb¼Üá¦}çÁÖb6'bþ¸KwI"ˆAL¹jðŒ§Ï"ÃLP„Âäí™‚Ä xO"ÍED8›åÝPèÇ-ýmCxƒSÐþZTÀ0X>Ô[7n¼ðÎ]J~½a¥*”ÑÄ&^xP`3’á4`ÃæµµÓ˜LUP0šÓ0`Ñ`ôòn=¬LÏÙ¡Mm|²l_ƒ|Ë{^XÇ“wÙ7(ᨠuÀ=QtO C–Z£Gdáƒ.8F(„Íb¨7ÂѤ†À?ÿYkÅ À¶öòØgC,†Ð p…ï,ÊQ˜Ž|äC¥ 4:€!êí ’SàhA>™¬´DGeyAéó‚l‚[ŠôAÆx¼ß9¯¯× ¡“+nDŒo© Íh9/¢ä3™þ‡2ŽÂÂ…,ð43ÑY`‡6>±Ï@?Z–$ªS)ޏŠàÁ\}ƒÅÒ£Že¬Y(V¤~y£G]hP‘b"[@ÅCªhY3XO‡d O!U'S-¨'òÉ€9; Æ7¾MúèŠB'‚ÎØ¥GW\N…5H=¥©WW„ŽZt¢4ÉÇF/2| D° QòºPrd¦5]H<èbxÅE}r±hÀ³%(6r‘·7&Û¤¡b–¨÷RgR&I ªAúHç¿ Øä÷…(Cf™¾ršØGb9ŠBœ•½Òtvr{‹¤"ê"²r#tþ"¼”"3Â,~&^4$r)uB'orL}âE; ÄB!òæ1,¤Ä¨Ld)¾RKLÔGõ$Fd{¿’b,U”y¢"yŒwIZt+B,-àJprL3|PEH²åuBô"™$Mÿb)¢Gº¢)åMXrNžB"žI,@%ç$ 0 x¢E‚—Dpµ§'+p5Ò+¼4'o¢„TpEGf!,ûgP uÛÄM°`ˆîÑ@¢7FÖô·M›0 פnîaçyòô)óq&ó”MžÂ)šb«4ðAŒ×on´B-pŒG eÝ ± PÑþ¢³¨-°_ºh‹Ù-²ø !!ØbB€ŒÂ¸¾£ŒõŒÐÒ8ÔXÖxؘڨ£ãÛbcjÐõ7•Ts^ü’hÄõD€3} crã_"ÐX%iYpSÀã\ãè0ÊTûÂÐUQ0¸õ \åwUÃQ8€ZOÀRsñRnB03¡3)ø¦sxCF…L (p\v‘U€0Å#€P\]007ðÅÅÌpW†UTbû"p@*"àùÕ9f@=@ i’#_! )Hð vá“ð…ú2)6²Ó R þ@q2E)b XpeX)‘2 )P0À yfõŽÑp ^o™U/0À7°ŽJ™UŒæ9P…V9´0VY`’4ãµ±:@`>ý²˜…Y@˜I²µ”Ù66ÀC‹ÂR€ ™Å ûø ­©bUû² Ð4ª_•^@X ƒT`åiM32Ç u%6 _ÃÙ`!`  P9° ‹èˆfU4/¸S LE5˜Åx7“˜  Vf•W0Àã 8Ð!ðÏ"3ÕZ2ð ‹R)À¡?¥ÆU7.ZÀZ¶cfõCþ‘8¼eI޽•“U®cžV°Õ¥PbÐ\Þð Gà£Sc"СåœÌÀTÿ¹fP7à’•OÀ\@8_‰öÙZj 6Ï65`¡à9àØ  ¢g#a:Æ)Üõh º P]*f]³ó^RLu2_a‘_žS#7ÁcwÑ›¾àð–x&RQaÕUjæu¥J`V½é“aÇ€3é\u7qUá9¸¸ÝâÆP5 ¦S4õµ˜³Ór!"ð]¥Ö Æ3T£vS6T:Sô—Z7*þ–i®•H€ïâ-HeI–©Žg2q06"Щ2†“³Q;3¡«NÀc¨£q9€*Wc–:d–I樷e$¶R™ƒž¡-J9ƒ“ @f?ß0¹C›=u’–c­„óf6dEà Íå§W• &4E@/Ü e¥c9uƒu¶[»õ ¥†X‘®$¸“Ò;=`{€±{ð8ëej¨–cöÊN‘E Èc©:MH1iÀ1E†Æs¸Š \æ°Ò“ÛЛa°¶i˜õ fÐnQÀ|бyñ?ªvs$kÐgòs §="`LÆ;þÏS¤ü µ›ÓD15ß z°aÁU¨# 7ð/pmFXaã§yñ Â!@»å°eã µ~æl§¡º>X«_Ûs ’æ<:¶{bz;FQ º=®˜jdôjCγ[¦%=ax1=z[µ [@Õfm”Á: =ŒAÓƒ­ÖÖ<’6i(q=ÁF€¨aAߦ«ä°pØpŠá°üSf¶p¹÷ƒmË6µÀk;¶ƒ­ª‹<õ³=`µaWñ½<”B6·i ’A‚q¾¼{=’Û¥ñ½¨ëg5„kÖVÓC=öK؃Ï»>˜‹¹¸Q?¼±:`þ¼&k*dõñB´$\nš± Ü!l³«îk'|2”†!m(º¹’ÆT 7lŒF?ÇiE7GRDÔXa=à7ðv¼Vrœfç{@#÷o†A»¤xsœO1—BE»õû½¼ÖišákÜi†q§°£C@ÄÇ÷!óA†ùÄ!7o“q@¤A,'tßqn‰s-äqeH¤Ã”¸n7wãCÁ G$ csšI€uÈá,@Gu0pÕ!E›°iDŒ@ôÈ$hàñI Æ†a÷A%Q´ O²"@uÿþ±Ã's%äF*ǽ&WoàË`LH{×vZ$"–øequ¡”Ë2} 4},ד·/ð*TÇWÀë‘Í;°s9É…sR󯾻J®Ñ¾‚~¤ƒEä†Ò‘nBÄu/H'ktG©¢Ì±ç$Ñ÷’ç)°¢vaWÆgô×LåÄBGRE Ë/°GV¢„x“³‚L4ƒ²! Ë/€~ÄÊ%±"ÙLžršW@F.M$àMéF†9èIH¢+Q¤=@%»lmÒ€†+!"xƒ÷Þ—!ÒL«²l|~D:‚Ôþ·ò·ÍÂyË¡b„Ò++ÀÒ1%\í+Ñq )B$/{™w^ôE)‰t„ò(½’*˜8Ô'"KÔ)Ç7"ª4#}·!%ðK’‡mÄ*ŠÒ(´`o-NG$~tLº$I„,}¤{ErHÔ"‚·$„nr!P|Æ7xœô&ÍBÒM—|rKááu/‚KO}qÃrPÛÇ}ݧIi²'a€†tIe‚"2H*À„`Â~AR6` Ñz]Ï™#Ô¡%ЄüB”IÇÄJ™„LÞg~iÒJ8Õ¯}€Åd~$pIýE¸rF¸çÔtHD´þX"}hQÑÉREŽâÔ®¸/Ää}ºd&~2Ø“‡á×8‡}M'¥Ýw­~ž"…wHÉÇö·Ö!L‹%}̲! ¾/ÂÕÕ{½òJ¹$uËô&$‚L)‚V"(ŠTD’zÆ„EõWHƒÒ!Gô‰‚EŸ„(È à/œÒ¯B„˜’{oB|n$câ”Ì5²­t!Ò~–wÛŽwáHŽž9xEâ(NíGÚç/CØ+ðý'ÌROaÛ“¤5x#h‘*¬Â]ôóÁ„à·"$®Í‚ˆä·=Åò(†þLûWÚwî/]ØJ;À)î±!Z˜…ö÷#;΄TþÄ„#EìçKÏa^{B²D¼RKH^ÉQ,ÇQ}8¬,´!®9…%°%p[xŸÈŠ3Ý…VH…§WšR›2°x°Mú1*gÐñ+Ì&2`"RÝ4 „}xèI˜rÇ,‚2ìÿÒ@Bˆ}<  DßzÍB²ŒÇ=ýAïv1m…brF¿T"ó4î…è)›wBÅœO«ØûDËG2ÒÇ⌬/€) ÿQ‰Ã¼%#/ˆÜttLí(ðwBWÓ˜‡ø)XRˆÊ.aE0s0¤ J¸OWQ%ÎD,ÔV`í‚ôѤ¿ÈŒ²È¤L:MŸ-$¿õ à;B -ÙBŒ QŒÅȤÓÊŽÇ·ŒRo! öû;tiff-4.0.3/html/images/note.gif0000644000212300117540000000041006747424643013247 00000000000000GIF87a ó€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ, ½ÉI«ÛÍ+0 t¤žcYÎ)ª”N]) <‹,}(ذà=|Ÿ®Èä%CÊ•±Ùõp8ÝtʲŠ^+ª±‹Ã@Ã[æçjå8;qh»•;ñôØ%: ¢?r[I~‚‚~ˆzŠŽ1‘˜”š–1Š™†œ˜žE¡D£©‡9¤© œy®Š«¯ªoC³zµ¼T¦²¯¹p¨ž§È$i„€:Ê;<§BÉ ÍÚÏI*;tiff-4.0.3/html/images/jello.jpg0000644000212300117540000003266006747424643013436 00000000000000ÿØÿàJFIFÿþFCREATOR: XV Version 3.09 Rev: 8/13/94 Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ðÿ²p óÓßÿ­þyÁö>q¿ŸB?ÏOóÐÖšFFÖÛœtÚçüzû{P#Úqßîç¯òô§@+×RfV3~ÇÏúϯËþϵ̶0ù' üúδ¼¾™QµA/eïÓßñÍ[.0¥ºØ{~yÏ®H÷™ÿ_×õù»Ÿdã>gÈ;O?çüóÅ/ØùÆþÝÿ<ò??®4ÄD2ŒŽxÆ~¼lvéÞ‘cÊ…PªÀƒ þ§×Ÿz9˜XÍûÇô㯯áÈçßñ£ì|ÿ¬úü¿çüûV‘FÈl(é·Žƒ·nœØdÑåcåÛÓƒžŠ^ØóÍÌFh³-Œ>Ièÿ>£ó¤û'ó8ÆAÚyÿ?çž+P#p¤ž¼tÉü;©ÏP)epxqÈ= Ø{ oZ9˜ìfýœoçýßóÏ#óúàûÇô㯯áÈçßñ­!À@¡G@1È?©÷ç¶h(Ù …6ñÐvíÓ‚{ š9˜XÍû?ë>¿/ùÿ>Ô 2ØÃ䞀óê?:Òò±òíéÁÏE¯lÇùæ—cœO^;g'ðì~§=@£™ŠÆ_Ù8Ï™Æ2ÓÏùÿ<ñKö>q¿Ÿ÷Ï<Ïë!iê=zzNƒôŽ :Ž@éýO¿=³G3Œß±œpÿN:úþŽ}ÿ>ÇÏúϯËþϵilîÂŽ…xíÆç×°&+.ÐvðNA ^qŽ}½hæb±š,Ëc’z?Ϩüé>ÉÆ|Î1vžÏùçŠÔØÇ'“׎ÙÉü;©ÏP)l< §¨õéè=: p;ÑÌÂÆoØùÆþÝÿ<ò??®±œpÿN:úþŽ}ÿÒ tÓúŸ~{f‚ØQÓonÝ8'°É£™ŽÆoØùÿYõùÏùö Y–Æ$ôŸQùÖ—•—oNz(={`?Ï4¡ó…$õã ÎOáØýNzG3þ¿¯ëóV2þÉÆ|Î1vžÏùçŠ_±óüÿ»þyä~\iÊàð6ãz°öÞ´Ž :Ž@éýO¿=³G3Œß±œpÿN:úþŽ}ÿ>ÇÏúϯËþϵil†ÂŽ›xè;véÁ=†MV>]½89è õí€xÿ<ÑÌÄf‹2ØÃ䞀óê?:O²qŸ3Œd§Ÿóþyâµ61ÉÀ$õã¶rÇêsÔ Aiê=zzNƒôs0±›ö>q¿Ÿ÷Ï<Ïëƒìg?ÓŽ¾¿‡#ŸÆ´„G…Ç tþ§ßžÙ £gvt+Çn0Ç>½4s1ذ±oUÇSÏ9?°ü£TÅU†29‡^00:“Ú§ 0+•ÛóLž¸ííÜõéš\6ì–艽ÏSÜç==„ànGPÝqÇëùôŒÓU æ'?óôÏJŸi*2Ø@Ïÿ[$þTm$m'‘Œç§P?,zþtíÐ)R/œ`Áé‚x>üwÏ4¬9Û» ¿ÂHãÓ ¸þx°c%¶‚Iþ"Íž}ò{~YÀ(ÙòägŒ÷íõÇõ=qIXdXl¨WnHÆAÉ<yüÏ1ïH@†aО¼ÓŒñž}*}ŠÀá~PË`¾¾ÜvïJT¡a“¸çéùÄúb",/Ê7nÈ8üþœ,Rm^0ýrw_NüsÓ׋1£pqòŽ™äþ¿æ…@$@NŸ¥?_ëúþ˜ì\gï`g;ÿžÀsÖ…@q–'מÜôäÿõO±²Ib\ÃíéÓ4…r6‘òàås‘Žùç¦8Î¥ œ0Ï8qœÏÐt´»:‚Æp@õãž½?<ý*r¥ƒNYŽçÎ>ŸÓ°'µƒÈ^N9éÐõã¯ÔÐXS’¸ e‹ã¶sï€xçýqIåñÉ'hôOúœþ:f§ÙŒn 9äROCè;g4èá’i5y¶ª¯v=9'°Ï×ÖŸ›¸E-÷Ž3ÀÏÌÏÿ¬Z@ íÓÆÐ0>ƒô©Ç`jÜÖòÁ!ŽhÞ6æÞ„‘ÁéÆ8÷=j<9ä dãžÝ»öZJÍ Vjèƒbçí8ÉãŽ#K°Ü $ä 3ŒgñíÜÎxœ)R'=‰=OÇ ç¸íH…냃Ӓ9Ç|‘É>çÚŸõý~€@+»€HÏ?‡Oò½)ŒÃkgÀóØŸL“Ó§µ8_Ÿ ì´6HË9Ç=>¢‘T°Sòž2YÚ3Ó¯_§|þô¸ä:°èO^ä8Ïý(òÂü£vìƒïÏéÇòÅM´ü¡BäôÏÞ>œzž¹=¸â€  ü»z`7^¸éþIÉéšAµxÃõÉÜ9ý};ñÏO^bã8?{8éßüöžµ9B0|Ü éÿêúuÎ)“ón<òöéŽÛG ã4…Pe‰õÁ'·=9?ýcH…8ažpã8Ÿ è=jr¹Hùpr¹ÈÇ|óÓg?Ò”©`Ä“–c¹óϧôìÉíKp Ø©Ô3‚¯õéùçéG–ä®bøíœûà9Ç\TøƒÈ^N9éÐõã¯ÔÒlÆ7Œr©'¡ô³š`K´À=8Œ“øqßüip>ñ;AèGË…p;~ÿÎ\2®Ã`Ž8äžzsÓéýiqó1Œ8ýxÉ=? Ðv’¸Ãð½ÊžqëÇSôÏ¥ÁÊ‘ä0<nœc8ö¯¤eÜÇs‚¹À$}ãÜoóÁÎOWáCw=HúãÛÿÕ@ì]Ÿtíç<öé´c®{ã×­.и`ç8ÇsÙ@ôÁÉö>œJÈÀÜ0y=€ÿ?.Òj˜Êç<ý™öéFÿ×õý~%È6|€{(Ê€ õ'ÓŽŸýqJT ±\c¦à2òœñŒðxëRàpW“· 3Âêyÿ&€£pUbØ$–^3î}=Öž FPò¶õcžçÎp¯.ŠÞIK$VìÌ̈¥±Ó¨Éýuö^´ƒËiÉ–@7'äÝëÓž½û˜ë¯QB‹H©ç  3’xþ¿^ xµóˆGJJç‹_9„t¦¯æô_×Ür6~Õ/îÖD€€Né$u=ÆyïÀíôÆñøjÖök5Ψ«&>dŠ"ããæ$ž2vŒcŠì´[M£Î`žÄŸOOÄþ”ksü‘Æ9cÐcúzÿõëŽYž!Úéz/ó¹Ÿö…eÏ&“òÿƒso X©<ÝŽzp9ëÏ'Žõi<;¦(_ôv$`nguÎ;õãžýU©ÀqŽ8ÿësÛúƒÙÈHq›-ŽŸ{üÿŸnc1G7÷žSÆbe¼ßÞfÃáý5:Ú)*U9nÞ‡ëùã¯kcLÓÁ$Ù[›,|µì{žýûÖŠÄYP…º1úÿžÿZSÀÉ ŽÄŽùþu“ÄÔ–²“ûÅõ‰½e'÷” ³¶¶pÖöÑFàmÞˆƒŒñ©¼ãÆF=O=€ý> Ý~¿Sß×ù~H-ÉÉ-ógž§ÛŸÇÿ­ƒYÊ¥õlÆU®îÙÍxž1a¹d[òsƒÓ9íœç§?N9“ œn# œ“Ðçžžž™ë×è÷Zj\ÚIïAÇ>¹üÿÎkœµÒaÜ C¾RFX¶yô£¦½kÓÁãaÊ›Ðõ08ÛSå[£šŠÎ[† K+¾NrÏÆOlŸÃ?Z¿‰3H¾yóÍŽ 8(ÆsÇóÏl#‹M³1¡HËv íÛ·OÏ(ožb«¹Ù›¦sŒ<ä>µÕ<}g¢;kcj¯u=NRÓ¡·³ˆÃaX‡\ôÉN:x÷É#$±ËrFyÀädã©ëÓŽ;uwѰχkÉ “Î#‘Ó8?úÜÑxä` ŽöÏëÛ½z}YT¤Ôž©˜ ’6¤õL„ ŠG{h''ÓøÀçÛŽNOº9#»8ïÉÎ2ç©x óaTcå?N¯.”ch<Ž[¹ê–=ë¼í" •w0wryèzûþ¡A9c„ÈÉǦp}øèõÍJ± äô.Iã¯Sþ… ä»rCBŒäuêOä8úѸz(%¸¿`œç#€zþ¾ ]ÄmUl}Ð àdú~§¿LT„nŒ€v~Q»¿|ŸïÒœã;C`ƒÈF8ì?¿þ³úþ¿¯˜C;³žIcëÛ“’ÜRíUùˆ8SÁÁ=øÀéמóÎEJKufÜORN3ÛvÉ?…J·,ðK`ç§\v4_×õø Q“ÀÎIõ£i œ`Álç§çÿê©1ïŃð¦ Û¿ˆs‘ž=;óþ~”œ…# <ãŽÿ•IŒý(ǧ^™¢ÀF)\"ñ’3øúõÉÿ=( ŒqÜžùëÿש œ~8£†6ñ÷[w#55¤K-ìÊ !‘Cp:òL}E3Õ‹?´-z`JŸÌTUÒ~Fu]©É®Ìî>è§~8è9Àè9ý~™«66­st‘ôUåÿ¯ÓòëPÄ€ —8ïÎ{ŸoÄtZ]’Û&æo™º÷ÿ=+â!gcãèR矑yU`ƒl@ ÷ÇùþµÌêSyó–Œ}?_ä>•µª],p´J@ÏaŽqù~¾üu®l’Ì[£1ëøã¹êNÝtªú#lTÓ\ˆaã=ùÇÔóùiU ¸\ä’'ßüþ¾Ôg€@8þOÃüööÅMf£íqþ»×$sëúóÓ¿5‘Æ‘³Û¼*¤l#;˜þÏZ¯,L­´L Œú¿Ï»æc!Ñ'?(çäÿõª2B§“Éý~µ‹}5·,–¤xà¼c·ùöÿ=—kòOËôÿ= 68>øÇÓ¯Oþ½J…Ì3’:ôÿ?çš›Æ õ»JFŒôŸçüôÅ9íá°–T ±É`œ“éõnÎ+TÌ‘©Žœÿ_Þ°µÒÅà`øóÝœô8üq]TŒ¬G (R•–­™—s4²`äã’sÿ×ýx­?Û+LÎÈ:¬Xdã=?>üsïXéó´eAç…úúþ_Ÿá§itÖˆB äã_ðô®ØïvwR~ÿ<‹>*³‰ {H!Ð+Ð9ööæÜ€6äääž~§Ó½v·—ÒÞNC’½ÎGÔóëŸz〠g$×­–;óü¿SÒÀÍJs·—ê0. ã'úsþ}sõ¡T‡8'vq‘ÉýÏ_Z~=yü(Ûž:çµzÍ\ôH¶†;OG­8ŒŸ™~£=?ϵ<ƒŠ1é@ ÁÎæÎsǯ¿?&Ð8 < éÔžØúb@8ã>”möö‹ ü½?06ªqžƒ‚O©?áúâ¤íì(ÛØp:PxS´žØ¥Ûޏ‘î}ÏøÓÐ(U$ G=O?â{zzÒŒ8Ç$ÿÖî.´ì!…qT’:Ocúѳ8ÎO8$çØzÓ¶¨A•ëŒôàpyü~}©HÎNr@Á;»œŽ¹õÿV? tlðÈŽ™Yæ¸#ž?K·¨Ãð@=qÆ:œJ6“ž¤ðO¿§áéÇzVMj &¬ÏSÓ´Ñþ²e ‡ÐŽ„sÆ8ü+^{¥3òîo›u#¦xõ?˽T:”kÄ`핈§àò3Ô£¹¬‹ËæŸØô¯¯çÓùö¯‹mArõ>]Ê4cÊ·"»¹k‰ó’Iêqî8Çÿ¯úÕUÁÆ::Ó¿õöç­8Œ¸zc#¿<õýrE!ÈÉ' ËdñÇõíéëŠË©Á&äîÆõç¾3ê}?çô©!\L£r#¹þ_çÜdñÈõàý}©Ð|“&À À9'ŽŸ˜ÿ)5¡-hÍ“¦àHã'>¿ËüúR˜L»BŽOz vçô¨° `cƒÁÇäÏ¥Y…‚±§~LÖ+³2‡½¤ˆš" `ç¯##?ýlÿ/ ¦·øpy<Žÿ«µ¶®ÒË{ÀçüúzuªóC `sÀ$qÏ^xÿõJ·NËCYá¬®Š‘!bN7z‘ÔÿŸò*[­7í°$L† UW$õãõÿëUˆ`à’Üvã¯ùÿëw««ˆþ`¸#‘œ|£ò<ôü«Z0´“gV+NG'u`–³yJ2Ê™ÃÛØœcñïPOX@à‚FOnÃÆµ®¤óîåuìÈÜF}= gÕBdãŒÜ‘’0~sÏáÓŽö´=YEYØÀ¸ÊA6ÒTá°sóõõÏáÏãvÁ8Àÿõzž?È®‹QÌpHÀú)ÏNO>ßΰ@!@ù½þnO>¾¿®N:W¯–/ÝÉùÿ_™Õ—E¨IùŒ ~§Ó×ùž† sŽ1ÑAü¿_ÖŸÀïÐ>ƒŒ’F?ÏA†{gÇŽO¦;Æ{qúúV=<#$ñùdŸóþ ´‘œsù~_ΤÇÌFrAÉ#ŒœvÇlŸÊ“hfÛÀè¨ãéÜÿõºÞ3‚@ööôÿ=)vC€>¿ëùSøÀÏSÐc¦y$ëþë•,ÝÆ;ñ‘úíÍ2 e{R?J^1ž9$vãRr>PcÆôÀöëÔÐF@ÜIQÉëƒÏ_×Û¨¥`£*£8, ryÆ=»{wü©ÀœnÉç ×ÛÐþÄR |ØÚÇN€þ=‡åžœ»¯CŽrps׺ç×Ú˜ ÛØsÁÉÎ<œ~·úPA'qœœc'×ÿ¯Çs’x§9ÈÈêrF×óî:]£;°Ißá××$Ìäàç=NGŸ÷º~$z L```cÜqþñùzŽ´wéŽã=ý=8éÀãžœ¯pnž~Ÿ\zzg4QŽÀ`ãœc·~ý;õ£òïõ©?0žzÉäçõúþ]*ìv™P@#ž¿SëÏÿ¬ûÉDÎ0r3Ù ÎrFI'®?Ïóâ„ù\¤ ‚Ü?çëWå¶À< õÇOÇè*„«µŽyç$“ƒœúãŽÿ8£”sƒ[š J¨<†Ï÷Çó÷íŠåÃÔqÇAëì:ãüå߃Ԟƒ¦?>)xÎâwüÝÏ_Çúó\Ç § ›”dáq“øœ…I³q<ŸÓÓô¨,Ã%³Ž3»óšÒXËp«»£ŒäŸjê„\‘ìQ\ð» HÀ Àë’qùZ“!þñÁâ§aÁ_”zœdÔr¼Œ³dã>¹?çó­ZåFír£šJ&$J`78Áî1ø½9õ"£wd7NpGÇëïbÙ«%·Í<€€<ÆÃ=y>Øàýs‘Þ¡˜­Œ01’2q1ÛÜdþ98éèu'îœÖ° " üÛÆy•˜«Ó3ü'r;öþ¿­{ØòÐ^g£„-%æ0<2zñ×¹ëÇo ô˜Gñ ’yÜcØþ|÷§€§¸!‡>ãëùËŒŠ\näç8àõä÷ž3þ9gHÀ¸À$ p9éÇoSïŽç¯r£+Æ2¯¡úÓ¯ãéRžÍÎxÏ'8ÿ=}³FÜžFrsßüÿúÏÒ€þósßÔúóùÿ†hÛþÆ8ƒÓ±Î>™ÏÓ.À# gÆÞOR?ÉõÏ Pp;¯¨^>¿ŸéÇ7GAÔ†œûúf‹tê>Díò®IôÀ?ãúúÐF¾ON}zú÷ööåáv¨ 1€9<þxÿ‣Žn¼ÓÈp?.Zò‚Çåäç·8ÏoóŒúž´„¼pbO'ŽOÞÞžÄI°7=Àï×ןþ·\Ò/8`}AÈÏÿý}¸Í;Ü`Ðã¿AÛ§O×ù‘IÔpFÒO$õõ?ç<÷=ߎÀ»zœÿñT§%?‘ÿ8õü3Î3@ Á^}úcñ÷üs’ò‚ÍþÏ?¯¾^U¶©Ž2@8?ýnßÏÝ/TðöŸo‹› ®çb2òBŒ£Ð.Oùû æf™‡Ôi^+šoeþ~G©•åÕ1µt‹q[ÛúÜ_ ‘sm:Ìn—r8ÿÐOùï[‰c$ŒB•Î p>™íþphÓõ}"ùž=>Í-ʨÜ<´RÀú<ãß×ÞµcŒÉ&FÑëƒÏ'©#^Èø Ù–"¥vä­sÇÎò¬=uH(8­4oɵҤ-ÕŒóŽ»|~~ùÐsGó¸îbsŸËÐÔö¶ìÊ3ùõíœþu~_”–qìs’}¿™ÿJ'mÏ>8JkcâɱÔ;dg¹úßdÍb¬ç2‘œàcßùWOyq‚Npy'üûtÿkîáòÒ,`sƒß-Ú7ûÿÌÙ³ÓÐ*î.ãÝúÿþ¬VÓãœpŽ{ÿ#ôµUÓœ66œ‘Æwgž:ž}Ï´C©\/ÎÀÀrF{ŸÀçüs^ýTKÈÞ›ŠVŠ·ÞPšÕI€[)ÎsÇóÇùÅe]åe,O\tãÿ‡ÿ¬V½ëáyç°Çæ§ùÉ®zí°[¿LuôþŸç®8ŠòŠÜç¬ï¹Ÿ0-y!-¹°Š À8ô#ºƒøT°TÎç,»‚MÙÇŽþ”ùŸeÑÉÎüAüDŒdç“Àö#5FîçŽf9 ç=A‡~ü«¦Ÿ²Ro¡ÝM.EèsZ»CöéÞ¤f0&TóŽã©üNqùVºÄr²…È `Ä€R Îp9÷?Ž„ÚEµíÌò½Ä®þkÈà‚F9é€ÿª›ý…dwÊA–ÀÏoË¿·5Ù„ÌÝj’m~GÖ}JŠ¡ï$ºhP]e¶bÜFYйz~?Ðöìñ«!%ZfÉôéþ}ªÝ¤¶Wœ ylaéמ{ªÊ«´8î=3Û¯?‡>ßGN·‚·õ:ç‡9íôõý}èÛx$tÀ9ÏOÓ§^ÃêiáIU c¯`:ÿŸÃÞ‚¹å³×9#§<ÿŸÃµ ÂC6õçëÇùî>ÜRã8$ôÆ0qÆ3Å;i8ÀÇϧ§¯ù縠tv“Çù?˜õ4Xc1Œ‡.úÿ>¹Å(ÄØ ñüºñÞœއ S××רõ¤û=ÕË­!’iËÔ±§¿¯ë'OMÔ¨ì‘ÕƒÂTÅÖTiîúôK»:m+ÂÞØ$ú„Ξn&åä‚IÏ\“Zpx+E…òâyò1‰%À÷ÈÿqsÚxŠå\A©Ì€î "» ã® Dº&¬XìÛ¡‘ˆûzWç8¹×ÅÕ•Y×µú-’í¹ú&+xZ*••]äŽþäuã°ôè?Ïb*FjÄI)t)jzÃÁuµ­÷8l§¨Ç¿ÿ¨V|úÜ’Ì% Iä€1ÔœóíßÒ¢×HûZdË 2Hþñþµ‚läÔ""ÚHnÃnÎWôöý>µÕF1t’žˆ÷°WŒSÑudúî ¸Ù&âÈÁÝ:zýfG¦ßI’4ܘÈÛ Æ1õúÕ¯øGî6‘æB ž~lcò_óÒæŸc¨Xƒ—¢*XÆðppFG§çï]*¤)ÂÔåSìc:tiÚŒ¯êeQï·8Ï;œr}9?…6[+»dÝÏAL>!ùM£ ä0ó=}N9ÿõ×N‰¤þÓéý3Ÿ†­ŠKš*ý×ü9’#èH' 1ú`sôôâ2¡I-ߟb~§ø÷ȧ´‘I;ùjbLåTœàÏ'“Ö®Zé³\¢±Pã;˜¸ãŽ;õÓë_IF¢ª¯ëÔð+ЩF\•™R8$ÊÆ»œŸ›o<÷¿Ïüô9pÎ{ÏÐõÿÉ£è~¿çßüóOpCpAë–<“þÏ?\„`cw¹ÿ?çô.ÇùÍ5ÜGô_óþML¤¢œžÅ©%+·¢FޤVóÊ,Rùä~¸·¦Ï?ÅèQ …"Zª7tz÷¯–F•·¿ ‚›´ûuÆkà3¥<ʾ“´#²·ãóüа/ìi'9ÚO}6òß¡ì3j¶Ó¦½¶ŽP@*Ò€GÔv¬ÝrþK½TÒÚÞf1ƒç 1ódôîã^f‘™fŽ(ws´*®I'ÛÖ½sIÓWJÒá³Få;w1êsŸAíŠùÜFž–W¼»tÐÓƒ¥€äù¥}žÚŸ„´‹ë-^inlçŠ# J÷,¸çüqÝaŠä‡8è{ç¯?_ êi:œàu4.áÏLžßçé[ÒÎw”?åóœ$ó*î»—+i+[·ÌÆÔ®|¶xÇ|:Ÿóþ};9'v2ÄñÿÖ«ê×RkrÚɶ&}ªÝÀãõü{ÕtÖ¯ãR…QÏ?1Ž=1þMwU…JÉK§cޝf-sÂQwévŸåm=N—< ààpOùÿ?Éx sÀ=ñÜÿŸñ¬µéøó-·6G(Åx®§MÓ¥ÔtØ.ã)š (Ùù~b?Ò¸ëAÑWžˆò1|1ša5Jz^×M?Öÿ‡©S®9Îy'ù|ŸóÊmôzçŸ~ÏøéË£^&px;_ ã×äVlòÕšxåDÊÄ×8=zõÇzÎ3Sø]Ï2X Z¿îå§“<ãúþOëIŸ@FrF§ôü鯘˜t݆el‚özzñþ<¦Ü žƒu<ûøÕ$ŽiÂP—,ÕŸ˜»BáŽAÆxÆyÍ(SÉP~€‘“éõÿ<у¸… ã9ÇßáùSò$çüCa,ÍFê»—o=±ƒ×ŸZȱÒç²¸ó «·¤Šz‘ÈéŽÈïÓøŽâ+Hl¼× »Hž3ØÿŸÊ°F±c•Ûsžp˜VëëÓ­z”ýª‡*W^‡ÚåÕ`’нïÓÍ¢¼šü(YZ)–EnT€#øqž:UøHIc=[2\TòékwЦ›†šMÙIfvŒç‘ÇCþy7áø{«Æ>{@ç=|ÔëÖµsÂS_¼i>ÍŸIC/§$½¢åoù¿¯[ü×j—(Z…‰ÆøùüqÆq޵ÖY|4ºœG$—ÉG@pG`àƒŸZUðf²€±EP:,È?­vz<¾•¥¿åcŒÖ&Ý*ÿ±ÎÇ×·â¸qx÷%†’üÕˆÂÓ¥M{©¾×ÿ‡üÌ8¾iñ ÂúV?{s <úõÿ?I}àùmíš[{–¹tûѲ`‘íÏ'8ã¿éWŽô¥c˜/3ïñÿRŸi{T˜n|ùkïþ׎šáê*‘»î¬ÿ¯¼Ã—âñTÕ:°Ñm¢ÐãÎ>ñÏâ?Ï?ý~¼Ðä’HÎFOçŸËÚ´õWE»Ý=´]3’ä¨Úþ¹¸ëž:óëšÎÀ<ŒqþÎ? ý#/ÇÃKÚ$âú§ºÿÙÿÃ#˱)%Z6OgÜnÝÝ{ŒcÛ¦?Ïô üßÄ?¯äÓˆÈÁϯñÿõþ&9çÿÕ]ÇàÞ¸ÿ?çð ïtñN <‘ž}?ÏÊ·æÚ3»¦1ƒëøc¯ó§²° XÝäªÌÄà2IïÇéþ5ØXøVÇìq®£oæÜœ³~ñ¸öã?ŸáYZºm”‚òêà‰€Â"«ax ’{ñüýøèá$Ò÷ñ3dúÆÜʾ'‰18úòú¶”ùVíFZ¾ËM¿7øû9r…íœÒ—MVŸðF è›ûëÿ=üjàҴпò ¶öBÿ…Toéw ›i ym“ù§|UoøK­:ýžàÓîõüë壕fµUýœþw_™êÏ2Oâ«ÌÏ]Zé>M¶Ÿ6·L7´ÐÆÑF@ßž„t÷®XkZ£>£tIõ¹ýjÅäúö{™®¼„³P@öÉnƒŠ„iȇ>|Šäÿfö¯{“×¥MFTîüÏ¡Âæ™]*J2ª›êÚä4kZžÂN¡vOýûu«Z]æ«©jv¶ƒS½"G±pC±öüª¨ÓŒÊøÏxÀíõ­-Q¤j?kØ.[Ë(¡†Ò¤‘ÈÆ}üMk<«àÕ:ZÛM—çb±æW Rpšo¦¸ô¼¶zãŠÏ=³Ö¹OøKŸ8û^ÿ½8çþGü%ò?У ôiÿŸZð¿ÕŒÓþ}äÑÿ3便†þoÁÿ‘ÕåŽ8àZòßOþ$»1’ÛTúdê+§o·$Ù¡ÇñÞ•ËÞÃåÝÅÓ†WšF|È\ž‡·Ö½ ¿‡³ 5ªS¶ãþg§•ç=YN¤úväbªç¦*vÓƒŒãîö­Ain¨ªÑ«°ãÙõìÏ¿d·ý2G Ž_óú×·ý‘о‰}ç®ø·/þ÷ÝÿÜðª&¿„%‘ÕqŒyÿ/ç]³ÃŒ7ÆŽ‘¹Aæ¼ïMºm&éî-`ˆ;!FfÜF22zúü«SþD¾\»§¯>ÿç5ãc8cV³©µ·SçsÛ ‰¯)ÆövÝv:™4ûIn·ˆç…Û“øUKÝk/Ùcaq±Šÿxã€r}~•ÍËâ=RVL‘ }ÕPz¼äÿú¿8×_Õ3Ÿµ’;áþŸçëJŸ æJÏž+æÿÈòg[/“÷©'ò_ðç3¬^I¬}.ÕT[("Îí ç9þèªip¨ Ü u®†OßHf•#y$9,c1=ú{ÿœSv©÷Pëå/½»f½å’âífã÷¿ò>› Ä™^ h¸¯$¿ÌÆFheI#óYNÓŸPkÕt a5­9gÌk:œM¶vŸ\ÇÌ⸠‰Ÿõ1dŒcÊSÓ¯ùô©!’[E+ ¯<•F+øŸóÛë\Ø®«‰¿$šÛwþF—a1PJ4åuÕÛüÙé¹ç’xàRu铓޵ç?o¼y?LàÊçŽqõëIöëÌŒÝÏÆ0<Öýyëús\‚ëÏÕ÷3ÅþÔ‡ò³OÆ‘‹êvp®0|ôQÏ»ÿçëŽ$‡bS–ãrk£÷‹ÏÚçuóXßóíP¶öÆâN;±'Lÿž+ÖÂðõjPP©Q5ÞßðOg Å®.ISæ¶ÚÛôfOØî1ÿÒ‘èóÂ¥‚+Ø_ o3!Áa°þ™ïWÂGÊ1‘Î3ëÇùÿõsÑztî{ŸzT¥>zulÿÃÿÛâx®šN•l:qÞÿ¸Ì ‚1ÉãéGo~ß§õ?…?°éŽ£4¤?{ОŸ_ϧç^êºZŸ íwaQq‚ÿgüäýM`cðúã“ø:påïßÛùþt¸Ý€ àäŒç?矩§ÐC0yûç·jR ùB€[Ï?çš^£ª€Ü€=:gè9üýipàAœÜgž;õi ´žpN O§síGRx'ÐÉ?‡ù矂NXG¡çóSFG^ƒ¦1Š^ 7ä(#·¿?§OÓ¹¤Û£9ëóþ•?;‰Èìq€yíþ‚€£¦@ì}‡ùëõÆ:Ó›{ãv9ç§·×úýIç®?—ÒŒóö°?Àÿúø¥ÆHãØ=úÝ}=;÷fÜçhcž7c©ÈÏëþµ@ÀëÜpOç­; ‚~Sø?Ãó>ô»y9ç8#óÏ_צqHàŒœzg¡=ÿÃðëF +Á< ñžÝ~¿áŠ\uç'œôä÷Ïéúý)NI=3ÉêOsê?.>´À`cÈàðýh €NNHÉl’Nxúÿò¼xÇéÿÖéëGVÏV?7®Onþƒ?•3gž¹ÇL<OÈÆ2¡@'¶sÓüþtñÓ'qè:}9íG!IÏlñÜóøŸO΀·$(Î`qÏù?ÎŒr /A÷qÓÓ>ŸçÖŸœNÑ´õöý­ à ‚:v þz÷þTz€Ý§®9À真_åþ»I`>aøtëúõ§mˆÆ}õ积>Ýø0êqÇëùšg¡<äŸç@P\ßóýiàsœœãéø{þtœ `dÏ?AŽþ¸è¸%¹ Äž@9Éü)1èqÛÙÇN?N3Å?¨ž3Ó¿çÈçùâ“8ÊñØòõëëùœ})êx98˜Î>¿n悹䑞9<ç§¿NÔñÉ-ÇNz‡œŒPA‚x)úq‘Ø~­73ÆY¿™ÿ?JOº3€;Søc·õïO sœ€=síƒÔçðõ£³6H휟óŸ×éF€;nAà݇äÐÄrÙ\}àN®òǧëNÆxëõÇcÿÖü©y<äî$sÉ9#×¹ëÿÖ£úþ¿¯øÐ¤g žvúäçÓ¡Å Æ9ïÇôd’:ÓŠîaœóØŒžzõãÀÿ&Ž£'œŒòGSÏù>Ýø r@û dè?^ÃùRmþlŒñøãÜzÓˆ+ƒÏ8úûcéëÚ†=yÉ~¾½¿c¨tŒò$ã'/åÇ¥#ÏAÛŽú ~'¿w·Ë’ç<Œqøúÿ/ÑÚ r2xçñà}ßÿQÆ `ðÎyéúýáÏzä÷=Ï|}pzœþ§ãã<1ç¦9éž?ÈéÅ ÇŽ˜öèséÏÿ¯%˜'Ž3øqœýqÆ}Oë„Ú߸ã=xïœúŸÆœÚ8x†ôë“ùþø£© äž ÉôÁüÏ¿^0¸œg“Àÿk¯ùúz É/œ~¿‡=ºž9§cgœt’}Oôÿ<u'r3ÓðǧÓÜ€7<)Æ8íý\PGb9é…îqή¥<ŒðA#Óú`þ¯â˜< Îr,úÉü ÆGÁÿ“‚· ÏM£åëǹþ\攞ƒ$rFxÇà¥;t½³ÆO'nçúõôJR¹$`xÇzþ?‰éš^¤ëƒõçü(ëzäõÎÔóJÀ4Œ‚x¸þ~ÞãüôIÝŽz޾Øïý)ØÁÉn™n{óúƒÆ}½¨Æ9ù±ÁãŽ~Ÿ^xÇ>´„aŽTõÉÀÉíßñ°â“i )Îx¼Ÿóž=E;åà`›×˯¯Ò€3¸ò23Ôþ×üúÓûÇ cŽ™ÿ'Ó¦i1œ 1¸çuúñŸ­9‡ Üg vǧéG~@éîyç“ïH€ Ú9ì{ÿ,å@±œž8wÏ×·OLt§rT£dð{œZ8ê9ô8ãÓ¶:tü:f˜ÿÙtiff-4.0.3/html/images/cat.gif0000644000212300117540000003027506747424643013065 00000000000000GIF89aq’õ…¨‡’‡)eBe>hgMRgPg…{da@M=CM%HgJDh7Œ¬·Ž¡  +.>{A=y+²Â·¥§¨K’HI|GqŸGk‚Jst{mno>:M<;=RRQGLK011%142M@0H0 (}šnVgoZ^\åçëºÏÖ+,*:&CIDCjlCReJ‡l652 %&&666L9L‡Žœh=a>‚egd "",q’EþÀ‘Ð&,ÈQ‰è»ív¾£m…³Ù|+Qè‹KàmR¸òxºà°í'œ‰­G®¦«ÕVÄ&º%J3K"3B"#…†6%>57v8+$$8$‹3’!T!!84}5>?ƒ#24K%"«¦?r#6"+!%?6¥3«‰#„%$33B‡¼] ޵Á’42Q">4nVnkÝV$±ƒÃÇ"2%Õž2²…º"NYl$#?ºn¦W‘8>$4M|ĈÁC<ÜAÁ$nÉA `dž!HŒ;æã¤Xå€fbüá2F: ò’i‹N¦YBâÇþ V¬¸ÆŽ>ØáÂ0z ðÑá (È¢‹¯`Y@¢¬U‡Ð.¢!4FWJÀ¸""ËM -\ô@Ñ#<Œ¢À†‹.V” ã†,ZkÉ ¨]iаt…Ã1j„î°… X¹²X⬠= r`±ÍF  ;à!±ÆO‰06h \KÖÀÀÀC†çyLÈÑ 6ÞØ7pÐСE‹ #Phà°—Ãá8@à){.§Òüøbrp@§™Àd@ÀpÝÅtNÖs“À\;$ €;,A\PA. ®þrDJ³’+—¹ÈO— •b À¯‚añ 0P« *(ï¡¥'Í6?ì Œ ¸Á¸ lRC,„u#€èÐ UCéÔBÂ_9Ô*ÁÖÚ¥à‹Ñð*htÔQeš™M‹zá1.ˆJP qç>§€` à>hÁ 2X€0á)@P`^;P@I¬Nè¢6@ÅËqNr0F¡ (ñÀÂÀÿ1‚ÐP<±Z² j@ X±‚¤œ€ô€ ÀBp´ +€n„`{è@þòw‡oIJPLÄô~•b@bw‚ì¹àBÑ hàIBX@Ô¸:D øNÀp™ÞIKZ˜Œ@ Â÷¬ã>XÀë pJ>AЀp   `ÂA ƒ<¢™Ú@ 4õ à!ø°8sOÄ@r`F÷°å„@Ї|à1ðæB)|“ä ¥Æ  2ÕØOžõ“|`H£¶”A™1@çÀùùd©2¨7 MаÓ_ íÄ¿u«ô©¢e'p< U`*S$´`0S¬þ§ì`”œdT§ºKB@˜)%C‚Ž3‘—âÿÚ5 €$Ô§h’b ƒ@{jÔi /vÑ¿0`:èé0A@­è … @P•`š °¢ ¬ØÊQ@lêÀn™ì¥8€\·ƒïäŠù@ ^õ€ØS!D‚Ï  …ªñÀ^ú„› @{p)\”¥7ÐÀŽz€(¹"b0“"ÄÄ Y,³¬AVt.,Y©Å v4ã"ð‰ºÐÎåÐ+¤f^"D— Á ],F È p‚xÐxwÔþu±bÄA™Ìûõ‚%”8G Hpd 漦o³ÀŽ„lWTÍð„QVàÆ}à3 A:BŒqð¢/‘…!> *Ä„ .„~A$€°lçø€4P ™Ñ ÃEð1QP”Í×%ÄFð’‘0ОõÁ)dpŽŽ°T4ˆµPÀÛê"²ÍÊWΈ— €Æ¿É@ Øré kˆK™HU&@È`ÛÑ8MS›RïJ.,‹S„ @8Òm.†æª„-œ‚Ï-Q ›üÐ74(l褚¯Üi_ÙŠœnñƒpÆ`øÅìûp@8…°A—>º.þÄ(p_ òGN@ h P œBG-xúìPX'DþªO‹–"¥Z/ˆÆ Hƃç<Ç pèÊxXNuäË¢ÑoÃÆ3. ÎiFͤ˜„5pé îs¶œ§ xQd䃑…Er$wFä/GúÀawP¦¦4yôƧˆ¦ÄÝ)(¢½(B‡°ñ"N{Á-J@ ~ î¹ëBï ¼A M@bîK 8¨RÊ* 4HÄ>G{QО}à‡›²†¾8¥/k gòY™Â9 mö!ö½ˆ–  N2¢K¹h[@* þT*g|Ê€ú%þèË+šilØôu „8E¹^r™\Ëf<0`.›ªDmX‘˜6 >ìç *T…*Œ¡é–«Ä•L  ™Ï~FÁaR„ëüË< )˜†cŽ‘æ0G&M€ä=éaÁ<ízûø¥$#‹Z<™Ó‡A¹ÀY ë\ãøA " ³í‡*ÈZˆ^Ѓ Á =<½¿¸eaકª”õ ´îœŽÈ…yŽYMP ð R^,€Ãzp¾€-ØAF6¤`A!YHDÂùD¨öÿšAqÇd1nö²0úòu4²sv0þzP¤/Ð,Õ"1"< 9&02Vs`5RG$8ü 5Р3ÄxŒ’”æá{à pìq†£#!€>œ°Up:.ÀX ’æ®æ4Ò4|M±›U‘;pYPÑ%Õø8‘Ý“) —LßNž :€Ný€ºäÉÔ à°Tp{à ÐBjÄXÊXY-ôf )Lö44 pà ñäD 7 óqþ ˜QbÙPe0ÁIS3©òÊ%GrÑm $^ñMuÔ °>éR14Yj¤p`¢T*Q3&cO_fDLÄm§p¡/0úÂW0@Šj´7 ±9e 'Á)„rKT2.N©Ð °Y°—ù¾$’”¤F¤#’p8 ŠñhÒ$—Áœ$pFò›šx Q u%9z¤ƒ#a>Y³&¦x0 à\‹ .¾à2Åq!4ã\ñm„™DaéÃ8@ š°n” ß#w  ưbgaliaA à F!·1 1F-ª'BIþqÃabˆ ^Þ0Wžˆ2ýС“ÁpÔf 6‡0&2@ 9)i¯R3Áb`FÀ K k>!Tµ`‡¡BRkŒ´ DÐ œ¶@V°B7 ¶!Ÿ X·8¹‰AÑW8°?Oº!=4` N¢Á€5€â` ÅPp `b Ô˜!¡Þ”Œðh¨Ä@š™ÆyÆ‘*eâ{aJx#P:©J¡c!µ eBàmÒ€ F@Ewè³瀨¦àç@m$’ {iŒ°õ` " ;`@¢ð$V ,`xQ3éb…T©Bþ±`Á0÷ ý  ¿0ŸÃQ(ÑGhwÀÎi}…;€=ši 9/ Px êñÙZ7ÈyÄp ÁÅÃ` ÀUdtqG$<:b:IRuàîyÑHPÀ>P’S”b±þ8J„†=@*«ªZ=fD‡ª¬µ -’.Ýqи7p5c®V XpgkFg÷h7ðw`=ÎøeéÃ#[³¡zŽôˆ61ÎAiÐM²¬Â“f0Â*+ lÐ?P†äa€1W À#%1 6`®¨ ĵE2‡°ˆôšþBaðÁ)À&ÅÖr²z1 t²nÀ3ÐòaO4¹Y7€:Ü ß*e-¡ˆØÁAÆ7¤-~³ ­R\5£>gÀÕâ/o'6[tG4ÚñQÓ³¡tÑ7|DÍÇDU7 ùu6!Ð2…a÷ §à''€kæ12§6À’Šõˆ(¤ÅÐRh"âѸÂ;!ˆ¢)ê¡-ðNa‡utXPpW~SDKà @qO,ÀƒaÞæm©²¶}8£9`(@-aç‘5°°Á‡Qp„bOð.¢,Á;1nŒ"ZÐââA¡0*²³*_ËÀ4h<nÌxÛÃPüÔWOcÀ`Ðt„@­r3È4¾ {|ÅFoNTáøGÃ>·3¾"(秆â|A¹èÃ(õB²/p @$ƒ, b7;y›hCþ,žùtià{r¬Ò6`°Ú÷>!â0(r[|'¬/`/\ŒÀda 4/Ð'ýB0Š?ä3£önaØG<”<€ð4裞8/'àª\¶¯’m«c‚5ÀùǧjоîáDœ2Ãí¨Ðcèõð7ÓÚ€Ât#²× ÞQÒ‡#eÀ1jÊr~ÐëÃwÍÐ1ƤRÊP¨— /±@xRæ²$è4NXÜ2ÀNF–Ã&ïa4ã(Ék'ì` ›¶äc"$ð <¸&Òô†yðÑ[|PSö+6~œ¤]P7 ’dgñ©4FþiáQ‰‡{ kƒ"b% èÑŽˆ²÷+0õ Ò°6:7nA³nÖŠéq(xá0c1[áÐXA'ØBà0t2r𱱆åŒå‚ §ú2hq¨ß£)Ië•"J£'Šb/çQÓ¯!(’}‚bQ|By„WÖVpðdƒH~¡nI[l,ÿ@@²šFŸ[ö{è%xæð‡0Mææ3Í,öR(¤-Û( 8Ê%(ÅŒ€[õVúh~&À~!RdeÞ¨~z}äÁ:eƒ3³ñMÂçÀajNÜ .ó7•pRp}q!’€+)Î÷þÒb"eÍ4‚5bø8µË`Œ€ÑÐÝ&Ð9 À„Ådc6å&‚ù\•UÊiE°bt#3F°°œ´1HSv@£¸Q f§‚hÔâ q 1|l& 5€ñ+–Cƨ3l’Ðcµ­­á Û‚a6W±)»û©ZqR·á wp;"ZDýe ;J@„‚‡§ ¥ú$d‘1“#ñC9â×R(`‹À¾ `‚±ßû}39F!bg4Ó$;b]°ma§ËÒ‚V'b±Ô•DÑRÂô Aâ¹aøTPš.)ôãZØAaþèè¶G3¶H›V껆– ¨?°?#öÇüCq©€$C”Ï!¼‡)€­Á"€È<̳‚Ôi‘)šH-:¦@‚F$B!ts3œ]YÀ±AäŽ:eе‚0ûMì@%hNW.H,€Æ£¬|˜j4ÑQ) 0ï…_X·! P#‰%`B FøFÛ“:T&²qwsHsîÔ™±ñ>.œ‰‹Á–÷IqDÂëŒ")B‹Åf&°Œ»¨¿Æ) ÀÖ2´‹ÅXB&PV$ñÊX;ÚãÚ®íP±³Y¢ †Ëb0ÚÌCþ©¶n£|ž% ›*m;ÀŠÔÅÏó‘óX”‹…XAÅftu.…(I$”S IüÄÖv‚Õ.Aá¦é#þB(ydQË‚Väx£;DHBg·?¨ÐH&‡?ès¯±fö€Eíg>%Ë·w€zYá S°UŒåÑ€A=þò/;°ê{RL—ÕM±ôf Ä ´Q+ð…F«s”TÛ}Œ¹Z‘ü²MüJ&aíµV°”¢ä§ :KViB6DÏA’f !qþË”BQñŒ• Ф¼âÜ«¤CI¨¹”âgl!þ“?@[@@£ùh¬•Ç“ˆ´p›D¢åñùJ¸ÝV¡P`ÈnçE„…’/t»}jÏÀ·‹…jŸ mõé Z±ÎîeÇÅå#ã$à°'Gêlã.fgàãç†Æc'¦&çÃG “fÁge¥Ó£§&æçue@Á†bÀk§d¥Ïæcå&d me‡æf#Äcç­càF@c¥cüe¼0ƒP1‡Aj:DæççL„ª$𨣓ùÆç³X—HÔ·‚•p„Ña‚ >x2%,·òL‘!V'{yjÓâO% º`) 58º:QâL þgÐÐ)¢Ðx>uÆšB–òJ€€P!‚¨QÃPˆPkÖ;>È q)äÇ)8…àÁ#ãÕŽ2Lùø!CéG§0²ÀpQa‡€§@lX±Dˆ1tî¤2C'% ±á‚@(PÁf0ï‚£× „^®J½\AA18Ö¸(¤-²!:K|¤Vl=ò6츜Y€ ,øð¢† Ö1˜0öÚ2þàâs08ÀÃûâ¾ó†¹l½ ß(¤bMPм%L­ 7ç”!‹}8°ƒr ¸ ÈÏ<ˆá‡¼Lj8Bä0Ð@ƒþ{`„=ôð p²AlÀ©Þ²‡1V¨Å|Ð!„cPüÀ'jð „lðÁyb âÃ"GH1ÅM¤BÞš„–ÜHÃNü¤† fä @pÑ €’’C)EðÐD˜aprÓ¼be't°(ûHa›ÁK¸’H°a†DE`óÌE\´Ãl8QGg8“M+§Àá«p áª€¥ðÄÊKm0Í(ƒ²a1C‘"Å”FÙ±ƒZx1"A*hÐa…qúôP7ZQ„mô2;t`é4ô±Ã‘^ád‡D©á \ JþÒf‹lÝ !/Jõä––r9ÃJ ¡ÙÝ|uÒl?ˆGEò !EPÓÄj–ÊCå=³Äý@<á¥Odq’RÉjCôp7a}ó“Xr©W?R†—F.]†¢Î “ĆäióGlXCC84wè.]8J‡Ã!†Rc€ä]µ”BÂU›Í´ÒêRGÏÁ~Õì!b aíVІÀ>Øá£`üùToù@‡ùÈ>Ô|èpÒ3õ0S£e õh8r B "a#CÏð@¤;ÒÌJ+´b(GàWÊC%â–âþ5ÎÀa€¨=ò$U<ƒïT`‡XöDNgˆÖè6Mœ”„¬ÝœâNûn‹tl`ÛŒçãJÒ RU«ÕzQœLdtÍ!=ôÃÙ&’Í2g¸F c—úPEQ{¤[* µo5mø@AjÐQÐñËB‚K@ÌDü‘ Ìôh@f(ѤØT›*qˆl Û™èã, 8 Ä<Ã@„= Sž«T¤€4€dtð $ñ"zGh ¢IÑ'œéƒÐ…©…i'œcË 54 ZkMÔ“ÖñD jLèTÌ{Èæ¤èP%:^´з¡þ¡>U² ؉ ´ -ÐcPÐo=ß™ì3€€ d»”’ÆÔ=¡Q¡?Ç3Ú¥Â&©ÆaêRòLjСH*k'R›Ô X :@€CÚ&û¦PÀ‹Z°p‰ Ø XÀܲ ×7¢å¥H =*å€h íH“r‹ )X-Š•(J‡"›•”¢QC=²`Ià6 ,°ÄÓvÀ@ < B Р`wä%/ ° ä“-à@PÈÄ¡°¥H!x¨‡›>ÙDJÖ†àÈç–¢­~?`Šú,*òðÉ¢¯£4Dþ1N ÑGIJ=àR|ÉË$ —»Ü%2Ѓ «o?I”›¦ƒ;ÔbY!+“2JКò<8 ^0 „y%XgZŠ4:Xüã¬ùÀqr¶—R ¸Œd #b4€øe.qªðr§æ0‰Ø†‡Á€ TX¥_Pôµù¨ohÁ'0Àƒ<–<À@vT‡…qˆZþ:£?ü‚ ˜D@ù&L9 <’øˆ6€ôàè'NY }Ö€Ÿ¿Ä j“¯b¬Pn[Æ*AЂ#åI#X Zœ@Ÿ6–`zŽtàŸTư#!ÃFþ&š 2ÈòM#@Ʋ+h9¨›€š²·¶UŠxzË"Æ-¥(Õ®ìcõÍbµ’“Jp ¸4GŸ•¸„ˆz÷{à„Cÿ ÔÿJ2< £µ²•é ^в6­….Y`ƒ„ðR= €ŒQ`ܶ#¡R šQ J’¢{¬œ%BÜҮʙƒ—lˆ ”äÍ:CŽÂQ„À"Ÿ>å€L3àN/ûóÉó€K^p]F¶ G=`Œ¡[Ö61l[à!RL¨:˜¤ÈÌäµµñæÈné  ð  ˜ÀÃX䓵2Ýò“=á/s@€þ`m@%­pØ‘Òø´kTyÀdà/¼UîKo‰‚ y€)Õ*7–3À‚X“œa˜ÃÍ@˜‚ÎÀ°gÝç4@ª¶4`@E]KM¯À¾vÍ’uï¨G[zãÉukBp‚¸€ë€Ñæ¼Á9s`!0Š7,í† D*S‰È¢DjÍhèc|ÊÞ©P[/;|—FA>õÈ`ÌlØþÈuq¨Ÿ5!6ØÀ ˆ8!¯©F^D7´@‘aùsаÎ:oó‡Í9ž3€/Ѐ«óIS¨9!`—³¤Shšµð@j1¤#iš-”]`Ä#äÚ $'ˆ¸l^Z‹ @€Y@0aѵvÀ-/5íê¨ýëF;xìc ¡;~¹–ç¡yèN eÉÊ/šv•)›¶h@Ya‹„š…°×2(b2›Ù<‚ Ò­–5rˆ}fpxpüSNŠ‚¡‰†¬( <à?oÙ.¾aßûŒ{p޽»Ùàœ“EI*…#J㤠þKè£>bÁjàEvà/@`ÌÀF¨èf!ŽÐ¥LÆo’~ Р‡+€ü‰< N¶ìÐ$Ë ζôŽþ©º\-âCÄ™ékJ@9xàÔºPZ@'ðϾÚ/âfàé¨ ÂÎá±l «+œŠ¦N`ì–¸ç" » €Ì/jdj! èZÀ!ÛÆ>>&tê {jÃ¦Ë øŒ`6pkwIál)Kv¨ €âü‰‘À®Œ€(‹àÜ/Á>2Ä"ËÁPÀ¾ @ÀÅ Öõ"jÀ„†€G4dÈÐâlÞâqÜ–̼n•MÓ„ày«fžÌ—.àorétD8`8.à ֢і$!Ÿþ¯¨÷øÍ±þÞ‘: X€F< B&bBÀ€LFQV N ÃîvĦ v® ˆ²v$)à‹.NG诨C0bX‹‡Žäzê˰îɲ¤–²„BŠÞQ]0uàS„€F®`"àåk¤CM€Ä긨RdÀj Œ>DàJxÀÚdÁ =mBZ‹$ÇCH0D` ¼Qz€‡²­fìèþ njËŒ3"è꣆@޾ 8à&¢/LÖ„\Ì…lz ˜±±NŒ²Ò ±ì­²2„q óŽa¾MÕ,“òø<Á€Z@—–Í8Q ºÌþ§PÀêÎÀP˜þ¨dRJÖ„‰%Ã| ¦©ÔO9Ì-"NjiäPÓv‰µ¤Š~¤Q.&JËÌ€úç Æ  ò(írÏ–€ÎP9 ¦ xä#@І@ –ƒZ‚‚  IR†Œ6v¢ÎPdðÊ   Î*1d<íÉzGjãÎÏÁ§Ì1F `€xJÄ$ XÀæØ4깜2#–aBB¡/Ch„†‚(e‘èaÖXëðºªjñBdÊ Ž€ü)ñÏ0$+Ürà ËëŸjËÀaØ ¡àˆÃ½ Ø”‡(²ºLvâþî§øÔYv’ÔQÒ¼r'¼ XeðŸdëZ±"ìJ$Í&Ö!’#ÁœJ  bJ®4ôÐ Ñ S¶lÆÍGYõ9’ˆ€sˆ1gUÒu†"¥Mf!‘l±Lr@ðÆAð*$wäÙØ1f¡ë&@“9úx®/UëOýbªP€L 2 Z€§vÀÛ¶`É2 ç#ð y¢¥{Ðe]gHLD`Ží9jQËÐClПpî¸ÎàüI¦0 ÓZÑ–¸ÎÕ¶5€. [‡håêܯ’ÖGÙÔ#û­Áž#`AJȨ †qþ8„dgd¦jÀÁ ´þ¦JJWUj_1„¦œ  *ÄÛÂô–È1Ú  €x€ˆöðöˆÖ,€T @;†zŠ§Þ‘c9vx€—PO)V`-Á“ÏÐMcÎÍÔ±B¨ªÕrCôÎ ‰ñdè& %Æ TaËLàa]÷oùö`o/à(ÖµPà;zêv àž£ç~ɤÀšøLZ@„:D:xñußsíª¶âÏö„`þÉ/pë!‘ n€¦¦U]÷ÐþÖn7ô–|)@@èÐö®ç–Œº$axF©†rÆð‹´tm+þ_ƒƒÄ"¹W)„ ¤`mBÆ÷ac €h{ |àpeŒë–* Ì÷n# o«¡Nàa“m`Î`)¥{:p™”D'Φ¯ò¥†UµC*{b\)σ¨H1R„ZDàð6 wOÍ b{J€èéJ•·Ì ÁtwØN < ®â* +Ì@NB«Y¤Å™$É-–§à"ªåÐà\ÙúƒÌ :aM+BÜ†ä¤ nئJayNZ7:ø €{ êÏý ƒÿ­z*Œ)ª€l†ŽfMfÀ&ÉÂ>z"YvèB‚—8þ'—ŒÀ\ÐÚ~vfù¦HMFàl ÀL33<ê6O Š}+H—OÍ €pôµþ-‘3¹ £v¢În-{ ®+¶ „á.c fÚ.2¼\ ÂÁž#’hÏÖ9ÌݼjËâ V’³0‚¾Z×d<»- (à,€¿¯,@–ÀD;F;Ç#ÀÀ¹ ,@­7#j‚£‚#0‚]JÃ)ÀèbŠCQКƒÑœÃëì^6dƒ_ÒK€0`‰-›Í-[àÍ%Àºgœ«Ûº³S㾘 · "`6¦`)Zm¬†>^¡0Î{CB`h{’«9™ç °!Yœé"¤ƒ(vÔkkÆVx—¬¡úÆþÀ7hÊÞÍK"*n bNbUòùbHÅEqA ƒA" VµÏêG h7ÚæVh>±ó-Ú€nçureNÃ)÷Âäp| ­hpT(´¬Ü0®Ý„àp @Öø|€¬€|l~ÔàÄèø¬,ÔÔxxœ.ùü|$ЀDUì@ÀDA(€àx(Å„ü,Ž…ÝdÖ„´í„œ |ÔÀil¼¼ `œœ`n÷¹øÔì”Ñ lh€ ¸ÞÄ} „€½m ÔÜx$!ù úìÔĬ A•Ž c,`DÀŽ/ì åaSŒ®p$!ÁèŽËDÛq „†)7v@çË.²åÁ&3‡©}þ/4È(ñ#†ƒè4áh³"Ó+p¬ˆ#èN¤_|„ ñáž@;F…P€/ÆŒh´ &Õ#°2|€-넽ΈÛaGFâ‚°s¢¥ŸÚ´åh…ïG«g”˜Q°Œ%<)±aƒÒàp °#C¬ðÐB‚ ìè±£XhW ‘ÑZ a°ŽÈˆ<ŠÆf;€p1dÃ((  ÞQà¡¿'xùáàˆƒéÏð‘ݰƒÎû¶¡sq +tDX°A„;Xpz–KÀFKãaþ„ eÄ` ’„@2láF M¸C0P€Ü{ÉÔ þà àÐÙ>,&kä=àábÓ  € Cp€@-D€Zµ\@A D¡P@‚ ¹ÆmfQɼ Ã(:ù [€ p .4XË{(dš à&”à€ Õ9àƒ MšiÃu>”¹O@ €.pÐA)ðj¤#éý™޳TPA2Ä U“µrݱ&¤´ñLJÁ(0g.T §¸0gLðC 0Ðy>V¦ ÅÐAž£¡8—žqxiJ¸´ ×6évæÄoÑjŽ B3Ó<3 …9fÐÛB8œ`€$°(–Ý`icMÆ´@e²v‰:(Ðôª³™ÚR[–@Öʹу¢¡p‚1ØúHq¸'@0(` L ¤ ‚ }K0A´ìpCñ,à $A¾l ƒ‹É@‚Rø C†8¸â ¯Ðò^ Br(ý•;¢°£{(läT/|àÁ¦\;tiff-4.0.3/html/images/bali.jpg0000644000212300117540000006305006747424643013235 00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀkž"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?þßo<[w,ïÛ®Ùfœ[Ý\Ý;ØÙìœÃyÐiKu$OmR i­Vh¤‰Û.î–Œw—÷6Û/&û2ÎË<ÿe†eK™&òÚæ=Ó[έnÏ ²…2ܸˆ çç¯noË—È™HÍa圸K›?&t15­¤öFÞ3hîRhî#Ba—ȶÎóš€óªFa DvÓKu’ó»Ë …mà•ÖI¯d–#ecaÌ Aõò•<:›P¦ùa?sšr’ÖNòªá(ï)5£N8Æ«çö“—«†ÀÉkRRŒn§55gF1sU#Oš•H?g'B­JJ´qtä݇=÷VŠ'k©®gݙ䷼…dAŽ™#X®â/?}ö—62.^ÝÒâM˧§ë6°Mq$ j¬°¸¶™<æd*Â1,P ›¸ ‘I4"ñìAÏüŸÁEà©ÿn¿híWà_ÀO·Ã?†¿.uøÃÆ~Ö§Ó5oø®÷Jíí|Y6ùü1ÿf§>±à_}›ÃðÜè-Ñ5oˆpøŠïÄ6~> åÿbßÛ»â/À¿ü=âOXÛhÞøã;ÿ„žœxb+mWãÄCâ Ýk·w5ÿŒ|s©j÷Þ>Xu-SGñìº7ü ðãÅï­xOV¿º†ëß‚çž9pKÇSàLDñµqXjš™žmEa£”à*`ðõq¸¬%Y×ÄRÄÕxx,} ƼéR§„ÆSÂR£,d1 GúWô^ãÏ€p¼q F_OŒ¯—OÃuጎe<·ˆt~¹*ÑÃTú“Ž'.ž •±!ŽÄS­,&36/û²¼¸Šy£¹š!]áIŒåî&Ž ‹˜72¬~\r¤%[ʘüµy<§ŽMkMBêDÞ÷·=ì²C´Ú±ÃæG*OR‰­å2MþJö¯¹¥¼Ue¶üiÿ‚O~Ó_ÿi€^=ñïÄvmcâ _|mg{u&§qw`þ—NðÝî…†4i¥YøoÂvöóÜhún›gm,SêÚ>«¬j×WZþ¡¯B?X4QÌeØE$R 0–ýë¦ÇX®¼ Îí*$%%ŽQË‹£2þ§‘fx%É2üÿ-¨f¸zXœ Ô#¸Òü â¦òŸ‚?ðP/ÚþoÙÛÞ8Õmþ*øƒâ—Ãÿ‚³Ï†¼ ž'‡ÀSxvûGñŬ«áÏi7ÃâM[SÑ-¿á`øƒÅº|gã_jv7~—Á^!ÔõoÇó¿¸K)Ïó.£…Çf8Œ¶Ž9T¯…t!B¾gƒ´c•P–"¬':¸Š¾Ó G—ÕjcU ¥]baVŸìù'Ñ_ŽsžÉø²®'+ÊðùÆ;.öY}yWÄchdXù{Ùõg†…jP¡†Ã×Âæ50Š´ªG+–'‰–8yAÿpáÈ-–‘›ríYU²òšv‚IKÛP¨ $K³ÊùÉ?m€ßõ»_xûÅ1éz½ÚÅV^ÚÅp·W¯4’ù·I3.žd\,‘A}ó#[¡š±ügûGÛü*ýîÿi_‰ÞÕ|3'†~Åñ_ƾÖ4ívÃYO[kúƒ&¶ºŽ=>Ë\¶Ö¥ Ía6:µªÛOq$Í+/ù™þÑ_~8~ÖÞ0ø‡ñ¿âLjõFñG¼Sªø£KÐtýcPÐ4o O­5Äö>ÒÙ®^GðÍÕìVzN¥©Úê«2ZérÜjɦÂÍõœ[ÇÙå¸ n*_ZÄæÎ’Ëð~Ñáf©ÍGŸˆæ£Qà EΚªœaRR”©Áº´«FŸÈxYà–yâ.e›aè*TðY,jÇŒ¨±?Wž&Ь£†ÃËzµ+º<ñmAªÚrÊjQ‡ú¡|3øåð³âÝ´òø#ÆZV±ue$pjšm¶§m5ö•y,1^Ge{3ÈažhζŒá®íî­ÕíYeoPp”ØÏÊÎ#gp7ª,6K‚üÐÙp²á°Â=ßäãø*7ÇïØæóÃ^øâÏxSâ=ç‡þë7>'žK kJ×_Gô»ã:]jÒ^ß]êÐé‘A~.a“R0Ki Ή¤YBÿÜüoþ Yðóþ ð£LðÄ=cMðGí7á¬4¿x]ÖôØuNmõ?´ü=möˆ/.%¾‚9îl—~uÅÈÓÅšGö?G„ø£Å9.7–“ÔÌ'^x| yÇÍ„Ž&­,&"–*”aíc‰¥s•ðð’•>z«’¤¾¼6|Ä™¾E…ÇjÇ'©J†.µ*i}_ øü5dª7˜Jõ§IèïFŒ±.Ôý£¥ý³PÛnI.«±3aÞ$ H QÃòá„fFÛ÷ª¹…rÌnª$€†ÞŽ‚Šº<Žf mÛUY€ŒÂïçÚ/‰­5{}E´ÝNßS6Œºª,5++¥Ò¯4ÙUo4ÙííK±jÒ2ÝYÌÐOÏÚæ-­÷#’ëÏdß$ŽñÝB±½Ì‚f·¸“}´³âK†hí ½„C‰/f(Þ ¶¯ªµÌªSœ.ùgNjp¨’»q”y•®¹Smk$Ý‘ùÍL èJtë{“ƒwM4ÚQOUö{.n]'»DÞKäs*ñTÈY –@ÕºC,ÒMú¶2mPÈùÞŽ•:ÝÛ¼‘¬o,+È 3å\1Ñ\½‚Ǽ¼1@Ê7åÇíõÿJý?àŸsx7@øÃiãßx³Çš\þ!µð¯Ã]O^¦ƒmw%•Æ»sgs§ßµ‰šÞâ ?Iðí¾¿®j7—;Ïkot¿%~ÌŸðpWì#ûYün²øðSVø‹s}´Þjž)ðg‰¼ ‘ø£Åºv¹7‡çÓì5í7ûN[+Ïi·^ÖŽµk£jZOˆM1èšÜÚ¬]\ã"¥,ljfÙ})åøŒ c(_ˆÌ«ÒÁàhÕŠ©)ª•ñxŠ”TZ¦êGÛ:WG»GƒsüT2ú¸|›0œ3l6k‹Êå3•<~$ÂUÆfu0³ÕÖ–…•Ý8^UiÒ¨©)MrŸ¾2Îfó!·4¢9Q£’TD~\3„Û÷ŠeÂZ(fž0¢XÒAy K›–T·\G4R=ËBØUX@Ø €:}šY[! 3å!¹•!•­ç{xGuª½µÇœî“»–ž8ómgsi;,²Ûoš-ø ,ö°Ë%Ì3—žFŠs?¼Î—_¸‰ –ÚO*8fYcyØÅåG À–¶±}¡$dV0¹—(`¹Žh¿q^ßÕK“ÞmÙYµ9©r¤Òz¸´î—³5ÛæµÔ|o¨I¨û?yÊN1qmN¢—,cÊ›¼£$Û›ýãWäݺ׵(VÞ'MñÇ™æY¤€MGqûÀ›f’ A€¼ˆ¬6¬–ñ 2¤±»Nñ¶ûÉ”]o ©W*lž`ò Þ¯,úφ&Òuí:ãGžiþ½ÿ‚FßüUÔ¿c}YøáOxÂú—‰ý©?f­z÷ãÇ=m| à ]OT×µ)äð§ˆ5/Š toü]øƒqüÃÆk¨Ü6‡£ü1ƒWñ€¼;mâ]ÏÀž'ðG¶ëÿ´V»ñwᵟí⿉:D_~k²pØø‚ÿ^Ò~"xzÏJÕ¥»ÔüYñfóáÜ-$²ÓôMZÛĶúÿ€kN½ñGPÖ¾Ëwq§G4sA¦øVHà"ÿlKow`–÷7°ÿ~ Ñ|5ªü.ñ'®¼_ ËâM3â>Ÿ¤ÿÂc©ÚikšMÅ”wú^¯¢øJçL»»m:ÛT´X5­Fno÷IÒö-Ôú°¯Ù_Ûþ ðOöyðM‰?¾|Lñf­áÿÙ7û[Nñ?ßi2x#á§í]¤xWÄ>=ñÿ„luÿiÚŸÅmkÆ ø¯CÕ4kžÐt*ÚÖ? èz=Ôk©Åø-ÿðö_Ãßøóƾ=‹ÃºN½†ì¾Yx·_“Yšé|¦x6ãÀ>'{H$‡M¶ÑÆ‹½µò¥žc`É÷Üaˆâ^4Î(ÿ­XÇ…°ø —‡¨¼ß0YDp9®{„úÓâ<& O2ö°¥‡ÅÅâ0•ñ2ÂÏK X|ú¼>¿ùwØŠ„Í05‚†kOœæøéái˘c0y&+0£—e¸™Â8,F ØUJ´«ÕTœ*ã±U(`3Ol|óû}øÇÄ¿<ñsÂ#ø/Y·ðMÕÄZv§íÀÖ­®µû;kå½¾ò¥ðܶ>t²\É*j¾ œéw–COKMSÛ¾jß~üðçÅÿjK |P—ÁŠ£^ÑeñEãÏáëÕÓoO´·Õl ]]A¹ ÞF·Ê¤+ZÚÄîÿr迲GÂOÚ[ãW‚þ üPÔ¾$|ý™uuŸÇ¾/—Å? |;áoÜø_Ã^!×®Z&ñ5­ßŒ´]Bá­cÕî$ñE§‰|5y ªée¾‘usgq¦~dø×㟃ü#ãÏxGÚÔÚ¦ CÃÚ}Ä6––—ú¥¾—¹áZ½Ó®oZâÚÖ}P´¸ÛªZµÌÖ:‚Ë0Ô™nd›zÚòà̵b3&q?ã#áÉqfO‚Ê¥B²«y¦q–`g–ãqÙe<}*8Z”±l=,º†"—Ö)ãi¼ewI,Ezÿ­ø'gí±ñ'áoÇ/‚<ø»ñ#ÄÞ!ðÆ¥ø+ãV±ñ ÄöÇÃÉ{¨èš_…4ˆ×ºŽ³«Xi6wþ»ðÏ‚Ý5y¤Ö›Àz7‰þ×ssòéšgõ¿ûF|i¶øû?|uý ¯ôYüMaðKà÷ÄoŠóxMš;ñ ?<#­xªçI:“y ŒÚŒ:+XGx¶ó½Ì>l­Ì2ÿžwŽ~$|/¿ý|%ão6ßÁþ1ðæ•áO xRgKÕ5«+I¼Y®|Dñ“£]êRiÚ߃®nuOAÿ 6-k6:æ‚Ú^¡$Ò Þ—yk}sú/Ñ»7ϱy/eY•j®¾6Åf™5LT¥S5Ž•U¥MVs•z4ñO ŠªÔgÍŒÌ1N¤f«Æ¥_È>•Y' Ë9àÎ&É0ÃQxyäCk¼v¶Ð¬@ ­Ä]G ÃÄùÀynLáMÄI>cT‚Oç_á¯ü‹ÂšGÁÿ‚IãöÒ®<]¬ü.øy¬êÚÚ}¦Æ_êúV“9×-tíVãLÕ4« ûÍFÒ[­2î;…Òlõ1guwoqy7—£ûJÁzþ|ýžn>"hºM§~2øÖ×PÐþü=Yt­'ûWW¶Ó`–ïWñeò_AŸàýÚ{{ÝF÷C’}Aïͯö]»j×ñ[¿÷fOˆË3¬» aóŒ ‰Áaó*²Î#‰Ë^.Y©bñ´±ø|=l<ðò›Xš¥F½7Ò…*µêªqþÇdYÞ1ÆaÖ^½<[ÂÅà«añpxˆÊ­ÑsÃb*ДªB¥Ò«†­,$ªÖ”áyÓ¥ˆ´ÿ´Oí;ð+öYðÿ¾>üCÐþøVßuœ—ºåÌfÿ\ÔL¦í´I™ÚþÿXy^ót:dr‘´·í*A 7ñ«ÿ ÿ‚ß~Ùÿhß¾;jñk\ø<þ=ðF§¡jz|3uááý‡¦iÚN·d¿Ú–ë¾ ï5D>ÆîòÞʘÚaæmþâ6wOˆ‡s£•e8:j†+޳ü=<672œfOõ_ ŽÃûl¯-öܸjyŒêÒÎñ1 íˆË0˜üNGWö\§ÃîÉð´p¼[WšqVgz<3“Î3¥ANwý»˜áçR3”áV¬pPU £ˆ„«†ƒÇÇá…Ÿ4m'OÓ<+Ò%ÅΉoi#ÚÇ=•É¿··µKƒÌ×WÐ>i+KåÇ5̃H‘¥Š™~·ø¯&ІÓÅ1ø†ãC:¥¾¿á CVbjRAqg¬é),°ëvDš•üÚuÌúm•Þ¥a£|!Òîg™Åï€Ý~ÍõصÏAð÷^KÝ_HÕ¬ï,4û›Í>âò_°­Õ¦£>ž7¥•ý²ÝtmElí–Í Ž8îHí|û2|B¶øw®j¾0Ýcck¥FÃÁoqk5Õ®®·cÄÚ}ž‘w7ÛSH–uŽ;›22÷ºˆòŒ^þ?žÇ€cV¾e#Áέ\U=l& V&XŒ]X/d°Ð¨åMó5VTëÁQö‘•YÔÃÆ*ÿ}Á¼kpÂäPà¼ÒŽ †§ŒÄfXì°²ê88Tú¶*XÊpK^p…XÁQRÌcFt¥C‹T*Lý-ÿ‚wé_ï-ø'Åö/…~%½Ú&i­Ùhºü!žÒ5-6[.MïL›@EÒ.´Èí­¬Åºè¦òÎ÷G'SÒe{/ÍÙ‡àç‰,&ñ¼×š¦©ºÒ%–æËQ»‚Õt;!¨ZK©És©Ú=†§¨Å—Fû%ÔR~K[2Âÿoæ4°ÜA‰ÂÇ *øª•¥[:ùt2Ú5(TͪÂ9?a ð•¨FéJnU!‰ÄsS”©ÿNeXZô8G(†;†)c±ui×Âá²ú0Íg³|m)ÔËê¹T ©ýz¾3FºRö7_ìÔ«Rœ%Sö[àÿü¿ðkáî‹û.xcàÄ3û>|$ø]áŸü.øß ô÷ö³/…<¢i6—ƒá†­áMKþ †ÒÎ; äø—YÖåÒì´Áuáÿ´jFÊ×àø*Ÿü#á¯íà‚3¼š„þ+m_—K¾ÑäÐuË{ÿ^ßXÇo¥xŽ)lmµK›mDÜHþ¿â¾ñ ÖÑ_B÷p\þm|Rñðºéþ!Ó¬¡¹¼·¶{[[iã–äèÖZ\jW7ö°nk9ôû=BÍ™/㵺i’æ)Hû9Š?‹ÂüC¬ø‚Â94»7Õì4Ÿù³é“Ä—–2éñM©E6«ÃéP[Ç%Æ”º­½Å”:¥ãO$çQņ›cú}o¿¶rl41Ü9(ð«R¯J8(,Dq50¸šq–*8ŠXh*UhWu1r¯Uœ±q2HOÛÌü ‡ƒ•ò¾!Åárn1¥‡âïi•©æ•Ñ¥S†©V‚§„†7ØU£ZŒ.…)NU'u ²u§^Tªö?²7ô]âÛê6cM6å4v¶²·Hg½½ðú£¤RI3>õ,5OíúKàím.‰<-àò­Ïéφþ0|ðïŠu¯ i:"ÃáJÿEÒl´/ ü/¶Ó4Ï#Vµº:‹^Ç—•®sP½¸Õ-®ã{=:8gó%ó"–ôÜ~.ü5øZ|š¹×®oçÔbÔVßCÕtûƒ¦U·šs=Äs`´bñ\›;ˆn iÒMk­µµÓöŸ¼_âíÃSü>ñ׊tÝÁÛhðE«´·ñoˆ4ûÔ‘,tÓ.‹¡3¬m"Ôìã1H‰Òï´ë‹_µ~S‚Ê3 ö¬ðÜEL,*åT§*³Åb§‡¥F­…¥F›ž3R„±0§þÏ Ò©í(rÆ*béþ™“æS•ðé˜äÊž?ïIâ)C–`+f3ÄJ•,Ljž"†.£)QUCZ8ì ^*iâpÇÐðS/Û#Á>#Éð‚ÀM­MàO X|7—Ä,º“Éáý[Â~°²ÓÅ«ØKµþ“áÿ6§o«{©Ž8åuò,à‚ý™¿i !<ß5íDøQ¼BÚoö¶³y ·–lm®î}N)dyfŠ/³Û §¿V&k$2$“ÜÙGwòÞ§ðXÐ|¶6sÙØj:µ¨¹%ޝyy}²{€Ó\êvúLº5­ÕµÄ0\E%„8´ÒZc§½EãHõ-;XÕ4M%/uÝWÅw¾"¿Ó–› Ç¯\ùÖþÓã¸kdH¼1â+K­?L´ˆ ¯ÛR})&³–ÂÃBo³ÏÿÕ|ûSê4põèÒ­Ns©__ ËŠÁÖa± ›Ââ°óX˜^¼éGÙѶTܪ{jŠœ!á'ÆÜÄ‘ÄfÕãF¾&œ§VŽ/ÃâòêÔqµ±9|¦Œ!V†"¥,,°°ç›Œ(×þÓ¥G„ÃsWú'ö»ý­êºnG‰xŠŸø¿áï†< á_„ž5Òüsá?Šº7Å߇sk¾#дۉ`ñÂÿxg[»ðÖ»àڵܺ–•ân,-¼M¡H‹oa®x3_ðÆ­§Êc¾¹³Ó½À7zF¡á¸õ-OE³Ô¬4B×–­‰®/šÂ+H–òæHæ–)çEû-„°ùòR3 ϰ:ý}âO |!ðΟg¨Ú&“2x²é¯b–6‘ßYY%µüª.#Ó zdèØ´º˜Ã§\ÜÇu#jV÷¶wémòFŸà©|ªkš_Ùmn-|#â©^òÕ´ÝBi¼Ik¨Çsªøb Í2ò IltkÍ$éfho´ëa0™b¸÷ Ðàóqî­ZXê¾:øâD“PԯƖšÄ—Z†›áó«Y“s$—wö“ÛèÉkkv.éþÃ{=í­¤M$ööð-‡ˆü[øk¦ø_^ñ6§êßèW°N-¬¦´Óo °´ÓoÌd‘ZÕþÌòÜÛ™¡/}x« à´Õçòdýtýƒ¿f=cVøs¢üDÒRØÏ-½Îo5Ì“G¥6¨t«ë5ÓÓV²’Ñ–æÓWH®`w6Msý¥snæé¡¹ûŠÙ «Jl=Z´¨àæêUÄP”ÕZxì4±¸w*•c©cjGÚR§*“÷¾¯W\²ø\—ˆ3,ç>̱y”<5LFK „©R…W/ÌVÂ8j2’”hSÂâ%ìé*”éÂ…J^Î4%…üùo…ë|ŸµíSAð´ÂÂòMNÇL±¾³¹ðü3^-À¶ÓÃ2éõ¦‹JÑo%g´Ò¢mGûVÊ[ ­×ö‡Uÿ‚§ü:ðÏ‚üð‹Ãvž*Ð|=àí3Om5ã×¼1 Ï¾ 7µÔtËÈ®'û ¥Þ›¨Ü\Cs¥ÛÝÈö÷nè!‘nT~a~Ô°ê? >/7_Ò­^ i1D,îmÖ?jq¤w:GöË{Éí…΢óZÙÛé‹¢;Ü.Þ x|ÛDç|5ãOü}¼›Â?~ /XÛMâ_Zhú…,4g°Òo?áÒntÉuk±,Šöz†šú€‡MÓ„š¤×“H÷ñ›I òø‹…pXüŸ‡³\fx̾µ<ÃUâq?Ù¸ ¿—bý½\-Lêòè’ÜxëHvÑWL²¼ü7Šü ÆÏ°œñ5ò©RÂáÛÌ+Õ§‹tÒ¯|LÔiVö˜JÐÃb2ú¸xé¿~è I<¬þÌZN‰à†¸Ðu_ØèÖžø³ñŸà÷í'àq-~iÖ“|Ö^ßÄ~´¹šßVÔ#ð?Á»ë¿|Gñ›¥ê÷·SÜxIVãW°‡R»ŽÚôY³ÜµýÝ–l÷rGö»­FÐÆÙcW’Þæò÷ÅßÖÒxlxÃá ‡Â^#Óaì7O{yôÝ`ÞXÛEv÷«}as i5­Ä `Ãd—6w2Ê“-–œ·Ÿx¿Wñv¡âÍ_Âøúÿ⎭¯ëº-¾ñ á~«â™ü9­^-®©ª]i]Šü¢x·U¹›S¹Ò4™u-;QÓìtKýV»¹_iú†—sÐ^ø¹âÿéoàûÏiúž½§=Þ™ w:PÕ£Ž}U¿‚úÄøˆê:u”·ime§Ûé1ÝÙZIª}®i5ÆÑî-´»]_ôÜ7…YòœòÎ9O ™>&Yl2þYS©ЫBXjΕZX©Uö÷è^¼¥þkKÇîãJ¹î'ˆ2LvM€ M &{‚©8æTshÞXL^–Æxºì,±\|§†æÃûhMVTppU«ôø]‹<)g>?üXøy«­Õ¥­§‚<ð‹öÖ,¡’bööú‡‰¼AûNþÏSiöó[¬Ö1tYô§M\{Ûûµ7]¤^|ø=ý“uñƒÆÞ Ô~"\êVörx+Rð7ÆO|NðP´²¾ÔâñŒ×ÄÞ¸øG©xSQVº}ާðçã¿Ä _R½¾³žÛ@“I»ºÖ´¿0øsñ#LÖ~*]&¿syg¨Þ\F·Úžæ—amsd¶wnÈÍ$¶ºŒ.ïmra–â5{H®ììîbºÍ÷qñSà…¿ÄíWK“Vñ+ÜZiÚdVšm§›.£u§éÒÎú©3´—Ç ÅµÌ’Ã›Îµ´¸¶‘ ªûÛèóªÙ5CÈø— ·ˆÀa¹1y%*8:tñ5èCŒŽ® ÏZ­ ¸{æ…͆;¦9ʪùþÊ8¶X:\EÀ¼_ŒÏö¦fÿ²¸Ò®',Ë €ÅW˰³ÄÐÌkF T¡?m ùmÖ¥ˆ”jÂx\”høÿí;ñJò÷R±Ô|/«Úji׫›a ^ivö·ð®žï#Ú:Øùš„ÖQ[¬VÓÝK2ÆÖÈÒ :êà|¹ñoâ.‹q¬øjñôk-BÛZ×>ÔÑÊnZ GQÔ®›U¶·Ô,õK"⿺¸g•ç¶` Ñ>š×~ ëÞ𵾇¥_i²Ko¨ÛÁª_ÛjJ÷¶:eæ©ZÞëO{­5Ä6GO±ÑtÓ§hQÙøzÃOKëWGføÏ\Ól‰5k$gÔ%»ºYRú+‹»û«‹h K„d»½[™ÅÅÝÅÊ@ˆßlHôèå‹ì—_oÃ8þÎËðxªçT°¸7VxŒN 🵒£N¬wB”aF¿,iT§5R§4©:3öŸ“qöcâ%ךcjf\+,}zXZv0ÆûeV2u*ÑqÃËZ½Z˜(×zQs§:T#5Hb(¥Ôéÿõ‰~Ó&¾ÆîamsöSok‰îÙ [™¢K›!l#¸–î×uÝ«ÜKwg³²·^NjÚØï­å¸mJ݆ëЗ3Mmkh–«q>ÆM °d´‚<3Å,É%¬rF"ºä¯´½NÎêöÚòÊê ›æò)â+q˜™®Ží [îŠe¶¡$¨q«Æqõ+"7É Ä*'åü²’Ldfu_%þÎŽW€¢¥W†ÃÁÕq›Tù=“'*åŠNšN.÷+|Îò”=ÓòŠœSWœpyæaŽThB¥5)Ó© S­î§=YFtêʤ%î¸Ôs„}š’§ Cöçí÷ìá¹µ¿‡*ÓnµI­®üX|agi6“©ßÃÃ[­Sâ~ªë~¶°hæ ºÄVðÏ{¨Lú<Ÿj–Íe¶·Šý¼|usãOÚ›Çþ)ð¼ÐÇŽ ñ…¼E¥ÉmmÓIÒt—/;Ù#ÊöW:-”“Áw©íçh<í:KÈoãÒ5~|Kð¶‡û-|"´óu ë·_lä@Ó¯®ÅÜ~—JC©\Ë®Á¦ÛK¥hÞ0E$ú]új·þ!š)ôÕDŽæÃâ«ícRѼ!­ëZ¦‰mcâV¾o M£.wr“^jºNŸ«‰§¹¶ŸWŠ=NßSÓnn,î®&Ò%´¸H—MVØú~ÁåµøŒ+æ8 -\ÏQC%N£,-|Û2ÂÐÄÕÁâ±UOhð9n‰£Y*7•z8KʦVýo1ÍáS’Rž6³Ë0t!Š­J®½u}W7ê”ù~§˜â3BxºvRÄN)IÖŒhÓðÿ…7ž#ñŠím£¾Ôoïmíæ:e©˜\y—N«—¥ì½²ÌÓµâIæ¤I´ùÈ„ûG‰|Q®ÞxÊ{ XePñ9ÑÒëM lÆ]wDÓìLÿ¢ ¸ï®5U/ ÜÜÉ ÷ñæúóR"(¬4k?žþøÇQøuãir(¸Ð%{ˆ¦†(ÖIÞ(XÇe&æ{Ty¤o³Ë;Ûja HæNÒôÀoÞx»ö˜ðOŠuK«'UƒR¸°€ÝÞßj³Y<÷S^X”Ó…õÍÜú„ÇTEš+{ëÉRÚÂkë}ñ4:©b+UXl6‚£íiT„b•9Õ©S‘F%ì¦è*S‹Ÿ4hÖIV©íhÉE_à2L^Ã-Áâ*ã±9–7‰ÂâêÃ5ˆž¾½,=^j´jPž¥\?5G )óVÃâ$©Âœ>¯ÑeßÍâÏZøÒ Íq¥ÚÞC¨\ͨ[d_ÄV«téyäÇg­¢µâ]]$÷12ÉZ]ÚÇnš„Ÿ¤?ðJmUÔþø×ᯇ¯íuX´ÏˆIâ8–Æ+8o´)|Iám7í—‘Áy|‹ý”¶‘Û@·­¨}žòYµ[kk-Zä~”x;LÔ>'ü<ø¥gã„’éZ½Ôø»Z’ÜiQ'‡Yü3§0ÓgÔ̰ÌðZ\\]Í}ªÅd–·–'S´·…ä½I¿$ÿà‘z¥Ïí!ûIjº§càÝQÒ¼?¢M%®§t—Z~±âoG êšt œjGðì6¶«ýœ—3Þà_Z‚Úóìxo0ÆgôüC§ÑÂBy7 åú§ÕpØœ,F75£ˆËªáªNާ²¥ÂΛ©.xrÎqS§?¶ÆÇ‚¯ÃÏQÒ£›¼Û S)×Óˆx;èú¿ŽïuŸxŸân~ _O ¾¹¡èí&¿á[O F&¸º½Ò´ ZÆÓÃñkZ‡ìì5ð¿ÃŸ>xÄ? þ.j?¼Eyàhµ_'…Àgá7„>/´:õ•Þµ/ÁKŸÞø+Å1èºÆ·­Câ˜%𢶣§ÜkÚ#Þ[Au¤ó°~Êvö¶ºŽâwÒ­µO‰–ð‡Xêº…Ž«ýŸ xþê>/ì°Ðô–¸Jû,b-_YÓ!¿ÕàñC¥æ–n¯µìÛnëþ £âø?f?ŽŸgMTiž!Ö|â]_Pµñ=펫ÍÆŸ‘è¿mðÞ‡>~tæµKm#Åiía­Xj¾#¸Ñõ+ «Í þtþaú@ÓÎð¼)ŒÅp†s˜QÌ8k4¡žÕ£“×öÙvg‚ÇÓÁ¬ß UW­G ¥–guêaêQÆQÄZj’ú¼2¬sKôÏrü–§a2~-Âe9†‰òYåXf2xârÌn[KWõ:øO¬âá†Í2èV„*Ç0§W¡F¬±´£B§ö9ðö2Ѽwâ½CÇ´‡¼3ãïjzåæ¡áx®gø¿ð»àêßøz=úOG­|)øq x×Ä—þ"°Ó|mªxÛYð6¨[BíðÿJÒîá½Ö|yâ¥jÝÀ>øâ‡þ ž7á.«¦ø‡Go…k0è¾ °‡T¹¿´†ÏDðî«à7Ód²»³Ö_D»ð宵okª]êzuÊÃ`Öú}­¯›þÉšÖâoèCWоè¾:Ôn`gÖ¬¼o®xÎßÃåõKTðÆ¡ Î~ø-D¨‰§Ýëú¼¾²—@·}N&ñ±ªµø(ÏÄOh^Ñ4¯‰šU¿ˆ"7édÖ#Tñ¤¾X5ËÍ}.üQ,¾$ñ-æ‘u§ÛÜD<o­µ–ªmïá»Ó¡[-gDþÆq†sŸàsLvaÌñÝ|Î7SŸâe*yb¨åŒ£^Ÿ±Ua…˲ՉUy噫ŒªU̱øêsÅÓý¯”2þ*Ér5)C(§‡«^Ó¼Qt¯ëZ‹}¨iVòø‹Â:pÓ´)µëÓ®‹<óÙ^¼ú¦©iÐêš– §{×įŠ>Ñÿo?‡ŸÀºv§ ks‡º„¢‡Mð¾âëXx¶ÉuÇ¿Ò5;è´}Z/M¥èAu$Cvêþ ŽËH¸°þ̳òß¿ þ(h?¼uá¿øœxØê'½ñ ”º5é›á­ý¯Ä´øÃKñ'€c½¾¹Ò¬µõ̺ý­ÎгÄtyešïT†=Eî¿Ñ °ùneÜ;†Ï0J›Âpnµ\ßæU±Ì¯õ|áÖ<êâ~´ób¨â§¥ 1¯ŠÁO„ü'p™†OżS,ê`åŒâüm*x|6 ƒŸ°«õlN¥(ÔÀû(â+Q‹ž –t°ø|-Z­1¯Bœ¼Óàv‹áýG准¹Õ|7{~!ð«ÜÞéÐë[i—ú•ÒDn¦?dcs †›uk<÷ ¨Ùê¥ËÁ-´…ö£Zíº:¬ÿ á)eœSbóLã.†#.ž_G ˜W§J«Ê¥˜`ëÖÃUÆûj”½Œ±8‡Wý¢âS¥:³© q­*Ž/‘ýJž3¯G†®êàháëQÂãçGIO‚žtñS«BŽ…Z½yЧ5]Êœxs/nÔ¼yg«Û^A­Z\éZ…êNº|¶¶ì!›2^içP¹·’ò]B-ödž6Ód»žÝfÔGþКÒÕgùÓá ¯xË[×ï-³jú¼p_hòÙ-–£©Ks›mekuuæˆXuIlÑKØÏßf’í{ Á§^k¶f«7¶~m´“ê7z¥Ü$BïXœ}”Ú5ý½„³Ûˤ¥¼BÝRîÎK¹¾Çsš¼.·á‡ÚEØðüt×3Ëi#\Ë}·Ãº‹Úµà[Yïç›L¿Ó,“Ms,º~ë=BÊÃLMRÊgÔ4»Ö¼ùìë€(ðî[˜áøgùs5J.½ITž†U*Pt!T+Ö¡:»ö”牞-VŸ+ÄòÓ¨þÄÔóŒï'Çq7&24q …ÆyóòJ§·¨ñ)ýa(R¦©Ó­ŠK 8áç…TçRr—†ø‹àÆ“âOêº|“KimykªÙý¦ <Èm[J²Ž;[éôØ®â–àÚë~1µŠK}1uŒ¼·m¥ôƒ³ùŸ¨Y=²$‰/›dîÖÑÜÇ Â¤ë o‘à33+Ú¬®Ék™b’hâŠIíà¸Gô+ûø+Ãþ)ý›¿à¤¿¶Ä»sy¦~Ë4Íáƒ[gOÑtߎߴ7ˆGÃï†÷h^wžî85íWU}f)u;I4ëxaÖìâKø,¦Óÿ¼¦Â[u¥xjêHâ±MJÖêûR ÀØéK5µÍÕÀŽ9f{+KI¯dœÁ ’ÂÖñ³¯ÊRO°Ãpî#„òœƒ•ZÙÎ')˳,×í[¥€§˜á£ŠËðôa':ÔðS£*’U#)º°Uî£Z¯å\u‰ÉøŸ3‹Ë+að°­W4X‘£NÅJ¶7 è¬EE8ØÇêÖ®¥ˆ£R­:J4RTþ?ÐïˆZ|ü<ý’¾øM¿×þ#x—À¶ºßö6‡ [PñÅ T/‡l&€ÚÜ\ÝO}­àïhSZ\½Ååí½Ü9ÓmtØìõí_ø*WÃ/~Í´Ž‰û=XÍáßxövøqð¯à†›­h7SË¥ø›â‡|+kñ?ã]íÂ]Þ]_™¢ý þ0|QθŠÚñ,,Æ’²[\išŽß³ÿà˜ÿ µÚÏþ gðºûÃúPƒÀß®t¯ˆž"Õ|Q-Æ£¤øGŸíÑ/â{ (uk]MtƱɦM¤Ýh~¡ ѾŽ/Zþ1~Ò¯¾8üoøÙñ:ëUHì¼mñwâWŒt]2Ùá¸û(ñ—Œ5 zK©¥p Ýí„ ©Í4’ݼv¶Vw¢ xà‹×­†þÎàü·í#:yæqŽÍ±têóWœðx/k–啱©„“ÄWÌ9)û9óa°Ô«Öq®ÕZžf;ù†;C‹†-⡟Ù}W F8L%9GšÄEÒ©>zsÂצœÔë*xxsÒŒ¥/ñn‰g¦kz¥¦™s%õŽ›´"y• •¥Ñ5ÍÂE÷hŒŽÓ+G%º´—1<‘DרŸðNkOÚCÂ:ÿ/gÓô-â[ˆïüÛh-­g¶Ó¯%–îò{ÉbˆÚé–[îÌ^l1¤Ëk<×$1ÁwðÕÔw6“¾ZU¸·– ®’]’¯ˆ,Ìà¨2b@F$‡Ë#ÛÈÍ5Ïôÿ¼ý›¼5Â_|Tñrø~mwÄZÆ›¢x;]Ó¿´àÔl¬tæû3Ú8Ô¢íúÖ‘=Õ•ÄâÚÿO·–é¾Íq¦-õצ CŸ0ÄT• XYÅb!û©}ead°Ò©UFq¥Í‰t«JvåpSNQ_½\<;€žiÄuq¸L¨,±XŠ˜^f¡:¸ºÕpØJ8yÒŒ&¥RqöoÙÊŠ¡RT!)Cêý<øßñÎïÁÿÿjŸ‰ß üm,Þ%½Öž]P»Óm¿±ôÍ?Âú}¶•`·æ÷ì²&«YEq¨†šûQ¿Š)ã6™¹¶Ò!ðÿø"ǃî¼ðÿ[ÕšÆþÖûã?еKý_$Žû@ð½¦èZL7)q5¼n²»½ñ¨Ó®‰5 N9/tÙ4›k·¸ù·ö¼ý¡5o‡³—쟣hÚ_…$üxø“á½b×_ƒÄžñÞ¥¦ÝØÛ:]鯨XëcH¼-¦›h–±Þµ¬ c aµR»º†[›«Ø4ö“÷ãöFý¨?f­sÀšm§Œü%6ñ &9µMáëÍJ[m “§Auoe¦ y,ÒæÛì1IßúX‚9f¶FÎ?m-'ÂVÚΣ?Û¼`É¥ê:WÄqÓâÌLrÜ›òÜ¿"Œ18~!Áâ3 >[[3ÇC‚Í2Ü+‹_¡RXHc:jO?~­l,«¥8Ãñ<§ _˜Õ¤ñ9¾?x Æuñ˜\–biªõ°†Ôju¿yW˜ÓtèUÃBU(ÿ5´n§¤üwÖ¼}á߇Z›ßÅð»Âú׊t߇«ªh s©iöÚ^»k®¥ìÞ ¸¶ÿ„ªÏÁzo‚í¥»ÐÕ5OS“GJÃ%¶¥wñÿÀ½wÅ:¿„tßXÙx‰õû_‰­µ¯ j–7ÚN£¨ëš—‰/.ü/¤xWL{]=4Û­vm;CðÕ¦›6- ý½æ‰xú\ÚFÇo‡1ðô¾¹K "›ëÏéZ¨ú†šÖ^"ñ&«¨ÃâÛh7kÔ¡×|E  sG‡Y{‰ç2,Räkö7w×5÷€þøcFñ¯àß]ø“ÁWÞ0×ÛÃZƳ¦iøîoÞkº¯‹,uI-tK'´OÂ'áÛ ÝaôK‹[Ïìë´Ó ´ƒR¶Ó"þ|ñʦ†rŒ> _ŒŽ#7«W‚SS­—ÃE¬ÊT+áe‹UÖ7‹Äó²ÇckÑZXiIHý2¬Gq¾u›ã~¹‚§€È)Ò¥™û8ÓÁׯ™b',^#J¤°Õpx :4ªÆeW Nx¸ÔËêâŸ/î7ì¡ñö üG®Kñãׇ~jÞ7º—äñN…`º-õîŸzŧŒ…á¡ßøCGúâ¯Áÿ¿e¯꿳§‡ü,žK}Xt LtÍóÃñiw6–_ðŠG¨ 6ÎÖ;èomm¿á°¬‘êVÖzÄú„/owø+â_ø>"ßx·ÅðwŠ~ .›âKoÂÓÔ¬üMã íõ}vOë¾³â›MVKÍwOñf¥>¨gk{}JÖþKëž"Ý·‡…œ\'©™a3fe‘cøWÛ`ñ .K>øúûâO|7w’ꈚ5ÄPÙßéï§i2k—¾µ¾°Òtky¬¼4ÐEp¡ymmuCXþÞÒDWˆú·‹¶ ¸ÉÕO[ê5ñc‡Áa°µ?N¿do:'íã«?ã~·ÖtI.ü#á- HUÒt•¾€i‰â]Bëí‚ëˆ.&fºÑ –ò#©E Ì×I¦hše‹yí‹ÿôñ·ìÓw¬A¤ë·!ðÆª»iº®¨Ñ‹½^Âö·Z…ÍúÏpÖ:L÷çRG唕ÏÙo¤¶»»“SÕ­Gû<ø‡^ð,žÖ´\xwOÒÿ¶á ±K›¸t‹»;¿^Io{“qö<W:N±§Àúµµ„K«jww7—zf¨ÃXÔaý€øññ“Cø—ð:THí/ï¼7ö9ôûk}:ÞëRñN¯té¬éÚžŸ,3ÄöÇWXµ»;¶Ó%MråçñΣ4†æëOþÈÄÎŽK =Z^ʦL«G(Í0Thû:xlv W‹æÁªucTñÉûhaun”[¥AA3áéfº•°ŽÜ=J¸øN¼'QN`«R—×'Nƒ’x\E=+AB¯%'R^&_ÏL:ÝŽ‘ØÌ¶–3ßÛhú†±¨“§Üê0és[­5b¾Ó£»ÔSPÑžóP¼ÕaÒo,o`¸¾‹Ãðim–ް-ˆO«ø†ûOÐ4íVúcâKÈ­5mZ÷TmÏíÚ´F@jm3ǬúÞ«®´ÜJMý¿öM'P¼²\OËycâK Íeo쵋 Eé³j­}kw©iZŒ6Ñj6ïew6‹¨ÜÝ‹hïô‹cQ†æ- ‹Ušx?RÿdoÙšËÀþ“ãÇÓÄ:ï‰,õ“¡XÍnÆÖúÃÄ73ÂöV×vqèúåÕ¶­w¢Ý[iÍ ÚÜM¥Ú)K{kŠâ§SCÚPukK bqt§[ ±#F¹ªU%5 _WŽ)R •Ô¡ }b§5GUàt¨f˜eN4¹p~Ç0““ä¯,CQ§„¥Z(Ê2ÆòB®"oÚZÁÅÆui¨+®|#û/Á(t€~ ñ—Þ2ý¬?iÛˆÿç´ò,,8j8°ñ½eᨼ#¥yVò‹ûø/íÜÜÙjòI$«y¶Äê¶Óhº¬öÑEq©hö±é÷I¦Ë¬'Ǿ.^|Søß¢é¿oƒVÒ|+ý­¤x2;›ù®Æ™¡ªÝj2Ć'– ÞLBÍ ¸IqÀ·ØÎ-õkOÒ‡zÿ‚?gŸú…ïƒ|Egiñ=ôÝKÅ6š…´ÍpͧK¤Þëv³¢M.Ÿá¶6š\ež¥¨é×w×Z2ëvsÚëwpɦýÕÁâóœê®&¶!føoì¼& S¥*ó©_ …ÃÐÄR’œ—±Ž^ð²ÂS8Â0EQ¥iTð²ÊYÆçXìrËðØš˜,—ðËãƒ?a¯ßðQ?x ßèÿ¾,x/Áÿ³ý¾µ¦\Ç«h60øê{§Ô4 &å´ùu7JøkÄ­GP‹W½NÔô¯ Àug–C¯á%×Õ¶Ôî.¬Õ–ÆØ.ëHÖi­4‰.­®ÕþÛ»éœi·k§²¼ów^i÷6z…¬úsÜiÇéZ÷Ç cÄz|^ñ5Å“YørxÞ [¸ Ÿ[¿ø‘ñÄv­â SÄ:áÓ¡ÕõÉôÂÖúUœ·’x{E62jÚré¾+ñWŠ'ÖìéW·^"ðÝìÚWö¾›­Xi–V6òjÚQjZ\kß [{[Aomv/Zàlµ³žÂ-NÛQº¹Óoæ¿}¾_b~µœÏ‡0ÐÅP— åô²õzÔñ´3l^…þÚÅJ¼åõ|>¦2¼èá!KÛ>L6‡ï+â1¸“ &]<ó–ã±èãòÜl*ʽL?±Ácò*Ôó*ô(bf”¨V›ª¨óbdÚSZØœG=Zt#SŒøAð7Ä_~,iž½»K(“Z·ÓÛRÔ.ÍÕ¤vÎMq­l…Ì÷3Ígc¦Z¾¡:iÒ]½­•ÉY¤x®àžOè7à®—ð÷àýþ¢øÊÏY— íTö×6zn—â=gÅzÐK Fàèš–¬/i5+»Ë´Õ#Óµb·u„í¨hVV¡ÿ0þx#N¿ŽãÆz]Ô÷š´°Ok{‘kÆgu¡_ l4{=> ^ËR»D÷‹o¹Ñ¥Ó5$‚ÚÆïõ-+Q·õ]‰_µ®»¥~ÌŸ³Þ•w>•§¤º_Œ§°Ôb»Ðô iÍýõåþ§«E¢éÞ·]>â;ë¾},:L–7o«>™‚®O-¯…ÄgÙ¹(ЫÇÙÅl+Ãa¸;[_ØÊ¾>x•Yâ+áêb©apR£ y†%§‡©ˆ©O.­g,Á<†…(QPÌsœd\hàia$±9®a:¸ªx|,prÃÉâhaiV¡:õ}‡Õ¢§*ѧõ‡ŠgÆ+msöºøùâŸüðÊGð×ÂV6>ðmýËjzœKªIs캠ˆÍowÝõÔ—:­³¥å¥°HßR±‘,ïÖÇ÷öKÿ‚A\þÒ>ø_ᯉ6ºÖ« èÚV§£x­¦mWE³¶ÓõIäÕ/ÄivIp²Ë 7V¨/EÅŽ–“^$wýÎý‚ÿàÿ³Ã…zo€í<¦>©¦i4×3XÙ^Ewâ›h£šëTñóÌÖ÷qÁâjz‹iZl©ö˜¥Ž]"ÖM3ì2ŸÙøKKð†šú6‰¦[é’Ö²Óôñ¹È¶¼ù†+[™%º6’8Žâiãž{i$O2Õ¶ûø‘‘ñÏe¹îI†ÅÒ˲ü ð¯†|_ €´¹øªÉ¬xÃǥܵŸŸ¡Ùø÷ÆÚ–±â#@¾—LÒåo x~ÿAðÙ¸´ˆÅ¡¿Ú5ºûÿI¶ß4WY?èö÷v2ZÌÆXÇ=¥ì@5”û&š'e•§òç”§ü¶ò¤dÚ†ÎT+û#Õ<‹ÈNbxßË·–±^¤ÖÍoÛÖ5‚8.áÿJF"Õ&šÎ±ÄöK˜lY­¢… ¹†mBÙ¦&Y剡ŽÞñškhn-&‚à¹T:ü~tÓI:Åìýr*iN¬©*q—$Z§J5¤é¨ªj¢n1p‚qÃ¥í¡/i[šµ;Càªãq8iKhÝ©Qj¥ªEJÒ†iìðñt½¥Þ*£‹ŒkaiÆ´*ÂGù›|<ødßSLþÊO&ƒà½^ÒÏJoéºäº†µOie&›§é1i:Ž™¥N-.ÖæG±{;ýwE°Òõº{TŽõ~½ð¿ìñÃ\øÝaà\øCDÔ"Õ4 ëÚôv7Ï£Â?â6 ‰|;©iZ–¨YxSÕí+_|$Oé×_ü-ñ0²x_Ú<—>:‹KŸIƒÄz„º•¦K©^[Ø!¶‹P{«Kg¸»¹‚Ú;›Ë©¦ë¿esT“ö¯ýµô£u²ÖÓö•ø—§ZK ðjv¶ÿ¾.ßÝÙÛëPC±¼×–6w&(¯Õ[xÙí¯ó¿éŸÀøo£Ç†¹Oä9ŽkŸg¸ÌZucŸã£ŒË(`ÕÓ«‡Žê”ëb刯˜Q­zµ¨G­A,C)ÓÿC<ñ×9ñ3â ¿2Èxk+ÁÑȱ™…ì®®UНœKG±¸ŒJÌ12£O AÒ*4c7ˆJ¬éStêPýª¶¿ð·…tO‡Ÿ³—„.ô{ÍJðׇ¼=ioD¾Ñ4 ­Šêž/×4}7LÓìnmV5SGóí®ÞÊÖåoÖ mñó¿íYûx_ðÄÝSÄ:?†5½{á·Â‹š½‘»µú§‰/<$ðËâè#‚Yî Ô´ýNm2}&ÇK±KŸû K³i¦85QôO„ÀÐ.ôåÑÂØ eŽI|•Ë/Û4ùLÒ³‡ifizóHZI%ýã³?Í^‰ûKßÜÁûü_ñD_g ñ¾¥±«5œ——±YÝZAm<8‰bKxØ,;á·\M4¯þxuâ £Å?Û8Ç.¯ãÒÎ3nâ¾Ãä8ÊØL>}ža²Œv)ÕqÅãó."Í)RÌsø>] Äðlºv“-‡>Ð&¸§Ïk5¹—IÒtûIÖH"³ùì†æY¦“øÿ‚ÔéVZ7í©ûE[Ø,èº_>*x.Æ[›ÛÛû¸|+a•Ž‚oµ ‹«ÙtëÉå’Ê®$ˆÿg·1Û*Ä?£~‰X>!ÁøÍÄm‰Çañ|7×͸W •Õ¯^yž[ Âüe­MÇ C„Ã`p|CGE`]B¬ñÔðØZT!J¦#_¸¦ðQ¹ð8ÓæÔu]J¶o hRý’C=ìws]\Ez-®-SQ¾šêóR¾Ó.ï Óc¾·´Sýµ.þ(ý–õ¨|'ãÍV3ö–•â‹Ëkdz³–xî-WTxX¼°9’<ÙZ‰`—}¼éŠx¤Œ²7ºüÓí5Ë-oÄZÂ>©¯]ëSGs¬_Ü\]j3iky.æ•æ3îg&ãžf•î žyó+ý/ÅÖ«šb¸šªTXlÚ9Na:4e*£‹© ¿ž¼)©N>ÒÕèS…¥NØŠ´½š©â¸:øj8,–…juêK–ʵ7MBJ†; Ê¥F:±ngF5£F­<=HÅEÖ¢äø5û1Çãßé^!ø‘q ¾;i÷­ëa¦·mk¦¬iZqÐõh¬âð¾>™keáí:ÂÒk]b :ÕÕ¤ºŠ?ÞµO<-ð‹àö¯öÛ¨-u4n¬£ŽçNÔlb¹»C…›5=?S‹T‚K[‡K;mN7V½×”ö¯Êk¶ð®³áBÑ%ÎûélX_¨/ØÛMÔïͨKï´*Áö¸¢”F (òѨJøöúÕµ=CCðJÞ_]J·Wz®¡r¢g‰nnììl¥µ’áa1¬Ëo,,PÈG"Æ(Š}~S•Òâ,wp¼ñ8š8<ʺxÊ”¹(ÔT0u(Õ¯:0ýõ®c/MU«R”š”!i{:¥//3œr\‹1Åáð¸xÃ+©:Ôa'í£[ŽÄû5,UÒêžÏ™FS…jNµ,=Jr£É ?’šÂëç‹£ÔµÖ±©ìãss<— /õK‹95”4qÛ̈.&šÀZF=¬‰gkæÛ1 ßløa¾1~Ò;ü+øOðûRñLj/4ÿx“ZŸDµ™ ð÷‚¼=£\ßj•õýŸØ,t¸ôn­ïRK«›ø·Dö—÷šU¨úkögýž¾øËâgÀëx|ø‹e௅Þð宫'ˆôMB?LD[Lólì´§24Œº|PK k4d‚y]®.[Þ×òO‰ßIü'ñ–pÖ'4ÏsL^mŒÈðøúôðy1Âá§ŒÃVÍþ©V®+„¡íªNX5<*ĺQ¡:Ô£]â0ÿEþáð¼5›ÖÍ1Ц ,-,Öž [Š£[FRÃà+W¤©aéU§µñ4qÕ›OØ}[‘N§ùï꿲7‡ü]¢xn†~*Ño>+i¶ž·ñ‚5hZ2j6%ñ¶“àÄ­âOø›CÐttÿ„‹Wð÷†u[>ÇD·Ó5_j’êóÿcÝkwzZìŸû@Ü|{³ý™üeð§Ä^ ñχ.Ö_è>;‹Zðç†|7áï>þÊ?k1 ]>[6Îk]CQÑïtP÷mݦm©ÜÏokÕïø'?„¼+âícÄQx¯ÃZ‰…ŸŽ>^Y˯éÅÕÆ¡¢êÚ¾ öwš…½Åݪßê:^Ÿs{ ¼ñÃvmbŽâ9!3û‡ðV;=sâ§Çßßi: ^%Öü]âK][UÒ|=¡èjúEý柧Åsƒ§é¶Ò,0XÅ#fÜ_M¨jw&mKUÕ.ï>ÏŒ¸À>ñŸà3 ñžCœà)ÕÇçÑ£KÅ…á~ªðY†"8Ic=µIbqTªÆ1Ž*Чòöø ʼFñK†2ìn|3“ç8œÃØeÜ5q§K•ä¹¢Q¯õìzk Z¦”j,4¥Mb*Æ4ñx×_ ù#ãïÙ‹Ä_ü7âÍÇâ4þ¥.±{¦è‘ÚY]'‡EÕ­üÖW÷°Ë¦Î]†Ë]7Öö2´‡Ì‚çRº‚ÞkÍÑÙ_Ù»öS›áoÇ[?Ùßö-áÿƒþ°ø®xú jZƪ|Jø—㿟 §Öô¾ÑuY59íN¹«Üµ•½£&§,×WWzImsQÖoí|Ÿö”ðÖƒ¬ø[öeþÒÒí.?´¾(é~Ô?wäý·A—Ä^¼“Mºæ/>¹×ui·Iº`ײâ@¢0Ÿª¦úïBÿ‚¤~Óöz\ïoâ_‚'J‹©tgñGÀ¯‚ðë“èw‚âãD¹½‚ÖÖ•-ͤlRÛEqp’ÿ(q‰¼iÄœ;ˆžaž×Ÿö®a,ö¶QT°®tªäÔð“tpµðøz˜œ4 4±˜l°ÄâkæTªC‡§Oûö„¸?‡3ü<Fã‹¥ÃùŽY,Ö¥S_‡Åã0õqRÄâ)Ö­…†2¦bq*S”áJHVùÓ?¢ß€>Ò|ö.‹áýBŽÞÊX&Ót³{=Ö›46–ÐÛE«jusªÎ,âŠxu^uÄ¿²[]SP‚åm-GÓ&(b“÷Fq<’È­+ÍäÏiÄ®ŽóNfK9Ú[‡µ]ƒÍu,WfÇÌ6âH¸¯ƒ–¶úfá½>Æà¶´²HbD· ‹il¹¹¼›Ì¼½•¼É$’{ÉçžY¤’âIyFú2ÏM°}OD’KHey<ÝÍ2 ˆÎîB±ù»ü¥gPÌ‘lV9ÜæÏö_ÑïG„ø#–á0¸j0§Äøêج6ž8UŒþÉÊ=·°oi9Ò«Ë*ÕjN•VÄÖ¨Õu9üâ–6¶mÃVUeV8IQ£R¶"¤åûªõ¥N¥E”]ࣛ‹.*©Ó¯8XuÍÂý¦èygl k4²2(¾Ók{˜ak¨nDk0¬‰-ÃÞxåQÅŽ«#ƒ¼Q\y÷0K wҵǒ‚ ›Iü¦GYeDå&¹ä+?®[ØZ {ŒB¡D·ån#trO°ù¼“C<›NA`sµ}+NuµÓZE4÷W2 žçuÐ+o%ÚB‘¥ËKäm,hÒK,¬¦Ydvý“ûI׫)Jý²qä”çË*nN*œÜg¢ýç.Ji^ÜRªSüÊqŽ*¶ MRœªIÑU-MΪ“öž^Y)ÂMªj ª“NmJIÿÿÙtiff-4.0.3/html/images/dave.gif0000644000212300117540000002003406747424643013225 00000000000000GIF89ak”õð¾îº‘h \wGit9G¶5 ´ìs]ípLJ)責ԶӌeÓ„R»E0»?×E0ÖC@?Ÿ:$ÔA É*ïr=ê_:âŒzÄ}}éŸëÅ­,'`5;à˜eé…^ÎV/¯U/q/0ÒqRµbVÌr<Åy筓⦀   œ$šøË±úɦ潰ܛ{j QüÇš D 0 1é[#I (u%,k”Eþ@™GÄÅp²˜p(#Ë%r©dV…Ê)òSv»ØoÒWÁaãwíeï7³Ø”#µÓlTKú÷aWlISekTƒMYqŒ|MupRIŠB(&>..™™šš›  œ£?*y‡†hdmIvp8OR( .À. à ¾ÆÈÉÇÄÁšÊ£¢š¦Ö_1ÜÜmWX3I·8©Bè2êJ·» >¿õ¿Ê65û5=ô¿ôzôxa`ñ5°|íkø.¦<®p7èÞò¨@ûÖ;3˜Š#@¢wØžPˆG@ /,D ™0†;ˆÁ¯‡ô0†IŒÁ vˆ qÂ;q }0B$ž 'È"|0BþV â‹0‡áÃ-‰iÀ; ~5Ù‹‰0ræ‰\¤:éÆ7þÄÀ D$b¹˜µ JH…$õçØ£ØS£ðŒzøfh3‰Ǭ¶.`€Pþ…MQ¬8ÎqCfÀÂ-Òa‹“¤E-£¼E;Êò€b52kä/j‚“é„'>ùÉB€¢ÂøR!ˆbæH\„›c;ä(Ç´˜$%AIZÊr‹•X:¿F#9ºää›·Ê€DöÂÃøå)b{ŠT¢ÂÅ,æ1ÿV@HnHêž™éFXÈ2P³, áÀ5q¸ÀÆEäÈ¢äì@¾úK`tEQ´™ æa@¯ü€uóÅd²‚¯ä3fIÉ Lþ3•¢D¥©ºfÆ`y ™È†\ã¢ËºîÓxަ]`‘üÀ6hZÔ×€˜À!ph xщšþ ôÌÐuLj2àCÞA“JY –€vÀ=’„‘]Z´ùÔ‡>˜èÔ#m ^‡ÙÌ*° DůHΊ3ßÌ%À†™™ ò¢RJ˜F4¦¥4Ûé@æÑÔ7½é?‹¡ÀNdT¨½h>CâèSŸ±–Hù:>°¨Ðö:‹Òfð%t*T4ÓdÅDY…\(¨Ë‹è’Œ€°¢U«òu/ XF80`ÄÕ«À.¦HP ²Ž…þ,f-ËQ™yÀ´.uN‰€S@ʶ>Å-ú¢ U㱌Lë¢ø×¡‘샊 æ®ñÔ°š¦‚Ü:*YkÔÀ”…Û{àÖ]¯´â»aÎ}®qŒ]/²7 ,×\"ÙÈÈ…›‚¬ì@eÛ‚$PB¥«*1…ÜØˆ3èüM Pu/Õ0œ Ö*@ Œä4QqÈöáß*W­Êè²ÚÊ4ÐÀ4ef‹« "ôÑìý‚7;~ [GBQì AAko‚èÌùoF;ÚÁPÛü jR+YÉò…9¬] £P|ö®L!ù%°€Ú:€äUuÅPsÜÒœfþä ÓûôÑ@½·9 NκõœÌ›šÝ­}{ëÝþ’v°É.›:@àáb}7Ò Ïz¥NëBê:cî{…+\ú$h;á=OzÐŽ¶ô|]:‹‘ïnÄÐ<0?ü­}ú3žïBˆ<¹ÁÍœŸ—G?v“/ùs`¼Ïw¿Þé :ߺÓý½ñõ‚Ówßü§ ›iâ‹PˆÃOH‡„?‚‡…@ø$døBIì‰Pè‚ 1þÃ'€ƒ _X! UXD‘‡£…‘8¦èÃp´ä8¼#ÈÍ ñF0œ_”8Â!.‰ÒÜå¯p Wîr;þ| j¸¡‹Xó‰Ó+O5>Uþ”`g%h\E(Í cªà"Hz(Ñ€óra‡3'GnD.Ò‹eïF2AÂ{¼²î"]c(>á ªŽËCÆçøóîÐoH mþ‡*ˆ‘s-±™ º šêÇmû»VºxO‚!WüâOÒuèq ´PD­„ hλÆîK|#›ÅôMÉÖŠ˜à—ÑŒ4ÒlÜ ˆ7}êSy’"  jq½P€±CÆD ˜‰¶ K€l7VƒB "þžHdÑ„IjmhdŽ˜„h¡ŽsôѣĿ"ÐyHÞ̰¤n¢Vw1N>áKL á=Qþô0 ðwßСq¥4 dAz&!àzŸ{2QP×'R>àMyrK=Á¾ôeLHƒE± q~ñT!‘Þ`|ÂDàO¦´káÅsGgµ—w¾¡)h+ÿ!Nã´æôeçƒ\¦N ±·‡—]Áq„J¢áO+EÔÄàcÅP{ÝGžN¸Ôˆ! é¤NAAƒíER‹¤X‘XY¢ÇfÈOkg‚ pw¬aSèçBE|Â+5Qb#L1Q‡áWÃò2ÿ 7ŽT_¨XݰÝ0}” ÛM*¡Jq„i¾þ1‚2q.6áb+c˜£YM%¸A #1êÁ1·¡6Ÿƒc¾ ÁðF‹Å&eˆ(V`,¥Ò¤Yµe'•P¾ñ8}Ç&Ðg Pó0T(¦ÕnŒ?pœ4˜°H5RÖÑX;È¢±ÝV¡a@…e'a>à&CE+ð±.Ž‘¾¨6QÓâ 0TÅ$ÄqdãQ%pðø ?P,õ¤%Ôè]EßñÅ ’æ" 5n"#2Z¡eq5uÒM†æD?ªÅ++ƒ Y÷H#…%.éXÙÑU`E")rYþ3¹ ¢_þA€1Ò„µÄ÷X(ºx>r#ye#B@>e P;ÀêÁ~WR^Z¢X™á‘Å#`&^IV"‚_Ù-i‰S<â“1`­Ïá Köj{v9%C’¤ƒ–/%°*`hT¥À3ïR£?ƒ ‘–%–µ B™Æ7š°dªæ¯4‡ãi´&n…#ã9% ó9>v4 tiwë;g‹FôÚ¬Ëv8 6mÐv7ÀÃ7xS:®fo¯BÒBhVië†;Ô#Aç¸"„±ÚZ7´j³ãkÏc;®¶dá&mâÖ;ªVm d1dþ¶l²[<Ð<ª6på–Foã ”>Èo7»øãA¸m¦[ ùF@Õ;ó·äFplK év@ýoï–>Ð˽ꋾ—67ûÆoè›?Îþ—Kn¬û 4¾ú¼îÖ¼ñÖAÔf½÷VAú«þnÁË@Ôfo€“±’— 0@ù+?Ü¿ý‹@Ä@ñ«lóö=-0;Ðfm«kì&?½jq›:ã ç&ÔvµÐp  ‡ T`C*÷p0Ô \ vJÔqQ‡c÷q“° /,3tDTä1g@sHô C€v5ÜÇ †sJtD6·t"çv^ü,' >ŒCÄ@ìBWäà D%çqðÆD„ ÆQGÆEGt4Å&´CF'Åmwsg'¤sRôt[ C}@taÐCˆÈ¸° i—v€,rŒÆ1œEj`vm0C?¼1GÇVlx=…LÉ%×Ã.”Bu`v„Ã{þ„,isX£(À3]û%Šçx‹üÆ^TÇAœÉžŒp#W˜¼q™ @ðWñÌl3 ¤ ?PË»<ćàEs,v¹VO…»„€¿¤þ‡ hƒ8ÃpDÜrGázzD„èÐÕªäøàcÀ„&È#MˆK¹à3X3˜€1å-RÌð§˜Þ_ØôJˆxˆ´R°Gi¨ßßd+s¨K„á‚2øe¼Tƒ—ôUíub$F;˜OØÁŠhýâ¦Ä܉"âV]‚y‡hN¨/HqDá#àA‘…Ša§´ç Ÿí’ÂØ‘Š10)q-îOÓT20˜P}Œ$Rwrå·²‚º$§\¦x…W¿4$záUÑ ‘æñ€Íìp)ÁþÔâ qM4®ÑÒ¡-B™X…<ðO1ñÒ¤(*îþäNa2¡·†&eP¢Q†B¸R+pæŒáUŽ'üý„PÈ|!§DAè†Zž…Œá2%׿ðÙȤ%îç užÚ¨Ú•NM§A‹ŽÍÑ'èY=y(°ZbND›/„Î'È.$¬îQgÎ/~÷…Ø‘ÞÝ0ÍŽë§1Pm9€ YX’´pWb#Q±¥/(„ •wÉ~ZéÜ0M%A†ŠÈlÁ6C‚ø€Õ·x'±áQ·á8›DÉ©¤øaôøHÈ(5室X!Ïšqí}•®RüçÖÏøíTXÙÇ­0À‹Ÿº&â ðÏm9þs5&s9›³YÚ$¾Ðì—%_í(B˜ˆº~5É4m«-€ü®"C¥jLPãsAñèÃA±¾w˜óô0w‚M2q§¸Uy´æ)¥ˆ0¥ˆu“m~PØ­bOó@å{VËŽ2a(€²ó¨FãFvÏΰ $ä ˆšéX)“a0u“ÒàáH–î61T+P6øa%ó`â0T—3Ãqu/i¦°"þw{”Á’õ´š„$aõOºN%1¨PvbXþÀ2Âj*' rÇQ'çß ”}Õ?P$÷‘üïþ‹ð@0)]>DáB¨Ÿ uF=1°b±+ï×›ÕfY†­Vëù|=4¬“`¶ßáuÀT*< %#CbfÍFGcaA¢§â/2òEââb§!Éå‡ËéIÊC”4æÃÁ‹åkµ ,uõ«Cn­§G.w.·f'ƒ¯b#ÒàÀ¦ÁçðàwccqÁ¢ƒ‚gƒDØšBâ`“Í[€4Tj<ÊÉ…FkukkÝˌƂ×Wñ@__ mg§†=76Þ(£¶ˆY#4ÖN(pˆâÏ nØô0ÀâÃŒ)¤Ä™«Bʇv±ØµÃjtÁ‰£k_ @(0ûSçP.þexà°€™0:n~`2aÏÆ?nõ¨!ÀÆ';–B7²È’&U­p@ƒƒ69iÞ´Ì·“gB ÔÄa‰ˆ' ôe   f¤ ÒTqJTF'38z|òUä:#×1Öòxcâ;›'5 ôÁ!x‹à¡=€&Ь‘ÝHÚ¢Q¡ñÉ ØTÌûð€[kÕŠuë*B¸ðaÜò>ž§úA™ _Ò6,À+ Rn5¶Q˜ íÁ§²e‹#Oµ0©"DÐX¼87ü-ÚÁ·â  &º}kpA.†;`0`‚6ûc8P ($˜p ,8D»þ vG6Î#¶ŒFI/?öXo ‘DêÍ“b¡Fýž³, F€„›cÚpŠÀ|TûÃ.~"ÆD´Ûa‚‘<(Êó€°(fSVTq±È´Ê8áÔQ§z,ƒ Â"†Ú8p‚(Ha„*ãQ@p©€*0àÈ"ȈÉ'£¤P¡½öFˆQ÷Ldq¤ÅbŒ¥^¬áEöÜËTAFð ºjb†ž&PJ…hD)-Š `O„[å JÝÝM·ÓI'F•:ˆ®/—Ø4€˜`pÖǼ.ƒ €"‡ H˜(Ë# \Ú4z’þÐ"]ö €¬\ÙÛÍÊ‘vƒÑËø¢Ì¥4^xYNU&Ijrˆ`¯ÕS©0 ´VZi}âÐÎ=w„Îu÷VØ•4Æöˆ-Ö„±ò™ß} ðå4 "i°`‡©FÏ~`"V‡þV\s5¸Xb"XwÝ\Ýc·Ø¢‹µ÷Ò¾âPzߘEP;*Ø:ë48!U™g1ÜYÉu8ʈ%ŽÀbŸs]Wc 5ºèVpûÓpI<¥õ-™Ywe#˜wZÜæ&·½a\e~X¹ëÞ±ßÞxÚÐæ®µ½ÉLq¸Í g8Äé lkËwÇj†õ³*1k¼á…¦õ¼#.o‹SúÞRÖk% rc;ÜÚôþ8•§{_…£5Ú6÷¿k½á3Kœå—>z·‡Û‚p ]Ü-o`ù² â6/ÙÄÀÓ¸˜O®ñ‡½âñ®wÌQ ìØÚݼ¼¼á ö|3ÛÃlÎ߈cr»‡·ëâͻʻ¾Ý¨ûå8çxF3:¼ÿñ¿güßj¹N<“W{Ïþåy³ñjPW;tiff-4.0.3/html/images/Makefile.am0000644000212300117540000000301210411004547013624 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. docdir = $(LIBTIFF_DOCDIR)/html/images docfiles = \ back.gif \ bali.jpg \ cat.gif \ cover.jpg \ cramps.gif \ dave.gif \ info.gif \ jello.jpg \ jim.gif \ note.gif \ oxford.gif \ quad.jpg \ ring.gif \ smallliz.jpg \ strike.gif \ warning.gif dist_doc_DATA = $(docfiles) tiff-4.0.3/html/images/cramps.gif0000644000212300117540000003152106747424643013576 00000000000000GIF89aŸËóQQQDDD nnn```þþþñññ222!!!œœœ‚‚‚ÖÖÖ¸¸¸,ŸËCþ0¹ÆX»„”Í A€àø‘ay¦ëç,¼Š©*¢‡xïç:a±Ð‰Ã¡bXô{9`GãUTà8ÃÁ@^˜ qz!X&“ì[LŒÓdCAÑ@ø ƒ ]ƒ‰} ƒvˆ~ …~‚‰‰bœœ‹¤iv v¤c­œ¥rD GCmD Gxi^c^o Ãbe^   Ä CšÀÃŽ—¥b ÃÚl”Ÿv•´¦¢­¡Ãv§­³¯Ípö*à_ à:ÂI®!àa2`Ú!ƒ –"þÜŒÑ'f’€Ñ†I3ÅJcÉ€´„£E f¨ÓBétð_+a]b1˜Žæ€´Ä hË>šõÆ0èg “7 Š®)æE’ 89SFFT4±Ñâ5¸(0Ì5*]E”Z6•¤Eà ²aD,8–¢âélº "<§4kLjª-ZCë `-\ ^õš0¼m`@Ò·ÄZ“ꔯ“(iÁe +@Õã¹ 4sÚ{؃WeþdJ)ÉH ­DÓÊ>,݃`Y½†Wä`U%3F: ŒFŸ`‰@ˆ4O¢- á{‹tR’yMÆŽ>v,6‰P0ÉäJ=r­ç•“EôÊþ„D „2 ½Xå‹D¹\WÌgláâx 4€Î8’€èhð@:X’@Š:Hç¢tÈ(af8ÙÊ"øès >åIRÛ=‡œ(‚JO;‰HhÙ†e ÑLJsSÞm“5Ѥ¡áx$€Å˜g^ŠÀA~Bž<3œÉ.^2àbV¬¨¨‡¥¥!Ú!£˜²—M@å ›åf@8^þ€AOÀ…&Ï$2À%<8íã0©‰¥eØ‘À`…Òå9^-ÀÀhõ¼™Q”•UF^…ÒIVpʼ¬ðÚ®«‘©t\Ч˜’‘N´EJaÇåµ€¦Þ:qÄo2é1D :.”íºÂŒKÊš:0È —li*à*XÎ& ‘„ ÀãõfX^°y§_>ùàÔ›Wm4!¨¦G4|ld€­­”&p=ò>Ö1dôý8ýãjÚ @`1 OÈ\* ìàD³ô¾ßH jÔÄÑxçȽä!Èx«¨T°´M •À(Ýâààdkd?+íºe²)ZþñÜœŒ{$AÊY5•âØÙêmºÞà°²¨Øáeo7ƒíÄÈâÛ,q6" ÄœÏL€Ž¨´‡àÀúÙ§óv tÀéÔWOŸ,N¾“XCOàóš¡–" `E7žë€Žhã1€¥·97zÃ’¤ÄÉÄÕ÷tæ8„âa€WH@„¼w "XÀ ç@à›‰,*“¨‡Ë,0„°´HÈaÿüGBÓ=‚)äÛÖºþŽ2¡ÁÁ7¦â9„„òã+ ‚3¶õ¡cÂáNµÈ5!¡€øNT­:ÑtØCþ8‚§ ìi?9ÆþZUžü˜DáðFr"" [@Çwì±9{½/ èÖçˆ7,É`è0™«Ø·µ3m-$:HÌZÊCž€ŒB²Ö ¼M„vR€¾p!³3"€MmJ£ÉFHÇNFŒ«J”Qìp2h@EY«À3¦¥*î@"¸X—%à1T{#¼ƒC>6Ñ“FƒÒ!`d‘û؆¥„e4G#—Ò`³˜Dà@Š˜)ÂuUÆd&Û›¤Ç¶ PÉ@Ønô3M­ÊÖþ”hŠÑLàLA#/X8íÌŠ rr™Š˜5{â<Õ!’¾Âà€îˆÐMÈèòÞd«Ê!.¤ÔXæ É6¾oN¢bŸ)ÂRXJ4¶óÝÖ"‰‚C’•ñã°àL“ j»–+ðõ4 `¢ÏèR¾ZRÂàä Ëcˆg&? ±\($Jô9žÏXJéÀ“‹ŠÉKX“b'³zZÕ[Ïxš<è£c(ò|uPšpVˆB«èBöà 3ðésCh©)y§ ŒëMEÚ Ÿé*‚n3)"ŒFF¥!K‡ÔÀ!Þ^ ®‹Š2Òþ•°a“P4Š‹|ì4û: ßøšè @‘K^šbŸ|D¡Ú-âj !YF26´5ð!?yX˾ˆÀIÍ+\xÕÃüüaaå#0!ˆ„VBÑ)L!„‰špƒM MÊ[Á0bQÒ×Q5¯]ðÂJ½åP,©î-‡CÛœH'T†gxÁdQ^tc‰¸ü@)BbN¤ò„—…X QbQ0Þ@wPÁK+åº}A³ `XKoñÃ$#;Ó•Yk²s¥eà-sÀNpó€¼D#{|ƒ )]ñÙØä#¯CBïFj²c’±a˜NÂÒþµÂ”¢»‘è‚à‹(!cÖ¡ñU:ø¶%tê+Ó8ô€ÛÌo¹ÆHR.5“äÁƒól`Q„•ÂNèZü4 RGM#AJ5±<(aÎÒÑP¤ÃÔ0xåB›5àƒ¡s‰8=òêá褻Ln¡©VI T".Æìð —Épz—W‰¬‰}ã(lÖ¦+qªu ãYÊTѦ²U@T}˜«øZ\ì«6#‘[‰…œY”ÍŽ³H r ›„\g Ì|ÛÉP¡ #bNz 3xËX{@a²߈yªVx‰UäYËüng±LE J!B>&óM.ãSŒ¦L鍊ý; 9‡ ~  ±š}¦£0…ÙÓÓF„¤œ”& ½ÓÃqá= `R$Â/àÕUœžaår} (f±­ÃRÌdb`ŸD ¶þyc"ƒ_¿3MÆu“HÔ-5NÁàà´ª@?±`)“€;v84Q‘QîW1Ç4…ñª Þñ Á'7C!@9Ò1.Y q òSD¾ÐRÆäZ@6³õLiÒ0"TÓ0ì1ÃÀIÈ$â 8Îr$2 hh@v8èQöÐ5!<ñ•¡ mB>NRLQ÷€OG¹3xGH=˃pÌ„G rk–"?=È —€yˆVùb'ÞPDlâ  /@s†½á<°¡pmè?ìrÿQFÀŒ"@°ZÚ xþ.B65&ÆÓ&…TPlPM8p$8 ÆCK‰%d6ñ2jda+Œ’/áàZ<¡ç}ôrñA$ÒÑ;€sC;TD‡VìC‹À´q=öÒ*$"z‰Ç7`ZSñTÓ:Ã$I|¥ZØK„w–µ.Ts6qDkÕqÔ˜ GGyO§Ô3Â÷CAŸ#E—B=¡ @tâ$ ÷„l0ôrHESðK÷8Gq5sè… ¥¶jXƒß×i.óÄPHä 7 –" PMINw÷&‡<I-¶s)JrP…€6 6AœPþ-j’^X$/{rHa’5ˆÀ«Ú@Çd™tŠÓÓ*orñ&ÙbÑ{À°“–± ¼+Ò`d*b ‹GËc±bvúPSË‚ ú‘!Ô%ÇtFðSFYDôçG€Ð%)rcRnnPH/—!’5Mˆ– ³B"ÔÙ¢"g"NàP—ã¡89Ð'7$®’Ó%Y¡ µ³1àr-%Iè0MÀ*½PëÒÌô4þg'l 9–™*"(?0YMëãvE‰á¨"j²«ÐR¹ù0Þ±Œm5&^ò&l ?Üá>]¢ E@v2.ÊCLµrDGÄ&=0)²&ãU–‡þ´uóµLgB[v‚6Ë£"a!9 ¸p"ÓxwHÄ&‚¢Ç02¼DLpDãa'p6ârÚ¸pŠ¢á,$r94uX†b)桬¡oÝ“r¹C¢°c–?£Æ vñ"ˆr ÅB £Ñ6Q?”# F ,ó’q08^L0ÀXrõµ,œÁžf‚ d&ðp2Êð9âs?pS3Ðé 9Y q BqI®"} ð ñãÃP|s{³f> ZxE·F$¤"Š ¬r'áeG0o&%Lð?êrÒ^¨1;¶‹óÐHx øx`Ñ!ÏÂ(ó’4„B˜ð5þórnO¡Øf£~òH”/Ç¡§€L°PjÂÐud!5*–Wã=ÙQ:…0 b§›ÒK¢ ‚™dÝÀ ×b@’Jø•i´€ ëv@“M:óMQ]‘/ôg-oq^‡%eö E°p%!Ò‡§¥†—0 k}ô§…€pè0^®«ºÑNúWÓ’ÀaMÑüBºIn†’W3(Íz¤|Úd:ÁÅ[葺ðeÂu :P aP®aP‹“ÈQ@x1‚{v8­0©&:±GmP-äÊ®¿áгp¯H,µ‘l‰äx6§¯òÀÁFþo®A_k¦©¿«æÁ\@ª ·p¶ÇTº@¿ÁfX­{hú¡;CQ,k€¬ðc5+0ôpëUlÒ“R=—éâef÷u¨ÒFbá ìp¥{l‘k)[ <kø¦aÛ£nÂÁ¥ömüPEAH-±ó—'§¤ØÁ^Æý0LBf·á±4ÆÆ9Í ÉvE a5xÁa#±¬§3ǰ±¡8á6bû#rõb‹â·‰°@·  iiVäe×jú²\CXº¬û¬+zÒ'ùÓQ¯¡mÖg>é¥1`“0t(,Ff}æõÈñ'fþè=µ  “z2ßÈTNòÒ…Ïåe¥+·j0&µ@ïá!l±\h»9r´€ÇÐ5KÀ¦_Ó, ”±:|q# §)g¶°[Ÿ1oš‰w@!èA©££[G%d· 0×P¢U¸gÓ’ÕÚ.Z¥JÇPµa§¹›ÓÇQte¥núЫ„À§œ€8)1i#Š ÁéàC½ÝsÑæl9<,ù ²(»‘^T,¡s…ƒTj0σ¤°pvq ‘šŒ† [¶¤šQ_&üÅVñekl{±×FGÔ…QÅ÷ ƒSs(‚mþ!V È—œP8×Cï}yf/aZ¼Z¹ ô,_À§Ò=È‹3Aº†'‚“Ó%3‰&ÏÔ¼é@9É4ùihS³#ñ ö(£pÁ‰­5[Q Ã0èE§4!GÌt9£ª‚Ê!ÀÆf0v·.\&[àë¢J'¸ògãO…£J¸zQøŠxª&^¶‹­´€g±pª¢“y–»BW4â$?cƒ>½ƒ’d8@˜‹õWÿá`}`ÎçP"D¦¢GK¨dÈeãA`÷ûÏ#†RÖ0¿±£ ìŠ÷Ìí{dg"š`XÚNhÂ-–Ìö8„þ¹…¤9ÞÃu9Ú¨ŒÙiE´ äWSMe¤”GE`;!D?ÒgŠú  qG–䀔tŠ:‹‰Ð[W`ê"N[ Tj¥Ho6‘-Àv(¨i²m›c'z)Åòú@LœrE6³æŠÒʸÐ-중 $—×ÑÐ11>ë79À¢S63“’DL—Sµ3Q^ñ’n…8{(m^àµhLö¦ÏƒCqLç ù!_8¤1`‘lª@ Þ3E4&±æÕ*Ò±]ÔæjO› # bSdþ1¸9aCkEP{’aÂF/…g §Ó_ނך1À²±6n!‚[S.'N«PDš¨êrÅr3ØäÚÛâ%Y&)ò6óÒ5ÓÖ3#*!I}›ÀRÈ7Ã麥E¾ãXááX™É6¡L’"©%*8ÅjR$¶6’9–²z6m@’»)F¸}à¬ù¡×žX'S³@\Ãà¬hflcYCúmê¢ÜC'hjðP7sFHëá<¨ºåb™NÒ]Á6-r S% ñ×Q:‘Þ"JÖ”o.ó>Ó£Ðf󩓈SþàèTÃ¥qâþ„@ íwËîµ#C‚n€#KvP^C­=l£@qw<á&¬•@šG‘úCâl*åŒAéБªe!BЉ"0L ±›xC"{½$B…t"¹Yqw–³˜mÒirr=Ú0åÁa$6¶ždSdX•\¤9Ítú’›Wä=Ž·5 ùë,BCkGKA…C¿P05#¹û <#ãÙnÄD Ç®ÃË})Š3™<–•:zrU èY3‡i Ç>‡ÔN8ÄÌâ :ÄS^¦½ïLò燶ìñBε1-›Q@êØòœ&lrë© cb[(e€ ³ÏÑ& ?þãçA£_¬ß‘>œHKó’ÜçÇ2˜asƒ©æ=Ašª^`h8‘T„*=1×rI~À*ÃBKxIÛS…ô!*ÁŒl+-µGß艉-ª€7BqRWÑŽúR[O1i ݃ /zÔE¾-9#ÒrH 0^!?Õ4r¡€o¦ÍÐ9¤ÖL³$}{O1ô_BÝq`™´±Q]W8 ±C)sèìv4Åø#S&0çcs<›_4!X ] |]P:âv>ÿQ:ð=òãÚ6q "6(I*+k‚ÛÕ{5ãá ì”ûÅiÂápQåTš"þ1+XtôáA§ÀBìcÍwFH&!ÂýxóÚ3bTO$  †À`Ç–‚¥9…çqçA\@ï f!~Áx!ŒGdR¹d6Oè±0,8A°0P‚ÁE ‹ƒÁ.à ™ù&<¦ˆŒp|(3‡)#!„€¨FÇGH%¡ ÄŠÓ…¢†I …‚†‡€,††Ÿ žŸD‡„‡"#™Èeæå¼¤„…5³œ……Ó›´ ‡á…Á 13ÖI¢[Œ³!mP"!Z¸‚f}Ç„þ)ƒ  !ൎø’¦ÚnsBP…âÀ· w˜™ö"Á—öfµpPbÒ¬’!8(¥¦š}1—4PêmñdÄÂrž€ú1ˆ€„™ (ÀÍ,M=h|y € ö 3ö Ÿ‰ hÁ@ð¦€6# Äðã”Y™Í”!ÉÆãŒ‹¦ úD O‚µvÄðçÙ³^Öü Ð4) `@(€“Õ'pg$¨À³Œc5 `‚‚hÈx°´±|qeÿÑvã 72X}Ë3¨ì1Ú Fkš—Ú.ø2´-ažbÌz“Î1܉ìÀCÓÔþ€Z(’/­p³ÁÈ›²e3ÐtÔUY}´l‚?1ˆW°h€Ò°¢šXja$»\ŠS!ŸE8KɇOŒA`€R+ ¼m2 Ôp¡p„B€;õdR€X Á…`Æi¬á)„/2%€jT@ç˜c8à /„Á-†Adq@Àl˜«(¡ ¨17cJj€˜cB¡@h€ƒ¶†!Vb£² à€7@Àá ü,Á±~¨qÄ›z —al+óÄ2:(Œ„xÎÀ…Iøa§ ( ŠºÔ'…ljG/ª€pÀ!BŒ¦Þ¨Â (ÃeœWnþʲt X€F jù¡ÒŽÒfÑAÌÃ@•B‚<†•-ë`€AK—QËE[(³Šüã7YÀÊXpi›44 ‚§8k¬F!Æ#ï¿FS…VL`ÝÑ2L°ŠËHÐz›«YH`ñ!G5\âñÊáI·º¤ª*R«‹!,°aäX „œ¬æ#Pl(ë–U0)êÞxa3;Š9/_š6Ë—™ƒâª¯ŠE[,¸ ‚ƒ’ªF j€ýXŽtÈAi£EH˜¸0ÄZË §6á)ó†!È|#›åÈüÊ+²QÈFéiꪢŠ(Û^#Ê3äŽnþ«H#U—Ò8u‡5vÎÁo½×Ð!ðÀ÷~¶ÿ*‘#¢—N)ã?n:àfc馔2n(Åóι¹æO Ö޲p¸Odî¸/X@ÂÕ8Î¥¹«iû Ác?®ñ40¸†Ü/z–#5I•+¸ð›#ª™\Îç_ŠÉï>¨¾Œæ«±¾í§™[@4Ô“Ò½GÃûŵ¯Kboü«ÛwE5¾‹Ï±iÜ;jãg‹·þhïT<Ê•äD‡ƒUC"™¨Fkªá¨ÐFÔ¨›ÚNW NÃVùƒìp÷”ª…ËDÈFž‚$ì`Ð`e–‡Lì!…¹8B5Šðþ…HÈ)þöÆ@È]Ž?8Å6"g ÃØÀysˆÒ‰3»i¨È|¬Ë@âW…x¬fL@ÏE1 MˆBLx#˜ ƒ"ŒÝi`¾Â8„12!¯KMóÌð»;Rî>\ŠCb¼0©mK”0ÁÛ!Òm<ÈDøp´¥T¡ àŠ€ž4#¨…ÐdZús·ü…‘,‚íðФáÁHð@Œ Š3Ô‚rutÜwÊdŠ-È¢˜·¥ÂmcÈ“ÔÐ=(ú }n€hÒL1x-/É‘XòÀŠ#.›:ÌQ¡Tz”¦x8žñ¹g8°9èœCæ`¸@îM T :áþ„Š H£‰§ëÐw ¾Öí¬ †)Xø¤¢Ñl3óB@M#ˆ²†‹Æ+\Q.ÌíyÊÿ2¹QX€ß9ÅRЇƒÐ3(ECSx$»x¨mq³Â+gW7ù©æmVP‘àj"+<\N09È+ôI8>C{[™ÐRÀ4©Hz _K¢F6¶´ƒTãMYè#SÖð¸ïœƒžàÀæºa¸4œè)':¤"å& ·Åõ B œ´7P*3p+~ÒÐ>ðš DÀá8†rt¨©…[ªŒÂ*±€Ê¬ç¦Ü€G”ˆÈô÷&/œ/nWœÆ›JX‰ÓúÔ%š Z­xþxHÀ :àq ½u`¨²ZŠ(:HvjÏ ;‹ØÓJ#l¡y«íì炈F”ôõAº‡LžA“Ÿ1(!úº7Ðó%ç˜T,Ø'/q¾é•³šPM ¼…AoN Có¶Ð“‰€xFoœ¶·%I$¿‡»£7P¦ìMpšÁ8ªpµÔU€#³û^ªøÆœÄ½. ´(¨ipG‰ÿèh0ë)x”÷z´E«)Øb•ú{ÑÀÁqibG–ÐÓ-îlgóç-8ñ©R\8¨dñ¬z%…kÒ4û)n<;làl 8_P†‚ipOSÈ R%Êé¿/a þÉ®ó(O8áZ7û<] pºÈ?õ ~ŠÓ\·¿ÁÎ) €Hü#JI—hUpåÄf`á§ IžxÊÌ’ÆÍSÞÁtD÷‰ÌÓ&á­PˆÆ †#ÛßMÇDŠº°½t;ÞRŒ‚³‚ë´ƒ]æLj•2ýÇ ­™îåV£#è.à1ƒ‡¡‡=¡€ a1ªyºTÔq¥+Ø-¨™ªÛ¹ÉvgÐ̘  ÿYXq8…/Úál:ðÒ_eO@àO\íM€(5R b#JŰìâa6Êm¥)m uCµü,~¾ ¨âÐÂ<ê·JþXɵ¥r]ÓêôVÓ!Éy…gEw—TE¥,ø>‹À!qtøT®‚•P•µ)-uݵÃqTƒA¸)³#bÄ\Aþv×pâäÈ×ÊV¢ÆhõñI_ò;íuθ[—ЀÞÑ)Ñ W‘ý¼¥ý¼#ªûàÛb×ñ4J¨ýàj±uC“6ÐÏR· r¦T¢–‹Î'Íaî9C${£°sn°ìy3t˜õÖ¬mIPÄ81ºìÎG“‚ÖÅ„sÔ(a¸ðýYvm☷—”£=ÿÕ‰Û±Y3dTÇŠßNaƒ=®—Ñ£þNÂë´Ëè_GLàXPþ$È3Õ .Ž zãÎG¶»\ñÞ¿ÁE®ëåFñWM[åi=ÑW ?7X.@×àìßoÀËû›&ˆ© ­$ËY;:Ñ*!þK¥@ƒÑsºQ½QÿÈ›l8·Ù±¹Ê‚°kžÛJžƒ¼¥r·ÇÁ‚Ô@‘,M ‰îÁžÿK%Iؾ  ÚP½°ƒÿX&»…à‰3ȲVÚÕÚ›Ù˽«[®Ãj¡8-ÛQ Ô˜/3-Ãc³­Ð/b’ªàœ°¢fú‚LìzÜÈA'CŸ½¡ƒ)»»· Yq7º2œ;ÏÚ›s4åh73%B"W°¬xš<É™-þn( ˜[ŠÌj4£J£mûŸQ›Ô:+X‹x¸Â)Ó³Ú²9ƒéÚ1Åsˆuº Èš9Ùx½ÕÃÃ¥b'Û#ŽH3çA0ÐiIx†!\¤NDŸÑò „²¼I¯=£@’7à ĥ*¼ó:ÈÆ%9ìÉñÚ4¤|«E3€Ä’/LpÙR=Ù)(Å!F*¨×ÁE¾uä/Uà2 )/ô%¢C^ò1ÏÙ†² +n@ÿ±¡5(“ª 7剔¢†G˜‚ÖQ¹¡ PÉ Š7ÔI+Áp¬ á(Â8–¤0Ф¸ˆ¦ðþ±º:ÛI¼lÛ4+˜#&i,M9JB ÙâDª%ø"S@…qh5ô6šª<¸‰Ûš¥œ‚X‰;ȇÐX‹\ˆ÷H˜2ð P8 …sE;ZÁM„‡ªÉÂçùœ^’¹m#h[ …+©äh„ȩ ˆÂ¨ ¨t›ØÓ0óy† "(†Q‚b‹‹¹Ü hò8;1YªŠ3&éœ3»ÊšK5#)QPÁ梜%›Ÿ«€kZ›m™Ç¸ªÄz›)ëŸó•¬Œär£¤x…¸eQ™uIÊ ‚qzñ¦ƒµ9¯Aº³óqµ?°’ $o!ˆcˆ¨ ‚b`"Ž=¨À“ ˜ˆ‚8­‚s®ÇYË岆:,°Ë)…EBˆTh¤(™0¸é À)¯)šB ¥„ü¸…„Y‡È aà¨{ÿZWÊ\¨jàèÆ`…Êp…Ñ¡Hí†QÀ"¶êqS0Dí*˜ÑÈ Ó³Í·ù.V3jz–îiŸÁ–N¾08ŒK8/Ø*HŠÐ™Yñ™:(Y(—eé™:j®‘ê#î,J¡QJ²œÎätL\Ó°ÄAê J˜þ$e‚Wr†öȉ‡=ø„[ùYP!p€Uè3bˆ(Ñ€:m0:†Lè Õ£H“*'ˆ~”9s„é[ÂÌ€ BEyµÙЦ>ø¹V2Y >@8x¥Šy¥¨¥q’*€#ÜðÊå`mà1[i¦äœ{KãÉ^É4Pp¸¡9 ZP‘ ycxdʼnX4Ø€…*ˆC,2€O0 Ÿé˜D`Ú@…S…29¤QÍ€C™Â û¢ˆ“€I™§ÑP´Ã9£`­€³\P‘YŒŠ‚ ‚ÐJþÍø•“xƒ$º•ñ$ö0Œ¤Ks*Ðñ*L`J0ÚJâ“þøˆÌ/˜X‚뢤!ŽaP%² !BÕÓŒRJp Ú’ÂzŠþ òHöx¾Ü‹Ü 2¡ 26ÈÙà½uÔöЭZjŒs`¹Ì3Ê£¤¤ƒÀZIÐÚG †c"7É)Ê’±ƒW4·×¨/¸Pô¬p+³¦Hœ`­ªxƒmØ*úZšvz/ÐA…lÀ‰›³Ú‡Weýh‡p“%ã°{ƒ#ëV¿0Q»©r PH¶ „Ý¬Ž I¥01Í9 ƒÊpéêªQþx]G ܸŠ7ÄXJ*عüáÀmØ °ëÊEQPPØŒ[iÌ- ÌT‡ì¹#WS—Ö²ZH°Þ¸À‚¹r’“°½ #ˆ…2ðF_<úG 8Õœx-I…6è-(8m‹•š­å*°T„š±”b8œ_`‰¤óö¤XJ`T0Y‡h›ÂÀ„ê°(‰XȄٖ>øÎ:¹„À´Å9œžKH ŽTÑÕh`X`² Ú3CvúƒTØ‚X8G±9i$ð&ùÀL¿Ìc’§˜“²3¢P”â6 íTÀ.õþ R<Ø{5 n™7Tµ¾=zÉUC7þ2 š(‡-3ð I¦s”Ø®á¹;vµh!´Z¦ÙC°TN£ìLYˆ`PvJ¼°‡ûÔ‚°H68¦T0©2«¥¥’ƒÃ©Nn„þeµXeI×\DxÂCLÀ/øƒ @¨dƒøq’žbØ‹ PD0HJïóÎM»4jÀ‰à`†º#‘Kx–’®vÀ? `;ˆG‰—ã:½¡ØQZ\X Š”x(Jªßs5$r˜Üˆ’Ú›m9çHˆƒI‚¥Ñ¿«\˜šð¡ÒYòWAPá,èÈbþ‚1© ïQXê†t-ƒó™EX ‡^±8ƒ²À€AøÅPÒÓ˜äRT‹€«-„ÑØUƒ~€ƒèŠÊ›eíuáRç„Þ«¦<­éF‹À¡Y¸…K{©¾‘E§Xª¡¨…Eñ™ÞÜ#p8‘ ¹ÏŠŽD0°B‰ÁQ!2)z¬(öêGh iû ØIY;&„æ³(<š°k9“c!‰I”p’|@üЀÄ“r”ÎÀìG˜P?RNk4°²Š4ót­XÎÙõƒcp¤á )pà‚M> TIWf’00íH8rujËié­þ…ù‚îØêÖC?x©Iy sJ„äݤÆpè_XMÛÉ#ePîep”¾0´wQœ~2î„!IòÍØ”¥6í¯…Škx „ŒÁ „-Bw8,! »€¤$ìuï(0 œ€«ƒ½v†•A?à¦è¦Ê¨Ûòp˜,ˆ×´pPEx% ‘,i ö˜“¹”ðf0 …3è 9^ã,E1‚•°Ò0–“øV°cá¨aËB1mí%jîjo„¥ Eµ¦'÷s7Á4‡+,œƒ¹zù‚¼ègÈh Iie±s BôFÜ+=Ój®sþÄ )ȤÕ+œ”¤Ä뙩OŠÅ ˆÈÆÇÑ#5ñ:`û|^5‡‚­ôÓªBv˜æ=Û® p“dßR¸Rëˆ4$b–Jþ#°‚?Gª‘¹¬„PXâ/) íÞeIS±KßQKW+ሑZ¢EP¥žuHx5’uÂÅŬF‚ûŠvjÐ@paà…?Ȱ (ohr®z,¯èio†.Ž(sŽh£·Å90BØÏ8¸bœð‰|9±ÇáÚY82“ðqE®‘¨xo†¦=‚ÆPjD O’øäƒÃqpê›(P¯¨¯èþŠxG¹W]j,s‡ø÷·&ô¢Áh‘ç;S™G1‚+±€Â›.1XPq'zÓviÔ¤ˆp—÷ä.î]Ÿ N*¥,t…Þ#ï`©Š!èT*…ù)£Žÿ¶pµ7 {¨á´ò¥ xœH!êKá^E¦Ãiy }±%AMâŽK†¨ ·ÒX’‰»´„(ˆ”‚p‰“mŠÒ,4£ ³Tš¤è™©Ó†^©oÁ VXN!i&ú`æDHÃù¿?$`™#*ÀC[ƒðõn©Qkví¼P(w¦HßÖ*¨­¹l¤—)—ÖMý)1kèlþ éª9ÎX„-…ÉÙ€˜¤X™1¶÷!PÐ:P‚«ÇJäo†Xh ³Ÿ 7I Yy¢ŽšŒ4Éñ’(T5›´–#ÙÓDMT!‰Q 4p .’LµÐdŒtÂ¥Üò .1í3Q:{e…Šxº¨pRFéÐóZOM`‘#}‘‚[`1Þ]”å«! “ v‘M”•#(È•NH`ù`¸mq DÀKÍpK3ddÀy¬¶ [åþ“€0¨¢Äk™…Ð#9q†4µŒpX!Á)#p’ 2r¤ F  `<ât‰…`A z!±]ó$’ˆu 3U{½àI(1a–N(»Ô€¥ ð”öÌS‚Œ&ÐÅR¦ŠqÑ=((™$„Œ[¼Ög6SJÌè‡FƒE æ‰À7òÅS¥‹ý* k|Ø‚*ijƒ \°â­¨h]™à#’¼&CMEñêBK·lUÚPlØÓ"EÅЂ.¸(Í |ù²h¯§…4”-·Œd@»…q®”€=ÔÞ7‹ˆB• 1ÒT–&`Ĥx!ÌQ >þÈH•—[nŠT£W˜×„ "h¡O£{¼&m=ºPeWFU¤ #>•"Kc³V´t@…Íòç†u½»Ê”Seʵ.1‹f]ô@•yÌc€KA!P*¸aÎ@*!ÃÜìsÏj>¤þE«½dk^ñÇf\Œ@Imxpq†ø¸Æò­—¹Õ¤ÓfŸEh'0QŒC ¯ñBéDÉ=˜‹3ž@Žå^˲¤‹…ì@ âr8Œ}QKÀqÑR ÊrG i®bÏ„/à3°º0ñ”¨ÞrA yj/šÄD±[ñË—¨T¯ú@µ{„(Jê¼þR &™‚(|ÉÎU˜À—nˆ£'bBë¸ö'Ä´¬'¬ð 1@ !1 r‹È€N€¬”¬%“ÂZÄÁŠ£`“ÂÈŒ(<H ¢ ø ì&”ñE©rˆÍdg3° ÏÈR@ˆcHçÁÄ:P€ôf+§+…–¢ç›:ì ©0Šá(t%ðîˆAÎP¤¬(gH…*"25b M<ÂW„˜G±E$Ö“fc\.“-È<*‘Ž„É|q‡€™‘„ ppG—àˆÇQC:œ|$‚ !ñ[Dñþ @ w8ãC=ªcLë?îU< †‹ìD âÐ’B&TÇl˜™Ü„aÀ=sZNüGÊÓ­P¶B eK;ж‚tH  "'¦Ü‰’a+ 71rÜâ“æÃ-À €IÒäNRRN’’ Œ­b%•HÆ-TŠâP'C®À€HJTµ­¤‰CϲmKX"‘­H¦Ü$­nÛ$ujmHª* I’¤HÂ[6pJ2À¢òäIjèG‡d¤ÌtØ´§Ìž)aÊÜ ÒìdÐ=;’"CjËêÖ¯]³–Ý* ;tiff-4.0.3/html/images/cover.jpg0000644000212300117540000004733506747424643013454 00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀ““"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ÿ?ú(¢€ )G$SVD “™0\œ…ˆ$dŒ#'Ó4w}•ߢi~my&Õú+þsù,[ü7Þ)$Ï– !`ÕŽóïÆz óZún£{qä[ZÜ]NêY`¶O2fUŠI„HYÊÇ2<„ ±¢åöäW·üýž¾ üp¶ñßü+Ë85KÀþ·ñ5î„K.««XBÚÂx4X 2^^[¥Ø»û(užXáa<¨ýuý?f«|[ð¿í «K¢ÚGáe×,õ¯&Œ× 6½«xYm48t½.hmVKù/.5H®´û»8m®%²0ÛI-ìóZZ÷æ~;áÿñõt«àøN¶S†Ä`ã,f&¾wVx|¶hÂ3¯UWÄÂTœ©Sš¢—5gÓ~MlÍâ1¸Ì‹‡©G?âŒ>_‰ÆQáœ5h,f'‡…:Š”œç T¨Ö£5*õ)ÅÂR’mS©ÉøGi£ê—±\½¥Äéi º¸1!a¸™ai®1“ +;¤>t›#32øÈʦŒ–×NJª»íÜøEÈÁ.:ç;Iàž5ým~̲GÂüMøßñCCðþ‰~%xBQøYâßìØ,ô«]SP½·ñµ¢¤é'ü"ž"[Ÿ”Ž‚}îûÈ?h´³Ó¯n~}Ñÿà–~ø}ñ__Ðu]I¼Eû>þÑ/á‹âŠÎÿÄtÍOû:ItÝlC%å­·Œ¼âÍKD…õ=í¼KáÝþH4Ø4Ÿ_éÖ’xgâ÷ø›ÇxîÂfø|›ƒÊc™ÇšÖ§C ‹¯,Lv;§WÙþû R‡±«š÷½·3¥NRXæYÒá?qžø‹„¯áÿQáÜ¿‰(`óºô]Iàñ:¸Œn õZµéãjàñ1„f°u+ÚŸ5h§Nšþh —£ œåíÀ\ƒ´ðÃz§ ¸ìÆìPòIõ5ûoð§þ ñGÄ?¿h€_üÏ|Að·‡5Åø9{{,vñߊ ±“Äž¹[»<Äzœº[1”¦«j“ÚxŽ}*ëAÔ’ßòËCøñCÄzïÄ ižןÄ 4Ïêþ9ЧÓn,õ¯ÚøVçìÞ!MSJºXïl¯t©su§Ï_*Ùß·i,îR/Øç’æŠt"ðrŒ1_X–q§(a±ðѽJ”qrK ˆºŒ¹U*Ó—4%U/tœðöc‰Æa2üï˜ÕÀÑÂb±3ÃUö”a†ÇÎpÂVX…z5!VtêFN%ì§œ­4¼RŠÒkˆ¤gr¹e(£i ¬ØÄ‡rä°B¹2a®éUj¶J‡,@C¸S¹²HÀÜUŠà•V;µ·*rºNñM­R{¥dÕõOTîž©žûŒ’R啚‹^ëºMZéÛtÒqwNÌ©EPHQEQEQEQEUøP¶ÐHÉ,O=•xÆ}OõªmÙ“€@ëŽà¯'Æ”¡?8¯[s-†“wJÞòk^ŽÎW·]#(ÿÛ×écú ÿ‚oé~ ðgÁ/xãMÑíÇ?üQñÀ>%Ô‹Þ n4M5®µ½ù1HaÙêš|Vêmá‚ItûÛÖ¸išÎÈÛýßðµüñ[S–öÂxŸTX4éµIíÅÜfk­RŽ;˜5$”Mmq¤ê|fTØó ‡ Ín!?ÿaŒÚþÇ~×¶Ú­ç„üsâ=SF–ã¢Ô¤Ö%°ºh˜HŽ˜°¿’ùJJ÷QFÌŸX𵎳ðÞ|oá-@ÙëLj¼E©!‰­¢–Û„¾¹ÒµkpZÉ”hÛZ%µÅÂ5ÄJ·D„W÷'‡<ñ?Õ£©†ËxЦ .– –:4ëೌÓ(ÄÏ1§ ÔéFœhЭNP­5UJ£”9SGóneÂ&â|,ñ³xS-ÌóêùÿˆÜQÀ˜|Ã.¥ŒÅg<,¥FQÂcrêt©Ök†ÁÔ©‡¨éJ’ufÜ;?¥¼}eâ|o°Ô|q/ˆ£ƒJ–É>Ûmq£ê+®ÜM£Oeo¦Ý¬:uýÄÈ×&ëÃw#f§æÜÍL&ž9¾‹ðÇ›ûŠ—ßüg'…ï¼­ê6‘ø;SÓ$IO†>/iú]¤ƒûCT’ÞÖkiµ½CU´Ð/mµ+ M;HÓït[Izv¡{%÷œø;â߇.üAaxt8¯|pöþ!…íí.tˆ®4Ÿ Øx²}*MBInä‚÷Ì–îî¬<3k.¥¨Ckwu©%¬qÏ%Ì_4ëš·‚¼%ñ{âÌÞ𯉼8ž.Õ´ƒ©½¿öeÖÏácPƒXñV“e,gM³Ôìu›ŸµK4·wpKk=ů‡à¶ºÖ·þñ«èOGÄèqop–M›eþ$â²Ì pœ–`0ø,qœcs¸eœ2¬EF yZÃAÖ¯ˆZn§4y%5/ºð_é•xG ôqúOø[Ãì˃|)Ì2úKq<«Qã.À¼%åxÌV6Œ±xʵ(æ òÙb©:¸ÙÓ­JR”`á?Ø/i+ñ_IJ÷Å‹m^-;ÄÔõï†~63ÞA£3Å a©é¾Ô,L™ä·Ôuk[Iõ ÍBK›Q êž!žÝZÓJºší mfÓT·µ]Õ4‚|_áY_Ébg†hîêõå8Ö«/7Ëøkè÷˜pæGô†âÎÇøOÅü!R·…ßHß °XŒ®´°Y¦–;/ãl«Ùc+å¹–Y˜ÖÊ¥ŠžaO „Ž' ‹Š«uêòÿ;ßÿà…šU‡íûLŸ®Œ>ÇoâÏüðæ³y¨_ë:*üLðf±=‡Šµy^ÊÖâ+ß…¶×·z/†µ­CKžÏPñÏ…¯u{LðÒZø~ÃXþy4?ØÏöŠñ·¾,|>øðŸÅ^6Ö~j>!Ó¼x¾Òn¦Óô)¼1u¨[OÅäÑÁÞêCK¾ŸFÑ̯êÖÐ\Ée¦N-nî-?Ñ¿VðÖ¥áo xát[-&Õ¾øóáý…Æ&¹Ðîôé4»{~+_H“×Ú^¹…ï5ßÜÜYé÷:eÞœ·ß^6'Á¾;ø=ª?Áx^ßJðçí âOi¿~ i–z4~ðfµañó^²ñw‹ü{§hÖ2i^/ÖWRÀþ7Ó.µË+Ë÷ÖôÍ3Ákz~‰wâKÍ?ú“3á,ãˆ8Ç>åø?¸z”q”q52ì~Ä9~sC-«ú†y—á±0¥–áÞ2†#/ž"¼¨ÏR•ªP­4Ôÿ¦<$à>1ño!Íxÿ‡é,Ó†çœO)ËåÃõ)ãð¿Ø˜¬»šegR4jÖX|oC ˆÃb}jñ­õNXTÃVœÿÌ •²ß+pNx[Í|\ðÇnü)â×Ò'Û|Yákkû? ZÁ=¼1Þ구ÑÇÊÉki{,Oa‰ÅaðT*bqu=–’^Ö¥œ¹¤ ¥hÝ»JK£ô4¥Ju¦¡œ÷½­¹IÝvI¿–º\ø`iLJ€Òop¥Ë‚q,…Á0ûxpßwý1ðkö4ý¡h=>âïà§€/¾#Ëe ³ßh¾Ô4;¯[GíÒÂ3&­»< åŸ*km:e¹Ü}íFÒåbþ¿cŸø&Ï>xWƺü_´ÃïxÀ~3½ðŠt?üð§ˆt§¿¿Ã Õ¼IðÇÆ:g޼fº—…­<;¬x{Äñx»H½þÌÖtí^×HÕü%~u‹V³ý ð/‰¿eÿ€^ðÞŸñáúüø¹o¦h:{|Bø#}àí@Ä~*¾ÒãмGeñ?áÍï†<7d`šòêñ4=~ÃEÔ¿áðÞ»w©ü<ñöŸ GÄ? âçç|Àpâ Àḋ‰·±ùfi‘×§Š• -Ë2Ü6sÎqO–#ƒÂౘZ… ¼l–.œ¨RªáQ/3Åü'ÁœAÄÙWa³\_“ðÞYšåÙŽS_ ˜ÖÆc³¨c£€Ë±t¨Ç—+ÆBxJ•1ÄÆ¤e‚~ÒŸ,éÍŸˆ_²Áoˆ ?gmGá_ÆO…Ÿ~üOÒõ}kÄiሞñ'ÃÏY[j:¤‘økR:Šôh¶[kðM …êYÜoK+¶£F‚y:ÈZÆX5Ë}IÒÂæ1âm/ìöövòÛØé¿ÙÚf·£êPï{+ñgö­ïûXOl·+z‰}=¥Ú\c÷Þoø'W‹~1·Ç/Ú3Å?µuïÄj>ðܺw†4í¿Œü.ÒµôQy}©øµ!Úì·Ú&µð΋ igS¸Ô/ôhlHôËoÆ­Cá¾§ðïâï…4_Š~°ñ,^)Ó|eq§ê«©j«à=VÓÄpiÑ\[è¾!ðž«¥M¨ëºdùZæ—~ãO𦳭¦¿i5ûi‘]~wàŸÓ£‡³Þ2ÁfÙ{W5§Áœ ŽÿˆµÃ™>‚ú†k‚Â×Äaå‘áø¯„­‰öQT]YaV½F§F½?vQ_QàF?5àOx¿Æ:\uMð®kãfEÇù “3–>…*¾]‡Îøvµ ψ£ŽÂUÆÊ¬+Ñ©*pÍEÆ´§9x¿Ã»Ý7Á~'µñÆ—¥é—÷wºU†‘ª€%y‘y{f?´.dY]cÕL6Ö·º…¤Ñ\8gw¹/Õ_|5 ÿÂ#¯ZØ_ÞXj%Õô+Y´!}}ª=¼~"ŽÛÈ×4 .òçí:]Ͷ³x±Ë§é—6¶“ê¶–"­¬³C‚x¿ÃŸ l|[âë >ï[ðlZ$v×:m̳[ø³H‘4Æ{[]/YÓ-­c‘'µšÈø“T–ö8TéNd‘ÌZ/Ž|s 6'ív_†‹Û4étûå¹×à³²-0’`mí¼@’Cžâ um>O°ËÉs{m+"'úM×Ì>ü)Àž'øCÆ8ü¶~7äÃãñxLϘeU*cpIS¡ÏÍCŒj–6Œiò×£Rª—¾£8ÿZxôuàxãã_„\1Ãø¼ö‡c8[øO†ÂaŸe™¾Q—æü5ŠTq4§—a±X*Uq2ÀU†Ÿ³¯QÔ•Ûmkü2øG¨ü?×¼ii xjçGÿ„N×Ioióø†]CÅfÎþÍ~Ówiá­'SÒ5{H¯5kk™¯.t•Õÿ²­áÖ´­2Þ3]¾m;÷ÿö8Õ«$Z\º­þ¥r¾_;Á>4мYá­wÄ:µÛÛÛj¾ñí­ÊÙOªÜj1ê:f·§“§éz¥„qþ<üqñD:¿xºÂÎÿSøºŽ›t5& »_Mðê[ ÏkV²ºª\x§Mitøô9­l­5Ûh5§žÂ+›ù^+¿¡ÿdÏ^ñ‚,5O üJµ‚ÊÃVŒø»@»K3áïx^û–ÚWˆ,Šê†W·ñ—…|k¨j:Kš}Í–µ¡A«K&¾Ö×Çü7ã ç?Jß ñøî&Ë8k ãž >Ê)p§‰9®[ŸÑâ Ox…¯‡Ìøw RÅJ¦:Žy‡Âa«pÖC'­Õ«…Ž5èâ+×þ.â\Ng•䙯 çõ8£þ Ïáø‹„xû€pXNÍðÜ'…ã¬Ë.–‹ò÷™{++Õ›T°½¹Ha¿{ ÛC.Œomn­õqwVß|Døwâï]ê¾:ƒF·Ò5/ x¸Is¤Ç$6w¶7[j:'ˆ-"»aq§}‰õÒuk&ÞÒäÅ¡ø–Õní5k½FÏïO†þ5Ð>&x:-wÃXk—PÛé÷~¿‡V–K|-ÓtÝ*ÏûN}3ÄQéþ'²] VƒRð«_Áe¨³êÚÝÝÅÄ^[‹ŒøBÿǺuŸ†íî´ÿjx^÷ÃÐ^i·šu…êqM©é:-ßöÍ%µœ <7TVí®´¥µÔl¬®­ÿ-ýŸ¿I:^ñ¾mŒâì›ãx›6§xûƒÄç*5)qnT¡OŠ?Õiâq2£ÃøêU%„̽¼ªÎ9ƒÄb”a=ZoðŒuô4úDðßÑ·‰xç)áß2ìu,×üھC,~KÄ^fÕêS£‘ñGà),»8Åf9n"¦"†/–מ[ŸáãUG*”?)$ðgƒµHtÿ‹·^Ôµˆ¿²±´øðÔÞÝ\Ýéþ2🅵+ý_Å~ñT ë5ýð›ÄWúÅ™G“PÔΕcàÿ2-&ëR7ÇWí_û9|}ººø‡û[kŸ/¾üø™ñOź÷‡u+!ü%£Mãokz—„t•žñõ›{M ¾Ó¢ÙÅ©ZCp?²æIMäsú¿ÂŸ‰ßµQqkck«èz߆®¬dÖo%»Òlg¸ÕíŠëTE"òH‹]Qµ€ÎÈ,ê2=½ŸÆ¿¶‡ì¯þÞbøgàOiŸl|oñNñ×Ä{K-"ÿâF‚ºÆ…aªAŒ5½2y-uŸ¥ñ»Yg²ð5ÅÛkºåþ£­ëÚ=þ«¨I¿Øï¤QÁ^&ð‚ñ3ÜFIÆpÂ`p˜Ì«<ÊsúØú˜^ÃB¶'5ɰ>–.vÄf5ªã°ôha#)ãÛ¦åNä×ú¿ô›àNâŒïâ7†yþI_…xŠ8e,›$嫘c8„›ž'2ÂË÷ù|±u\i§ˆ’W—,(Sº’þ Ì$)?7Ž3ïœøÔŽ=+ô/öÂý‡¿á‘ïmìõ?Úà_Å»½GÅÚχÃ_ µ/?Ž´ôHZKKÆñG‚<7§øv&ym­^ÁõýGPþГìÖÉs¶¡qmùêAÉÆN ÷¯àìN¾££‰Áã0U ©óañø,V]‚©B–"+‚ÆFèÕP­ÞMYò£øb¤*R«V…j5¨WÃT–F¬mìqTÛUh§»ö~íïv›Ý‰E.꤮bŠ( Oø}uà=/Æ÷įø‹Äž†ç~¯¤xkÄžÖ5HuŒA¬ßxsÅöñ‰ü·¹ ¥O<ÖÑÜ[ÛËeq,WÖÿÒ×ì}¦Á.ü} [xàOŒ|)ñJÊ5];WñއñⷆƢÄû4¾‹ø sðËľ0|7ømãO xcO“á¿€>'ý«áO‹¾x_\ð×Ä8ÿ¶¡Ö|!©øgGÐWá猵 { xR’}[Á:޹áÿ½Î™ue¦éçLù3þ Ià¯ÚëÀ¿²Gƒ|;¦øÁó|-Ñc’ëÆ~+øy³ÂÏ{à­5 Üöž&øs©¦¡¤Z[ Ëi©øWÇsêÛš¤ºç„?±áŒ&UK žû1exnâ LjÕ·%ÅûL=ia¸‰ÆV† _뫃©O‡ty«É|Kÿ³ÿ‚­ÁðÆÞðƿ܄þßD±ñ„°ßêzÇ„ü1 –ÒM\Òá[›ÿh1[¬#O–ÂÛQÖtç+ ªé÷ÆÒ?¯¾=þÍ¿~9þÖ'ã†ô3Âß|)6§{ðçÂwzͼ¿5ŸèÖðkú­–œ.“LÑã–Î]:Îðx’m2]VûÃK>Ÿ,ÖKÖõ?åáoŒu¿†_¬×À…mRÓúÃý‡¿à¥ß ?i 2×áoÅ‹í#Àÿï"–ÓÃéqu5žƒãJСµþÃÔïV;}Z¸gKe¨Ýˆg¹„ÿgÝM$ËcmþWqÑ#€8Äø¯ W‘qFiáŽi—e\IVÿÕêùŒe+Ç0Ë02­*usl-°¯0¥‰¢šN•)ÆnËÿHß¼dú>ðv?þŒÞáónñŠò¾'ñSˆ­Åç8jT1j¥\ d•ùp¸ãéÿ·æ†r¯õú‘­Q¦§oÊÏ‹—úOÃ?Ú¼ø ãW€¼Ss¤x’þK/xL_ÏáèÃRÒìì4«ýãVÓn¡ ·0éw g{§êúž¨ntýJ½²è|qðãö^µXæð·Å¯ˆ¾¢ÔÖ(|à›o"ÝéIi%•ƒëžóVVêQ5´ëá‹Â¡æîX’ÒK«Odÿ‚¢iþ.ý£?ࣟ ¼;ð§Âº¿Ä?|ý™¾ØüL¿ðõŒ—l?üaâËrs6ãȱÒüuáÝW—’ÀGhCÅ|UñŸÄš_Ã[O\øËÂóx…/|q¬i^"ð³ëׯ‚š+AâY´»Óm-ö«Ú@ 9ïl¦Óüùà[ëGI¢x>ãèÓâ×xeÂ^Ç‹Ä䨿¾qã#õì¢xa§ŒÄÔÁs/íÆœ>³Zô°ò”•8Ækšm?ïÎú\ñ^QãÏe9>y–e)›xM”çÜoÁÕð¸ Ë™d¹-*Tñ¹…<JøÏíZ6'?eN§·\ñ¦¦¤pÒ|GñOŸGÔ¼/ñsáßÅc¥Kæ“áïëבê³FÏm¨\Z<ºî¥£x‚Æ7‘>Å{-—ˆ,µŽ%·´¼³dó¥¼ ñ_Å>Ö4øWSø™­·ty4=JºðD>3_øBK}?Fño‡¡uÔ¢Ö’ÛZº–âÒÛÄ%Р¶›Q‚ûQÖmlY»›Ï„_ðN¯xKø‹àÚ7QÑ­o¡µµŸÂ^+¸²Óüge®]yS¾—©XÚéúŒð)kËHõ5 +»‹C25½„“Ïaã’è_²¦™çOáß>6·Ö£¾Ñ5] çKþÕ{›MwB×ôßéím.Ÿáµ›Kû­([ê ¥Ýi×–ÐÎÚ¥Ö¥sa•þ¨O…ü>ñ«„ñgÀu°ü?šeSÅË'Ì0Ø•ÃÊyö0£[ˆÄeÙöö… uêF«j1…l?·Ã)Jä£þ†ñ^SáoÒkÜï‹ü:þÆö™~S™PâaW&«›B¾ ÓÄà'G4ŽUˆFæ±XgZ £¡(Â5¤”Wê§ìgûUh>ƒD𯎣u=ž·áB=}V;Éa1Gáý+Ä«mge}ykû âkûÙÆêÚ-YtxÏ㎑¤ØùqÚïmuí#ýU¾’e•Ø_ƒH?¡O‰Þ1xÓâyÂu©ðîe^ù—WΰØ\¿#«ÄxÇ×Ãð¶c—Z8¬<±^Ö²ö5p~ÎGSÊ¥ígþ8ý)0f~ø;•ñ߉xϸvXžyîœO7Åp·T«ˆÁeù†+ì°˜)á1xl,ò¥ŒÃV«R½féʧ¿'ý è>4ðçÁ(nu_ˆ^>ðæ‘ ¬Is¬Zdz'ˆn.æ·¸…¤²±Ñ§‹Q¼œJ­5µÑÒ¥½hbép]Û1’¾7ñ/ƒü/ñ·R×¾&Ãà1ðúHîl­tÉü[¡ø~ÿHñ¾‰{ÇTž÷÷:&±7‰´ýZÜ[Ú_i^lÚ®äÅ–¯4êÖ+øcÆÚç†üKk¦üvø¾ñ9Œêë¨x?óüXׯ'ŠëK·}BçÀZ>«¯kz'„mo¯­o5Ms]ñ±¦JòOo<¶z¢Ø¥×ÝÚ]¯Ä›¯ Ùø“áî§ê^ñF‹8¾¹øtÚ™qþ/4Yµ[ŸêWçÐ&Ó%¶¾ˆÜß.¡{k¨¢:=ÜRËq‡Ø}p¸¼Ï/£ãî+Äž œ2Z^-çY½)øCÃÔ0êÌ2쳆ð³Í2Ó¨äñüή.¼°ò—±•ÊH~ñÃþ%åœ-á%~ ð+Çx±Æ8¬‹ W5©â¾Æf9VEüV]C Õø‚‡â1MSöË šáêb"¡ËF4q œ—óûqÁ)?g ˆ‘üZý þ&x_àßÂë½.Þâ; k‹¡üAµŠ×IºKo ø;N·Ó¼]á˽ êÁu†ÝðŸ]ñ6¯‹f|P·sG©Åü¨þÕ ýœü ã[öwñ/ÄßhQÝê)9øiᕽ²³†äC¥Ëý« Id/ï/c†îæd—Ú4péÓéM°ÝIs ×ÏÅm.ãGñv©©·ìŸáŠ¿&ñL²X|Rø³û\øWâçŠüC¥hó%ý¦®Ÿþ"Gþ™s ˜Óímôý+GÙ¢ØiŸØV×övÖ1[Eù™ûD|-ð÷мsâ[Ç_°_ÁM2öÇ÷šÅÌŸôwD³´‹ìcíÚŽ½Á/èZ_XIÖ·ý«¨é–¥»i`Õ¥6v‰þÎeÙu/¤dž*eüCÇUÉ*b³|wUαXlÏÙΤÞ?5•xü<±Uã'Tž!N* £á”#ø· qÆyñÃp¿ˆÓž>ÆÖ_X¡‹Êjeµøv¬êÒQÃã­W&±2ÅQ§*’«8Qteí*Æí/ædu ÍÆìàg==›ii€ÀôaUëØþ0ŸÞxßV¼1sá ظ³·Òf»ÖõIíÕ"šà?ˆ.¯u[xn¤Wž+[ë©f‚,n`Q|ˆÆ¡±¿ ž¸õ]ÀóŽcŽœô9¯Áë®Z•²pœ©ÊÕ%Q¹A¸JOF¢rk›–p‹Švµ•ÏÚà®­x]T•/v¤$®¤Ò•ã&¹f­8Îü²‹ºm2)OCIY ¸’:»Hx`ÙÜ*q‘Ïg¯_ÓŸnøñ.m0%†¼òÜEºÐYj÷Nnä° {kgŽT™ÞÉ!Š(Ö0V8’0 2ž<'ÔóÖ¥Fù['œƒŸLwõü½ë¦†&­?ehûJU0õ:JxjpIY´Óvog­´Ó¯‰ž G ^R•*sw£&á(J¡ÿ/)ÔŒ¥Er;;¦¤”—èæ™ãV.çÂÚ†¯¢]^[yBïC¹¸€Ë+ÂÖîR}5¢¾Õ}ÖBneŠâf]F;sw ú—íaûLxWÃï…ì¾7øÖO x·Ã3|?Ô´ÛÍZMcì^»¾MKTÒ<=y­Ãª^xtÍtoªm:}KN¹¾Ó/g›O¿¼·›ó{Áþ>ŸFŒiº‹Éq¥¶æDTGšÚBK+Û™0«1-"g–bqÎOÒ^Öô}{P›JÒî¦hN“mª¼_d’E†ý¤žÖú D–Ñ!ím¬/ñÙf%ÆAmè¿©ðçbå4«`3<~ƒ¤°xü%J'fÿÎlOg^x·™xÓÃÒÁÒP–[Æ9Oå4jf¿Ø5©ÎxðÆ5Juh©ûwJžœçNa ór¯Í­!î´}R»[R/‹¥ºÉ$oÓ\^AqzðÊcŽÊYo lw7Ò{;;BX§}:éL¿«°Ç†?cÚ Bðž‹sŸ |{-iemáŠzÇ•á/YA ·Ç„õmFþÃÁs]X9æðŸŠl,µ{ǹ·>¼ñUÛÅmôñ·öFø_ûF| ¿ø3-÷‚­uöøu?…¼ªkšm…‹xcZӬ廤ë«áûؼ=cý®bÔ5­/N…㺴k•‡ì×’=ÃÞ🈬'ðíàðyöYžä[Éê`1¸ZßPÄJ†>†:ÑÆSöU%Fxw)Î’u%ÍGýúý'ñRàü¯6༟—â2LÆ¿öß瘬“?Ág¸ÚØìU-z˜Ü7´­+ú1£‡ÙøÜ=Zõ¨âp÷¥Jrþ¦þ"üIý—cý"÷à—ÄOxzËÆ7úׇ.ŸáßÂé‡â¬:¦© wZ¥¦Åcuk¤è7WwšVq­è×:þ“ Ö’Ëw§h‰~³éÚߢiw¿·—ÆŸ YýŒxwöSø[¯iº·Š&“Ö÷zïÆTøá‹K?>}Éc«Ïàɯ¥Öt ÙøwKÿ„ËTv¹sivÒ,’6_³ïíooû2ü{× ÜøÛKñDÖ¾ñ&Ÿ¤ê–)ÒuÍ+HÕ£M׆‘}¤}²{Mâ; ¥±³ô;ù´Ë/ôƒø»0ã¼£„±œOÂç¸ì¾†cÄY&<9ÕL%Fµ*uñ˜ÊÔWº¥ˆÃËZh¡e’þsñד㾖ù¿ŒuàöO_‡øk…ø£‰iTÍif™ß á8Û-áÜ/–á8r†6qUñxÚ“„°øª“UaÁIa¹0êÇÀ¯Û7ÁŸuo|&Ñe_ˆöún”÷~'ñ+¨x3Iñ%åµÂiWºÍ·7ýžüiaªµ¯‰¼G§i^†çÅðÜ ®n­¯o¯¬üY¥xËOþÔ]/P¼³×ôé-ÓR‡J¾‘Véa–/οøA¯þ êSü^Ô>*êÿ <1­Øi×~Ðô SÄúŸ‡t(c³Óu}eÒÛ_ÖüC«Òê×w:‹^:^ÝêVv:„v¶¶vw]½ÇÄO|Ó®¾+øâÄ¿ÚwÅæ€Þ²ÑµK]máð&•«\[ß\ê÷ ×öe‚]ƺJE nð˜ÞRÓÛKr$ÐücàÿqW,£'áì¹æYŒ0´óžÍ–m›pÿµªÔqØLÉc°•8nt±ueVuqü¸wNÔ©Ö®”Ï©ñ7Ñ£Æo 1<[Àþq¯„,Vâß/¤ÞG_1á_ ¸'ˆ1Ž|]šÎXéæPÊéfkê8üÖT(ÎqÃa0õ¡]aåÈ~Ó_àñÏÂÛý~xU¸Ð¦×ãÕãø€`¿ºñv• Mso­øãÂZï‡í4Ÿhz«=ÝÖµ¤øO–ÃóêZ|ö÷šTÞ¸ŠkŸÇKÿ€Zg†ôRð_<}ðÒâMBïûÒãTŸYðúëOjeÔåÕt)t½nÝtÈžyµmM4=wZ£³Ñ5X¾uýéý¿m/ üfñÿŠ>|UÐ>4x{âÕΙo­Ø¯| ¢Ãa¥øgM¸Óô½NïL¼ð”Q‹? éš¶«¤Ù\%Ί÷vš£Þ^µ¾–²YØ|#ûv|;‹övø¿ix4ø øYñVÔ®4›ï³<ú“â]6)¤Ö|=p†!k»õ™ôID-pö“ÞA¼w6Wó/ù/â·þ*}óüÛ>ðË=ϸo!Æçxî!â^槉áŒ6Eâå[.Ãä4(Mª¹^b'‡„纒²§ q¥¢â?þ‘Ùo|/>Áp‡‰ùöcáµy7‰¼;Œ–—xš¸K —Uâ¬Þ<=aha–m‚ÃÓQ­—àp41™‚§έJ”ã'ø½ûVhW^øI¬j>6øWá/Z¥ü—×—^#Ð4;MSY—FÑŽ¡¬ÜëÚ—Œœü!áÈ¢³»¹×ä7^Ô$°ÅÍûiÈ‘Góx]ÎÉÙÑæ¤Xe1#1eL33 ‹ò|Ìǃ–5ý|ø›Áë­nü1¨OjðI¥}šV›R‰fžk[†±\Ï%¼–ñØß˜´»¸oÒëQ¼‰ŒVvëgfŸÎ×ígã;oˆ×‰â߃Ð|6Š;ÛËk=B;K{†ñ/‘Ú-óø“N’m+Ä cµÏqgª›Ë›«»ZõnGäpw‰5â& ¾iþ±å2ãÕÄK6Èðô¾¨éT†"¥8:QªãNjT!Jr9II»Ú2m«xAâúíšqY{Vauõ*g†=ÊÊJŸ1¯Lð‡Î¯xÓHd¶‰ᵺ>z¨I£EÄr”càüì›@|8ô0ù¥i਻wJë¦Óu+,txä†3õ—sŸ „Q]•Xlc€¸’ ÙžVeDÁÉÛj:½§…/™[ûLÛéH|¿:XZu[«Y¥inŠöHåù÷|ì¸Â¨Çw¦Ý\%õí“[­Ô³¾…òYÞ×Ï{U@ï,nÑêV² ‹¡”ûˆ5óþ,a±¸<¯‡jчÖi`pUáìjEU„EJIÚ¢•í&¹·~GÍp¦:¶ XÊ>ÆžƒÌ£‹Ä?e :¸ FëSž2U¨´Ô9©BïmM_ [hš~§=Þ»§K®À¢žÖÞwÒ¢¿”\MwkcqxÂþE²ŠæåÌñÅÍy6ÜXÌÑÝÃê^$ø»âÿÛÛè£Y›Lд¿šÏÃ:ŸaÑm…°¼—V°ÙÅu,#È_Q{ùÌM;-ÂK$’¿Œêš|’ǧß_Ûɧ[Ûê‹ Ý´sÝB·bÉs%Ñi& à20–'2*ª–l+gÚ6hʧkyQÏ Ÿ.k:…ž»aâí[Áº•ôwš;èqZékkwdFÙmµ¸j0Ãæ²mSRxCguŒ±¯ç<ã.+­Ä°´2Þ¥œåÓÁfåΖm˜Wq…,¾Xˆá}Ÿ= eZ1—?$áí.”¹WóOx/âµ kÇpFG—ðVŠÁÕÇætêˉÆÔËñPÆR–"&©Ö“¬¹ß<ܦž“š©ÿð^?ضo‡8°ý«¾hiÃ¯Š·–ZŒ4Ý6Þòæ?øßû6Þ=1˜ZG<1i>-Ò, ±Ñ¤2m·¼ÑãÓn§»½ºûuÇáVŸð âÅï­sãݲHŸ ´MgFðT‘=ìpj7rkVšÍËëz~—+ÈF•£_ØÃ¤êº¬3A¨iš½Âé³DÖÓkɧ~Ý|9ø§û_üføO/†¿ioŠº÷ÀFþÄð¿‹< à­SUñ·\Yjw¾-¾ðÇŽ4ý*ÞXéóÿkÀ.¶ÎÐÏcl±ÉyÝüÓt=R_|½ðÖ›­økWÓnî´-£Õâ¶ÕtéËKEÒtí"!›D¿¿º´‚×RÓ®¢´Σ¦\Ky²Ûÿ¡_³ê¶iÆ\;ˆðçÄn1Ésž0àÜ,£ Äy-j˜ŠY…JwÁ`§›×¬£8âp˜¼=*—+´hâ”Ô›QšþÐðš®uâ>;Šã*8I×Êñp©žã( Ž6yÎW‹Ê0™ÛT£Nj˜ ö†–;ª²ÂV„ ÔŠü’ø5ÿý¤~é^Ÿ®êñOÃ^:W†àÐ,ø ãû7Õ>xºêõ[6öKq©k>×oô{†ŠxzQ5£ŸL–í ÜF´öV?دˆ^(pL³ÞÆa§Ê°¹ƒx¼.LN (¥û cÄ8ÆœkEAÊ2wQ>c)úBÊ~qÑ· àsþâ,Â8>&Éa„Ëèà2šO±¸œÙ}NXŒ77Qâ©â¥_ÚÂRœaíáBQþ‹þ~Ûß¼}ñ6Ç㎇¯hÞ1ÔBƒÂúVàÑ¡Áªx_G¾Ô–mZßWñG‹&]nâû\¿¶¶º†Á< á5šÓO]$ê/eq&µ¨zOíã=Gö„øâvÖ|%e{à]O¶ñ†…¯h¾;øqãH4ë­"Êáãñ<:47 Hܳ%·‹$¾ñEšKQÚ›‡üO^ø/Å&àï‰Ú6¯`|)â-cļŸÃú—ˆ¡Öü3®h(tïÒ4Û}:÷XÒ¥}_MºÑõgHÔ­>ÒgÕ´íZll>ÈýŠ~øããm§ˆgŸâ¦¡ámFCe­Úx[UÖÓž Ò.'‚ÒvêDŽ-ÓBÔnDžt¿Û^ ½’ kí)c¹Ò¯¯ýÎ1ñ*Í2œ»ÄþRÇÓÅeØjYÖ0Î]*sáúʪ¥†Êpò’¨±<Õ«N:Óœ¥)sûHÊþvú@ø_à×…y†=Æe8b¸× ”U˪q.|¶†6®c“eXY`²¬m9ÛKŒ•z¸ŒeZµ”áCÙR¥ø†ÝOÔÿ:JSÔýM%zGé/ú¸QEå˜ÎH¯¬ü£Ec£ÙéèÄ%Å¢Ku"ãz\^ÚÈ1¼s»ªÜ4A•`ÿÚØ#äÄ;]O¡ö„î¾Ù¥[ÜZÜJÂ+8Ö9&RP¬¢iX²é¢’5í ’HV¯²à· xúõìZ]HmuÍí[Éü:Fíé¡÷¼ –ás_íìtÝJùEl=&ÚúÅéɯ>of—›Ý]‘ŠÑt§´KÌ fÕo"¹“1™"ÔáŠöõ|¦. 7j"&ƒÍónæ …Ã¢ô–Ò[E*ÉíÄvóH5i?k*ìD6rÉ)I6,ë¾%[  Ÿ»r¸R\Çöˆå¶3&éÖ ¥·vhn£[›¸ÜÊ®&³Nñ†EãX]¦È‘"H­ZIUâ†t´6Ím ¶GD·Š[…µ’Hgè|öÆÓM¾iI‘ä'Øâœ’¯eõp’«*~Òõ)Õä’æKÍ{¶æ¹¶i_ç§Áäl1Y¦6ž# Ž–oRÅe”0q”)ÿiO7“œ£ºTyå7ÒRMÅž¯ZÓôa¨¹²º1}¾ç³–,Ñý²å£-çÉåH'ŠÝÝ%D¸ñÊžf?råsc´Ó®Ò=:œk6îíoé Ü4ÑN¾XÚø’| Å ÄË@³:MŒzn• Ø:i¦Dìe’ÆÂ+‹¨âòí#ŠI$uŠ(†ÆQ#ç“ð»­üGñ ýÇŒ~,\èú.o-‰Ò_M`úü:‹Åiw¤i?m%¼ÔãšÜßZÙ¬’‹[«æ™Y•æK繑þÇ2­ÝÖ–ñÚ¤‹-ÂZN>Ëeý£vàMh-“Pd’áæ_:ÎÔIu"E…Žn“J]+KÔõé-’Q{­-¶ød¼q%‰¥’)|•‘#’asnÑ)HçòįöxlÐÏ åü1á^3S…2<ŸŽÆUupÙf,ÂàòÊ•\¹êÇSŽ7Z¥W*Šœ©ó¤Ô`¥?Îø‹û7„8²§põZT)JO›dëšYFk†÷Ul»F Ônu§Š<‰µ.m?L~~Ò?~XøëIÖâÑc]"K7/-Ì1›%Ó_!šK>ÒúÆhôíoG°’+©l§v¸Óâµ™ÚSµ/~|ø_6‡áü=ðlÚ_…’ÊÓZ ð–•©]jzd×ñjÚ|ÿaº{û×…î/¬&†úãϼŽ) GRð|/ãoÞjº^mâ~ 3N>*¶Ò,쯮äû3Þ¯‡I{öw²½k=ó–w"˜aeŽÚèEat«ó"Y yÔÂ#*# ªD¿.Ädf$ÎI h‹B,cŠ·i¢º<Çk™‹o‘0&//z• db:6³k@“\ZÀ"€2[‰¢‹¸!FTKvµ¹RέTu¤Ý|Ɔxí¯. È’{yV5†i¯![(Ý‚ÙO1/.qöxü¤ùœ7ÏdÄszøŸk„§ƒ­‡šÁU¤«*’Jœ¹Ý^og¹­n[mö™úÇçÔ(fYv jµ|.i„U0™„h,}­8ºµjÏ Fj…çJ3‡¿ÌýëÝ2 d—ySp#x¢“Š'[°ßÏØ÷¬|´ºxä-¾Eór«­^éÞ±Ó¼K«Ýص¥çÛ¥´³[W²[#›!gi ¶=¼÷ µìÒoqwKˆîXyo¹â{_[Zj·eJMö›ItÕk¤Ô®n!´ž yç¶,“ >ÎcB»È ×ÊÞ&ñmÿŠ®äº½vH¾í¥‚<†Òư*Ù¶ÝÆ Ó¶C\ˉä&AÎ\Kžã0•ã‚ÀN*„¢ùªÅ¦Õ¹U”RÑ»¿µê™|GÇ¿Ú/1ʰ¿Y£õ:¾Ây´”÷öŽšJ;Ú<˛ݺÓS¢ñÄj7æòÒúûM¶ûDWvЭÓÉ"M¹x¢–â(U¤H¢9´‹|Æšf—ªÐ>0ÉofÖÞ ÑãÕ&–ãÍ´3›{å2Ï$׋•â ;mÅ—ð«ßKá)tûèìâ×í@Ô<*Ù¬µ-!-­,˜ÿi~ñO‰ü;sqis.‰âSHºŸK¾ƒRÒä¸Óµ+»YÃP³‘ío¬ÚHXÛÝBÒÛÜÆ{id⑾Ç6̲ \)—eXl,óÌGÕëR£Äù¥L?öÕ\>VâÌ 1ËoĶë]]«E$‹4Îv4ŠÂ2Ñnxõ/ŒwsÁs…ŠÚ²¬V×Gl— s22ÝÜÊ|¸Ô³¶@£É@^BÀ¯‡î<ôç¯Ê1ø `qŠMÇ‘“Ï^zý}qÛ=+,4å„Äb±XyJ|dÝLDù›ö“z7Ë&ã:AEußSX¹Â)Â¥XC  'eïË'ÞÛ­šú߈µ-~ðÞê—ÜÜ„–rP§Èœª³Üä¹ÉcÏ5†\s´c'ÛüšŽŠn¤å)JR”¥'väÜŸ}.Ú[ì´ì.k¬œ›m¶å-Û“÷›v×QI'¯jJ(©nú°piâB8=Fsüê:)4ž_ø‚ºwM§f´mhÕšÑõL¼·¥4]ác,ؘ‚2>^3‘‘Ðígš®ÒîÜH$¶ÎKgqž1É8Âÿt6r!¢Ë¢[/E²¿Vµz^öï4äÜšÑJMÊVÙG™¶ùb¾ÞÑ»åJ㙳Æ1M¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙtiff-4.0.3/html/images/smallliz.jpg0000644000212300117540000004011706747424643014154 00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀ€€"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ü.½ðÍרßQ†DœÚ¿Ø¦H¥ŠG ×BïÎ>ê°ïŸNBæ7XÀ`W´äÏ'n1œþµÄø3âoŠo4ù|íW§6˵ ,°ãvù@‰?{‘ƒµˆ#8nÕÒÅ©Mypêf¹v78Á9äžF2?¦+üöÅäxü1Æà3Ç,“¤áuÌÒRW_*Mꛓ٫+¿úàð—Æ^ñ‚òî6Ê2Ÿìhñ½—³•Jrçû|«ÙÍ»µÙ¥ëÚôS4EÖ^r ‹ÇûM€>»‡l×Ea-´Ñ_Cu5¤ˆ~Y-î<·~O(FCG;r ëŠ÷-R=+Jømeâ8‘"ºÄ‹sDç~Yä‰â“sí$7ÝUAÍIc«| ×ná¶ñ6“ 2\éÐlÕ4)?²§Žì¢æFæX{1[t%ù å¾6YßöŸ´¯,¾¿³j¸9J 5ö)s{–»i+Jíoä~«ÏgF¼°ŸWž&œ£h¥¥ÛjÖr·Dûv½ˆ|+ã-^mE!†ð2Z+qÔ®Ÿ2 [$¦JíÎ9'ó_L|)ø®Øë $ yžHf7)ïbo=Y¾ãª¶!` n‚¾VøSáŸüAñ~£ásâ)thVQ.‰©\EËpŒJù3ÃæylåI«2î9 Ç?£^ý|?á‰,u GW¼ñ rF³¸rС°Áž8Ô„N0 “ØWÂñ&IÆRÄ`¾­[ÛÖ¥í}8Ùû:‘µýé‹‹´£«O™ré¯Ïq¯pž &e†Ö±ÍÓ£JjMÔ›ºt’P’oGtÝšÝêš¿iÚ“ÅiþðZÿf¶¥ ¶¥âhD\e ÖvE~ô¤«–œ‘•p«¦¾-ðç„´ý[I×ï.oñ©X[›Øî&r]årYËž®ìä±9<œf¿U~"üðíý½ÊYéñ܈Ë4 £3À›p2Ê F H;‹p{þgüCð&·à jkwŠH,n ÇÆÛ•¡<…™W :‘‚¸ã® tpò|¿/\3•a#”c¢ã,Mz¼²–.²“æ©*š·îÙ([–1ºQ»“~GÕáüEÔ0”^]ÉÂNò³zÃK_»r¿º¼­ãY*ß(ÉÝ…¤œ_exæóôÑt‹ƒo®|@aclªTH"„W’®âªÈ‘oVÃd—tù?KÒ.oîÄá]ñ ‡ÀýÛà’ƒúŽ+Ö4¹u¯\ØXÄ.¡ÿ„;L6VB×zÌfi.¦‹/nÌO˜“ gJ•«íóêTñ´hÑö‘öt"ªb^ABÙsÅÛš.§*ê¹\žÈûŠØ)Jœ¡ˆ^Όӌê6œbº»ÆýWmì{ß´/ x?öÞkˆ¯õh¡XÖÉQ.nçiß&ŽÐqŒA?Þôì[ñ»Nø} x‹F‡Ä:χ5YmïdšÊÊ?+í%þT–Hœ|­À@2: æ¾\ðŽ“âK}>X¦Ðmµ"æñ¢Ôæf—Vµd·‚Vóî®K*eñ ˜f/½Hrli‹oáˆîõy?¶µ¹†á¼ù$²ˆ|¬²‹z€Þ™Å~]˜a)VÊó,­U©^µZެ+F²“•J“”\¥»Ó‹„ääïÏÌ›Ö6GÎfYWžpý~ÆF¨U®¥|ŠWjöiMI4ìšz´Õž§ÕŸþ=ø»TñdfÇSym#!ÐùbD‘;’¸ËaI<~åç‹ouKšy~×¹"†;c·ó²ÈÝóžŠF9ë_)i0x‡Æ·ޝ+Yi9·ŒAfêZìeÖ)™£V Bœí xÆ+Õüã[ÏÜêúGŽ£6ÇZ‚ ,î„hè÷VÌÇ9Tyd9 Í|n;…ðÔ°Ø<6Ñ­ŽËéÅâ°ª\•ã)Nþ÷´Q¼£ :žë²¿TÒ8ëð¶[€Áå¸,ª7¯‚§Ô£Š*3”›{E«;k'{iå—«üSø™ð«Wµ×tf [@2ÿ¥hº‚`I;¼¹ÇÌå… »x#<îçÜþþѺÄ)¿âYq.…­Ü&ãEšuò ”òu+&ùÏÇòߎ´Çñ=ýÕ¥ÚÝYÙLûl"´F™¦”çËgHÃ0/¹~îá·ÉÑ¿eÏŽ3]cAð¾£ocm•¼O,ßd‚Ú<ü¸REüœBØ=§ÖÑàþ⌞+¨àóº4b£^5zöþuN>ʬ¢­Ëø×VæŸ*ˆ³ü³…± Ç×Âe˜Ç N"¾"’ö“½•á¹Åÿ*’Z·Ê½æ~@x'Æ2隤úf±ÙEÌÙ†PcGŸ˜Èç €yëœ úý7¥j6¥Xnfd$lpzãæëÀíØçé^ùûH~ÂxzêKß ][^E´3XÁp”ƒÆÀ2äŽ27g¹¯‰ÂŸ‰úÉm ‚ý˜Ÿ•TÊ¡WÔc;GbHíÞ¿±1¼AÁ¼uí¼³6Ã`*Wþ6%Òæ\¶j“« Ùÿ7Egßü¿ðGˆuk[ÓôMN=¯ wwâ"ò+©\¹)'©}kî]ŸéCAÑnY}ÎÆ+y­%2«O䑼L¸V10rA_ŽñŽ:xˆª¸ 5)b(T–uyTa8ÝNð”[sO›M#g£ßCrêyž3-ÄTÃÊ|1âjâ*%ì•&¹yµSºr³´R{ô9ü\ñ™©K«^êXŸ#ØÅâMÌþ[vœïÈ8üx® Äóiß4Ä–ÏtÞ\Œ¨cd ³2ʼnŸN: õOü1ºK ouëb÷çšÖç‘&2–Wió1ò‚Ià+Ça×õ‡Ú&¦4û1õ9¼í>ææ1s,` „ù8ùrሠž=ñ_O *§R‚«K9œ©Îž'žœ0é·ö¢Ú«+5vÕíªÒë«%¯•Ï©dóŒ³?yRœI§&ôמúÛd´ûáÕ~Á¡é/¬éqOkqbí#3Ç(iÒÞÊÙ` :†ŒÜG^þEá*þÛ^ñeÌÚœÞy,à˜[£"Éq& CÛ,BB¿»UY Âeœ8L`nÏSañ[âÍ©ëjñ›˜›ûúÚ4ó ótÿ"Fwz†Êàtæ¼÷ÆZ­Æ¯¨]jóÚ¼)qqq5±†.ÉÕE»ç…ˆ!rîÙ€sôÙM î+…̱¸|KÅÅÒ§Z”§RPJQ›-xC^-+©-_.‰£ô|« ˜TQÃc«Ò¨êéxʧ*vpMh·³óî{—Å-Cáömáý?K‹TÔK½_YºW’Gšÿèñí¸o TÞûöm|=5ÅÖ¡ãmøÿKŽÛK..4¶‰ZÞ1nª ÆK<˜•“n1œ±ùÖ‰ºµ¦”ÖözŠðýŸì×72[}ªF“Ó9XäT<€?7Íà‰Iøqm§†²š]ü¦øM*ÃE;;¼kÞU`ÀI$”ÖyÎK‹Â`èâp8 ÖÅTÆAb§ÆT'í'VR‡3„`šŠŠŒcÊåUÖ5ŒÃÑËñ8KEÎSÄ(7Ißìß[ò»^ EKš?ïõ˜5oi¶’Ú_­Öœú×Ù∤qI>P˜«2œ“Áà±á% ü1øGáéæ½ñ-“x—Å$Œ- ™/$åD©mk`«¡‹vïµJÒ'ϳ5Ý_øžþ6½“ÁÞ¹·ÒnKÇ4ZËMqhªŸ! 2C•(A0ÈÇjô‹}/Ã^!ñ5ÔÞÓ ±¹ž?³Ir̨®ùšIÀ2ª1b¬Ðµîž ø]à+ËCMÔ|VñjVmåj:@½²ò¡Sóùÿ1î*ãs1;‰5úÞE“apo •eÿVª©EÅf¬¡SVå9ÎÎMÝ´’ŽÉugñŸqnŽ/™fÆ×Æb§WÁÏëu½’§IJ’våSœ[ŠÙI/u~Uü8ð/¾ èšl¾ ø=®Kyæ…º¿»ŽÙm®Ä2KesÎ8ï××|Gð{LŠÉþÑðO[xá…#ºž×IŠù0¬»•m­Q®Ž1Ÿ1bhøÁ%˜ûïàŸ„^KØÎŸf³ ‡´hè¡‘” ç¨-œaqÓè;á&ƒvRi"ŒÈBIä$lT°^ôuòÔpÅÀ€¸œ†”ø3‰«ƒXšš´'Œj›£FKØÒ\Êò¤¤¹“Kng.·Ðü;‰~•ø,£K/O O•áðõ¥^k RO–<”Üæœ½ï{Ú9Å)+)j×ñ‹ñûà/ÂoxJýô%|?¬iÐM9[<ÛL²Á“ Ì"š9·KìuVÃ.Í~OxÛJÒ5”ƒÄ6qc¦Þ˱˜Ú//ʕЖŒŒõ‚éë_ÜÏÆ¾ø»ûFh¿ |Gá}ÿÁº¿‚õŸøI.-æ²²Õìîça6qÂ/&šDie„lª^PœÊŸÚ7þÃðÏá5ÍÇôoxš]jÌ·%—[Õtµ¼™¤òá†Ú ./–ݘù›’c ‹ `rLç'Âg¸ØŠØì°4ªó_ û9Ô”¤´KÝM'dÖ«C÷¿>”ÒÅÐÃq=jÙeŽË^>/ØGÙâ£6¥ -´¡Ë킟¼[“ºþt¼F–r\°ÒÖ鬌>t2Ý¡F–&ùD‘‚ ²Àp žFkêïØÓǾðŸŠn4¤‹y,ri·±°UY>Îñmv$-K•9 îÛÁ¯¼?iïÙ@ðGÁøSÀú—¨ÜyºŽ¿/‰ôýº„þ%Ðm­á“@Õ-oü´¹Ó£ògò¯´g†8áÓÉyQwŸÆ;Í'\ðî¦ÆKÛ+ËyC#˜¥F‡xb¨[ ¤a€$ ó#‰Áã°µ²ïƒF\ðöí^|¿ œ]¹—2´œߥ®bp×ä~-pì«`\¯WÚÓ¢±5i:¸ÈÅòÇK“á£=Nó\²ÕjÝ}QŸÄþ(ð§‡leÓïtÍsTÓÅûoó%òb'vvÿÛ‚z÷iûI|:Ðeó­›•í JäyVû6?€¾[ÌÃòOÀ/‰:ÍŸˆ¼oo&ûd7ð@dÛ3º[© VA(CµüÖTdÞKdþ‰xÏF°ñ\ÖgeÔ¯ïäŸË¸Yc2Ã!ó V*Ù-Ã8×à<[œãrŒö”±.p¼ÛK Íì9bùW²ææ–¼Ž÷nîý4_ˆÉñ\ÄyRúÝ8á)Ó’R¡+΢甜«6Üom4K­ÏÇ›“¬Å³ù–â{Õ6a2r¡²9Þ ŒƒŒu÷ŸûN×Y¹ûެ¡¾Ð¶ùHS¶á3ç3wò¤“ƒŸ¿¼yû=E¦i+yyö5•ÜÊåVÚûraieÇ÷A\ n¯u†ì·E­a•!š(.Ã/”“©f ÁIq•F ª'Œçúü³ŒrœÒ.tå[ (Åûõm§ï>{5t¿ºÝ£³Õ?Û2>-Êsj_XÃÎ¥' •GÛ¿+¶‹Ïúgjóehíž{Guie_4EÃ#¨©?2²*³ülÃ+ž‹Âºv™ ¸¼Ol_cGö¦áøÉO”dr=¸Áí_GÜxRþÖÅR{öw!‚!ŠI|Á•«–Ê8ÜÁË6WgÈüGiw¥j:\úäO=­´›äŒGˆUsÀ‘S8b§gʯÊßU¥ï­»z»ð£ÄðxVýä³Ò¤Ôt•ƒM˜l2c÷žÂ6’b 9"DPHÏZý8ø ⛿&¼ÖÓÔY;]V})ôÓi¶2¡$’qã–S·NÉ ù!á_é~×ä—R±žk/>TŠk[Ói¨?– Ú4Ï)v‰Œ8‘—–7cÝü1û@øÎæ=ZËCžþÆÏScBæ_³iðò\ÜÊå%¹dPså•f`岂¼¾\NYœÔÌ)}RT½y:‰{X»§&š·µo™9s.žáùp…lÚªöèT¯ Rp–"2›§M;ÝB2§Í¶Ý›ßínz]ïÆÿˆžñ.»áû}JÊÛPMfûì‹-¿˜^&ºvImzʃ±€(H#vsާÂ_¿hoŠ^?žM3Æ7ZDp[¦›}¯y^MÔ:w–ŽÑ¬lá‘D…°ä8·5ã~Ñ,SÆ6þ ñž¬š† n¢¹“X»m¶xšEÈSrÛ˜uH `ÈH2ýñÃÏx†Øø£àçŒtÖñ|úLK©ø~¨,¢Ö-ke‰±å’è~fÙԒÊ᧩ŒÅbðyN+FI·Nud¢ Ú»ö6彯îÝ6›~êjÇÆñmLŸ†«àð8œ ŠÆãh'KSN¦ ¤£ñ5$â¹’”¹ª(«EËE§õ¢ivzl-œiú)Àl@$Ÿ§P íÖ»‘©ˆ,ÌUã}¦ ò8‘”Ç#Œî<¶HÊŽ2OJþj¾)Ácõ o4þÕ¼ŽK¸c‹ÆÚŸü#ºµÃÆè>Ño¡ZC¬l³‚#$ÇÏÔàßå€Ò(ȯ—!ý³?n_‹íÖ¿×Eð½Ömu>o¡ékÝjÏ5àþÊÒõíP»žÂ3[P1¨’Ú8Ú5y–¿°èçðª*Xl.•;¸Î¯¹F“JüÒ¼¯eÓ}^Çø‡Žá)ãªAÔÌðxÊ®¤dðøYOŒ—¼šTâšN}ye{E=SV_ Ÿþ3øÀ_ðUÍ_ñ‘uw§èž¼ðÝ¿‹"Ö%tÒ5««1ö}5ôH F_íVë"VšQ8SÆ©è!ý¬þþ×,î¼[¨xÿá÷„¾ xÚ èí{{¡ë¬ŸaÑ‹âU›Kñl^Êò^8ÙešgYE~gü0ðG‹|k¬LšïˆŽ§ãVòßKªêq_êþñ>‹%ȱK}gN°Õo5 ;Ø%òüÙäPZISìÀ¢Èߣ?³Î‡ªxWÄqjú‡ÃÏ øûTÔµN­–®Ú–¤5[k;X|2ãL¼²²œ FFæú×Ά/.H6 ß fPÌ• û%¥[©ˆÅa£wÎ\Þÿ¼Ûm_•(ò«;ÛSôÓ.• F]ÿW³I,.KG+Ž6Q§ ËÙÁFN1’j“©7)/y+.{+½ïˆ^7ð‹ô8›ªÁ}vÑJöRBÞišk95 $–êÝ–(£Ù<ëqnÁÙ@¶EfÙýbé_¼1}càÅŸ µÏÜø«ÃÑO¯ ½@ÒuYJÅÿüî¨án$ÞÈHR_€Å³ÇãÿüWöEñïÃþÏz6“¢|7¼ˆËã»-"Åí5û ÍJñ k»1QD`X¦vvbd\ü¼Èø¿„s,]³<޶ìZ†cS S£„éƵLUkS©)(EËšP\¶j\ªWý÷èñâ¾_甸O7yÞ[ŒÎé}C†+愪ex:Ñ•HÞQçŒ]Z“©.G7UÔ½6Òœ`ć°^Ãû]|7ø{uu§OlŽ&ÕSJky£F´„\Km#¨’0É÷™J–ØGÍÍ~É|YÒõí¢ÑG•}h±Ïms¶Ó¿–¡A™v¡Ï8ÁÇAŒ×æ—ìåû#_ü.ñŸí1â¿Ø?ÃÏ ý¶K­FöGד_ið[º,NYämÇÉi‡Î¬ª7-YøíûwkºäÒøcáÆŠ¶–žÊÛXZMBæÎ6e‰ ¶\yJÙ;C—lAæ¿&âŸÅU2œ/ â)c©åØxPÇVt•%S ÕNyJ1\ÑRäm^î-Fí4ieyñÇR«”c!árÕ*¦cNRxiò)BŒ¹]ÚTÔåå%Λ²š·oã‰Éá™îôÏjÒ]]…Ž9ô«›xÄqÜMÔ±*ážHð`I·œ8nß=kü6¡kagº¼sk|$zj@€xåso0’Q’U#,»›?'?%ë>,Õ5!0ñPžæY¯Úù5 ©æ–é&”ƒ%°‘œ±C÷¹'@àdTPjI ßö†š¢m@\$v‘° ˜Ø·Ú´AT¿1ƒè`<;Àa©óbå[^JjS…:\é{©Jœ‘mskŸóiý'•ð-¦½¾"5ëF)Å(òÆm$¤”"Õ“z¤Ûí{ŸWê¾%ѵæZø~ÚÖ'pc6Ú‡Ú.7ì_ßl1 ê1•@¹R3œ×žøÁzµÝªÝZj4w »ËÔP/wk3ppÆôª/Ä{«(£”hÖSK-gÔa‰L$›æ`Äwcò‘Ô}kÐôÍN=;ÊÔ‡^wŸuúMr­ F@Qae*€+/@={šÊxLnIR3ÂÅ%%Nßúɹ6£d­}5v[«M|Ëñ ¥+Áŵ}bþw¾ÏW3Ìü9ð}|1mmâ]vóG×#’ÜKöXî²Ö¥H&UŒåƒŸ1eÆr8¬ÿ|\ÐçI4è¼;måÀñ[[ÉÐE˜¾ã³(\´‹ü$`g<ö›ŒÄ—w³éÏ—}?ìÓÆ¥b„UØ-ÈázFOò^ÜÊ5?“ ÕÒ>íäbénKyŠ–˜ççUb3“Žà}ü‡C7Ìœø‚£uꟻ¤–ï•BIE§´’¶—•ŠX©Mˉ“Ärû²æµä·édÞ¾ºè‘§¥ñ5ü-©x—EÑuøC¬Ñ¾×©EbòXجr”]K’ÛÊìV*cEPhêqôÿ>?Ñ´–0A5´j¶÷j’-äq‘¸/ ч ¸‘¹r7ž OàŸ¿>x__øvÂÚn¯g}c©hº´&â4’ö$‚&T9XÝÑIÆârAËè¿ J•ð8Œ:y¾O-u/‚œ“•GO’<ÎòŠ9*ªvP“‹ŠRm6â±¾üXÒV“ʃf¿qbýCàÏísu Ú=ÿ‹´ýO]¹Ñ†• ø]SÁúýäè÷6h¾*Œ‘³zÖìWM°·[‰g’Hü8ñíuá?‰¿ƒ¡ñ—Ã=ÚÿÃ0Ùi¢;[›ùlõKé¥U—Q¯õõý!nÇiñkRÙ—+ç^B2OЗß~|øªt±/ŽRÐÞÛ]Я<'ãÆÑ¡y/,íõ±éúN´|e%ůö„ÖÐ[j¶>"ò"Ío-´>j°þÎø3eô°øü%L]w¤9ÁrÙÝÝ9ÇußkŸóå–qþ†x‡šð~&–KOsVNJÕ¯ð»i§]ûŸÛ/Ã/ÙŸÀ¿ ´Ëh|'á½3F¿š¥k«}¶êS {ÙvË$˜Œ+3÷SŠôQàsâ(üM¦½•¶­§”µXtë)¥¸Bª?³îÔÈÖÅÁ#œƒÓ_†¿ÿຠ<;ð¯C¾øð÷âLj~Áxº|M†ÎÆìi´ßÚ3.‡¨] ,bÕgÓl¬ {ÍB‘f»Ôb´¶k"SêoìÓÿý?iIµ}áŸÄ[ˆõûS§qi¬iö7/c%ÚÈ šN3÷•™¯”\#•åÓ¥C•T½Í¹cÉV+I6¤Óê´wzY\çÆqVw™ÔÇcñ©ær¯Bu©¿¬EÑ«V.så·´QPz©Aò¥}RM~‘Gwáéc¶ûu´©s¼yRIi±T÷,ë£:óǽrt-+Æ Öô{øã¾ðÞ§¥ÜiÚ¤ƒZ\ÂÐÍòíÞv+n;Tð¤ÕÐøO[ðŸì^ Å^×ÝY#-¤jvZˆ ]B¶²É.ÒÇïøäóÛ«]<ù+” < ’Â6„D”Ê›dóFÒâ'`ŠîåH ¯Ö¥UøXÇ ‹Á<3i$¡ÏÌœ'²zo½ÓÞú¯ÉèãÖ[šáñq©^5ðx¸b!Mû[ÖQq'ÈœãîJÞëKGcøfÿ‚ëž#ø}âÛ¿ÙÚÆ;¿ xéÑáž)#°Õâ™å¸‚æg+²µ»ÃlG2Dàà©óFÓNÔï!KÝ3X¶:dÅÖ9'H®­œ6>ÕjdtSjüÛ¶ò×õaÿÛý—ãñÁKo^‚;gáýæ›gâ›h£]ÝxD\ÜÉ5䊊L–ú\×›îå%J¤ÐˆüÒSù>M+@½Ò[X²ÖÞ‚ãÉ»·½·xa·h>[È‚O7 ¥þR3ódWóÎ'„©ðmZ¹}.g…j“…hRö‘—µ”[R”T§¼¹,ù—ºÒÞÇýýÙø†÷Gžx^ÊòÚDßzrO6y v·}ØÉ&Hö‚|Ç“#®â„÷Þðí¿„aöD©, –?Ö¤Ÿêä‹%±±™‡qÚ½ÐÛÚÍ47µÕ¥ýü5¸ê8 ÆìDÚ€çn[vwp;ó~i÷úñÖù&}R¶†M6òÊKÈ¢Óoo´q´RM0ÊÛæ ±B’Sq6¹Fy[:Ìð4s:˜<$_%>[Æœ¡gï«ýæY¤µ\Ú£åñØøcs,$qõ#B3I.fùußáæŽ«]Õû£ôãà_ìÿ…øçñ{º×Â=-~.üK¹ñ§ˆ¾(|Cð·Úo´|ðŠMä U•íä7!$±’ÞMVÖ[ýN–Þ t…÷¶‚G ’E|vkƒÃ8ºp§ˆÂâ¹wus%{IZNéÊêýÖ—GØåtêc$ùó¼Uešöys-%ª’MËtºwÕ&¿©_Ÿ|eñsá·ÄM'öœøkã/…ÚçƒîþÝàÿxfÿÃ>3º°¹±†JÌ€[ÝXÜ]ÝØDº­¬ÍogäG{rfkxÿží;þ óó^½åßÄ; ¯„ö±Yi“Ç­Øiwb¤KÛ††Ñâ½Ó‘ÛÍš[vž'ãh³Tüñ§WøŸo­ÛèÞ‡GÔ¡Ô>Íá©üiñé‰ð”wsjžM?W·²Ðd°œÙÇ4ÂÉ–IœyM *“'é¿ÁŸÞøÒÒþê¶ZÍþ•¨4Ñø[ÄV¢ãD´ÖãEÖn ³Ô}Af4FÞD)¥²ÆŸ—q¥‡^Ëì«WŠp¨±-Éݾe­›Ù¦º6ÖOºÉ8Ë‹²YáéäŽa–a2êÿ]ÂӤ㇣ŠÌ`”' 2Q“QJ<Ë™¨¥ZÇä?‰ÿbOŠÚ$z¾¡àí[NñÖ•£}tjÓ¼A3ß@/íþ˧γÅvÐØ4RÜ*\Áµ˜¾va‚j^øá«iï5ø–Ö-åî%¼°œ… ´˜€J#q@¸Î_' ý9ê_ ~#øB;F_ ^èZ-Ö—©jßðŒ_ÛÚêß#MöKÔäG¨@š]ŒVh¬ “xmùfðýòØÝÇÄoÝèÚüÐXÞ-•åìvzMì3›k=NÞ0O+\$Ræ·Ê„pqóxÜ–„ÓšQ…¾Ì½×-U–‹[´ž÷ºZ»לôâãü£„£žåYfu_ R3y¾"¥EŒÂÅ{²ž—/²œÜoMÆ6“mÜþ}ü5âWµ3ËdU&¸€Âë$j9äl.ÌŽ=àèOuáˆ!º[›ËÛùQ®æò§u·bc(Ëòo ¤c·zûÓö¢ýš|º$ÿ>èréž €_]j0YN¿Ù¼vîêóK§cšÊñ¶3|ä-‹|áWóÛC}KS·N²ót‹#r«¨j&ÖIÚ)®”$Kä«A «(Éç˜òü÷>Ë–ué¹B’œ#ÍVMÙFú$ùyž¶åI;µ³ØÿP<&ñ'ñ‹…(qYÉK^Ë–JT£Œç²¾#’'bäÔ~>dåu#ë ü=´Õ´Q}%åÍö—áãk=¾•¾+1%VMðyPùÙ# ¥Ôu¯Rð‡ÅM¾‚ÃWðî«âMFÓO‡Zñ›G§ÛZ¾ä3)·ïeùpŒv–;‰Ú¥OÏÞþÎðö³aáñ“ñ¾š8ѧ‘ î±$ñ“ŸR t^)“NºšúÇìŒ#k©c³iLù3¬è¤&Ϫ<…+€¤ƒœWãX¬».Ž*TgCUÊ“«Ez’ås¨¯FVPr»TäÛÝs­Ïc3ËðØç‰Ãc)â(×T¥R“´T!-y\ß=îŸdî¶ì~Aà[o h@Ãm¤""iµ[Ü\ù„¥ÄétþlL5‰Ô[¢ å dÖ\¾“QøGñ@‹›Bá´}ZXàO2±=­»jÖ’Jû³)ßbGQBTÚÃ+‰û)kºiÕô†><]oSÓ“O½¹ÑÜ·G§ÝÁ SÜÛ†¸ 44Fø•åP]‚ãœ}IñtÛhß>#øƒáý¢½õ¯€õèî#³Ž5‚CqlÚ5¢ùeLLbžâ)s°ÈG#¬d¹Fa ÇV-'%Š…[ªµœ~Ô#(Ù«|RWIÞÇó7æØÌ¯2žO‰œã_šÀãê>\©ÎrTÿxýþg(´ãÞ.É]I_øýµšò߯~ ñ¡q ëv—Z%Å­Â^ÝjHÙg²¶´ÕSU·ö”ŸiÝ£´Qº‡iÚ¥¦øMî.og#[•5K¸,môH®-¦Ó$³‚ú2hµ&û6è¼¹/¢†0#†aMojÞm B7²¶±%õãÇ;À4Ñk§¶Ÿ{j·ó´w!®O2ØÃnÅž&ÉU©4¾ i·ž]¦§jVpˆÒöêò[›»5e· ök{K™Ñ¥šH§r?ŸD»™Ò¯2þÔN8|mòjV•9^œlÜõÑhûjµ¾ÇøÅÄÞñ§a0™—d50zÒ‹~ÚPSiÿ,t”ÚÑ'Ôèü?i®ø" B k׺DKvw‹EžÚæÚ}îi4Œ³+É/Ùošá–Kk„¨Hƒof4¿ëõ®¯ãÿ h­Ö÷Ï×áñ–œÓ\Ý9r/gŽD¿–YY‰F–YËÙÈ(÷/ xV[¯ ]k~7ÑÓMÓ {WR¾ÔfÒ4è,žiaµ¼·kÈ¡žöI¤‰ÉHayZBFÜ€+æÙ>)|/A£kŃGƒ]´-%•œÍqdŽBm’{È]ËóGæmÌeN;˜xüCÄâ©eòÅbg†©*˜ŠŠÓJ1vp‡,R³m;oßÏlC7Âaa:PºõTpò®¹!R³ƒjšm­yní{'¦åZxnÂOê2øRñJÅæ^xkKðÖ©0ð÷†çµ"UÔõK«qæjR(B›Ta·nRد¤þøö_ˆš„þ'¸Ð´oøËO¹Ò…¯†¼O}ª_YªZ¯—µÓCbKxÐ"½ò”¡*NÓ_JøSÆÿ±_ŠæÑ4$|<¼º·°Ó§‚âóûóÈÓÑ…±gŒª›©øûOú5Â8áŽÖf_¸¼7ÿàøAûChÃÆ >$Å øËL†U°ñ€n_Tº†âÐ¥Þ›s¬XYÚÛi“Ü1Œ[Iö@)i†Tçróbx/ÇÑ•,] VºT±Uáìç̞ѼRtÓ{ò¶Ý׳>Íx;‡Åû­S«jUh`èVÄ{$Û½zŽ›|©E«ói¡ùó©|sð‰yqwñáûé>3Óï.%JÐôkkiòvÄ’Ásnd…VP³%#bÙl[ý“ÿmÿ‚~øÁ¡jŸ>\á^ß/QñG…æ¶³×L¼#í ›ŽÎè Ã1ƒÀÉÜkïˆðHŸ‰´•¾¥~°[øº}3Ãðë«§ZÁ¨ëV–‘0½Öô›KÉ­¬Ä³;I$sKLfC(‘ã­oþOûyøNüKá¯èþ4³·¹O<é¬VÏg+;F„ÙÉb,ª+?“,£vrØ™]|–T¡K•ñPV«^j¤¹›Œ“’w´9V–½¼:Í+Ñ”éákÅQ‹ŠŒàœ”’ºi¶ÓNN.î÷VÓ§Óßµ?ü Á|Tñ§ÁíÆV¶Þ!¶Òôïµx›P2x3Á:eœÿ`ðå…Ž‘n²iþµ‚Gxšçí$Ä[ÌE;}g¢ßø£Á¾"ðWƒ¼{40k쯵í'Q–íÁÀñ'ñOÚ—Ã~ ׬ô‰4[/û6ËMá’$[y&žPe˜´0 Pò|ÃÐþ Ä\?›åžÈœdðÔêÎ55©^>üaR.¤¥9Þê4“Jñ³Lÿc<3ñw!ñg‡p˜ü›0ÁË:ÅRŠÆåøŠ–¯†Nœ\íMMM4Þœ×o[õ>Äøiaý§ãQ°–K[KX>Ó~ù7ÀC™e€6)y …Ý_T|Xñ·Ù~üJ²Ó- ¶»½Ó'¿3ÄGÚ/¬,É1FÚûä%·ŽX‘ÁÍ~oøâ^¡áŸ x¯Å!¹–éVÖâk7R®›iok`±À^·—L-\Hç3$¢8Õ·¾üp·ø¯á¯èzåÝ»êZÄZ´;n¤“u„H<‹K}ÊC¸‡Ë „2«Ûpíòe nM—æuéS«‰Ã`«FŽ"²»Œ¥RÕ¨4“wÓ•¬šZÚQ>OÄ,†§×(ÖÄEã(`e†Œ-)K–Qš•[o%Q¶’²j+Kݙ߶?ÃxO[Ðü#qk¦i_…ü-¦XÇ£x†cW±Ñ¢M¨žYËÚ¾>ÕµÁç`<|O¬xgUµ¶ðŸÄh,퇫>©iúa³—_Kû1¾’™ç¼ŠÎ2fÚK)£ €ìò-Ö~ЇÄ?Zjž-³]_ÃÚ£B HZIíµÛÙ WY¯U—É[D"þè(Y·o…ðÓOÔ–öÛÃÿˆüC«x‚{›]ãMÔRÏ]ŽED’ÆÊÎÓÍž[2)®.&e¾Ì»˜Ñçû'‚°K…8[ N¬çN¾.R|Cœ§Q©+É·6÷jÒk}véþUxÙÅð~½¦U&œ><‹0Ê+Æ‚ÆbÜ`¯B0•J5½¥Q;]]~"xÁž·º‹þkÙ®¯fßy¦ÙJf2\ÙE²É{U‰ !™’VlmÏ$~¼ø1ñÅß ¯m5‚þ-Õ¼0 ’ Kn‰vaÓî6º˜ßRÓ¤ÝÌlâ1(’?,€xÎýâºý‡~ëú‚YjÓ&µÕ,®¬´m[My`»°µ¹¶š/.Öw‰R0wmýæì‚G‚>Nø“ÿ¯³øu$úçµ{û9$Óm-4û]D}¦ÖÖ˜ùM¨ì쨿¼VùY$qðÏŠ¹&u ¯:ÆWËq”æÔòëR–U9>[S„&’ŒâÓn¤“Ri;Å/ì¿•>–_‘b2¯8‡*ÆÒ§K0ÎiQ­[=ÌiÍûº®½j”•WkìáNÍ«$õ}¿Â¯ø+/Åï èwz_¼1gâS^Õl$ÔüWeq§ß̉"yÉcœ‚vŠFEòä‡{±’7?D¾ÿÁg-þ˱nŠÞqtjãðÜ9ˆÈaŠ_X©<"«Ÿ*•V”ªÎ sFRJÖWÑ[ëŽßþ kðCþKKx»À^.´ÔBhwÖž.Ó“ÃO{7–wÆ]}¦Ý’åFÉóynÇ¿…ºßüYÿ‚lümë¯ð¯Àúd:üÖ“ë—CGÓ!ü3Ðnuˆõ=û Ê+_A5¬š.¡6¦¦îäI¤ùZ–‘¨A$-¦±¹†…Ò[yCd~D~Ѿ,𧊾+O‡ÖSÄtt»›ÄZ’Û;Û;^ÜÄtõ±É˜`gK“,\HPO¸ÜŸ…þ9~Õ¿?á%XøÙâ« Ë4w>"ºkÈ-£»hU£êFf•Ö'l|ÌÁrI=¸ø·Ãþðβ<.ÊWQ/§I«ÝÛ5ö§âÙ º”Ïq#4ÑÁºÙ§²*¬‘ n"¿˜ø£<­šÓ§–„qu±3N Å>YK–7œÜS´b¤ÜW3R»•”lÿÖþŒ9÷„E_Šs®,ÂæX¸:´1ʧ%†¯'.dëSæp~Y(ûŠ1tù,žæ‹üKw“¨x;Ÿ·ÜjÑÇö²¡Dò`i$µ–FvÝ æYÎ?{Èï^áOê¾¾»’kmAåUY²X|†7Û #wÏÏ8Ú+ OñøÔÿ·%”Ï3ά%,IÚÇœ©%T¨6ôÀÏ~}[ÇÚn“­è–ž%°¶xuh­£G+9#’sž¸öçë\ôrÊ9E8døÌ4g‡Í’•Xòگ˥ӳQiE-Ÿ*OtþµÌ±øHWÂbjÒŒ©bcÏ*RR’jí=ß•ÓO¯m¿ÿÙtiff-4.0.3/html/images/ring.gif0000644000212300117540000001026306747424643013250 00000000000000GIF89a||õ¿¿Å¸‹ çí¢Ø–àâ“çŒ å‚ì èŠìüW*ýR/Üœâ“ͯÓ§¤×™ÞþL4ÿH8´ÈªÑqôhøͰÖ¥9FþD;ÿÀ¾Ë²Aÿ?>ÿB_$úP0ýùe ú]&1ýP8þGÞ™ä ®Î£×ðyõn”á‡é ÿE:Wü*Iþ6ë„ú·Ævòfø Ûž÷j'û[ñxró¯ÍÕ¥-Uü,||Eþ@pH,ȤrÉl:ŸÐ¨tJ­Z¯ØÉ¤Óåv»…xÎu·!¬z½ 齌ˆàC¥|è‡Aôz†‡‡?">)(>"= :lŸF& #))< f' 176/..+**554¾¿¿¿¼*¹·/661 Z9 r§ & R:?v?¯&21µ¹½483,-õ-$$%ú% ûþ%øðÕcAð€„ÕPqkˆ9hð£€?xâv$ÄŽ <ê\øÑcÃ!bØZÑ ¼ôZìkÀ A›rêÜɳ'þ…Ÿ4û,x‡Â.¾Ù@ñÂv¤áBGPXàPò¤Œ¸TÐp)^>~ ~ò„Á¶­Û·paôl` 3ŠBàµâŪ Hà`Ň=rpôˆ $ <ÈaB®^ ̘Q/_M k㊎ËÓ&]}w7PÈp™‰z`°èêª rHÀŠâW“žÔ­`é΀¼ÎüPH«vçè·>éR؇oÑ4j õëÚ`†Gô¸[ȉ+yÀ`ò6Za}½+`òtiþ\ž¿?ÍÔ‘@ ñ ´—v.ø‚ 0A<…ÀS•w„`0@%þðA9œ‹:+é (Æ£b<›É³âA²6\‚7Ü …;8À4Þ1lcá¯Q4@5w0B ˆ ä`BÈN Wb)ƒZpñ… ,ÒÔRI  @ÒBia—9ð"ðPÀ|ð|öÙç\PÀ#p€A“œ4U…n6êè£F*餔Vj饘>Ñ`Ðì‰Â¨¤^Rê©—|`A ða{"¦SKXþí@ðŽq,n†Awá5‹vÙ“`±2¸›4ôø(°m£&hÎ%?¶ÂfJëˆåÎKðâ£OMýU@Æ7m¬“it1 ”@D!”o_Ëø†u`¤ ŒrØcl":AY÷xF—Æ;÷\[>ýTS?$(Œ1ÉÈðšd@ƼFèmøX’QfY.4à`œYúH×\NC§-—N§5ò]a·Ð /8Ã` ÃHÅ‘pÞzl+7Ø"YóôŒŸrA£­¶h<àPÖáàËv6.…op ÁFT¡a"$À92œ+qf0™å™þÈÌÝÓí@ñ‡@fŽïp~É‘rŠPGè>$cß>•@IQ¢Ÿ &NÌî€ödñöÚ“pW -Æsï^º Uì‚m [Hh¼Ã¬•v;‚ShzØä! ÂW´Ø‚Ëp»(†y±c Åj ¥ý€H²@ v0Z"œz ê`‰\@…Ê@0Vô(L!ñˆ t@àà%.À+l ð³ ¤BÀÃ4XM‡@ ¢‡HÄ"ñˆHL¢5µ@Lä?èÀêăXq<à ÅH ‰ Ö—¨-, à.•Qù@U¬Ú"þ~ ` vÄ@~À ¡*•yÀ@c<âkò&‚ ØypÕ?(íXÁ:Á6¹É.H) xÀÑ©é‘AdØdD<àsáðQ¯z DIŒé0–ÿ†“‹òñò—ÈHƲ¶ä¥Pj`Z?èQoF€mY09@EìС|ñ±B‡:ÎÅŽvè Eõ §8Q#_ƒi \Žœ( @Ðã€bâ· ì-`f+²™ºÐêz }bÒïÔö—AP$ è¢!7Þ¢YB]¤¼ÁG†k† Ö,·8ØÅ®ggIÆBþæ …w!PÜ|ñP¿ÄàK‰Ãìà$ò&pÀlêP³$j_k ìg±£Ih‘ãÛØ¶‘éƒdy1@Bj¾Îå(´)PAP$Œ0¨›€9pH"â„gÃsn§“µIή;ÙÏi`Š—ƒ,Í|1`D¼U­¼ 7&ØÀ90˜%–ÙEqb×T³EurÐÉ+ŽÓ¼@n­¹iD4à-‘ü H‹ùÍ2еÊäl©ÈÑOO0;š¹Xµ¹NvË ¼e µ‘y@5h 2­Mê[9ã¸ÇÙ$r´…K^ócU¬d·ÉìÝò¶·põí§UÈA¾…þŒôàf­{qæÓ¸™<µ®Ñ•.Û¨kßqÕ}Z‹: Ì“Aj¸Twå²—lüØÏe£[9Ý!-5zÁ® ì†7 J¬È¡Y…j4Ì=ˆSœÎŒ3¸Š rQ¥«Š-w¹úæÅ@ ¡‘ ¼àÛ½¡Ãeý„G&мõ¨•u‰£^KÄvÒ¦®TÁ;ùÙÆôÚŸÝ„([ÕN_ò;ÚŠVc`ÂuÔ Tè3²p];2£™ÆÝãûèlj×üRio@Újù²ë/¨%+Î{_¤<Òƒ8¥¼@ÔI¤ç:É´^ò˜¼ú=zÌc3žEQ”¥,Ìfà(Xì)¶’˜þKñ¹¦hß*F™”ëºðf0îõrª+! =çŒü²,ôACîŒP À¿éЕ õ;`Ml@—£,f¡ ºÙ‚n ò_´…ɬ‡Òƒ\¡™z«ð@€½é46Žê4ìÕ W^Dh‚»â¶Ê}îÖrÝP"Ã»ß †È{+¤–))qŠìÛ†8T¢(ö{¤Sø@I‡¢å±Áp!e‰YÀo–³¼ôŒh}¼L¹j½šz V¾RÛ– €«¾ˆ¿“à’Yº„¶´o1íd1«_Ï ÓŽ<ËòNЙA”ý:Ä$c¿BØ?ªS]@úЗÑN 1q&U+‚Ìd0Ï´}K©`Mí=ûÓ?·@þÀ°j­†±UæäPµ/å q2 " kÒ7y÷(‰Å2O± ä"+aV"óMˆ¶"‰æY*R/1"kû‚% „7qÀ>á$”÷&âåg§€‚&+ýshí‚=51ia/¬ÁI%8'À¡&A&)ÅÕ<µ%d6€.ò±TfvfÝÃ=¼ã=ñâYöbNúÂ/  ëÃ!"!¸\Æ> O`)ØKòQ/î’=)u15»ãÚ7qÆ5XSgQµQ0AÇÅŇؠ `31ôQPe³Rµ“7Ñ'vUÞC/&g]…>ñ R‰ ‡Wþó=¶‰îñŠ3dšQ1>“19ñ\ËqÓ1ü‘ŠO&SFq2Á#X¤E‰wèkåa:àÑX«C¼È hf>SƘb*ÆÌ¡Œ1õ† 1ev3X¹˜<TRÃ0‘1:À‹Ô3ˆpu1?ƒ*ÖáH_¸/E¡9%c4–7Z#V¨…; ÍÃiÀfB6YL•s%ŽiS9@S«H &cJ±LAíã_—H$v < :îÑV-Ab²C;K6[´U44qUi2q¨]Ä“ 9V=HÞp:}X8±’êµ8bcfú¸¡_xõ\7Y™# Àó:&»18 Q¡þäe^è5†Ä$VPã”w•lAUnÃ>º¥Mó±¡iXö_:¦Z|"VÉ5†’;1á3@#4lÙ–IVUpÙ; eÙåP#5|b‹‘5uða^C–5à¿Ø\Â_lY§ñ`©q]â95z3*`‰2c™1™y“%;h‘b‡I4¢ù6bš¼•šÜÅ7 p’P°c«õ—´)˜±•4™›sÑb¹…"»•5ÀÅÂEœP`xÆiab`Ã8öRšñ¥Y!ƒ“öÅ4XI‡‚[`ŠÅX³V3‘ÊW–õ”5)š—C•3c/ Z €Fä5 )þ3;`\•PTè•8Ÿ¸”¶™–¸‰Y·ÓdXa <8R#!ÔÈ UµV'ð5JÙ™h&2 V¡ˆé¸³ËÁ˜óbEÐXZ$:Ai|Ù$aKÁ˜»À™0 V;âèynƘzÁSˆSÞÑQOÚI$’+7¶ ߉¢#W$ f–¥üXž“;NÊ;Ž&>7ªt7”n’0šæÈuTóÕ3”Wh¡ ñ39Áü±WkX2 5eÌpi²ac.£<ÂQõ#ЃÛh"‹–R.…1GCŠ—32TÉŒ !¥Á3vêcO£2)Þ°0)þ0åphhëŠ(uˆÿðRÑ„¸[(à ½5à}?à•°ZO÷´^!ðdÙ§~ê.KhP¿jPôÀŠ‘6ièô\pkw6‹±’ú(çAX– .¬FiÀ€ÜøMiŠ6 Ü>’kúRiÝ5!vèš•MÒdíó!µ4h¹D–‚ø ÷BNâNäTNùb@Ô¦N"9~ïtc¡—–" B?©0j¶ ²À€FÈ Ù1 ,K 4kúç%ý7 < k× µDÀ6?¶7…DKØ4%ÑZ#µ°K¼T>¾4#Á¤g|Ó»i$€C”•¸r&©0KO’lç(±?Øg,µ€,ÅR#VBLÅ$~ÈT³¶W TÛJ;ÀHŽd Pn} {ëVÀÂI|Ë^Pz àqÓâ)™g ©„ gd”•q0„zÐE¬`l€?†P„¹•KoG7'"@pvp™†‡ãrR  FŽg{>°* GtTGy”{ÄSôGyòH†y  'as›Ò)jH¢¢»¨òx§*@H«+(‘¥w#9òD ETtEV¤E\Ô 2hPWFšä_ÈFeIÐû½C§¾ìÛ¾îû¾ð¿ò;¿8;tiff-4.0.3/html/images/warning.gif0000644000212300117540000000043706747424643013760 00000000000000GIF89a((òçççnnn¾¾¾üÿ!ù,((äºÜþp…H+ ˆÍ»ÿ`ˆ)fžhª¦Ú؆pìµY)ß0M¸0ü=îuû€¸¡­Èô”<Òç¼A™ªìC6Ó\©…U h°u¼ëžÓÔ-›Ò¢¿ê4½7µ {€~MzsKƒ„p`€3ˆeŽ…†!‚”–|šy—q™Œ˜¢’  ¡—a¬¤®©•«f¨.‰³A¼Bµ>1xuºe°²›{ŽÉwôÆË!ÊÕ\ΟX¿ÔȽ§W?ãäåæçHÙèëëÌÀàrÔðIˆöˆó½#+ýþÿ Ä;tiff-4.0.3/html/images/oxford.gif0000644000212300117540000001366506747424643013623 00000000000000GIF89a(xóôôôÕÕÕ/çèOO×[ÝV?â#—Ž–ä+ؼ½½ÛØIø¬¬¬[Y],(xCþUºUÇ{E8@ =^ªl[<’ã*%Ö/M¹,"Ù.@Ö¢l¯åØH1–P£X!ŽË, Ô»·€4¹ëýXСT²b%±Ú¸|N¯Ç“Æ£T9UU…‰ ’“”•–—˜™š›œž™Ž¢¡¤ŽŸ§¨©ª«¬"z{º»¼½Ž(¯—$ ²²® aÉb“(I%“ÄÆÈÊÓÒG4¶’(¹PyÚäŨ¡ÖÂïð¬ôõö÷—΀±Û´) úyíß"Mi$”»f¤Å›d•šDº”͵‡š„ü’GO þ4,zr7¯’¼’øRª\©)J¿cUÔÉœI³¦Í›8sêÜɳ§1\@o 골ѣH“ )c§©Ó§P£JJÕ…#W«jÝÊ5ªoRúLû:Má".ˆ0[¢l[¶"Ž¡5›6m£> Ñêm;·î›±_Ù¨‚æíÛ¯0ûæ%ûW¬^Çz×:–…W¡@?»e[²‰ {û^æ‹÷q`¾ný†ä[ÛÞÅL+Â%óÕ ssa ´âÕ\¤ÔâI°H/áJÞ¡ˆsd-‡.ëEA[{< ÀÝ÷¾ÎAüpî ¾“ç` }{‹Ü;ÏÞ}-øè_à`ÿþþþþ )`àØA‚”ÀƒFaÂ7¡Aàg!nØá‡Â‘2H› Ì´`a’`µ-èá¹i@ 6½AƒAÿ Ð@à Ÿ?‚Þ@B¤‘)TqÀ“X°ã“8”U^àA€\ê§@—ÿ5É 0ߘJ¨æƒ¬Y¡† ®çœtÖ '‡‚ˆßuöùŸš§Ÿv~((¡ƒúy¨œˆ*ša£]×$¤”.'„P`@¦Âi©žÿì—é“Òé©©”¦Ú᧺çŸòHf ª2Z릙"©ë®¼úW'€&ðä¼›$¢¬²ç§þ> ê²Ï:;è§‹ä*¡ÊΩ!®Äë­± bx€°HB©ߦûÀxV6š­¶µbø*­°Ê+m­>ª Ì“¾„¥“£BYê½ur›îÁÿe {+¬¦a& "„ãwa—Cih¼ã9'‘?ª ”6ÖlSÉ&ë„rÊ,+µ²1/·,óQ.ñqÁ+ë™cHd‘Å$),-ôÐ*ÇÂ8­4*P0 e쬧j0KKÄÑÒWô¸ˆÔ I˜œ´ôØdwÒtÅôƒs Pó™ÎR]ÉÕ-†4‘2Wl„ –Ð-IHIÑ%A“ôßlD#JaËÓø;eG.9%g?­6 þÿHˆ¤Ú57ùç*ä —N´+ûÄ4Ê-¸€Ðºu¡Tw‹”6×®–í¸ç®ûî¼÷îûïÀ/üðÄoüïœE–üZ‹¡…ݯm&Ò<;óš3t¹rŽÛ¨Io˜eÛ³Öý\œ•ß<ùÌ÷œ7\ç÷ü‚ôe­…V ×go~ö…_‚Yl–šòt±óÈšÍt¬OÌ: Áˆ¬z1ð“‚ #«ºí¨ÅyÁ/€s›ÍG;ÈÙC£Ñ]À¬E°‹FCøë4ÇDZ„ºSž" i†@O‘¤ÖöhjC>Ô•zH¥;i_S#FˆqMeBPÃÅ7¹ÉBê”þÄ EÁ z‘N&ä!£¥ÀZà]k™fU(y%@o|£•,ƒX >s|`¸Ç-êÑ]^´ÛèEk}‚ÂÕŒ±Hc”«ˆôBU ô£È4Ò’²ÀÒ!Ø*@z¬R$ˆ= ÊP«aߥ †HE¢r’$'¯å([m’“Ô¡6¥¯~u,‚~@†Joa²L‹@ÀÄ3a;£½péÇiÒ+¿¬f­©ªý ú*€® )¬‹;ëjØ,™)Ç=ëÊ”x2ÙžgÚóžø,w ´®~ºG@ÞùN*Fói¡»yT7b$^·¥”Ù¼¥Då}È`2U´äâÛ€7 B$°Uá8•ø w–²lh$û¸@xq“‰´ò%ž>• ƒT¼‹UÔâùÄpJaú5‡l´`àȽ829Y‹3òPXw$y.$1Œ‚›7Kr’¼S$þÿ(==ï9ÈŒ„Ÿ‡*K¥è“®ôC(ñˆ…zD¤ )`LR”¢®˜E5Á‘Mlb ½A”âgD ¸ÌSìÔ(v°FÞÞƒ!‡å¹hÙ¥ÜÏРIz¾r>(û<´9š¼’;¾%©TâT_cÕ„u*fì˜Ï<×±©p[ê2’~R%qætmª 9怮ù‰q-i ^¯ŸÏ¦Þã©ØÛôyƒH!tjìŸ×æØMzeu|Þª:~Âoo䑸¤$~ð¡ÏzíÔ!+UÁ>U®¢}«,¡ûXéŠøŸÒ}탟ç¿úÉíȈÞΧӃ¢h€þµë‹aǦò“qø7|Z$UØòG·'˜’1ãN¬—oO$‚€°÷W}Ô,Ÿ4€ú¶qˆ{µÂdË·ÿgJ €+Ä„0ZÇq¢tΔ.䤀ˆ‚D-/¸MÊ‚}B–GF«Ò!d²P‚ ó/ÔQ9“õ÷JÇG_”o È`´c;¨„ÄçJùô#¢WE`.ÈJ×-I3ØFhÔ„Ô…ð7 /'¸zÐÇp@˜OTÂC³‚º²0ø¤Lag†µ”(s4/›Ôq¬’/îWNB0ó²3u (ðT…ÆòæD%üxŽÈ+ë¤LŠø|Î’@)Kó±þk"Gz˜„÷Òq]Nî÷H ÍDˆ™´H8¦ä{n‚Fø%•N•¸‹¼HN„H Gdo¨HS÷€T2‚ÃNÃB*Âb„ÍÄy:èDLáÄ‹Öxؘ ³…^¨ ƒ%¼ñd/ŽoØ8Žè$PŽÉ´Ǩß²‡Ò-ƒTbøxú˜@ùØûøöȆQ˜-9µ’oy! æ6>áÆ3ùãjK@Ôöl)U‘)åS†‘‘qwºÖlöÓ>ÕÓS©¦RJEj Ù=•QÊS‘?eSCðW±ö=£fmäã4£õ~ ‡=ócv„ EUUEr± wU80=@9þ@³ ™Àa‡@Æçµ9@ƒ Fé“v )¦ õUvC° Ió“ /†eÊp6´“8ù%ëU /9Ä•7#ÊÐW–`—yI—× —nÅw981˜ªà—>i˜¹0‡“˜.`–Ä¥e€æ›SU´axñ<äáaÙ™V™+  ᙩðV–:¦B¹à™6$Dš°Y˜²ð[e›>¨É3×"(”˜wù›x9r¶99VVœÃIeIöz}àµcõˆÎÉÑA6ð6¢4K7jáSP`ÅieǹYͰj¹u9œzZ56Q2XS]xÑÞþI:FŸái:oEnü@^²€»‰ !áYTÔoE–p•• û3  Ñ|åWÌ#šyËæ§`dE6c÷Y:7 [†ï' Îa•¥&pï¥_܉”ƒ“c1H3š&8ÝÐ4½áv'f¡zà ùE£óÉ84§¡ú9ãI[–šÍ1›‰Æ–)za a£-¢Uy faQ£üu£bðbë9£[ºå°™µy D: Z¤’3ž:K¶–%”EtÅ9˜¥¥”•Åfœ‰ bz‚ã%P–a`cº-v¦CjŸê¨l9GŠcº%§Ä!¢ž7 gbþà”×õ„r‡‘¥4— ŸÚÓP–{ð’«©bl Vi#°¦*¤‘ºZ ‘pž—ÚQG€ ª”§~Õ\Åz4°Ã\W:7Æ ¸À ­sU™¬Ñʨjš¦·š«Fšœ æ4ÙaG2ª­,a« `®ä:4“úOc©§·›š®+ñà)¯Ô¹«—C ¥°¯û: þª¯ö:¯ô*Ö°ö`š”º Ñ©h [< k<kÇ$€Ð`˜…üÂ’XNpbÔ¾RØÿaÅXçÔ-ÊáLÕ¡øÍyxÇxÉÄѺV« ±Òº™ý[Ú” eÔv—]·;®™#®Þ'à±qó!UR%‚ÐÚ1ŒQK$LJí%¢{EÈDu¿{^×&oÒ¾‡GÅ òèÅåìqy…шɲƒÊÑM)G)ÃÝÉT†Nx†`LÙ’®RÆË-Å’dÞaþüÅ!Í{í ƒêýÝ(hÇäìÝÌMz»ÐŽùµè¨ßèÈ úÙQàMVàá¸ß~à‘‹à½`àNÖdLKàþßPá ¾ßÞànáþ-Ž .à ¹K«á à îá  ·¯33Óâ.þâ0ã2>ãêÀ6Pxß dÈ×­ÇÁ20ø†ã› ä„"€Wßõ݈ŽFïH TÈ0ät‹î î¦ÇíFîë±¾æ¼ä~¾º@À”{ÉìUøÅ®Žš‚Aö„éPÌì¾î@À§‰ð'ˆ+ýlä!b\îܤt‘þJãÑ!vˆé#øMø4g{^ë­wKV¼ãUNÅ4ä9‰Í„Ù’ñÁÞ×âê»rNùÄN™žþì÷­ð9ïpJ6îÇÝ=ÙŽ×x 0ÙÈó‰H‘‚¤®èTÞpcçJú‚%0?Ûä1‚ÔíŒ#è{ÓîÖø£Œtè ‰a²GØÄD£!·èî!!¶¢ð÷ÞÜŠ¿O‚= ­¨àç?41kR&œ§fïÌÌöHO&]‚!`?{J­‚Þdí~KEæß­æW'Ô˜Š óŽC$§Î+#‹mç xJ?û Ãóµu)0ˆhŒ¹’0]>!ë!úµ$üž‡Ú¥¿Ò¼‚I40 €öÎÏi_.ºX‡kOûÖÏ‚–4Nâ/Q%ˆIO²üÅ´H‚ö‹þ¤ OÄÑ‹ÀÁ|ÌÛòÚçÂþÕNz‰˜Ìp#޹ÿ‹™"PädÕ2içæÝ0ÇQã0Š!ˆ»¼+&Û¸j³ á»`aç·a9d‰p0“¨ò)m"M¦S™­F½TmS¡ÈBÍgtZ½>_±lx<]írËKgØŒ¥Òî4À¾®:°Á%ÂÄÃ-:©»ÄB¦ÊÊʱKÊ1ÍNχ?ÎPLOKKN2ÑÒMÖM„RÏTÚZÛN×LÔ]ÞÓÔVT²Ø¿YÜÏÓàÖÜYOØSåÌ_ÖãbäËM_gÍNJXïÜpeomet€ØôJvËtThJ‡‚Jôxwl|xwÖú D†NÓ¾|úØ%¬ô@‚„ñÚ8Èà»xû!T8 ZFwý)”øc>‰ÙYa¨AŠ ¢L‰­%»u ˽3‡­\É’m2ü·óâQ}'v3U“’Ã’â;UsiÇ‹@%UYÕkÇN-«‹”j»¬Ù|áãz¶R;tiff-4.0.3/html/images/quad.jpg0000644000212300117540000005654006747424643013266 00000000000000ÿØÿàJFIFÿÛCÿÛCÿÀÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ÿ?ú(¢€ )~œÑŽq‘õí@ E/®9½éÈÏAøÐQKSýÉ£üóþzÐQKN Ç|ôÿ>ÇÚ€Š)p} %í¾¹úLÒq޼úcúÐQKLçÓþ¿ÿ>´”Ràç¯lzý=è'”RãëùRPEPEP]G‚¼!¯øûžðO…´ùõOx«YÓôÂÝwIq©ÜÇkn™8Xã y¦‘–(!Y&•Ò$w^dzŽ ÷Æ=ëßµ~ºÿÁ0~Zé¾#¾ø÷â8£/¦›¿xÞUË‹ûˆÖ-wÄ “ò-µ¬­¤Y y.u&ù<ˆš_¡álžî{—åõê{ %Jñž:½íìpTšž"i½½šq…÷œ¢Žœ˜b¨`°”åS‰©T¡Ûr—[.‘IÉù&~s|vø-ãOÙï⯋¾xúÕ-üGá+è­åžÜHlu[ËhoôoK’T¦Ó5m6æÚúÎB‹ ŽQÉÄsEàoZø¯Åz/‡îîd³·Ôî|‰n!Ò òÝÇ–%ù<Çe `Ws¹¯éãþ qûßxßàÃOÚÿÁúz\jÞðþ‰á‰ÑAn®¼¬¤ðþ¾<°L£ÃºåôÖw¨Á™luÑwº(4é÷ÿ3? '|Eð\„íÄZZ1 ¤—QÆà–È•˜ö5ëdÐá_øˆ¹] Û6á:|Y€£‹¡:ÒRÄeÚ4~³„¯ZŒ¡8NXW:3©NP—ü¼ƒ‹jÞ#ÄÏ•VÄRŸ%_«â¢ªBÏ’½iJn7N7…X6“‹Ù^=º|û.~Ï´jšçˆþ2,ûðÿÙGÁPÄnìn°`y/Œcßê þÂ?±f­kwÚÿí'ö¦ƒ\[jß ?0çk‹y<4ç HÊyÄ6ÓóÞ5£Nö›.p†LƒîO¡÷<~YôúßáÕû]\Z bAtÝŽÜôã©ÏÀö¯ôãŒ<=ú'à#*¹`ðÔýŸ2tóÌêZ-_ñ3–~3ýú5}|:ñ•æO_‰sâ©Q¯RΖ›çŠ”£Ë†ÂR’MÝ$å¶Që_µwüàÿÁ_ø'§‰?n†ÿ>(ø‡PÒ<%á¯Ùø Å~ðª[Éc¬ø¿EðÝü7z¦$2+é¶Z•Ö¥çC +ý‘c1äçÛà‡Àüvñ7ö…¢‚ÒÆÕ¢}kÄZœšNo#0S3Å’\]Ì© ³±L·‡sC M<_è#ûOéƒÄÿð@oŠ1î§ûìóâͰüÒøE|NúªÈNÇ"Ö¥‰§FÛ8äù£å×ùLýŽt« |'ðªÚƉq®Â|A©J»wÜ]jMº&‘90Ø¥­¸’DaIØ?‚|=Éü4ñ#Äìë ²® áL^e Ï ‚ÅÕuñÒÂf)àðPÄÖ©VtÝjS¤«Ö‡¼©R—*I©¯âÏ#ðû?Åä¹.ÂOŒ¸£‡01­Ruœ0ÙgfT0õ«NNõ'C-¥‡¦ß»í&ãRKâ¾Ï‚ÿà“ß õ=28u¿‰þ4—V–5{¦éú-¥”R•ùŒv7)w+Ç»¢Iy»—5ñßíwÿãø•û4hÍñBÔ—â/Â¥–(ï|Cee%¦­áynfŽÞÙ¹OН D*I~óÜK6á(´­û×…žpŸðåL.ušàò<ò¶ Up–#K £ŠTܨûzêÆ\5J‰F¢Œc>VÝ9©-?Ï„^ð·Œ>&x+Âþ6Õï4 kÚý†›«jš|+qymou'–Ÿgè’yÌVþkG/ÙÄÆqæ1 ÿZ²÷ìÿÂÕtK>øsãÍEíÑoo<[ñ'RÔu™›ÒIs¤¿‰¬-,$Èù¾Ç¢éê ²íp’=FÊßÃïtý Q·¿¶ÐEÏø†X®ãe,óÚ8ì|³8̲Ü6g8àjáªB¦ñmÆ’…z~ÑT¡É9{G9+rÿ-ÏÃOñÎUóã¼ë„c‡úÍ9C)öuð8ÚØlR§Zx˜B¥ ×I8ªRXgʯ]¹=/ø+ÏìàŸ…ß>k?²?„ô»|Dð‹Xë ð%ù×`ð·Œü=| žöp/¯åÓtÿhú–“5§Ú®9u3[™]VD~!ø?þ/j^šìÝj: iöò²F‡Nñ4zm¡ñ>‰˜¤š)¿°|@Ú–Š.â•á¼î"#™@þ’> øf{¨õ=O/m¦Ã-ýÆáÂAgÜJÇŒùq·ÝÏùr+ù¦ñž«6¿âïësÈfŸW×µmJi˜å¥–öök‰$$õgi ä“_xã’ð.QŸJ· ãçÅf˜š¸¼^• >-˨„ia0ôœ}½YJoš|‘Œya¬Ÿô§Œ pÿƒü/ÁqÂñ.cÄÙæ~ñrÅ×Åa¨a0ø|&_J‚ýÕ*s­Vu«ÖÄÅÔ©R³ŠŒTcÛ“ýÛÿ‚r~ÌŸðOßx¾&øçu¤ëž5Ö’ââçOø‡âíSÂZ”öºÕ„é¶ö¦…¥êêÖ϶«{¨ù—ò-Î~Áÿ‚ŸÿÁ;ÿe-/ö>Ô¾)~ʾ øy¡|@øâ뺯µöÖ5?ø7R»_ëv¶_Û:™¼}.ãTÓüAºÞ5h´ý/RÀJü”ýž|*ú—ÀßMþ÷Sñ1µvFSöhµ»ˆ·DìHu)p7Fª‚@ñ•.ŽÏõ€|+x÷pDY¶oQ0ß{·ëŽrsè¯pù‚|Màï ÑXl†sÆ“%ÅÄŠ?‚5’VDo³ÿদÏâ7ÃÃ#<=à }J[}͵5ê—óO9SÀ–k;-:6a÷£¶‡?tcèØ»Æº§ìῆ_<%eauãFæëQêp³Yëuê\ÛXhmÅptÉ|9psåʲÅw©]ÏqÇœ/á×qoˆ¸îÊóJχrl."½LË:41y³ÂB7„硇–7Uaé4¥Xª’ö•#'?é/…¼Kœpsg¹–¸o$­šµB9žuO,øj.á´_ˆÞº»ÔtK)îåòí-õëBËNÖ4‰œÇÉudúd—2¥µ¶©s)ÅgŸ?ั_ˆ´‹;OŠš7þø…a‰/¢ Íãoyáš¶:¯†DúÄñoPÝxnÌíd-ŸËõ}{öÔý‹míGWý™¼3¦x‡Æšį x§FÔu?xXèžÔ-WG¼š[mõkˆõ¹.nm!žâÚYt»¶–(^9Rà/eYV±ø?ø‡œEÃË-£V¤ó¯oˆÅà¡NŒdÝzØŠµ*`ñ4Ú4• ‘©ma»}ü8ñ“ÄzxÌ7ðFy”V§…­ˆþØ£—òåXgNq¨ñ”°¸Œ6‹™R¬ë:nñ÷¬ó>ÇNùì:ÿ“ÚºÀ¾6ñ<7>ðwŠ9ý‡ÄŸ þüWÔ| ¦é:»Ft-RþsU²Óõ_‚B\iVéöâ[G)i<÷‚{·û-œ–÷?ÕOŠ?jß…¿³×‰ßÁ¾2ø³ðÏà?‚ígŽËáÞ†º¦‡áÏáÕ‚Ùì'ÓRÅ-ìc·‘'ýç˜bŽ’ê$¶Òløœ»†ðurÚ®k›ÓËpغq88ª2¯)é׺ñ6‰FR9¼-ñGÂî5õÔ¢òÖKm-Jâ •·&âÕ!…®!þ#?রÕßì ûLëàñ"ø»Áš¾—Œ¾kÒùi«Ïá=JúþÒÚÇÄ6Ð,qE­éw:}ÍäÖÑ¥úÇýªÂ· ikñ˜œvQ ÎYf4Ãã«{'Z1¦ùj{4ìÜé¶ÜÞÍí®ÇôenÎèpÖŠgJ•L¶³¡ ó¡WÚ<%\EýŒkFJQ¨âãrÛšÊI]_á øróÅž"Ò¼=cÄÚ•ÒBòà”·¶Peºº“§îím£–áúec sŠý¶økâ½#ÂzNƒáO„³Ñô+;}:Â#vȹ’âbßsw1–æêVË<²ÊÀ3þB|ø‘¢ü1ñÚλàm?ÇVw6¢ÒM6ûXÖtCfU’C ö‰qor¦Mˆ²¸UpoÔ†¿ðPoØŸÃÑÀ¬À’MÐ*¤pNsñ¼QÅÜmÃ~Ýp·æÜC¸uVËqÙm´Ü©¨fY¦®KrÚNÍ7qð‰9‡\Qý«Ä^ñ¯ahÒÕ«p¼¸Zp¤ä¹ªóPÎ8‡+Å:©¥ɇ’²÷%.goíÀÿ <+ñ»öfÒ<ã-5 |EøK¦hzîŸ7çJ×ü3­Ò£©- ÂE9’Úâ&óm®9âu’8Øž§íû:x£ö@ý®üMð3Å&in|ñO‹HÕfˆ@uß _^Úêו]|¥þÔÑ.¬îfX÷à Ë\@®ëãý,xþYýž<ám#úOì›ñ* MÖÇGÒtÈ> ø}ì­tk E¶¶EÔ.ôyo^[t†R­æ2ÆZioD‹åËø¿ÿMÿ‚Žü.ÿ‚ƒ|Jøgñ?Á_³õÿÂxN¸Ðµ_j~2²ñ%ÿŒô4ÔSUѬµ[/ hðY6‡{.¤öR}§P“ËÕ.áy!nÿ-x™}#òïóªyáÞi•ðVm n*Žo‹Î2ÒÊó,,å_/¨ðØ|׉« T°•V•KT•²j³ònžaŠÉ8š†u–crZ•slÇ1ÈðøåJUå„Çâj¿ªV–­zP«5)Î_½pU)ÍFošîm6êr&nqèürI‰õÇ#5ôÿ¸¶\ۓدüuÇãõè{Wæ·íMáiæ:‡†5ËY‰ Éiqc{cÉÃLÖ/‚y¡ëŒÿöO þÜ? ü8ÑË/…üarñV8×HXƒÞC¨;'Åå·#ps_Õü[⯌ì$èar,ƽOfájxœ;Rv¶’Uùlݵ½­sý3ú'xÉÁ ÙNŒ8“’âp¸jëÓÄÆ¼¥ÓŒc4½*Š[;r·~‡ö߬Ù'ˆ¿àƒŸmÍ—ý›ÿhÛ6ò¿y;5 ñºƒk}ï,2¦Ã… ` WñQû|PÓµŸ ÙxBâî(õï ù°­¤’šãJy¤{[Ëec™’3ì³yy0‡ÌÚ&ˆ·[âïø-?í…iá/üøIãé¼9û6x×ÁúÇ„u„^'ðÃï@öþ&Ón¬œ%u°ÙŽ;ë4*SUœµaR²œ'4ù]´Vþ™µè?<â/‡Þ%]úO‰tÉld”i¬®p$±Ô­ƒå~Õ§ÞÇݹ²’û¡îmÚÖÒG@FKF.@2ù¸·ÎŸþ#øËâ§Š.üaãÍfM{Ä7‘Ã×ÒAkh½²yVÖÐÛXÁkk'ÉPÀŠs’KÑr‰ñÍ\ã[‰*啲éѶx|Mzدm®GÉ<5(Æ“§ÏÏÍ>e.NTýëižæÜ-˜pÆO†ÂRÇÓâ,¾~Ê¥gF”0u02ƒs¥R§¶uHVQZn):ªMs#»ýšü/Äÿ|8½’ø‚ÏYÖ8‚ãXÕ”¿HÚ{;9mav,óÂ6¾v·îõ”W¼®z´ÅÇ«t==ð:w¯ÅïÙ;ãg†þ|A¾×üO¤O§kZ ߇ßQ±E›QÐ~×ug;jÖï$):2Ú›k¨Ä‹/Ùg•àʉ þ¦øöƒø'¯Ëտį B$ua¥xt©Ô±àK£³FsŒ†w#ò\mâ7ðVcVžE‘fØœ®¶ “úö…\M:¸—*œðšÃ©Î”©.T•HÆüÍ«¦Í8›Pñ‹‰ÅP–"ÂeXZ8,|§aˆÄÖÄU«ŒsíJT’ÃÒP©ÊÚNiòÈý5ý–ü?á=CÇ~Ó7Æ/QeÓîT3’Çp ñÂÄ¢ýà¯?4†‚÷Rø³àkkuýáv×ì]€F‰Š'’nøÁŒ3`íR:øüAã—Š¹f[<±ðÏÒ­J”0ô²üehèœTiN…:©‘•9Ê--ñ?C,Ï‘á©Ï‹14rŒÆ®"®+1Ž>½,2†&½I×®ùêÎ4Ü}¤åiÂ\’Ž©ÚÇÊÿðYoÙÃÄ? |eû=|tÍuàÿÚá]òé—~gŸâ†ž"»Ðë_¼Mã?è2_ÝO Fæ÷TÓ´}oMÓî †ÊòÜÇmqsk ¬—Öé\CÃäž ñ÷‹~kx‹ÁºÕÖ‰ªAò™ Ù$0’ –·ÖW -ý¤¸[[È&…øÜ„€k÷NÌxã áÌ»S6£>'xIN®+ØÖÂÒ­ MGŠ£„ÆRæ«R\=)ÓÂW­>z´!R§í ˜ø¿†ÃñÇfYö¢¥‰Ãqf+<ÀÖrö”ªÕö¸Š5”¥І2IM8ÝÂR§%Ρï~²iž¼7‹˜\à}ÖÚG¡|}Õ>ø›^¸×žïVмmsö8o7Q™šyã×!w`g»In® ÔNÃíqO&ãç$Ÿ¦>øÿ/ŒôHt›/ø{â'…•áñDzð²·Êÿ¢Ï¦jªu ;ym‡-n¸bÍøÉà~Tèå’E#Æêr¯e>¡”‚Ð××Ã6̨à?³¨×‡Õ#ÌéáëÒz4Ü·öqn2…÷j2IüÙüe•å9._Å?ë]L¯ŒÇÕtÞ5VQké¥Ô›q“~D©º±ÖPŒc$ùQý5üý¥ýþ)xŸáÄÍ/û'ÅÞm.K¸SÌk[Í;^Ñ´ÿøYÓ¦–(^çK×4 [MÕôÛ“yöW°ÈQ”^{ᯃáñÿŽ|5àëj×Öúö§ Æ»{÷vÚU³+I=ä¶¶Øšu†v#&öÚ$jLŠB…j•ㆅ9J¼êª1¤—¾ê¹r*vþnvÝô9qÌ6[Z¥°˜|=L]ZÐŒë[JœªÎ¤!F3©VÔâä£Nœö„e&“á»uëÔ}:Px=s_Ô·ì¿ÿ’ÿ‚tø»NÒæø‹ûIÜøÏU’}B?âO€¼hd7ªhéý¡¬éÛ7~ò+­VyT2–+ê¶…ÿ^ÿ‚Úé†/øçJ²–@¤Í}ûRéÖºˆiãßÛÀº´lîU$x"[I]ÕY‚º/F˜UáÙºxü§9œâÚ”pØ •­gg­â›O³·™ø~Qô‚áÎ"ΖGüâ¾w‰•eFð^çÐÂTn\¼ðž*–á~¯ ®µµµ?]§:c8çñéêzÓ+ûÿ‚¥ÿÁ¿b?°çÄ?ÛöPñ¿Å/3Á:_…¼G£é‡ˆì|qàÏh:çŒü=á‹ù>Ñq£Ùk–mgg¬ÜêPjêSCØ.쥊C5¿òá/øƒÆÚ¢i>±{»–äbDvöñ½-Ìïˆáznsó1‚˜á|߯ÿ„:8ÌEeŒ–àå…© bÅÁEºÁs9OÞ_–·NÖgô..̱òËéP˱Ï™ÊtðÙt°ÕcõŠu熫…«ƒI֥Х^œéÔ¡(óÂQi­ËQ_]ZþÉzä–¢K¿é¶÷…¾Ï­ÅÄ*ǪIpLEvôÜÈ èq‚|_âÂ?üt+}ªÜÙÚ4ð,ÆTýfø“ûüøIºN›á©uk‹0ÑIªk÷×W—“¼ckJÑÆööQq¹’;UX÷¿/Ë_7—`^cˆŽ8Œ>ɥψ”£{l£7k®‹Ôû¯ >\qãWžgÜ?_(Àd¼?Zl~;3ÅÎx𔽼háð¸zU«Ôj“R•IªT•Ôc9IIGð³$ðMôç§ëÛÿÕ_BüðŸámgOÔ4;ìt½F'·kh¼¨¯­Ø—( ;Vx& ùâ”ðáúΓq¢^Gcu$/;Xiwíä>ÿ(jºež©¼¹ Ésj—‰mw Ð]Å5ü!ðWÅïzÿ.ñ~»:Ãg§X {•e½Ô/%)k§iöû¸½¼–("Ê©bîˆßMƒ£[0ÄG ¥SŠeB(BU*ʳŒgìã¦Ü¹e4–‰Ýìíý ©O-ýà«ëÕ]ëc6§¼iŒ±î’ÚÃ[´Ó®/cŽw±[¥¶¹0ýgÂE“ÐúÆa–Ô£JÉÍÆ­ Ò¤Ÿüÿ… µ'EßFªÆz3Íỵ̄‰°õq|?Ãæøjuk`gíéÂ*×›”U½ž«÷ŠðÕk©ðe g¦OÐf½·Áß³?íñH“_ø}ðãWŽ´(‘ä—YðwÂßø›JŽ8ñæ;ê&‡}h¨™Ù¥só^6#uB…jî?£Ju9}y#+mÔô*â(Påöõ©Qç—,=­HSæ—òÇžKš^Jìñ+ ñ…ü4ðÃÏŽ1Y[í½¾ð.£¦YøºCfâ? ë—Rè:•ždÓ¼A§Î»m4»†OäKáDÿfø•à©HÂi±°ëòOp¸ŽvHq“Œõq_êùðãáß‚>7þÈšÂ_ˆU·‰<ñà¾á?é36aÔ4}g¶¶wH’¡ Ȳ ­nba5µÌpÜBÉ,hÃüÄÿjŸÙ{ÅŸ±íã?ÙëÅíqsqðïâŒZµqƒþ_ßÞÛê>ñ*Gµ"ÿ‰¾…sgsp‘f/ Õ²±òI¯äÜ?Ùq–g†›å©—ñ>"¥5´½‡öœå7\ÝÙY4–Çóg†¼A%áLë -qYoŸd˜šO⎎;O'gÊ©Çêý¢éEiÍ}hv_ã׸$qǧã__|#—Ãsc*;ôÈ=ý:zà qŠù FÝGo‰X{päg>™<,WÕ_ åÅÅ·¨`1ÎOÓ8ã±ý?«xòšx*¯–-ºmÞË›T–öóèôÖçû‰ô.ÄÑÄp¾GYS¦êK†ýç$}§ðã§?/7MuÓNÈþ¡¿k/øJÿà€ÿ S#ý‹öqÕoØã2H?áñÕ_Ì]¯ˆÓû(µã€«ºÜK˜ÕAÅÀ? Ùøsáö—v‘'ö†¿ö­íÁE:JÍöH|Á–h£· ñ¡!CJìæ$ÿoºøOÿÁ ¾9i°Î×/ìÑûBé²Elª÷½µ¯–8Œ*7oÙܹ™vºî ¬ˆ/€ž,³ñ'Ãí*Í%Oí ?ì»ÛrêfHâfûÆ?¼!’ܪFØÚZ'PÙRóßÐþm?ãÜ>7‘ciæÙµL­VQOÚÖ©EÖt¹’ýóÃÆ|œ¾ÿ²Um§1ü÷áþ)ÁøýÇT1ê’Ì)ñˆÑÉÕn[¬EN)«ŠÅ{tŸ·ú®*N‹ÒulÚ»=®±üC¢Xx—FÔtMJæ´Ômd·‘]CfSåLƒøe†@’ÆË‚² `A¬ÏxRÛÆžÕ4 ’#k¨KZ\÷´¾Œmp¤|˱Î×+’Ñ<‰‚ ò›Z±Õ´-VÿGÔšæÞóO¹–Öâ'•ÉY"b§Øe8ʲ’¬¤0$×õÏŠ>"bx/Øàñ|-O8Ê3Œ-z <ÃØS”Üe Fµ€ÄE?g(Î/Ú5RVJP•¾ïƱ~<>_àÚYþEŸà±®Ï5xjrªã*x¬# ,³/c8T¦ÝVªÂRj)ÂIz/ÂÝwXø]ñÛá牴9Œ:÷€~)xO[Ò§ÜËåêžñE…ý£>ܦæÍ7¯uÈ#þž?àœ²Çuñ‹~6Ÿ«Ýij\ßøS^Öü2.Ù×{ôý:õts#¹f’á4Øî¤$´’¿΋þ “û;_þÔŸ·7ìíð²;i.´Y¾!èž,ñ³vH¼ à›È¼Oâ„–UæÔ´Ý2MÖbc¾ÔíÕ—p¯õ{¶ÓÒ-Š–žs·±ì@#=øÆ3_æßñî‡8¯.ÀrÒÿh¡SR„äª:gˆpÃFNÉßÝšR´¹o¢Ñÿœ\kÇ\]áç„\UÄĹï×Çæ®Žy6i‹ÀU©JŽr­Nu0ó¢±4鯵*rç‹‹’¿-ÛKù¹ø½ÿÒýŠþ é:—Šì¾ÚxRðú]k7~;Ö5ŸçÏgo<¾}¶«^¾çD¡š)çÒåž7UhæF\×ð ñ [ŸÄ¾<ñ—ˆ®ˆ7:ïŠ5ÝZ} óu Næí¨U7Jv*€ª¸P¯ôéÿ‚€ßéžø!ñwź¿O†üâíkQc—m–Ÿ¢_\ܱ…Hi@Š6Êdû¹çþeÞ5ðÍŒŸï´_]¯ˆt­{X†O ÍfIolµÉ–].Ñ¢1Å2ßÀnO»‚H!™/a• )À¯ÕqÜYCаYM (^››—±¦¹«U¨©S£J*ó”R”)§ÒME[WüôGãŽ/ãÎ%ñ{‰øã>ϸƒ ^Q‚Áæ¹æ?§J•ãñ9… U±5jBŒ¿{ƒ­Vœ9y¡MÝGOÕïØŸö€øÁð'á‚õ߆^?×ü}¡â…,&†m:êõ»©o´}FÞïGÔ¢mpÞ]ýÔE»d¿¯VðUÚóâÇ ¹71hºÕÄúzë~×ü?®èó΢-Sv®–+iW¢*_8~ÏŸ´'…íuσüã›vµ†{­?JÕ-·ô•‘Aòõ¿ Ü4:æ('kG¨Ø[åÃm-ŒŸ<ý²>~Ï¿´€|cû3üKÔ¼%ªß|Fð¦­x.]SN>+ŠÖ c<^"Ó4á$š•…Ö‹p°êzf®°'Ùîí’{y ÄTŸ¥ê–ÚŒ3Û´ðO«$RBï±ÊŒ9P«Fèy‘RšúÃÃüwû2xÆŸü©Ûi0ð§†5¨<=©jq¨Yñ5dž­ä6Ï$K{uëòÖ|è Õ¼S]Áqkñ7Ãñ— ar\Çœd~3c³ =xÖyFCË0òÄUÄÕºÃa1™Œ3 ôœaRPËiÔ© ¤Ó¼Ý~‹CNðó"ÍøÎ§ˆ8¼weYa™ÿcã²¼?µ©Cƒªbs®FZsŒ]&Ö ”ç̬âÝ߀Á1¿f¯„~Ú÷ºWƸtÏøoá·Æ ‡ºN©Ç Ú«¯XêzÅ¥ž¡©ÚL WQËs¦Ø[ZY;ݧÔäF’kõ¯þ qûjøÛà×ÅSðî/ŽzïÁ]ÖØMðûÀžƒÄ>Ò-|-ms.›a©\Íá]2®æ»ºÓîeóµ+™Í¦ÞßìÖ‰ cù‚øñÞïÀÞ-×åñF£zÚï£Ôu}uZi5 7Äk{%Ü$f…^ælIuxoÒ72yësù­c†_èOAýº> |røe ü-ý¿?f_þÔþÐ#x¼ñ—ÂÔžø¡¤ÛLH²x“O¹DÖK¨ˆ´Öú†‹s7”VMNðý¥>×'–y:¼1àî&ʲŒ^!̲n!É1ÿRÃãgšÖÎiæx.+È«æKêÉÕÁsdyŽ´£‹ÃaiQ«„ç…JÐ_‚øc…Âe^)xƒÆžËø›ˆ1œ5 ›Ã|³ˆ2úÎU•akc(b±õ²Œ.3C …â)Æ\'Ö¤¥QÑ©}œ´õ_ØŸÅ^5ÿ‚Šê ð öŽð.‰ûc|×í÷ÄmZMüIø1Ïú*x¿Ã_åm;ÄÖSi2Oow7†õ=Vîîî _³éq¼ÓÛ^ÿ?ðR_Øoİí=â‚wú£ø‹ÂW6ðø§á·Šd¥Æ»à­NYã²mF€ŽßWÒï-¯4R4 ×6FöÝÖî¬Çâ‚gïøk[ÿ‚Uj><ýž´m_í—4ж|AMnïM „ïìeÖuÍ~M"ÓQ×þÑm9±³Ík=ÂÝù[büiý¼þ-x«ãGíâoøËâÞ¹ñ£]]3BÒnüW­KfÑ[\ØéÑCEÑ`Ò­4ýËFÓõY¯Íµžcm¦C4÷+n.>kË›ãœgæ\m‡Æg4øQáü>O&æÃqižR¯VU³,vz¸JT¥FÔê×¥GN¬ Bz’«Z?g.ãì/æ\Wâ G‡a™q-:+õØå™.t°Òúß×(UȰ˜œMJØ8Ç ªCMû%øJªTåZ­áÿ¾&éß WÌÚZ]Ÿ’qçœGʧV­¿9Í3ŒVy)en®–‹¨ªÕž {YÔ¢œ£ù{);{Òg×V¿µ¦·¨ŽïÂÚmÅàE_´Euqo 0êò[Ÿ8¶î¤$Ѩ=0Ξ9ñïŽüAsâBÖÊÎæåcGŠÆDD¡Ÿs»I&À¡¤v,ø¹äñôWÓgœqÅ\K„¡€Ï3œNa…ÃN5)R­)*‘‹ŒjNTéÂuf£).z’œµzêΞ#ñx»‡Ë8?Åæ˜,-HÖ£B¼hE*ÐŒ¡µ'J:•ª¨JQS«)ÊÒzêÏ×ÿø"oí½ð‹öý²-þ#|rÓïßø'Vøw¬ø£MÓ$Ö5˪êÚ­gâHôë|ÞÜØ¤ú(°Õ×OIïÓL½¹’ÚÖéÓÉoô—øKûNþοü iãO‚Ÿ>|LðÍí¬ àÿèZ³YùèÅ-u{o´t-J-²Gu¤ëVv:”ñKoyi ÐÉÿM\µ¿½±“ΰ»º³› <Û[‰`“kuâdlÃsówÍ?ñ…Ywç4¸‚–e‹Ë3HP¥…«*qŽ# ˆ¥FS•.j2”%N¬yÜyéÔQjׇ2æ‘øƒ‘bøó„¿Õ*¹­L¿NUçBp¡Êœ±u9¡ÏO™9%-e{é{YèßÿÓøÁàÿ~ÀŸ´0Oxjø¯Ãz_ƒ|9¢ LMg^ÿ„¯Å¾ðþ¹‘§}¯íš´Ð5MRþýmb—ÈÓ­î.&Û 9çgà^x#Åþñm¤QÝ\xoU´Ôà·œb9>Ï?œðçÈ ”e¢vY•ÎÝj…óï¾¼»¼“ºêâYÜ÷Ai]›< àvª~¼wõéþ5÷|#•Wá:#K5ãsœ£šä8*ØÏgÉWšÎ D¦íù, –Ý ª¨À»x×ÅÿÚSâƈ-ô¿êvúw†,§ûMŸ„ô[NÐã¹ µ.îaó%ŸR»‰r°\jWOl¯(µò<ù¼Ï¢¼/ d8,ZÇaòÚÅE· ³uk:MîèFµJ ÿëÌan–Ôôÿ×(Y4¸z9îe –qQ©—SÄÔ§†­ÚЭ8ûX+/r£”|‚ºoxÏž”Íáëº Ä¿Ù:¥íŠN ’â+i£Žâ<’Ls,ˆrr¤æh¯rp…H¸Î1œ^ñœT¢ýSM9 Êœ£8JPœ”gã(Élã%fšèÖ§¦ë¿¾*x–ÅôÍkǾ%»Ó%P³éÃRžÖÂä+_µYÚ4×EXîV¸ŽFS¤1ædä’Ü“žrzžþô”TÓ£FŠj*t“ÕªpŒ}ß*W~léÅæü|¡,v7Œ•8òS–+[éÃù`êÎ|‘þìl¼‚µt-Qñ&³¥h=´·º®µ¨Zizu¤(dšæöút¶¶‚4\³<³Hˆ  ’Àw¬ªýrÿ‚R~Î3xÿâmÇÆ-{OßáÏL¶¾kˆwÃ⻘ògˆ2•eÑ,ŸÏi&;ËË&‹÷‘9‹‹6ÆTÀe˜ìeN½|>µJRoÚÖŒ²ƒ¶¶”ùTŸEsó?j¿þ x[áî‰=µ¦£â}J=>»Öakj¾\“ÜÜͰ3´vöÐÍ6ÈÔË!O.0ddýÁg?dÉõ_xGöªð†˜$¹ðÌ:‚~)­¤*$:5Øü'âk¿-–;+·>¼¹•šHã»Ð`PÐÂ|ŸÄ¯ØßVMö¢ø~ä—⇭&-¿gÔoSO¸ ¡_rnŸrm;×(p#«Â|Ï Å5¸;ÄØiáèbó\¯ ĸJR•SŠÆÑ¡šB…Gï§í'BzÊ0œnùâÏͼ+ñƇŒÕñC†¾«O=¡ÃÙå<Ç.MU¥•ñvI®ñ8:´å.o«Ï 8¼4jIJ¦‡”äíú= ~Âÿ|b©âEÔ¼y­"´^jWSiÚbL£/ö-+N–"±‘þw|Ìaå“´fë¿> YE$ß|7(aÿn[®3æ<¥óÇ$6{ñÍ@¿þxÀ¬ú¿†!óeÃJÖ7·¶ #å´éNtˆ à×¥øCöLý›m.’î†Úf±8pëý¹{ªj–à§kY\^›)”Ÿ¼“ÛJ~\­¸y?x%áö \§ÃŸ ÞMBøÌ‡-Í1•áêëâs\&3V¤Ö³r­%)6Ûz[ü¡Çý81*•±¼Sœø‰ÌaÍ9ap¨apžÖíû:TèæX\= J^ì\0éF6j=ä{â·ì»%÷ÃOˆüà]VËà lô­SÅÚÕ”sÆÏYñák8æ’鼯´ÉªkÚzEobÏuä™®e·kH'¸·ø/CÐu¯êVÚ.¥ßk¥ä‚+k in®%làlŠvÀÎ]ȃ%ˆ×÷£ÿðþ…oÿãý§<-á­NÐt«o‡Ö7¶Ú_‡4»=:ÊÚ=ÅÞÖYaÓì ŠÚ ôk†Ž$Xa3JYv–ίìmð;Oð_Á3âÚ|3x³â½Æ¢ÚƒÄâÏ@[™aÓ¬-™Ô›x®Vrb#íF[4¸¶„'ñwˆ9xÿãlëð¶MÃþð†IÃkÆ8žÁQ¡BpÁbf¥Œ¥€¥ì°Qͳ¬ÑÁÒ*t0êUj›§QÏûèíôΗø%ÅÞ gYEz8Œ§ÄJœ¹V;3–3¦ò §3¥_3ÆÊ”9y*WÇÖ¬¨Æ§%(Q¡ Jröót~ÉÒÉ//¬4m2fŒ¿ö}Öµfor£‹csk¸ÇÈ÷+°²ì`ÀxgŠ|âßéWuÆO–ïåËm2Ž [Þ@ÒZÜ/bb•°r?a¾/ëïáÓ,—,Ñ+_)ÎOSŒðE|‰âmcJñÖ‘{£j+ÂNŒm¦l-nÔÄrbelo)þ²6’7RŒàý¦EôgðÆ,§:ɼân$ÁñÞO…ÄO.YÞcÌòœë„¥)¼6|®®.P䥉¡9Ó¡9®|5HÝÇú7€|^âìõPÌ3¬³,©”bj%9å´qjac)%ÏNuq5ãZ4”½øM)É-&žãx>ÿÇÞ-Ñ|'¦¼q]ë^BÍ.|¸!Š).n®™…½¬M±~gÙ´rkî ~ð•´þ˽Üqí›PÔØË,ÒY’$)oDD%S ï#vø·Àº­ïƒþ"xgT·%nt_éò2°LÞGÅ»ž3Ì&X%^3Œ ÇOÞ¯~Ëþ!ñ`7^ÕtÉ£¹ãµÔÚ[Iã.2#2GðÈ£8Ÿ$žñ öýéøà¸ëľdÜcÇYy‡À¸qœG,Ë]*´ç U˜Æ®׎>…xâªÆ…Zë–Š‹„S¾^<ø…W‚ó^†3?Y&A›á1•UVxhÖÆa*Ñu|M4¥kˆ£*qœ£M·7¬¶ìÿ`Ø£ö@ýµ¾|XøUã¿Âñ·áþªºß‡~&x:òæÃÄ/áAåY ý:yn4=n^´ž;´¾±3Ϧꖶvwv2@—‘~ þÒ?µÿÙ»ãÄ_‚~%¼´Ôµ_ø‚m(êv;–×T°–/ôRÜ—u-*òÊ÷ìò%¹œÃ!-5ý*þÀÿ³WÆÙçãjüP›Å‡GÔ¼7¬xg_ðµ²êŒºí–© Éf$œ%•µ“éšÄ~«ʽԭö9l„ ì²'óAûC|B×>+|sø±ñÄ—\jþ.ñï‰u›“!È·K­Vå­¬b^B[XZy6±)ÄVÖñF¼(¯É>™˜‡Ï<áþʸqñ-xæTrüª†/Ž?V<Ï [+ÁFžNïeWÕ*oÙÖ”2Œ¹&ú2ñgq'޾3Ç+ñ\oá,¸{„ó¼¿+Äc1”¸[Œ³Zؼ.c—ex¼\]Z9}z9V'0©„¡Z¦œñ´!FªÒ­§á¿…IqáëvõZéõ(Ä)"bfav‘æHÁrû²‰»K.ãö_üçá¯ÀÏþÓ:WÂ_~ÓüOá/ŠºV¥á]æîêÿN›Ãþ1KÃ×vWºmŵÜ2jÓÙIáäT+ÜêÖ’JV($5gökøuqãƒZï¾7KÍfÖÖYb&7·‹R¸+’æ 4’Çæ)m¡< –õöWø›kã/ x§Âº5–«á½{I×´»é®®"ÞéZ…½õ³2ÇlÒ•@¬ÁܼÐWñûË<.ÏøŒ2n*ñ.—qF#+Ìi`qÚØÜ«„Å:r©•ã2œU8*UíUaçáêʤ£ÍN´5’]â/Š8,Mx/1ã9ð¶>¦>ɲüç «–âr|t#Zž[˜a+Ñ”eN®  š‹“Ÿ³•:¼Ðœã/5ÿ‚”Á=­?d-[Kñ—Ãí[QÕþø£V›IŠÏZ–ÞmsÂÚÁ‚K¸tÛ‹˜b¶MJÂòÞ·ÓïRÙ&…lÞÞû2´š~ ð/‹~!ëvþðv‡y®ê³å–ÞÕl1 ÓÝÜHÑÛÚ[!aæ\\Ë)Ÿ™ûWíGü“ö‹×þ ø‹áwÃEÓÓ@Ñí´Aã­cMKƒw%æµ~÷M‹ËtmíCGe®¥%²EhSSf˜4± ‡Ñ¿`ºO…~ xÄ’ÙÆþ!ñôCÄãÂ<Ác,³.‹g²î6ñéþUÙ\…7wK(«Ïú&pN}â. †²n=â V•8ãkæYí*tãÅäøllè`ª{ñ)c±t½—-yÒ÷©J8ŠÔåWž2ùþ ñÓü=ú)ð_ø§R‡qÖmØ Oi\Æ/Ž[ŽÍ+á”iÕ’ËpŸYÄU £,O59F½ZµåÕ÷ì/ñKJÒ¿´5MWÖ“Äj%¾›Ëb¹1It–b=ËДWMÝŒ1ùcÅÞñ‚oÓZ³…™!¼·‘n,îvž°Îƒ‘†ò¥ÌÞs_Ú‡þø;Z’è:vµ§¾æÂþÝd¶ž3ÑȃR8##ÚºŸðK¯Ùö‡ð±¥h^_„þ7»Ó.†‰âo Ýß¾™m­ù Ö:¯†o¯'Ó.¬’ä!º‡O]ËÀÒ¬7PÈUÇúIâ§€?Fü£¥S‡1œc’ñ† R­ Φ6Žq’bkÓ§xQÍpU}ž&Œq\¯—J hðõ¢œóïþÓ âL.WâŽ[ކW˜ciáåœd™] ˜<¢j±‚¯Š„qƼ5ÉÔ«*x|mogv2“?…”GwXãF’I0ˆˆ 9fà bßÂ'8ë^›eðSâµý’ê6þñØÝ7Ç,öZù‰Œî‰.D/(ÇC°=Oú ûþÌö°üYø³¬­ïõÏ„'¹ð]­« ’Î-zÎûQ³¿Õ)hE€{HªcûD“l$-ÑŸ´ïÅχß5/¾"‡T¸×µm*=j+}:ÈÃxwÀ\<¸«7–_†Ìñ8iQÑX\NŽ>2ÃÒ£É)ÓŽF­LEJ´à¥ZŒ&õ—á®­ kZ ïk­iwú]ÂõŠúÒkgÈÎB‰UsîF}ñXùöëŽÞŸ_Ö¿U<ð÷Äß¶%üÞø)àoân¦ñ™ï4í;Of…à‰}«_ÌÑYhVáÜ$z…õ嵫;„í¿c|YûH~Í_e¿ˆðÿã‚õOkw6k:]®£%•Ôz†s4ðEyc¨é—Wºmü)=¼ö³Iiw2ÇqÇ&׬>ÿG,ƒ˜^ânñ†üCàž,¡ NQ˜åxì³*4êÆr¤ñx*вt*{:Ž& 5iΕzTjr©~•Â>'dÙþm>Í19nMÇ40²ÆÖáJ™žY»ÁÂÜøÈe³© Â4#tå9áýš‹æIGSǼ'á_Æž%Ð|% ÛIy¬ø‹V°ÑôÛh”³Ë{¨\Çk€ ¶<ÉWqí\¶8¯íöHø¥|øYàïi‘¤¯£iÐRüG±õMrïý'WÔ\X-Åì’ù³1‚Ù`·Ü kù—ÿ‚tøûö{ø_ñ¶_üz×dÐEÒ$OßÍ¡êºÖ—g®Þ¿Ù®o¯SE´Ô/ ¸ƒOi¡°”éóÛÇ%Ì·Io,J?¦ ÿÁ@b X`y?hoD®‘8ómüE…`o‰ô5’6£uGR º†W•á‡!žp†/9Ïx£†°ÙŽ;W C*Ææø >3ƒÃ4\F½zu`ñu¯*w*p”eï´¿Ï/Ú#šø³ÅœÃ¾ à8Îxg/ ³œÏ3Éxs7Ìrü×8ÄÂtðô)bpXZÔjÇ*ÂÊ|ñö—XŒeHÊt£)~ƒj |1ñkáÏ‹¾øÚËí¾ñï†õ? ë0¨_2;mJÙíÖêÔ¾å[ÛLwör20ŠêÖ …à ~-ø;âŸÙSö̇áO‹¿µ¾|^Ðì#¿Xe‚ WL^²›HÖìÄŸdÕ´É-¯íðw*N°êØþ²5/ø,üóÀ6ÅÇÆk¿Þ ex?Àž6½¹p¬Wlwº¶‡¢hL\«ή8 çj7xLf&žq‚«S.ļÏZž_R«<4šþ<®{}Å#‘îOÄg¯Nõôg‡u¬4y|çóÇL~^æ¿3þüið'Ä?hú¯„|W£ë1ÝÙÛIä[_Aý¡†Þ[k½>G[Ë[˜ +,3¯ € }…§øËIÑá[­_VÓ´«Qɺԯíl 1ÒÜË`FIn2­q_Òß7ÂÒÄ`q3Ì(âèsQ«‡©Jº¯°|’ƒ¥ËÍÍuËd›í¹üEâW†ùÞ_œfYf+$̨ã0øšÔ*aª`1®ªB¤£Éì.vÛJÊÏ™ZÇmûcÈ5ߨ×öÒËÉ™¾|B™G2<Ö>½Ô!Apym‘2ŒÁH8#ñ÷ö%Ô4¯‹?³ù´ù"š÷ÂzqðF¹m_6Îÿ@con²ª¨Ûö%´ûÀYAa9ǘC9õ?Û«þ WðÀÿ>"ü%ð_ˆ´ÿ‰¿¼àýwÁâÇÂ÷AðÝ¿ˆtû.çTÖuø]>Yí!¸šH4}>{›Ù.#D¾þÏŠD™¿œ¿Ù“ö¬ø—û.xÆ_ø&k]GFÕL1xŸÁÚÇŸ&ƒâhKˆÄpM ¶º…ªË1°Ô­ÜMjòººÏm$öÓ~ÃôBñƒ>¥Só>=ÊsŒ³†xÖŸö%:Øš)fRTéW¥›aðu\+Ï G¥oJ¥Z”9ù!ÍýÕôcú0x“ý8Ï*Ädø®âþ!Pã>¥ÄêeßÛTid4rÌu*´ªÇÛàð¸ØÅGНB0zP’VsªX?¾x ûYŽëÅþ ð׋mŽSì~&Ñ4ÝnÍwcæ[mJÞâ%pVXÐ:€WpRÊÿrCðSöCð/‚üEã¿|ø%aáßxUñ&¿sðïÂÇk¥hÖ3ê7³4¦$`$°@̤œrÄ×á„à·?lt„º×~ üB³×b‰ éÚ^§áûë .ùÖ FâK–-Ü+Éc¿’Yþ}~Ü?ðU‹µ¶…/à icá_Á™&ŠmGÃ6:„·Úç‹äµž;›OøKµ…ðÏakq7Vš-¤QÝ*Ïy&£4²Ûþ™“ð‡xaʝˆ3âi™æê•18<¯(ÅçEW(¿bñ|ñÃRÃS„šu¯z&£7óÜ—è}ôµñ2¼Ÿˆkñ?†|ƒÌpï>οÖèR¡ý™B´g‰¥“eù6mZxìf*Š•<5éSÃ)Î3Ä×§Êß)|2ðÕ¿ÇÚ–æïHÒ Òü3«xÿZñ½Ö›eCc¥xpk“k#L·Š(Ö+{sÁ¥Z¢F‰–0¨6é—À¶¡c·ã€gö9ý}ñ_Íìiñoß >-Á}âù§‡¼E¦É ^ê¦&•t§žîÖæÚöeŒ4‚Ñ'·T¼xÕ¤Žyn©þš¾jzNµce©hº–«¦Ü¢Im}¦ÝAygÂæ¼5—}CÊxr–'Ç8V­‡«^îž25qrrÖá XN5&ª¸F7;‘õ×€#Ilç®å<ã·NG?ËñüþÛ³>³ðÓö×ñÇ ÙIs޼em®|?„&ØåÑþ ^ CI±ÁT¦‘5ìº5ÅÁ…´é§m‘0#úÄÒüM¡ø[O—Zñ±¦èZFŸy©ê÷¶Úu…¤h 3Ïwu$PD¡FF÷wŽ™¯æ£öîý¶|/ñ/öËð'Å_†0A­xgà¢è&ª=¼–kã!¡k·ú¶­6\GttÛÖ¾¸Ó¬.%Ý5ŠÅ:¬$¢'ÁpO9Ç^2åðÍ#Åp] ,£Ä9ÌaVtrÚ51Ø?f¨ÕiÓž*­%ˆä¡ Ô”!*œ¶§¯ã¿@øñOëpþK‰ÆpÖeÀ¹‚Çãq4êÑʨñ¼+ðÅ'Š—-b1ªâðîŒdê}Z­jÞìi6ÿN~ü ³ø}à ø.Î$’=J·´žtC‹›æ->¥w†»¿šæåòR¨à}à‡q´ðoÀd'å?Žr¸ú:W+û;|UøMûAx_Mñ7Ã麤—6±Ë©ø}®!‹ÄZ ÙQö› [Jr—q=¼»£)Ù]"­Å¥ÄÖòÇ+}×á ,McÚr¼ãë:zãÔo#Vh¬¼Gá»ùõkXnXe :¦“­n°Bspt}M”nä{wüwâž‘ñàváï´F|KðñG†u«"ãÎ[æ™ô+èãÎám6›äY‡#þ>¬.€Â„®ãþ ûP|»ø1áÙ‡Ãæ•âψçÇZoüHš=ž¡mà?DÓ5[-u;ØX­õÝb]UÒ=2)MݦŸms.¢–±ÝØ ¿æûá7ƈ¼Woã/‡~ ¹ÐµxWʸDĶ:¥¡u‘ì5K)[ßYÈèŒÐαÕ%ˆ¤¨’/ó­X¿ xªxƒKŽOR2§Ns‚•l"œ[‡´£8ÆM^Ôå'J\®2·úKà׆Üaã÷Гƒ8oаXŽ⌣™ÕàìVoF¶ëùfާ’c1¸gMb(`³ ·<:Ž“œá†ÃæPZucí?¸o8ŒBAÇ“êq’;tëïDZ¯|“â&…ðÿÂzÿŒüUªÛh¾ð¶}®ëz¥ìé­Ž›¦ÛIuu4’?GXÑwI,Œ‘F#ªŸæÀßðZ]_GÑàƒÅÿì5Mv±-ç‡üU>•¥ÝÌí…þ™«ÜØ¡#æQ|sÈ «ñ¿ígÿøßûTé­àÛáaà/†â+“àŸ Éq'ö¬°8’Þënu™ ‘VH`HltȤHåM<\/žÞ—øÁçØ)à!Fµ?ig*µ¤¹)Á¦›¼ÜÚè’êµ¶«ù*ýœ¾3q‡àðjÒŠ\»ýš¿kÝÃÿµ?ÅxµãÒüñ»Æúæ³-ü»¼¿_ÞëÚþ‰}rNí–m¡%ž¤üù^d7%„vέûSñöKø3ûXxkEƒÆIs ýŒw†¼oá{‹EÕ-m/KäÇpñ]Yjš=Æõ¹ò¤‰¼™í'¤’I?‘/¦}~•õ_ÁÛSö‹ø mo¥øÇ×m Zñoá½~Ú×_Ñ-Ô±vŽÒ×RŠw±˜–+a5¯ÌÌà ÌO¾"c2 ŸØì,ç ÅÝÕËñ)JrSo–MEþó÷±’”*R©yÓšv·ú3ã_Ñ“ˆóüç$ãßø¿ýF㼃-Áåp•z•é`ñø\» Y¡K*8•ƒ„p˜ŠUð¸Œ6„aЦã9Tþ·¿àŸ?²?€ÿaˈ1xÅÞ)ñN£ñ6O z÷Ä?`µ‚+_ e´«k+ :ãWY5ûö¸¸¸–f‘L1ư*Mç~$ÿÁyþ1øGâGíðóÂÔm5Mgáw€®´Íg"̶Æ»«¶­‹q*dë ‚{¸w7ÙžüA&Ë„ž4ùgÆðV_ÛÅz$Ú—‹´Eqoök‹ÿørÛOÕæCÞ=NúMNæÆY0di4ç´e‘ØFR0±¯æþ¥©jΡyªê÷×Zާ¨ÜÍ{¨_O-ÕååÝÄ,÷773Ë<óJí$²ÈìîìY‰$šòx›Šáža°n-§”åYc¨ð¸HMÔPu%RrQsY¨º•ªTnUœäÖÇæ?G¢‰œ5ãÆiôŽñÇŒòþ"ãºùF'*ÁQʧíªW–'.£’}k3ÄSÁeØ(QÂdô‚Áá¥)µZ”åC’­,þ¾”dúŸÎ’Šøóý9úúÿŸçIEzËSÔtçó4ûë«):µžXñŽZ6SÒ¯]x›Ä7Ñoµ½Vò0b¸Ô.¥ŒûyíŒ~U‡Ee*%5RTiJ¢Úr§5é&¯ø˜Ë ‡œÕYУ:ŠÍT•(JjÛZn.JÝ5Ðq9ë“Ç99?™éM¢ŠÔØ(¢Š\óôè3ÓüþµÞxSâ—į±oxûÆ^' Ÿ ø“WѨ-¦ÝÛœœó܊ਬ1\62“¡‹ÃÐÅQ“NTqiפÚÙ¸UŒ¢íÒèæÅà°xú2Ãc°˜lnvç¡‹¡KFVÕsR­ ÂVz«ÅØô/üZø£ãå ㈾6ñ‚¨G‰üQ¬ë»Bãh_í;Ëœ€1ŠóÚ(¥†ÂapT• „¢›jŽ:“{µN”cßV–¢ÁàpYu†Ëðx\-¸áðxzXj1oVÕ*0…4ßV£¯SgDñ¿á«èµ?ëZ¦…¨ÂwC£ß\é×°èÑ\ÚI ѰõGó5ì:ŸíQûMkZKèÇí ñ³VФˆA&©|Pñ­ö”ð„Ø"m>çZ–Ñ£J1 JŽ+Áh¯cšæ˜:2Ãá3,à Bw硇Æb(QÕŸ5:U# ]hïtqã² ‹4¯K™d¹Nc‰¡gCŽËpxºôy_4}•\E•)Ùê¹$¬õZ“O<·2É=Ä’M4¬^I¥‘¤‘äc—wf$³19$’Iç­CEÀÛm¶Ûm¶ÛÕ¶÷mõo©ê¤’I$’I$•’KD’Z$–È(¢ŠC?çú}=©(¢€ (¢€?ÿÙtiff-4.0.3/html/images/info.gif0000644000212300117540000000020306747424643013235 00000000000000GIF89a ñbbb```ÿÿÿæ!ù, T„©Ëí£œ‹oM¹ã xâ@& gªŽ)ÄkË&ݪL®/g,è)j¶›(ä gÃ¥ñ(2¡ésWE,^&âýLx èà:«×ì¶ûí(;tiff-4.0.3/html/v3.4beta029.html0000644000212300117540000000532106753634101013010 00000000000000 Changes in TIFF v3.4beta029 TIFF CHANGE INFORMATION

This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


CHANGES IN THE SOFTWARE CONFIGURATION:
  • configure now relativizes pathname references given in -L options (as frequently specified when configuring ancillary packages)
  • problems related to configuring the software on Ultrix 4.4 have been corrected
  • the shell to use in Makefiles and scripts can now be set with the SCRIPT_SH configuration parameter
  • comments in config.site now correctly indicate how to setup the use of ancillary packages


CHANGES IN LIBTIFF:
  • mods for building the software on a Mac using the MetroWerks CodeWarrior compilers
  • a bug in the CCITT T.4/T.6 decoder was fixed where the last codeword in a strip/tile might not be decoded; this was seen only when decoding multi-strip images
  • a bug in the CCITT RLE codecs was fixed whereby the pseudo tags were not being properly registered


CHANGES IN THE CONTRIBUTED SOFTWARE:
  • contrib/mac-cw contains information and code from Niles Ritter <ndr@tazboy.jpl.nasa.gov> about building the software with the MetroWerks CodeWarrior compilers on Macintosh systems
TIFF home page.

Sam Leffler / sam@engr.sgi.com Last updated $Date: 1999/08/09 20:21:21 $.
tiff-4.0.3/html/bugs.html0000644000212300117540000000512611057522725012173 00000000000000 Bugs and the TIFF Mailing List

Bugs, Bugzilla, and the TIFF Mailing List

This software is free. Please let us know when you find a problem or fix a bug.

Thanks to MapTools.org, libtiff now uses bugzilla to track bugs. All bugs filed in the older bugzilla at bugzilla.remotesensing.org (pre April 2008) have unfortunately been lost.

If you think you've discovered a bug, please first check to see if it is already known by looking at the list of already reported bugs. You can do so by visiting the buglist at http://bugzilla.maptools.org/buglist.cgi?product=libtiff. Also verify that the problem is still reproducable with the current development software from CVS.

If you'd like to enter a new bug, you can do so at http://bugzilla.maptools.org/enter_bug.cgi?product=libtiff.

If you'd like to inform us about some kind of security issue that should not be disclosed for a period of time, then you can contact maintainers directly. Send a copies of your report to the following people: Frank Warmerdam <warmerdam@pobox.com>, Andrey Kiselev <dron@ak4719.spb.edu>.

Of course, reporting bugs is no substitute for discussion. The tiff@lists.maptools.org mailing list is for users of this software, and discussion TIFF issues in general. It is managed with the Mailman software, and the web interface for subscribing and managing your access to the list is at:

http://lists.maptools.org/mailman/listinfo/tiff

Posts to the list are only accepted from members of the list in order to limit the amount of spam propagated. Also, to be approved as a member you will need to email the list administrator with a brief description of why you are interested in TIFF so we can weed out spammers.

A Long Term Archive including recent messages, and most messages back to 1993, with search capabilities is available, and has been prepared and hosted by AWare Systems.


Last updated: $Date: 2008/09/03 08:05:04 $ tiff-4.0.3/html/v3.4beta018.html0000644000212300117540000000512706753634101013012 00000000000000 Changes in TIFF v3.4beta018 TIFF CHANGE INFORMATION

This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


CHANGES IN THE SOFTWARE CONFIGURATION:
  • configure now recognizes IRIX 6.x systems
  • configure now uses ENVOPTS when searching for an ANSI C compiler; this fixes a problem configuring the software under HP/UX with the native C compiler
  • configure now correctly recognizes memory-mapped files are supported under AIX


CHANGES IN LIBTIFF:
  • make install now properly installs the include files
  • some portability fixes from Bjorn Brox
  • the G3/G4 codec now warns about decoded rows that are longer than the image/tile width
  • changes from Frank Cringle to make the library work with the gcc-specific bounds checking software
  • miscellaneous fixes to TIFFPrintDirectory
  • bug fix to correct a problem where TIFFWriteRawStrip could not be used to automatically grow an image's length


CHANGES IN THE TOOLS:
  • fixes from Frank Cringle to update fax2tiff
  • portability fixes to tiff2bw and tiffcmp
  • tiffdump now uses the byte swapping routines in the library
TIFF home page.

Sam Leffler / sam@engr.sgi.com Last updated $Date: 1999/08/09 20:21:21 $.
tiff-4.0.3/html/Makefile.am0000644000212300117540000000427111766757625012421 00000000000000# # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. docdir = $(LIBTIFF_DOCDIR)/html docfiles = \ addingtags.html \ bugs.html \ build.html \ contrib.html \ document.html \ images.html \ index.html \ internals.html \ intro.html \ libtiff.html \ misc.html \ support.html \ TIFFTechNote2.html \ tools.html \ v3.4beta007.html \ v3.4beta016.html \ v3.4beta018.html \ v3.4beta024.html \ v3.4beta028.html \ v3.4beta029.html \ v3.4beta031.html \ v3.4beta032.html \ v3.4beta033.html \ v3.4beta034.html \ v3.4beta035.html \ v3.4beta036.html \ v3.5.1.html \ v3.5.2.html \ v3.5.3.html \ v3.5.4.html \ v3.5.5.html \ v3.5.6-beta.html \ v3.5.7.html \ v3.6.0.html \ v3.6.1.html \ v3.7.0alpha.html \ v3.7.0beta.html \ v3.7.0beta2.html \ v3.7.0.html \ v3.7.1.html \ v3.7.2.html \ v3.7.3.html \ v3.7.4.html \ v3.8.0.html \ v3.8.1.html \ v3.8.2.html \ v3.9.0beta.html \ v3.9.1.html \ v3.9.2.html \ v4.0.0.html \ v4.0.1.html \ v4.0.2.html dist_doc_DATA = $(docfiles) SUBDIRS = images man tiff-4.0.3/html/v3.5.2.html0000644000212300117540000000631110153177756012071 00000000000000 Changes in TIFF v3.5.2 TIFF CHANGE INFORMATION

This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


CHANGES IN THE SOFTWARE CONFIGURATION:
  • Corrected alpha versioning.
  • Removed distinction between alpha and release targets in Makefile.in.
  • Added release.stamp target, which tags cvs tree, and updates "RELEASE-DATE"
  • Added releasediff target, which diffs tree with source as of date in "RELEASE-DATE"
  • Ticked up version to 3.5.2 (alpha 01 -- but I think we'll moving away from alpha/non-alpha distinctions).


CHANGES IN LIBTIFF:
  • Added IRIX/gcc, and OSF/1 4.x support on behalf of Albert Chin-A-Young
  • Added TIFFReassignTagToIgnore() API on behalf of Bruce Cameron . Man page still pending.
  • pre-remove so link before softlink in LINUXdso action in libtiff/Makefile.in to avoid failure on LINUXdso builds other than the first.
  • Fixed problem with cvtcmap() in tif_getimage.c modifying the colormaps owned by the TIFF handle itself when trying to fixup wrong (eight bit) colormaps. Corrected by maintaining a private copy of the colormap.
  • Added TIFFReadRGBATile()/TIFFReadRGBAStrip() support in tif_getimage.c.
  • Applied "a" mode fix to tif_win32.c/TIFFOpen() as suggested by Christopher Lawton
  • Set O_BINARY for tif_unix.c open() ... used on cygwin for instance.
  • Added CYGWIN case in configure.
  • Applied Francois Dagand's patch to handle fax decompression bug. (sizes >= 65536 were failing)


CHANGES IN THE TOOLS:
  • Added addtiffo (add overviews to a TIFF file) in contrib. Didn't put it in tools since part of it is in C++.
TIFF home page.

Last updated $Date: 2004/11/26 14:37:20 $. tiff-4.0.3/html/v4.0.1.html0000644000212300117540000000574411720016727012064 00000000000000 Changes in TIFF v4.0.1 TIFF CHANGE INFORMATION

This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


MAJOR CHANGES:
  • None


CHANGES IN THE SOFTWARE CONFIGURATION:
  • --enable-ld-version-script: New configure option to enable shared library symbol versioning on ELF-based systems (e.g. Linux and FreeBSD) which use the GNU linker. This allows multiple major versions of libtiff to be loaded simultaneously into the same application or library without conflict, as long as all libtiffs involved are built with versioned symbols. This option is not enabled by default.
  • Added libtiff private dependency on -llzma for pkg-config.


CHANGES IN LIBTIFF:
  • libtiff/tif_dir.c, libtiff/tif_dirread.c: Extra caution around assumption tag fetching is always successful.
  • libtiff/tif_jpeg.c: Extra caution for case where sp is NULL.


CHANGES IN THE TOOLS:
  • None


CHANGES IN THE CONTRIB AREA:
  • None
Last updated $Date: 2012-02-18 21:53:27 $. tiff-4.0.3/html/intro.html0000644000212300117540000000453206753634101012365 00000000000000 Introduction to the TIFF Documentation

Introduction to the TIFF Documentation

The following definitions are used throughout this documentation. They are consistent with the terminology used in the TIFF 6.0 specification.

Sample
The unit of information stored in an image; often called a channel elsewhere. Sample values are numbers, usually unsigned integers, but possibly in some other format if the SampleFormat tag is specified in a TIFF
Pixel
A collection of one or more samples that go together.
Row
An Nx1 rectangular collection of pixels.
Tile
An NxM rectangular organization of data (or pixels).
Strip
A tile whose width is the full image width.
Compression
A scheme by which pixel or sample data are stored in an encoded form, specifically with the intent of reducing the storage cost.
Codec
Software that implements the decoding and encoding algorithms of a compression scheme.

In order to better understand how TIFF works (and consequently this software) it is important to recognize the distinction between the physical organization of image data as it is stored in a TIFF and how the data is interpreted and manipulated as pixels in an image. TIFF supports a wide variety of storage and data compression schemes that can be used to optimize retrieval time and/or minimize storage space. These on-disk formats are independent of the image characteristics; it is the responsibility of the TIFF reader to process the on-disk storage into an in-memory format suitable for an application. Furthermore, it is the responsibility of the application to properly interpret the visual characteristics of the image data. TIFF defines a framework for specifying the on-disk storage format and image characteristics with few restrictions. This permits significant complexity that can be daunting. Good applications that handle TIFF work by handling as wide a range of storage formats as possible, while constraining the acceptable image characteristics to those that make sense for the application.


Last updated: $Date: 1999/08/09 20:21:21 $ tiff-4.0.3/html/v3.4beta035.html0000644000212300117540000000340006753634101013001 00000000000000 Changes in TIFF v3.4beta035 TIFF CHANGE INFORMATION

This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


CHANGES IN THE SOFTWARE CONFIGURATION:
  • support was added installing the HTML documentation
  • support was added for building the library as a DSO under FreeBSD


CHANGES IN LIBTIFF:
  • the interface to the mkversion program was restored to the form used prior to v3.4beta034
  • several portability problems for 16-bit systems were fixed
TIFF home page.

Sam Leffler / sam@engr.sgi.com Last updated $Date: 1999/08/09 20:21:21 $.
tiff-4.0.3/html/man/0000755000212300117540000000000012027361332011165 500000000000000tiff-4.0.3/html/man/TIFFReadRGBAStrip.3tiff.html0000644000212300117540000001647110640473666016035 00000000000000 TIFFReadRGBAStrip

TIFFReadRGBAStrip

NAME
SYNOPSIS
DESCRIPTION
NOTES
RETURN VALUES
DIAGNOSTICS
SEE ALSO

NAME

TIFFReadRGBAStrip − read and decode an image strip into a fixed-format raster

SYNOPSIS

#include <tiffio.h>

#define TIFFGetR(abgr) ((abgr) & 0xff)
#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)

int TIFFReadRGBAStrip(TIFF *tif, uint32 row, uint32 *raster)

DESCRIPTION

TIFFReadRGBAStrip reads a single strip of a strip-based image into memory, storing the result in the user supplied RGBA raster. The raster is assumed to be an array of width times rowsperstrip 32-bit entries, where width is the width of the image (TIFFTAG_IMAGEWIDTH) and rowsperstrip is the maximum lines in a strip (TIFFTAG_ROWSPERSTRIP).

The row value should be the row of the first row in the strip (strip * rowsperstrip, zero based).

Note that the raster is assume to be organized such that the pixel at location (x,y) is raster[y*width+x]; with the raster origin in the lower-left hand corner of the strip. That is bottom to top organization. When reading a partial last strip in the file the last line of the image will begin at the beginning of the buffer.

Raster pixels are 8-bit packed red, green, blue, alpha samples. The macros TIFFGetR, TIFFGetG, TIFFGetB, and TIFFGetA should be used to access individual samples. Images without Associated Alpha matting information have a constant Alpha of 1.0 (255).

See the TIFFRGBAImage(3TIFF) page for more details on how various image types are converted to RGBA values.

NOTES

Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be either 1, 3, or 4 (i.e. SamplesPerPixel minus ExtraSamples).

Palette image colormaps that appear to be incorrectly written as 8-bit values are automatically scaled to 16-bits.

TIFFReadRGBAStrip is just a wrapper around the more general TIFFRGBAImage(3TIFF) facilities. It’s main advantage over the similar TIFFReadRGBAImage() function is that for large images a single buffer capable of holding the whole image doesn’t need to be allocated, only enough for one strip. The TIFFReadRGBATile() function does a similar operation for tiled images.

RETURN VALUES

1 is returned if the image was successfully read and converted. Otherwise, 0 is returned if an error was encountered.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine.

Sorry, can not handle %d-bit pictures. The image had BitsPerSample other than 1, 2, 4, 8, or 16.

Sorry, can not handle %d-channel images. The image had SamplesPerPixel other than 1, 3, or 4.

Missing needed "PhotometricInterpretation" tag. The image did not have a tag that describes how to display the data.

No "PhotometricInterpretation" tag, assuming RGB. The image was missing a tag that describes how to display it, but because it has 3 or 4 samples/pixel, it is assumed to be RGB.

No "PhotometricInterpretation" tag, assuming min-is-black. The image was missing a tag that describes how to display it, but because it has 1 sample/pixel, it is assumed to be a grayscale or bilevel image.

No space for photometric conversion table. There was insufficient memory for a table used to convert image samples to 8-bit RGB.

Missing required "Colormap" tag. A Palette image did not have a required Colormap tag.

No space for tile buffer. There was insufficient memory to allocate an i/o buffer.

No space for strip buffer. There was insufficient memory to allocate an i/o buffer.

Can not handle format. The image has a format (combination of BitsPerSample, SamplesPerPixel, and PhotometricInterpretation) that TIFFReadRGBAImage can not handle.

No space for B&W mapping table. There was insufficient memory to allocate a table used to map grayscale data to RGB.

No space for Palette mapping table. There was insufficient memory to allocate a table used to map data to 8-bit RGB.

SEE ALSO

TIFFOpen(3TIFF), TIFFRGBAImage(3TIFF), TIFFReadRGBAImage(3TIFF), TIFFReadRGBATile(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFReadScanline.3tiff.html0000644000212300117540000001221110640473667016021 00000000000000 TIFFReadScanline

TIFFReadScanline

NAME
SYNOPSIS
DESCRIPTION
NOTES
RETURN VALUES
DIAGNOSTICS
BUGS
SEE ALSO

NAME

TIFFReadScanline − read and decode a scanline of data from an open TIFF file

SYNOPSIS

#include <tiffio.h>

int TIFFReadScanline(TIFF *tif, tdata_t buf, uint32 row, tsample_t sample)

DESCRIPTION

Read the data for the specified row into the (user supplied) data buffer buf. The data are returned decompressed and, in the native byte- and bit-ordering, but are otherwise packed (see further below). The buffer must be large enough to hold an entire scanline of data. Applications should call the routine TIFFScanlineSize to find out the size (in bytes) of a scanline buffer. The row parameter is always used by TIFFReadScanline; the sample parameter is used only if data are organized in separate planes (PlanarConfiguration=2).

NOTES

The library attempts to hide bit- and byte-ordering differences between the image and the native machine by converting data to the native machine order. Bit reversal is done if the FillOrder tag is opposite to the native machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file was written with a byte order opposite to the native machine byte order,

In C++ the sample parameter defaults to 0.

RETURN VALUES

TIFFReadScanline returns −1 if it detects an error; otherwise 1 is returned.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine.

Compression algorithm does not support random access. Data was requested in a non-sequential order from a file that uses a compression algorithm and that has RowsPerStrip greater than one. That is, data in the image is stored in a compressed form, and with multiple rows packed into a strip. In this case, the library does not support random access to the data. The data should either be accessed sequentially, or the file should be converted so that each strip is made up of one row of data.

BUGS

Reading subsampled YCbCR data does not work correctly because, for PlanarConfiguration=2 the size of a scanline is not calculated on a per-sample basis, and for PlanarConfiguration=1 the library does not unpack the block-interleaved samples; use the strip- and tile-based interfaces to read these formats.

SEE ALSO

TIFFOpen(3TIFF), TIFFReadEncodedStrip(3TIFF), TIFFReadRawStrip(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFError.3tiff.html0000644000212300117540000000625710640473665014575 00000000000000 TIFFError

TIFFError

NAME
SYNOPSIS
DESCRIPTION
RETURN VALUES
SEE ALSO

NAME

TIFFError, TIFFSetErrorHandler − library error handling interface

SYNOPSIS

#include <tiffio.h>

void TIFFError(const char *module, const char *fmt, ...)

#include <stdarg.h>

typedef void (*TIFFErrorHandler)(const char *module, const char *fmt, va_list ap);
TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler handler);

DESCRIPTION

TIFFError invokes the library-wide error handling function to (normally) write an error message to the stderr. The fmt parameter is a printf(3S) format string, and any number arguments can be supplied. The module parameter, if non-zero, is printed before the message; it typically is used to identify the software module in which an error is detected.

Applications that desire to capture control in the event of an error should use TIFFSetErrorHandler to override the default error handler. A NULL (0) error handling function may be installed to suppress error messages.

RETURN VALUES

TIFFSetErrorHandler returns a reference to the previous error handling function.

SEE ALSO

TIFFWarning(3TIFF), libtiff(3TIFF), printf(3)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFReadRGBATile.3tiff.html0000644000212300117540000002043510640473666015624 00000000000000 TIFFReadRGBATile

TIFFReadRGBATile

NAME
SYNOPSIS
DESCRIPTION
NOTES
RETURN VALUES
DIAGNOSTICS
SEE ALSO

NAME

TIFFReadRGBATile − read and decode an image tile into a fixed-format raster

SYNOPSIS

#include <tiffio.h>

#define TIFFGetR(abgr)

((abgr) & 0xff)

#define TIFFGetG(abgr)

(((abgr) >> 8) & 0xff)

#define TIFFGetB(abgr)

(((abgr) >> 16) & 0xff)

#define TIFFGetA(abgr)

(((abgr) >> 24) & 0xff)

int TIFFReadRGBATile(TIFF *tif, uint32 x, uint32 y, uint32 *raster)

DESCRIPTION

TIFFReadRGBATile reads a single tile of a tile-based image into memory, storing the result in the user supplied RGBA raster. The raster is assumed to be an array of width times length 32-bit entries, where width is the width of a tile (TIFFTAG_TILEWIDTH) and length is the height of a tile (TIFFTAG_TILELENGTH).

The x and y values are the offsets from the top left corner to the top left corner of the tile to be read. They must be an exact multiple of the tile width and length.

Note that the raster is assume to be organized such that the pixel at location (x,y) is raster[y*width+x]; with the raster origin in the lower-left hand corner of the tile. That is bottom to top organization. Edge tiles which partly fall off the image will be filled out with appropriate zeroed areas.

Raster pixels are 8-bit packed red, green, blue, alpha samples. The macros TIFFGetR, TIFFGetG, TIFFGetB, and TIFFGetA should be used to access individual samples. Images without Associated Alpha matting information have a constant Alpha of 1.0 (255).

See the TIFFRGBAImage(3TIFF) page for more details on how various image types are converted to RGBA values.

NOTES

Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be either 1, 3, or 4 (i.e. SamplesPerPixel minus ExtraSamples).

Palette image colormaps that appear to be incorrectly written as 8-bit values are automatically scaled to 16-bits.

TIFFReadRGBATile is just a wrapper around the more general TIFFRGBAImage(3TIFF) facilities. It’s main advantage over the similar TIFFReadRGBAImage() function is that for large images a single buffer capable of holding the whole image doesn’t need to be allocated, only enough for one tile. The TIFFReadRGBAStrip() function does a similar operation for stripped images.

RETURN VALUES

1 is returned if the image was successfully read and converted. Otherwise, 0 is returned if an error was encountered.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine.

Sorry, can not handle %d-bit pictures. The image had BitsPerSample other than 1, 2, 4, 8, or 16.

Sorry, can not handle %d-channel images. The image had SamplesPerPixel other than 1, 3, or 4.

Missing needed "PhotometricInterpretation" tag. The image did not have a tag that describes how to display the data.

No "PhotometricInterpretation" tag, assuming RGB. The image was missing a tag that describes how to display it, but because it has 3 or 4 samples/pixel, it is assumed to be RGB.

No "PhotometricInterpretation" tag, assuming min-is-black. The image was missing a tag that describes how to display it, but because it has 1 sample/pixel, it is assumed to be a grayscale or bilevel image.

No space for photometric conversion table. There was insufficient memory for a table used to convert image samples to 8-bit RGB.

Missing required "Colormap" tag. A Palette image did not have a required Colormap tag.

No space for tile buffer. There was insufficient memory to allocate an i/o buffer.

No space for strip buffer. There was insufficient memory to allocate an i/o buffer.

Can not handle format. The image has a format (combination of BitsPerSample, SamplesPerPixel, and PhotometricInterpretation) that TIFFReadRGBAImage can not handle.

No space for B&W mapping table. There was insufficient memory to allocate a table used to map grayscale data to RGB.

No space for Palette mapping table. There was insufficient memory to allocate a table used to map data to 8-bit RGB.

SEE ALSO

TIFFOpen(3TIFF), TIFFRGBAImage(3TIFF), TIFFReadRGBAImage(3TIFF), TIFFReadRGBAStrip(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFswab.3tiff.html0000644000212300117540000000664410640473672014436 00000000000000 SWAB

SWAB

NAME
SYNOPSIS
DESCRIPTION
DIAGNOSTICS
SEE ALSO

NAME

TIFFGetBitRevTable, TIFFReverseBits, TIFFSwabShort, TIFFSwabLong, TIFFSwabArrayOfShort, TIFFSwabArrayOfLong − byte- and bit-swapping routines

SYNOPSIS

#include <tiffio.h>

const unsigned char* TIFFGetBitRevTable(int reversed)
void TIFFReverseBits(u_char *
data, unsigned long nbytes)
void TIFFSwabShort(uint16 *
data)
void TIFFSwabLong(uint32 *
data)
void TIFFSwabArrayOfShort(uint16 *
data, unsigned long nshorts)
void TIFFSwabArrayOfLong(uint32 *
data, unsigned long nlongs)

DESCRIPTION

The following routines are used by the library to swap 16- and 32-bit data and to reverse the order of bits in bytes.

TIFFSwabShort and TIFFSwabLong swap the bytes in a single 16-bit and 32-bit item, respectively. TIFFSwabArrayOfShort and TIFFSwabArrayOfLong swap the bytes in an array of 16-bit and 32-bit items, respectively.

TIFFReverseBits replaces each byte in data with the equivalent bit-reversed value. This operation is performed with a lookup table, which is returned using the TIFFGetBitRevTable function. reversed parameter specifies which table should be returned. Supply 1 if you want bit reversal table. Supply 0 to get the table that do not reverse bit values. It is a lookup table that can be used as an identity function; i.e. TIFFNoBitRevTable[n] == n.

DIAGNOSTICS

None.

SEE ALSO

libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFGetField.3tiff.html0000644000212300117540000010126211370550376015153 00000000000000 TIFFGetField

TIFFGetField

NAME
SYNOPSIS
DESCRIPTION
AUTOREGISTERED TAGS
RETURN VALUES
DIAGNOSTICS
SEE ALSO

NAME

TIFFGetField, TIFFVGetField − get the value(s) of a tag in an open TIFF file

SYNOPSIS

#include <tiffio.h>

int TIFFGetField(TIFF *tif, ttag_t tag, ...)

#include <stdarg.h>

int TIFFVGetField(TIFF *tif, ttag_t tag, va_list ap)
int TIFFGetFieldDefaulted(TIFF *
tif, ttag_t tag, ...)
int TIFFVGetFieldDefaulted(TIFF *
tif, ttag_t tag, va_list ap)

DESCRIPTION

TIFFGetField returns the value of a tag or pseudo-tag associated with the the current directory of the opened TIFF file tif. (A pseudo-tag is a parameter that is used to control the operation of the TIFF library but whose value is not read or written to the underlying file.) The file must have been previously opened with TIFFOpen(3TIFF). The tag is identified by tag, one of the values defined in the include file tiff.h (see also the table below). The type and number of values returned is dependent on the tag being requested. The programming interface uses a variable argument list as prescribed by the stdarg(3) interface. The returned values should only be interpreted if TIFFGetField returns 1.

TIFFVGetField is functionally equivalent to TIFFGetField except that it takes a pointer to a variable argument list. TIFFVGetField is useful for layering interfaces on top of the functionality provided by TIFFGetField.

TIFFGetFieldDefaulted and TIFFVGetFieldDefaulted are identical to TIFFGetField and TIFFVGetField, except that if a tag is not defined in the current directory and it has a default value, then the default value is returned.

The tags understood by libtiff(3TIFF), the number of parameter values, and the types for the returned values are shown below. The data types are specified as in C and correspond to the types used to specify tag values to TIFFSetField(3TIFF). Remember that TIFFGetField returns parameter values, so all the listed data types are pointers to storage where values should be returned. Consult the TIFF specification (or relevant industry specification) for information on the meaning of each tag and their possible values.

Tag Name

Count

Types

Notes

TIFFTAG_ARTIST

1

char**

TIFFTAG_BADFAXLINES

1

uint32*

TIFFTAG_BITSPERSAMPLE

1

uint16*

TIFFTAG_CLEANFAXDATA

1

uint16*

TIFFTAG_COLORMAP

3

uint16**

1<<BitsPerSample arrays

TIFFTAG_COMPRESSION

1

uint16*

TIFFTAG_CONSECUTIVEBADFAXLINES

1

uint32*

TIFFTAG_COPYRIGHT

1

char**

TIFFTAG_DATATYPE

1

uint16*

TIFFTAG_DATETIME

1

char**

TIFFTAG_DOCUMENTNAME

1

char**

TIFFTAG_DOTRANGE

2

uint16*

TIFFTAG_EXTRASAMPLES

2

uint16*,uint16**

count & types array

TIFFTAG_FAXFILLFUNC

1

TIFFFaxFillFunc*

G3/G4 compression pseudo-tag

TIFFTAG_FAXMODE

1

int*

G3/G4 compression pseudo-tag

TIFFTAG_FILLORDER

1

uint16*

TIFFTAG_GROUP3OPTIONS

1

uint32*

TIFFTAG_GROUP4OPTIONS

1

uint32*

TIFFTAG_HALFTONEHINTS

2

uint16*

TIFFTAG_HOSTCOMPUTER

1

char**

TIFFTAG_ICCPROFILE

2

uint32*,void**

count, profile data

TIFFTAG_IMAGEDEPTH

1

uint32*

TIFFTAG_IMAGEDESCRIPTION

1

char**

TIFFTAG_IMAGELENGTH

1

uint32*

TIFFTAG_IMAGEWIDTH

1

uint32*

TIFFTAG_INKNAMES

1

char**

TIFFTAG_INKSET

1

uint16*

TIFFTAG_JPEGCOLORMODE

1

int*

JPEG pseudo-tag

TIFFTAG_JPEGQUALITY

1

int*

JPEG pseudo-tag

TIFFTAG_JPEGTABLES

2

uint32*,void**

count & tables

TIFFTAG_JPEGTABLESMODE

1

int*

JPEG pseudo-tag

TIFFTAG_MAKE

1

char**

TIFFTAG_MATTEING

1

uint16*

TIFFTAG_MAXSAMPLEVALUE

1

uint16*

TIFFTAG_MINSAMPLEVALUE

1

uint16*

TIFFTAG_MODEL

1

char**

TIFFTAG_ORIENTATION

1

uint16*

TIFFTAG_PAGENAME

1

char**

TIFFTAG_PAGENUMBER

2

uint16*

TIFFTAG_PHOTOMETRIC

1

uint16*

TIFFTAG_PHOTOSHOP

2

uint32*,void**

count, data

TIFFTAG_PLANARCONFIG

1

uint16*

TIFFTAG_PREDICTOR

1

uint16*

TIFFTAG_PRIMARYCHROMATICITIES

1

float**

6-entry array

TIFFTAG_REFERENCEBLACKWHITE

1

float**

6-entry array

TIFFTAG_RESOLUTIONUNIT

1

uint16*

TIFFTAG_RICHTIFFIPTC

2

uint32*,void**

count, data

TIFFTAG_ROWSPERSTRIP

1

uint32*

TIFFTAG_SAMPLEFORMAT

1

uint16*

TIFFTAG_SAMPLESPERPIXEL

1

uint16*

TIFFTAG_SMAXSAMPLEVALUE

1

double*

TIFFTAG_SMINSAMPLEVALUE

1

double*

TIFFTAG_SOFTWARE

1

char**

TIFFTAG_STONITS

1

double**

TIFFTAG_STRIPBYTECOUNTS

1

uint32**

TIFFTAG_STRIPOFFSETS

1

uint32**

TIFFTAG_SUBFILETYPE

1

uint32*

TIFFTAG_SUBIFD

2

uint16*,uint32**

count & offsets array

TIFFTAG_TARGETPRINTER

1

char**

TIFFTAG_THRESHHOLDING

1

uint16*

TIFFTAG_TILEBYTECOUNTS

1

uint32**

TIFFTAG_TILEDEPTH

1

uint32*

TIFFTAG_TILELENGTH

1

uint32*

TIFFTAG_TILEOFFSETS

1

uint32**

TIFFTAG_TILEWIDTH

1

uint32*

TIFFTAG_TRANSFERFUNCTION

1 or 3†

uint16**1<<BitsPerSample entry arrays

TIFFTAG_WHITEPOINT

1

float**

2-entry array

TIFFTAG_XMLPACKET

2

uint32*,void**

count, data

TIFFTAG_XPOSITION

1

float*

TIFFTAG_XRESOLUTION

1

float*

TIFFTAG_YCBCRCOEFFICIENTS

1

float**

3-entry array

TIFFTAG_YCBCRPOSITIONING

1

uint16*

TIFFTAG_YCBCRSUBSAMPLING

2

uint16*

TIFFTAG_YPOSITION

1

float*

TIFFTAG_YRESOLUTION

1

float*‡

† If SamplesPerPixel is one, then a single array is returned; otherwise three arrays are returned.
‡ The contents of this field are quite complex. See The ICC Profile Format Specification, Annex B.3 "Embedding ICC Profiles in TIFF Files" (available at http://www.color.org) for an explanation.

AUTOREGISTERED TAGS

If you can’t find the tag in the table above that means this is unsupported tag. But you still be able to read it’s value if you know the data type of that tag. For example, if you want to read the LONG value from the tag 33424 and ASCII string from the tag 36867 you can use the following code:

uint16 count;
void *data;

TIFFGetField(tiff, 33424, &count, &data);
printf("Tag %d: %d, count %d0, 33424, *(uint32 *)data, count);
TIFFGetField(tiff, 36867, &count, &data);
printf("Tag %d: %s, count %d0, 36867, (char *)data, count);

is not supported by libtiff(3TIFF), library

RETURN VALUES

1 is returned if the tag is defined in the current directory; otherwise a 0 is returned.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine.

Unknown field, tag 0x%x. An unknown tag was supplied.

SEE ALSO

TIFFOpen(3TIFF), TIFFSetField(3TIFF), TIFFSetDirectory(3TIFF), TIFFReadDirectory(3TIFF), TIFFWriteDirectory(3TIFF) libtiff(3TIFF),

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFFieldTag.3tiff.html0000644000212300117540000000431112005260704015131 00000000000000 TIFFFieldTag

TIFFFieldTag

NAME
SYNOPSIS
DESCRIPTION
RETURN VALUES
SEE ALSO

NAME

TIFFFieldTag − Get TIFF field tag value from field information

SYNOPSIS

#include <tiffio.h>

uint32 TIFFFieldTag(const TIFFField* fip)

DESCRIPTION

TIFFFieldTag returns the numeric tag value for a TIFF field. This can be compared to various constants exported by the libtiff header files, such as TIFFTAG_IMAGEWIDTH.

fip is a field information pointer previously returned by TIFFFindField, TIFFFieldWithTag, or TIFFFieldWithName.

RETURN VALUES

TIFFFieldTag returns an integer tag value.

SEE ALSO

libtiff(3TIFF),

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/tiffdump.1.html0000644000212300117540000001050010640473675013761 00000000000000 TIFFDUMP

TIFFDUMP

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

NAME

tiffdump − print verbatim information about TIFF files

SYNOPSIS

tiffdump [ options ] name ...

DESCRIPTION

tiffdump displays directory information from files created according to the Tag Image File Format, Revision 6.0. The header of each TIFF file (magic number, version, and first directory offset) is displayed, followed by the tag contents of each directory in the file. For each tag, the name, data type, count, and value(s) is displayed. When the symbolic name for a tag or data type is known, the symbolic name is displayed followed by it’s numeric (decimal) value. Tag values are displayed enclosed in ‘‘<>’’ characters immediately preceded by the value of the count field. For example, an ImageWidth tag might be displayed as ‘‘ImageWidth (256) SHORT (3) 1<800>’’.

tiffdump is particularly useful for investigating the contents of TIFF files that libtiff does not understand.

OPTIONS

−h

Force numeric data to be printed in hexadecimal rather than the default decimal.

−m items

Change the number of indirect data items that are printed. By default, this will be 24.

−o offset

Dump the contents of the IFD at the a particular file offset. The file offset may be specified using the usual C-style syntax; i.e. a leading ‘‘0x’’ for hexadecimal and a leading ‘‘0’’ for octal.

SEE ALSO

tiffinfo(1), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/tiffsv.1.html0000644000212300117540000001405010640473676013451 00000000000000 TIFFSV

TIFFSV

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
NOTE
BUGS
SEE ALSO

NAME

tiffsv − save an image from the framebuffer in a TIFF file (Silicon Graphics version)

SYNOPSIS

tiffsv [ options ] output.tif [ x1 x2 y1 y2 ]

DESCRIPTION

tiffsv saves all or part of the framebuffer in a file using the Tag Image File Format, Revision 6.0. By default, the image is saved with data samples packed (PlanarConfiguration=1), compressed with the Lempel-Ziv & Welch algorithm (Compression=5), and with each strip no more than 8 kilobytes. These characteristics can be overridden, or explicitly specified with the options described below.

OPTIONS

−b

Save the image as a greyscale image as if it were processed by tiff2bw(1). This option is included for compatibility with the standard scrsave(6D) program.

−c

Specify the compression to use for data written to the output file: none for no compression, packbits for PackBits compression, jpeg for baseline JPEG compression, zip for Deflate compression, and lzw for Lempel-Ziv & Welch compression (default).

LZW compression can be specified together with a predictor value. A predictor value of 2 causes each scanline of the output image to undergo horizontal differencing before it is encoded; a value of 1 forces each scanline to be encoded without differencing. LZW-specific options are specified by appending a ‘‘:’’-separated list to the ‘‘lzw’’ option; e.g. −c lzw:2 for LZW compression with horizontal differencing.

−p

Specify the planar configuration to use in writing image data. By default, tiffsv will create a new file with the data samples packed contiguously. Specifying −p contig will force data to be written with multi-sample data packed together, while −p separate will force samples to be written in separate planes.

−r

Specify the number of rows (scanlines) in each strip of data written to the output file. By default, tiffsv attempts to set the rows/strip that no more than 8 kilobytes of data appear in a strip.

NOTE

Except for the use of TIFF, this program is equivalent to the standard scrsave program. This means, for example, that you can use it in conjunction with the standard icut program simply by creating a link called scrsave, or by creating a shell script called scrsave that invokes tiffgt with the appropriate options.

BUGS

If data are saved compressed and in separate planes, then the rows in each strip is silently set to one to avoid limitations in the libtiff(3TIFF) library.

SEE ALSO

scrsave(6D) pal2rgb(1), tiffdump(1), tiffgt(1), tiffinfo(1), tiffcp(1), tiffmedian(1), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/bmp2tiff.1.html0000644000212300117540000000676210212562557013664 00000000000000 BMP2TIFF

BMP2TIFF

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

NAME

bmp2tiff − create a TIFF file from a Microsoft Windows Device Independent Bitmap image file

SYNOPSIS

bmp2tiff [ options ] input.bmp output.tiff

DESCRIPTION

bmp2tiff converts a Microsoft Windows Device Independent Bitmap image file to TIFF. By default, the TIFF image is created with data samples packed (PlanarConfiguration=1), compressed with the PackBits algorithm (Compression=32773), and with each strip no more than 8 kilobytes. These characteristics can overridden, or explicitly specified with the options described below.

OPTIONS

−c

Specify a compression scheme to use when writing image data: −c none for no compression, -c packbits for the PackBits compression algorithm (the default), -c jpeg for the baseline JPEG compression algorithm, -c zip for the Deflate compression algorithm, and −c lzw for Lempel-Ziv & Welch.

−r <number>

Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes.

SEE ALSO

gif2tiff(1), pal2rgb(1), ppm2tiff(1), raw2tiff(1), ras2tiff(1), sgi2tiff(1), libtiff(3TIFF)


tiff-4.0.3/html/man/TIFFmemory.3tiff.html0000644000212300117540000000676110640473671015011 00000000000000 MEMORY

MEMORY

NAME
SYNOPSIS
DESCRIPTION
DIAGNOSTICS
SEE ALSO

NAME

_TIFFmalloc, _TIFFrealloc, _TIFFfree, _TIFFmemset, _TIFFmemcpy, _TIFFmemcmp, − memory management-related functions for use with TIFF files

SYNOPSIS

#include <tiffio.h>

tdata_t _TIFFmalloc(tsize_t size);
tdata_t _TIFFrealloc(tdata_t
buffer, tsize_t size);
void _TIFFfree(tdata_t
buffer);
void _TIFFmemset(tdata_t
s, int c, tsize_t n);
void _TIFFmemcpy(tdata_t
dest, const tdata_t src, tsize_t n);
int _TIFFmemcmp(const tdata_t
s1, const tdata_t s2, tsize_t n);

DESCRIPTION

These routines are provided for writing portable software that uses libtiff; they hide any memory-management related issues, such as dealing with segmented architectures found on 16-bit machines.

_TIFFmalloc and _TIFFrealloc are used to dynamically allocate and reallocate memory used by libtiff; such as memory passed into the I/O routines. Memory allocated through these interfaces is released back to the system using the _TIFFfree routine.

Memory allocated through one of the above interfaces can be set to a known value using _TIFFmemset, copied to another memory location using _TIFFmemcpy, or compared for equality using _TIFFmemcmp. These routines conform to the equivalent ANSI C routines: memset, memcpy, and memcmp, repsectively.

DIAGNOSTICS

None.

SEE ALSO

malloc(3), memory(3), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFFieldReadCount.3tiff.html0000644000212300117540000000540412005260704016306 00000000000000 TIFFFieldReadCount

TIFFFieldReadCount

NAME
SYNOPSIS
DESCRIPTION
RETURN VALUES
SEE ALSO

NAME

TIFFFieldReadCount − Get number of values to be read from field

SYNOPSIS

#include <tiffio.h>

int TIFFFieldReadCount(const TIFFField* fip)

DESCRIPTION

TIFFFieldReadCount returns the number of values available to be read from the specified TIFF field; that is, the number of arguments that should be supplied to TIFFGetField. For most field types this is a small positive integer, typically 1 or 2, but there are some special values:
TIFF_VARIABLE
indicates that a variable number of values is possible; then, a uint16 count argument and a pointer data argument must be supplied to TIFFGetField.
TIFF_VARIABLE2
is the same as TIFF_VARIABLE except that the count argument must have type uint32.
TIFF_SPP
indicates that the number of arguments is equal to the image’s number of samples per pixel.

fip is a field information pointer previously returned by TIFFFindField, TIFFFieldWithTag, or TIFFFieldWithName.

RETURN VALUES

TIFFFieldReadCount returns an integer.

SEE ALSO

libtiff(3TIFF),

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/tiff2bw.1.html0000644000212300117540000000773110640473674013521 00000000000000 TIFF2BW

TIFF2BW

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

NAME

tiff2bw − convert a color TIFF image to greyscale

SYNOPSIS

tiff2bw [ options ] input.tif output.tif

DESCRIPTION

Tiff2bw converts an RGB or Palette color TIFF image to a greyscale image by combining percentages of the red, green, and blue channels. By default, output samples are created by taking 28% of the red channel, 59% of the green channel, and 11% of the blue channel. To alter these percentages, the −R, −G, and −B options may be used.

OPTIONS

−c

Specify a compression scheme to use when writing image data: −c none for no compression, −c packbits for the PackBits compression algorithm, −c zip for the Deflate compression algorithm, −c g3 for the CCITT Group 3 compression algorithm, −c g4 for the CCITT Group 4 compression algorithm, and −c lzw for Lempel-Ziv & Welch (the default).

−r

Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes.

−R

Specify the percentage of the red channel to use (default 28).

−G

Specify the percentage of the green channel to use (default 59).

−B

Specify the percentage of the blue channel to use (default 11).

SEE ALSO

pal2rgb(1), tiffinfo(1), tiffcp(1), tiffmedian(1), libtiff(3)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFWriteRawTile.3tiff.html0000644000212300117540000000761210640473670016056 00000000000000 TIFFWriteRawtile

TIFFWriteRawtile

NAME
SYNOPSIS
DESCRIPTION
RETURN VALUES
DIAGNOSTICS
SEE ALSO

NAME

TIFFWriteRawTile − write a tile of raw data to an open TIFF file

SYNOPSIS

#include <tiffio.h>

tsize_t TIFFWriteRawTile(TIFF *tif, ttile_t tile, tdata_t buf, tsize_t size)

DESCRIPTION

Append size bytes of raw data to the specified tile.

RETURN VALUES

−1 is returned if an error occurred. Otherwise, the value of size is returned.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine.

%s: File not open for writing. The file was opened for reading, not writing.

Can not write tiles to a stripped image. The image is assumed to be organized in strips because neither of the TileWidth or TileLength tags have been set with TIFFSetField(3TIFF).

%s: Must set "ImageWidth" before writing data. The image’s width has not be set before the first write. See TIFFSetField(3TIFF) for information on how to do this.

%s: Must set "PlanarConfiguration" before writing data. The organization of data has not be defined before the first write. See TIFFSetField(3TIFF) for information on how to do this.

%s: No space for tile arrays". There was not enough space for the arrays that hold tile offsets and byte counts.

%s: Specified tile %d out of range, max %d. The specified tile is not valid according to the currently specified image dimensions.

SEE ALSO

TIFFOpen(3TIFF), TIFFWriteEncodedTile(3TIFF), TIFFWriteScanline(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFsize.3tiff.html0000644000212300117540000000527410640473671014451 00000000000000 TIFFSIZE

TIFFSIZE

NAME
SYNOPSIS
DESCRIPTION
DIAGNOSTICS
SEE ALSO

NAME

TIFFScanlineSize, TIFFRasterScanlineSize, − return the size of various items associated with an open TIFF file

SYNOPSIS

#include <tiffio.h>

tsize_t TIFFRasterScanlineSize(TIFF *tif)
tsize_t TIFFScanlineSize(TIFF *
tif)

DESCRIPTION

TIFFScanlineSize returns the size in bytes of a row of data as it would be returned in a call to TIFFReadScanline, or as it would be expected in a call to TIFFWriteScanline.

TIFFRasterScanlineSize returns the size in bytes of a complete decoded and packed raster scanline. Note that this value may be different from the value returned by TIFFScanlineSize if data is stored as separate planes.

DIAGNOSTICS

None.

SEE ALSO

TIFFOpen(3TIFF), TIFFReadScanline(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFReadEncodedTile.3tiff.html0000644000212300117540000001004510640473666016446 00000000000000 TIFFReadEncodedTile

TIFFReadEncodedTile

NAME
SYNOPSIS
DESCRIPTION
NOTES
RETURN VALUES
DIAGNOSTICS
SEE ALSO

NAME

TIFFReadEncodedTile − read and decode a tile of data from an open TIFF file

SYNOPSIS

#include <tiffio.h>

int TIFFReadEncodedTile(TIFF *tif, ttile_t tile, tdata_t buf, tsize_t size)

DESCRIPTION

Read the specified tile of data and place up to size bytes of decompressed information in the (user supplied) data buffer.

NOTES

The value of tile is a ‘‘raw tile number.’’ That is, the caller must take into account whether or not the data are organized in separate planes (PlanarConfiguration=2). TIFFComputeTile automatically does this when converting an (x,y,z,sample) coordinate quadruple to a tile number. To read a full tile of data the data buffer should be at least as large as the value returned by TIFFTileSize.

The library attempts to hide bit- and byte-ordering differences between the image and the native machine by converting data to the native machine order. Bit reversal is done if the FillOrder tag is opposite to the native machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file was written with a byte order opposite to the native machine byte order,

RETURN VALUES

The actual number of bytes of data that were placed in buf is returned; TIFFReadEncodedTile returns −1 if an error was encountered.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine.

SEE ALSO

TIFFOpen(3TIFF), TIFFReadRawTile(3TIFF), TIFFReadTile(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/tiffgt.1.html0000644000212300117540000003072110640473675013435 00000000000000 TIFFGT

TIFFGT

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
BUGS
SEE ALSO

NAME

tiffgt − display an image stored in a TIFF file (Silicon Graphics version)

SYNOPSIS

tiffgt [ options ] input.tif ...

DESCRIPTION

tiffgt displays one or more images stored using the Tag Image File Format, Revision 6.0. Each image is placed in a fixed size window that the user must position on the display (unless configured otherwise through X defaults). If the display has fewer than 24 bitplanes, or if the image does not warrant full color, then RGB color values are mapped to the closest values that exist in the colormap (this is done using the rgbi routine found in the graphics utility library −lgutil.)

tiffgt correctly handles files with any of the following characteristics:

BitsPerSample

1, 2, 4, 8, 16

SamplesPerPixel

1, 3, 4 (the 4th sample is ignored)

PhotometricInterpretation

0 (min-is-white), 1 (min-is-black), 2 (RGB), 3 (palette), 6 (YCbCr)

PlanarConfiguration

1 (contiguous), 2 (separate)

Orientation

1 (top-left), 4 (bottom-left)

Data may be organized as strips or tiles and may be compressed with any of the compression algorithms supported by the libtiff(3) library.

For palette images (PhotometricInterpretation=3), tiffgt inspects the colormap values and assumes either 16-bit or 8-bit values according to the maximum value. That is, if no colormap entry greater than 255 is found, tiffgt assumes the colormap has only 8-bit values; otherwise it assumes 16-bit values. This inspection is done to handle old images written by previous (incorrect) versions of libtiff.

tiffgt can be used to display multiple images one-at-a-time. The left mouse button switches the display to the first image in the next file in the list of files specified on the command line. The right mouse button switches to the first image in the previous file in the list. The middle mouse button causes the first image in the first file specified on the command line to be displayed. In addition the following keyboard commands are recognized:

b

Use a PhotometricInterpretation of MinIsBlack in displaying the current image.

l

Use a FillOrder of lsb-to-msb in decoding the current image.

m

Use a FillOrder of msb-to-lsb in decoding the current image.

c

Use a colormap visual to display the current image.

r

Use a true color (24-bit RGB) visual to display the current image.

w

Use a PhotometricInterpretation of MinIsWhite in displaying the current image.

W

Toggle (enable/disable) display of warning messages from the TIFF library when decoding images.

E

Toggle (enable/disable) display of error messages from the TIFF library when decoding images.

z

Reset all parameters to their default settings (FillOrder, PhotometricInterpretation, handling of warnings and errors).

PageUp

Display the previous image in the current file or the last image in the previous file.

PageDown

Display the next image in the current file or the first image in the next file.

Home

Display the first image in the current file.

End

Display the last image in the current file (unimplemented).

OPTIONS

−c

Force image display in a colormap window.

−d

Specify an image to display by directory number. By default the first image in the file is displayed. Directories are numbered starting at zero.

−e

Enable reporting of error messages from the TIFF library. By default tiffgt silently ignores images that cannot be read.

−f

Force tiffgt to run as a foreground process. By default tiffgt will place itself in the background once it has opened the requested image file.

−l

Force the presumed bit ordering to be LSB to MSB.

−m

Force the presumed bit ordering to be MSB to LSB.

−o

Specify an image to display by directory offset. By default the first image in the file is displayed. Directories offsets may be specified using C-style syntax; i.e. a leading ‘‘0x’’ for hexadecimal and a leading ‘‘0’’ for octal.

−p

Override the value of the PhotometricInterpretation tag; the parameter may be one of: miniswhite, minisblack, rgb, palette, mask, separated, ycbcr, and cielab.

−r

Force image display in a full color window.

−s

Stop on the first read error. By default all errors in the input data are ignored and tiffgt does it’s best to display as much of an image as possible.

−w

Enable reporting of warning messages from the TIFF library. By default tiffgt ignores warning messages generated when reading an image.

−v

Place information in the title bar describing what type of window (full color or colormap) is being used, the name of the input file, and the directory index of the image (if non-zero). By default, the window type is not shown in the title bar.

BUGS

Images wider and taller than the display are silently truncated to avoid crashing old versions of the window manager.

SEE ALSO

tiffdump(1), tiffinfo(1), tiffcp(1), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFReadRGBAImage.3tiff.html0000644000212300117540000002436210640473666015754 00000000000000 TIFFReadRGBAImage

TIFFReadRGBAImage

NAME
SYNOPSIS
DESCRIPTION
NOTES
RETURN VALUES
DIAGNOSTICS
SEE ALSO

NAME

TIFFReadRGBAImage, TIFFReadRGBAImageOriented − read and decode an image into a fixed-format raster

SYNOPSIS

#include <tiffio.h>

#define TIFFGetR(abgr) ((abgr) & 0xff)
#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)

int TIFFReadRGBAImage(TIFF *tif, uint32 width, uint32 height, uint32 *raster, int stopOnError)
int TIFFReadRGBAImageOriented(TIFF *
tif, uint32 width, uint32 height, uint32 *raster, int orientation, int stopOnError)

DESCRIPTION

TIFFReadRGBAImage reads a strip- or tile-based image into memory, storing the result in the user supplied raster. The raster is assumed to be an array of width times height 32-bit entries, where width must be less than or equal to the width of the image (height may be any non-zero size). If the raster dimensions are smaller than the image, the image data is cropped to the raster bounds. If the raster height is greater than that of the image, then the image data are placed in the lower part of the raster. (Note that the raster is assume to be organized such that the pixel at location (x,y) is raster[y*width+x]; with the raster origin in the lower-left hand corner.)

TIFFReadRGBAImageOriented works like TIFFReadRGBAImage with except of that user can specify the raster origin position with the orientation parameter. Four orientations supported:

ORIENTATION_TOPLEFT

origin in top-left corner,

ORIENTATION_TOPRIGHT

origin in top-right corner,

ORIENTATION_BOTLEFT

origin in bottom-left corner and

ORIENTATION_BOTRIGHT

origin in bottom-right corner.

If you choose ORIENTATION_BOTLEFT result will be the same as returned by the TIFFReadRGBAImage.

Raster pixels are 8-bit packed red, green, blue, alpha samples. The macros TIFFGetR, TIFFGetG, TIFFGetB, and TIFFGetA should be used to access individual samples. Images without Associated Alpha matting information have a constant Alpha of 1.0 (255).

TIFFReadRGBAImage converts non-8-bit images by scaling sample values. Palette, grayscale, bilevel, CMYK , and YCbCr images are converted to RGB transparently. Raster pixels are returned uncorrected by any colorimetry information present in the directory.

The paramater stopOnError specifies how to act if an error is encountered while reading the image. If stopOnError is non-zero, then an error will terminate the operation; otherwise TIFFReadRGBAImage will continue processing data until all the possible data in the image have been requested.

NOTES

In C++ the stopOnError parameter defaults to 0.

Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be either 1, 3, or 4 (i.e. SamplesPerPixel minus ExtraSamples).

Palettte image colormaps that appear to be incorrectly written as 8-bit values are automatically scaled to 16-bits.

TIFFReadRGBAImage is just a wrapper around the more general TIFFRGBAImage(3TIFF) facilities.

RETURN VALUES

1 is returned if the image was successfully read and converted. Otherwise, 0 is returned if an error was encountered and stopOnError is zero.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine.

Sorry, can not handle %d-bit pictures. The image had BitsPerSample other than 1, 2, 4, 8, or 16.

Sorry, can not handle %d-channel images. The image had SamplesPerPixel other than 1, 3, or 4.

Missing needed "PhotometricInterpretation" tag. The image did not have a tag that describes how to display the data.

No "PhotometricInterpretation" tag, assuming RGB. The image was missing a tag that describes how to display it, but because it has 3 or 4 samples/pixel, it is assumed to be RGB.

No "PhotometricInterpretation" tag, assuming min-is-black. The image was missing a tag that describes how to display it, but because it has 1 sample/pixel, it is assumed to be a grayscale or bilevel image.

No space for photometric conversion table. There was insufficient memory for a table used to convert image samples to 8-bit RGB.

Missing required "Colormap" tag. A Palette image did not have a required Colormap tag.

No space for tile buffer. There was insufficient memory to allocate an i/o buffer.

No space for strip buffer. There was insufficient memory to allocate an i/o buffer.

Can not handle format. The image has a format (combination of BitsPerSample, SamplesPerPixel, and PhotometricInterpretation) that TIFFReadRGBAImage can not handle.

No space for B&W mapping table. There was insufficient memory to allocate a table used to map grayscale data to RGB.

No space for Palette mapping table. There was insufficient memory to allocate a table used to map data to 8-bit RGB.

SEE ALSO

TIFFOpen(3TIFF), TIFFRGBAImage(3TIFF), TIFFReadRGBAStrip(3TIFF), TIFFReadRGBATile(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFstrip.3tiff.html0000644000212300117540000001040410640473672014630 00000000000000 TIFFSTRIP

TIFFSTRIP

NAME
SYNOPSIS
DESCRIPTION
DIAGNOSTICS
SEE ALSO

NAME

TIFFDefaultStripSize, TIFFStripSize, TIFFVStripSize, TIFFRawStripSize, TIFFComputeStrip, TIFFNumberOfStrips − strip-related utility routines

SYNOPSIS

#include <tiffio.h>

uint32 TIFFDefaultStripSize(TIFF *tif, uint32 estimate)
tsize_t TIFFStripSize(TIFF *
tif)
tsize_t TIFFVStripSize(TIFF *
tif, uint32 nrows)
tsize_t TIFFRawStripSize(TIFF *
tif, tstrip_t strip)
tstrip_t TIFFComputeStrip(TIFF *
tif, uint32 row, tsample_t sample)
tstrip_t TIFFNumberOfStrips(TIFF *
tif)

DESCRIPTION

TIFFDefaultStripSize returns the number of rows for a reasonable-sized strip according to the current settings of the ImageWidth, BitsPerSample, SamplesPerPixel, tags and any compression-specific requirements. If the estimate parameter, if non-zero, then it is taken as an estimate of the desired strip size and adjusted according to any compression-specific requirements. The value returned by this function is typically used to define the RowsPerStrip tag. In lieu of any unusual requirements TIFFDefaultStripSize tries to create strips that have approximately 8 kilobytes of uncompressed data.

TIFFStripSize returns the equivalent size for a strip of data as it would be returned in a call to TIFFReadEncodedStrip or as it would be expected in a call to TIFFWriteEncodedStrip.

TIFFVStripSize returns the number of bytes in a strip with nrows rows of data.

TIFFRawStripSize returns the number of bytes in a raw strip (i.e. not decoded).

TIFFComputeStrip returns the strip that contains the specified coordinates. A valid strip is always returned; out-of-range coordinate values are clamped to the bounds of the image. The row parameter is always used in calculating a strip. The sample parameter is used only if data are organized in separate planes (PlanarConfiguration=2).

TIFFNumberOfStrips returns the number of strips in the image.

DIAGNOSTICS

None.

SEE ALSO

TIFFReadEncodedStrip(3TIFF), TIFFReadRawStrip(3TIFF), TIFFWriteEncodedStrip(3TIFF), TIFFWriteRawStrip(3TIFF), libtiff(3TIFF),

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/ras2tiff.1.html0000644000212300117540000000773010640473673013674 00000000000000 RAS2TIFF

RAS2TIFF

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
BUGS
SEE ALSO

NAME

ras2tiff − create a TIFF file from a Sun rasterfile

SYNOPSIS

ras2tiff [ options ] input.ras output.tif

DESCRIPTION

ras2tiff converts a file in the Sun rasterfile format to TIFF. By default, the TIFF image is created with data samples packed (PlanarConfiguration=1), compressed with the Lempel-Ziv & Welch algorithm (Compression=5), and with each strip no more than 8 kilobytes. These characteristics can overridden, or explicitly specified with the options described below.

Any colormap information in the rasterfile is carried over to the TIFF file by including a Colormap tag in the output file. If the rasterfile has a colormap, the PhotometricInterpretation tag is set to 3 (palette); otherwise it is set to 2 (RGB) if the depth is 24 or 1 (min-is-black) if the depth is not 24.

OPTIONS

−c

Specify a compression scheme to use when writing image data: −c none for no compression, −c packbits for the PackBits compression algorithm, −c jpeg for the baseline JPEG compression algorithm, −c zip for the Deflate compression algorithm, and −c lzw for Lempel-Ziv & Welch (the default).

−r

Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes.

BUGS

Does not handle all possible rasterfiles. In particular, ras2tiff does not handle run-length encoded images.

SEE ALSO

pal2rgb(1), tiffinfo(1), tiffcp(1), tiffmedian(1), libtiff(3)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/fax2tiff.1.html0000644000212300117540000003457110640473672013667 00000000000000 FAX2TIFF

FAX2TIFF

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
DIAGNOSTICS
BUGS
SEE ALSO

NAME

fax2tiff − create a TIFF Class F fax file from raw fax data

SYNOPSIS

fax2tiff [ options ] [ −o output.tif ] input.raw

DESCRIPTION

Fax2tiff creates a TIFF file containing CCITT Group 3 or Group 4 encoded data from one or more files containing ‘‘raw’’ Group 3 or Group 4 encoded data (typically obtained directly from a fax modem). By default, each row of data in the resultant TIFF file is 1-dimensionally encoded and padded or truncated to 1728 pixels, as needed. The resultant image is a set of low resolution (98 lines/inch) or medium resolution (196 lines/inch) pages, each of which is a single strip of data. The generated file conforms to the TIFF Class F ( FAX ) specification for storing facsimile data. This means, in particular, that each page of the data does not include the trailing return to control ( RTC ) code; as required for transmission by the CCITT Group 3 specifications. The old, ‘‘classic’’, format is created if the −c option is used. (The Class F format can also be requested with the −f option.)

The default name of the output image is fax.tif; this can be changed with the −o option. Each input file is assumed to be a separate page of facsimile data from the same document. The order in which input files are specified on the command line is the order in which the resultant pages appear in the output file.

OPTIONS

Options that affect the interpretation of input data are:

−3

Assume input data is CCITT Group 3 encoded (default).

−4

Assume input data is CCITT Group 4 encoded.

−U

Assume input data is uncompressed (Group 3 or Group 4).

−1

Assume input data is encoded with the 1-dimensional version of the CCITT Group 3 Huffman encoding algorithm (default).

−2

Assume input data is 2-dimensional version of the CCITT Group 3 Huffman encoding algorithm.

−P

Assume input data is not EOL-aligned (default). This option has effect with Group 3 encoded input only.

−A

Assume input data is EOL-aligned. This option has effect with Group 3 encoded input only.

−M

Treat input data as having bits filled from most significant bit ( MSB ) to most least bit ( LSB ).

−L

Treat input data as having bits filled from least significant bit ( LSB ) to most significant bit ( MSB ) (default).

−B

Assume input data was encoded with black as 0 and white as 1.

−W

Assume input data was encoded with black as 1 and white as 0 (default).

−R

Specify the vertical resolution, in lines/inch, of the input images. By default input are assumed to have a vertical resolution of 196 lines/inch. If images are low resolution facsimile, a value of 98 lines/inch should be specified.

−X

Specify the width, in pixels, of the input images. By default input are assumed to have a width of 1728 pixels.

Options that affect the output file format are:

−o

Specify the name of the output file.

−7

Force output to be compressed with the CCITT Group 3 Huffman encoding algorithm (default).

−8

Force output to be compressed with the CCITT Group 4 Huffman encoding.

−u

Force output to be uncompressed (Group 3 or Group 4).

−5

Force output to be encoded with the 1-dimensional version of the CCITT Group 3 Huffman encoding algorithm.

−6

Force output to be encoded with the 2-dimensional version of the CCITT Group 3 Huffman encoding algorithm (default).

−a

Force the last bit of each End Of Line ( EOL ) code to land on a byte boundary (default). This ‘‘zero padding’’ will be reflected in the contents of the Group3Options tag of the resultant TIFF file. This option has effect with Group 3 encoded output only.

−p

Do not EOL-align output. This option has effect with Group 3 encoded output only.

−c

Generate "classic" Group 3 TIFF format.

−f

Generate TIFF Class F (TIFF/F) format (default).

−m

Force output data to have bits filled from most significant bit ( MSB ) to most least bit ( LSB ).

−l

Force output data to have bits filled from least significant bit ( LSB ) to most significant bit ( MSB ) (default).

−r

Specify the number of rows (scanlines) in each strip of data written to the output file. By default (or when value 0 is specified), tiffcp attempts to set the rows/strip that no more than 8 kilobytes of data appear in a strip (with except of G3/G4 compression schemes). If you specify special value −1 it will results in infinite number of the rows per strip. The entire image will be the one strip in that case. This is default in case of G3/G4 output compression schemes.

−s

Stretch the input image vertically by writing each input row of data twice to the output file.

−v

Force fax2tiff to print the number of rows of data it retrieved from the input file.

−z

Force output to be compressed with the LZW encoding.

DIAGNOSTICS

The following warnings and errors come from the decoding routines in the library.

Warning, %s: Premature EOL at scanline %d (x %d).\n. The input data had a row that was shorter than the expected width. The row is padded with white.

%s: Premature EOF at scanline %d (x %d).\n. The decoder ran out of data in the middle of a scanline. The resultant row is padded with white.

%s: Bad code word at row %d, x %d\n. An invalid Group 3 code was encountered while decoding the input file. The row number and horizontal position is given. The remainder of the input row is discarded, while the corresponding output row is padded with white.

%s: Bad 2D code word at scanline %d.\n. An invalid Group 4 or 2D Group 3 code was encountered while decoding the input file. The row number and horizontal position is given. The remainder of the input row is discarded, while the corresponding output row is padded with white.

BUGS

Input data are assumed to have a a ‘‘top left’’ orientation; it should be possible to override this assumption from the command line.

SEE ALSO

CCITT Recommendation T.4 (Standardization of Group 3 Facsimile Apparatus for Document Transmission).

The Spirit of TIFF Class F, an appendix to the TIFF 5.0 specification prepared by Cygnet Technologies.

tiffinfo(1), tiffdither(1), tiffgt(1), libtiff(3)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/rgb2ycbcr.1.html0000644000212300117540000001022210640473673014021 00000000000000 RGB2YCBCR

RGB2YCBCR

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

NAME

rgb2ycbcr − convert non-YCbCr TIFF images to a YCbCr TIFF image

SYNOPSIS

rgb2ycbcr [ options ] src1.tif src2.tif ... dst.tif

DESCRIPTION

rgb2ycbcr converts RGB color, greyscale, or bi-level TIFF images to YCbCr images by transforming and sampling pixel data. If multiple files are specified on the command line each source file is converted to a separate directory in the destination file.

By default, chrominance samples are created by sampling 2 by 2 blocks of luminance values; this can be changed with the −h and −v options. Output data are compressed with the PackBits compression scheme, by default; an alternate scheme can be selected with the −c option. By default, output data are compressed in strips with the number of rows in each strip selected so that the size of a strip is never more than 8 kilobytes; the −r option can be used to explicitly set the number of rows per strip.

OPTIONS

−c

Specify a compression scheme to use when writing image data: −c none for no compression, −c packbits for the PackBits compression algorithm (the default), −c jpeg for the JPEG compression algorithm, −c zip for the deflate compression algorithm, and −c lzw for Lempel-Ziv & Welch.

−h

Set the horizontal sampling dimension to one of: 1, 2 (default), or 4.

−r

Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes.

−v

Set the vertical sampling dimension to one of: 1, 2 (default), or 4.

SEE ALSO

tiffinfo(1), tiffcp(1), libtiff(3)

Libtiff library home page: http://www.remotesensing.org/libtiff


tiff-4.0.3/html/man/TIFFcodec.3tiff.html0000644000212300117540000000716410640473671014554 00000000000000 CODEC

CODEC

NAME
SYNOPSIS
DESCRIPTION
DIAGNOSTICS
SEE ALSO

NAME

TIFFFindCODEC, TIFFRegisterCODEC, TIFFUnRegisterCODEC, TIFFIsCODECConfigured − codec-related utility routines

SYNOPSIS

#include <tiffio.h>

const TIFFCodec* TIFFFindCODEC(uint16 scheme);
TIFFCodec* TIFFRegisterCODEC(uint16
scheme, const char *method, TIFFInitMethod init);
void TIFFUnRegisterCODEC(TIFFCodec *
codec);
int TIFFIsCODECConfigured(uint16
scheme);

DESCRIPTION

libtiff supports a variety of compression schemes implemented by software codecs. Each codec adheres to a modular interface that provides for the decoding and encoding of image data; as well as some other methods for initialization, setup, cleanup, and the control of default strip and tile sizes. Codecs are identified by the associated value of the TIFF Compression tag; e.g. 5 for LZW compression.

The TIFFRegisterCODEC routine can be used to augment or override the set of codecs available to an application. If the specified scheme already has a registered codec then it is overridden and any images with data encoded with this compression scheme will be decoded using the supplied coded.

TIFFIsCODECConfigured returns 1 if the codec is configured and working. Otherwise 0 will be returned.

DIAGNOSTICS

No space to register compression scheme %s. TIFFRegisterCODEC was unable to allocate memory for the data structures needed to register a codec.

Cannot remove compression scheme %s; not registered. TIFFUnRegisterCODEC did not locate the specified codec in the table of registered compression schemes.

SEE ALSO

libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFReadDirectory.3tiff.html0000644000212300117540000001764610640473666016251 00000000000000 TIFFReadDirectory

TIFFReadDirectory

NAME
SYNOPSIS
DESCRIPTION
NOTES
RETURN VALUES
DIAGNOSTICS
SEE ALSO

NAME

TIFFReadDirectory − get the contents of the next directory in an open TIFF file

SYNOPSIS

#include <tiffio.h>

int TIFFReadDirectory(TIFF *tif)

DESCRIPTION

Read the next directory in the specified file and make it the current directory. Applications only need to call TIFFReadDirectory to read multiple subfiles in a single TIFF file— the first directory in a file is automatically read when TIFFOpen is called.

NOTES

If the library is compiled with STRIPCHOP_SUPPORT enabled, then images that have a single uncompressed strip or tile of data are automatically treated as if they were made up of multiple strips or tiles of approximately 8 kilobytes each. This operation is done only in-memory; it does not alter the contents of the file. However, the construction of the ‘‘chopped strips’’ is visible to the application through the number of strips [tiles] returned by TIFFNumberOfStrips [TIFFNumberOfTiles].

RETURN VALUES

If the next directory was successfully read, 1 is returned. Otherwise, 0 is returned if an error was encountered, or if there are no more directories to be read.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine. All warning messages are directed to the TIFFWarning(3TIFF) routine.

Seek error accessing TIFF directory. An error occurred while positioning to the location of the directory.

Wrong data type %d for field "%s". The tag entry in the directory had an incorrect data type. For example, an ImageDescription tag with a SHORT data type.

TIFF directory is missing required "%s" field. The specified tag is required to be present by the TIFF 5.0 specification, but is missing. The directory is (usually) unusable.

%s: Rational with zero denominator. A directory tag has a RATIONAL value whose denominator is zero.

Incorrect count %d for field "%s" (%lu, expecting %lu); tag ignored. The specified tag’s count field is bad. For example, a count other than 1 for a SubFileType tag.

Cannot handle different per-sample values for field "%s". The tag has SamplesPerPixel values and they are not all the same; e.g. BitsPerSample. The library is unable to handle images of this sort.

Count mismatch for field "%s"; expecting %d, got %d. The count field in a tag does not agree with the number expected by the library. This should never happen, so if it does, the library refuses to read the directory.

Invalid TIFF directory; tags are not sorted in ascending order. The directory tags are not properly sorted as specified in the TIFF 5.0 specification. This error is not fatal.

Ignoring unknown field with tag %d (0x%x). An unknown tag was encountered in the directory; the library ignores all such tags.

TIFF directory is missing requred "ImageLength" field. The image violates the specification by not having a necessary field. There is no way for the library to recover from this error.

TIFF directory is missing requred "PlanarConfig" field. The image violates the specification by not having a necessary field. There is no way for the library to recover from this error.

TIFF directory is missing requred "StripOffsets" field. The image has multiple strips, but is missing the tag that specifies the file offset to each strip of data. There is no way for the library to recover from this error.

TIFF directory is missing requred "TileOffsets" field. The image has multiple tiles, but is missing the tag that specifies the file offset to each tile of data. There is no way for the library to recover from this error.

TIFF directory is missing required "StripByteCounts" field. The image has multiple strips, but is missing the tag that specifies the size of each strip of data. There is no way for the library to recover from this error.

TIFF directory is missing required "StripByteCounts" field, calculating from imagelength. The image violates the specification by not having a necessary field. However, when the image is comprised of only one strip or tile, the library will estimate the missing value based on the file size.

Bogus "StripByteCounts" field, ignoring and calculating from imagelength. Certain vendors violate the specification by writing zero for the StripByteCounts tag when they want to leave the value unspecified. If the image has a single strip, the library will estimate the missing value based on the file size.

SEE ALSO

TIFFOpen(3TIFF), TIFFWriteDirectory(3TIFF), TIFFSetDirectory(3TIFF), TIFFSetSubDirectory(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/tiff2pdf.1.html0000644000212300117540000004302610640473674013657 00000000000000 TIFF2PDF

TIFF2PDF

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
EXAMPLES
BUGS
SEE ALSO

NAME

tiff2pdf − convert a TIFF image to a PDF document

SYNOPSIS

tiff2pdf [ options ] input.tiff

DESCRIPTION

tiff2pdf opens a TIFF image and writes a PDF document to standard output.

The program converts one TIFF file to one PDF file, including multiple page TIFF files, tiled TIFF files, black and white. grayscale, and color TIFF files that contain data of TIFF photometric interpretations of bilevel, grayscale, RGB, YCbCr, CMYK separation, and ICC L*a*b* as supported by libtiff and PDF.

If you have multiple TIFF files to convert into one PDF file then use tiffcp or other program to concatenate the files into a multiple page TIFF file. If the input TIFF file is of huge dimensions (greater than 10000 pixels height or width) convert the input image to a tiled TIFF if it is not already.

The standard output is standard output. Set the output file name with the −o output.pdf option.

All black and white files are compressed into a single strip CCITT G4 Fax compressed PDF, unless tiled, where tiled black and white images are compressed into tiled CCITT G4 Fax compressed PDF, libtiff CCITT support is assumed.

Color and grayscale data can be compressed using either JPEG compression, ITU-T T.81, or Zip/Deflate LZ77 compression. Set the compression type using the −j or −z options. JPEG compression support requires that libtiff be configured with JPEG support, and Zip/Deflate compression support requires that libtiff be configured with Zip support, in tiffconf.h. Use only one or the other of −j and −z.

If the input TIFF contains single strip CCITT G4 Fax compressed information, then that is written to the PDF file without transcoding, unless the options of no compression and no passthrough are set, −d and −n.

If the input TIFF contains JPEG or single strip Zip/Deflate compressed information, and they are configured, then that is written to the PDF file without transcoding, unless the options of no compression and no passthrough are set.

The default page size upon which the TIFF image is placed is determined by the resolution and extent of the image data. Default values for the TIFF image resolution can be set using the −x and −y options. The page size can be set using the −p option for paper size, or −w and −l for paper width and length, then each page of the TIFF image is centered on its page. The distance unit for default resolution and page width and length can be set by the −u option, the default unit is inch.

Various items of the output document information can be set with the −e, −c, −a, −t, −s, and −k options. Setting the argument of the option to "" for these tags causes the relevant document information field to be not written. Some of the document information values otherwise get their information from the input TIFF image, the software, author, document name, and image description.

The Portable Document Format (PDF) specification is copyrighted by Adobe Systems, Incorporated.

OPTIONS

−o output-file

Set the output to go to file. output-file

−j

Compress with JPEG (requires libjpeg configured with libtiff).

−z

Compress with Zip/Deflate (requires zlib configured with libtiff).

−q quality

Set the compression quality, 1-100 for JPEG.

−n

Do not allow data to be converted without uncompressing, no compressed data passthrough.

−b

Set PDF ‘‘Interpolate’’ user preference.

−d

Do not compress (decompress).

−i

Invert colors.

−p paper-size

Set paper size, e.g., letter, legal, A4.

−u [i|m]

Set distance unit, i for inch, m for centimeter.

−w width

Set width in units.

−l length

Set length in units.

−x xres

Set x/width resolution default.

−y yres

Set y/length resolution default.

−r [d|o]

Set d for resolution default for images without resolution, o for resolution override for all images.

−f

Set PDF ‘‘Fit Window’’ user preference.

−e YYYYMMDDHHMMSS

Set document information date, overrides image or current date/time default, YYYYMMDDHHMMSS.

−c creator

Set document information creator, overrides image software default.

−a author

Set document information author, overrides image artist default.

−t title

Set document information title, overrides image document name default.

−s subject

Set document information subject, overrides image image description default.

−k keywords

Set document information keywords.

−h

List usage reminder to stderr and exit.

EXAMPLES

The following example would generate the file output.pdf from input.tiff.

tiff2pdf −o output.pdf input.tiff

The following example would generate PDF output from input.tiff and write it to standard output.

tiff2pdf input.tiff

The following example would generate the file output.pdf from input.tiff, putting the image pages on a letter sized page, compressing the output with JPEG, with JPEG quality 75, setting the title to ‘‘Document’’, and setting the ‘‘Fit Window’’ option.

tiff2pdf −p letter −j −q 75 −t "Document" −f −o output.pdf input.tiff

BUGS

Please report bugs via the web interface at

http://bugzilla.remotesensing.org/enter_bug.cgi?product=libtiff

SEE ALSO

libtiff(3), tiffcp(1), tiff2ps(1)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFReadEncodedStrip.3tiff.html0000644000212300117540000001031310640473666016650 00000000000000 TIFFReadEncodedStrip

TIFFReadEncodedStrip

NAME
SYNOPSIS
DESCRIPTION
NOTES
RETURN VALUES
DIAGNOSTICS
SEE ALSO

NAME

TIFFReadEncodedStrip − read and decode a strip of data from an open TIFF file

SYNOPSIS

#include <tiffio.h>

tsize_t TIFFReadEncodedStrip(TIFF *tif, tstrip_t strip, tdata_t buf, tsize_t size)

DESCRIPTION

Read the specified strip of data and place up to size bytes of decompressed information in the (user supplied) data buffer.

NOTES

The value of strip is a ‘‘raw strip number.’’ That is, the caller must take into account whether or not the data are organized in separate planes (PlanarConfiguration=2). To read a full strip of data the data buffer should typically be at least as large as the number returned by TIFFStripSize(3TIFF). If the -1 passed in size parameter, the whole strip will be read. You should be sure you have enough space allocated for the buffer.

The library attempts to hide bit- and byte-ordering differences between the image and the native machine by converting data to the native machine order. Bit reversal is done if the FillOrder tag is opposite to the native machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file was written with a byte order opposite to the native machine byte order,

RETURN VALUES

The actual number of bytes of data that were placed in buf is returned; TIFFReadEncodedStrip returns −1 if an error was encountered.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine.

SEE ALSO

TIFFOpen(3TIFF), TIFFReadRawStrip(3TIFF), TIFFReadScanline(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFSetDirectory.3tiff.html0000644000212300117540000000736410640473667016126 00000000000000 TIFFSetDirectory

TIFFSetDirectory

NAME
SYNOPSIS
DESCRIPTION
RETURN VALUES
DIAGNOSTICS
SEE ALSO

NAME

TIFFSetDirectory, TIFFSetSubDirectory − set the current directory for an open TIFF file

SYNOPSIS

#include <tiffio.h>

int TIFFSetDirectory(TIFF *tif, tdir_t dirnum)
int TIFFSetSubDirectory(TIFF *
tif, uint32 diroff)

DESCRIPTION

TIFFSetDirectory changes the current directory and reads its contents with TIFFReadDirectory. The parameter dirnum specifies the subfile/directory as an integer number, with the first directory numbered zero.

TIFFSetSubDirectory acts like TIFFSetDirectory, except the directory is specified as a file offset instead of an index; this is required for accessing subdirectories linked through a SubIFD tag.

RETURN VALUES

On successful return 1 is returned. Otherwise, 0 is returned if dirnum or diroff specifies a non-existent directory, or if an error was encountered while reading the directory’s contents.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine.

%s: Error fetching directory count. An error was encountered while reading the ‘‘directory count’’ field.

%s: Error fetching directory link. An error was encountered while reading the ‘‘link value’’ that points to the next directory in a file.

SEE ALSO

TIFFCurrentDirectory(3TIFF), TIFFOpen(3TIFF), TIFFReadDirectory(3TIFF), TIFFWriteDirectory(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/tiffdither.1.html0000644000212300117540000001266410640473675014310 00000000000000 TIFFDITHER

TIFFDITHER

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
NOTES
SEE ALSO

NAME

tiffdither − convert a greyscale image to bilevel using dithering

SYNOPSIS

tiffdither [ options ] input.tif output.tif

DESCRIPTION

tiffdither converts a single channel 8-bit greyscale image to a bilevel image using Floyd-Steinberg error propagation with thresholding.

OPTIONS

−c

Specify the compression to use for data written to the output file: none for no compression, packbits for PackBits compression, lzw for Lempel-Ziv & Welch compression, zip for Deflate compression, g3 for CCITT Group 3 (T.4) compression, and g4 for CCITT Group 4 (T.6) compression. By default tiffdither will compress data according to the value of the Compression tag found in the source file.

The CCITT Group 3 and Group 4 compression algorithms can only be used with bilevel data.

Group 3 compression can be specified together with several T.4-specific options: 1d for 1-dimensional encoding, 2d for 2-dimensional encoding, and fill to force each encoded scanline to be zero-filled so that the terminating EOL code lies on a byte boundary. Group 3-specific options are specified by appending a ‘‘:’’-separated list to the ‘‘g3’’ option; e.g. −c g3:2d:fill to get 2D-encoded data with byte-aligned EOL codes.

LZW compression can be specified together with a predictor value. A predictor value of 2 causes each scanline of the output image to undergo horizontal differencing before it is encoded; a value of 1 forces each scanline to be encoded without differencing. LZW-specific options are specified by appending a ‘‘:’’-separated list to the ‘‘lzw’’ option; e.g. −c lzw:2 for LZW compression with horizontal differencing.

−f

Specify the bit fill order to use in writing output data. By default, tiffdither will create a new file with the same fill order as the original. Specifying −f lsb2msb will force data to be written with the FillOrder tag set to LSB2MSB , while −f msb2lsb will force data to be written with the Fill- Order tag set to MSB2LSB .

−t

Set the threshold value for dithering. By default the threshold value is 128.

NOTES

The dither algorithm is taken from the tiffmedian(1) program (written by Paul Heckbert).

SEE ALSO

pal2rgb(1), fax2tiff(1), tiffinfo(1), tiffcp(1), tiff2bw(1), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/tiffsplit.1.html0000644000212300117540000000555710640473676014170 00000000000000 TIFFSPLIT

TIFFSPLIT

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
BUGS
SEE ALSO

NAME

tiffsplit − split a multi-image TIFF into single-image TIFF files

SYNOPSIS

tiffsplit src.tif [ prefix ]

DESCRIPTION

tiffsplit takes a multi-directory (page) TIFF file and creates one or more single-directory (page) TIFF files from it. The output files are given names created by concatenating a prefix, a lexically ordered suffix in the range [aaa-zzz], the suffix .tif (e.g. xaaa.tif, xaab.tif, xzzz.tif). If a prefix is not specified on the command line, the default prefix of x is used.

OPTIONS

None.

BUGS

Only a select set of ‘‘known tags’’ is copied when splitting.

SEE ALSO

tiffcp(1), tiffinfo(1), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/raw2tiff.1.html0000644000212300117540000003071210640473673013674 00000000000000 RAW2TIFF

RAW2TIFF

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
GUESSING THE IMAGE GEOMETRY
SEE ALSO

NAME

raw2tiff − create a TIFF file from a raw data

SYNOPSIS

raw2tiff [ options ] input.raw output.tif

DESCRIPTION

raw2tiff converts a raw byte sequence into TIFF. By default, the TIFF image is created with data samples packed (PlanarConfiguration=1), compressed with the PackBits algorithm (Compression=32773), and with each strip no more than 8 kilobytes. These characteristics can overridden, or explicitly specified with the options described below.

OPTIONS

−H number

size of input image file header in bytes (0 by default). This amount of data just will be skipped from the start of file while reading.

−w number

width of input image in pixels (can be guessed, see GUESSING THE IMAGE GEOMETRY below).

−l number

length of input image in lines (can be guessed, see GUESSING THE IMAGE GEOMETRY below).

−b number

number of bands in input image (1 by default).

−d data_type

type of samples in input image, where data_type may be:

byte

8-bit unsigned integer (default),

short

16-bit unsigned integer,

long

32-bit unsigned integer,

sbyte

8-bit signed integer,

sshort

16-bit signed integer,

slong

32-bit signed integer,

float

32-bit IEEE floating point,

double

64-bit IEEE floating point.

−i config

type of samples interleaving in input image, where config may be:

pixel

pixel interleaved data (default),

band

band interleaved data.

−p photo

photometric interpretation (color space) of the input image, where photo may be:

miniswhite

white color represented with 0 value,

minisblack

black color represented with 0 value (default),

rgb

image has RGB color model,

cmyk

image has CMYK (separated) color model,

ycbcr

image has YCbCr color model,

cielab

image has CIE L*a*b color model,

icclab

image has ICC L*a*b color model,

itulab

image has ITU L*a*b color model.

−s

swap bytes fetched from the input file.

−L

input data has LSB2MSB bit order (default).

−M

input data has MSB2LSB bit order.

−c

Specify a compression scheme to use when writing image data: −c none for no compression, −c packbits for the PackBits compression algorithm (the default), −c jpeg for the baseline JPEG compression algorithm, −c zip for the Deflate compression algorithm, and −c lzw for Lempel-Ziv & Welch.

−r number

Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes.

GUESSING THE IMAGE GEOMETRY

raw2tiff can guess image width and height in case one or both of these parameters are not specified. If you omit one of those parameters, the complementary one will be calculated based on the file size (taking into account header size, number of bands and data type). If you omit both parameters, the statistical approach will be used. Utility will compute correlation coefficient between two lines at the image center using several appropriate line sizes and the highest absolute value of the coefficient will indicate the right line size. That is why you should be cautious with the very large images, because guessing process may take a while (depending on your system performance). Of course, the utility can’t guess the header size, number of bands and data type, so it should be specified manually. If you don’t know anything about your image, just try with the several combinations of those options.

There is no magic, it is just a mathematical statistics, so it can be wrong in some cases. But for most ordinary images guessing method will work fine.

SEE ALSO

pal2rgb(1), tiffcp(1), tiffmedian(1), libtiff(3)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFReadRawStrip.3tiff.html0000644000212300117540000000641410640473667016050 00000000000000 TIFFReadRawStrip

TIFFReadRawStrip

NAME
SYNOPSIS
DESCRIPTION
RETURN VALUES
DIAGNOSTICS
SEE ALSO

NAME

TIFFReadRawStrip − return the undecoded contents of a strip of data from an open TIFF file

SYNOPSIS

#include <tiffio.h>

tsize_t TIFFReadRawStrip(TIFF *tif, tstrip_t strip, tdata_t buf, tsize_t size)

DESCRIPTION

Read the contents of the specified strip into the (user supplied) data buffer. Note that the value of strip is a ‘‘raw strip number.’’ That is, the caller must take into account whether or not the data is organized in separate planes (PlanarConfiguration=2). To read a full strip of data the data buffer should typically be at least as large as the number returned by TIFFStripSize.

RETURN VALUES

The actual number of bytes of data that were placed in buf is returned; TIFFReadEncodedStrip returns −1 if an error was encountered.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine.

SEE ALSO

TIFFOpen(3TIFF), TIFFReadEncodedStrip(3TIFF), TIFFReadScanline(3TIFF), TIFFStripSize(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/thumbnail.1.html0000644000212300117540000000774410640473674014145 00000000000000 THUMBNAIL

THUMBNAIL

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
BUGS
SEE ALSO

NAME

thumbnail − create a TIFF file with thumbnail images

SYNOPSIS

thumbnail [ options ] input.tif output.tif

DESCRIPTION

thumbnail is a program written to show how one might use the SubIFD tag (#330) to store thumbnail images. thumbnail copies a TIFF Class F facsimile file to the output file and for each image an 8-bit greyscale thumbnail sketch. The output file contains the thumbnail image with the associated full-resolution page linked below with the SubIFD tag.

By default, thumbnail images are 216 pixels wide by 274 pixels high. Pixels are calculated by sampling and filtering the input image with each pixel value passed through a contrast curve.

OPTIONS

−w

Specify the width of thumbnail images in pixels.

−h

Specify the height of thumbnail images in pixels.

−c

Specify a contrast curve to apply in generating the thumbnail images. By default pixels values are passed through a linear contrast curve that simply maps the pixel value ranges. Alternative curves are: exp50 for a 50% exponential curve, exp60 for a 60% exponential curve, exp70 for a 70% exponential curve, exp80 for a 80% exponential curve, exp90 for a 90% exponential curve, exp for a pure exponential curve, linear for a linear curve.

BUGS

There are no options to control the format of the saved thumbnail images.

SEE ALSO

tiffdump(1), tiffgt(1), tiffinfo(1), libtiff(3)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFReadRawTile.3tiff.html0000644000212300117540000000654110640473667015645 00000000000000 TIFFReadRawTile

TIFFReadRawTile

NAME
SYNOPSIS
DESCRIPTION
RETURN VALUES
DIAGNOSTICS
SEE ALSO

NAME

TIFFReadRawTile − return an undecoded tile of data from an open TIFF file

SYNOPSIS

#include <tiffio.h>

tsize_t TIFFReadRawTile(TIFF *tif, ttile_t tile, tdata_t buf, tsize_t size)

DESCRIPTION

Read the contents of the specified tile into the (user supplied) data buffer. Note that the value of tile is a ‘‘raw tile number.’’ That is, the caller must take into account whether or not the data is organized in separate planes (PlanarConfiguration=2). TIFFComputeTile automatically does this when converting an (x,y,z,sample) coordinate quadruple to a tile number. To read a full tile of data the data buffer should typically be at least as large as the value returned by TIFFTileSize.

RETURN VALUES

The actual number of bytes of data that were placed in buf is returned; TIFFReadEncodedTile returns −1 if an error was encountered.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine.

SEE ALSO

TIFFOpen(3TIFF), TIFFReadEncodedTile(3TIFF), TIFFReadTile(3TIFF), TIFFTileSize(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/tiffcp.1.html0000644000212300117540000003575411403261334013421 00000000000000 TIFFCP

TIFFCP

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
EXAMPLES
SEE ALSO

NAME

tiffcp − copy (and possibly convert) a TIFF file

SYNOPSIS

tiffcp [ options ] src1.tif ... srcN.tif dst.tif

DESCRIPTION

tiffcp combines one or more files created according to the Tag Image File Format, Revision 6.0 into a single TIFF file. Because the output file may be compressed using a different algorithm than the input files, tiffcp is most often used to convert between different compression schemes.

By default, tiffcp will copy all the understood tags in a TIFF directory of an input file to the associated directory in the output file.

tiffcp can be used to reorganize the storage characteristics of data in a file, but it is explicitly intended to not alter or convert the image data content in any way.

OPTIONS

−b image

subtract the following monochrome image from all others processed. This can be used to remove a noise bias from a set of images. This bias image is typically an image of noise the camera saw with its shutter closed.

−B

Force output to be written with Big-Endian byte order. This option only has an effect when the output file is created or overwritten and not when it is appended to.

−C

Suppress the use of ‘‘strip chopping’’ when reading images that have a single strip/tile of uncompressed data.

−c

Specify the compression to use for data written to the output file: none for no compression, packbits for PackBits compression, lzw for Lempel-Ziv & Welch compression, jpeg for baseline JPEG compression, zip for Deflate compression, g3 for CCITT Group 3 (T.4) compression, and g4 for CCITT Group 4 (T.6) compression. By default tiffcp will compress data according to the value of the Compression tag found in the source file.

The CCITT Group 3 and Group 4 compression algorithms can only be used with bilevel data.

Group 3 compression can be specified together with several T.4-specific options: 1d for 1-dimensional encoding, 2d for 2-dimensional encoding, and fill to force each encoded scanline to be zero-filled so that the terminating EOL code lies on a byte boundary. Group 3-specific options are specified by appending a ‘‘:’’-separated list to the ‘‘g3’’ option; e.g. −c g3:2d:fill to get 2D-encoded data with byte-aligned EOL codes.

LZW compression can be specified together with a predictor value. A predictor value of 2 causes each scanline of the output image to undergo horizontal differencing before it is encoded; a value of 1 forces each scanline to be encoded without differencing. LZW-specific options are specified by appending a ‘‘:’’-separated list to the ‘‘lzw’’ option; e.g. −c lzw:2 for LZW compression with horizontal differencing.

−f

Specify the bit fill order to use in writing output data. By default, tiffcp will create a new file with the same fill order as the original. Specifying −f lsb2msb will force data to be written with the FillOrder tag set to LSB2MSB, while −f msb2lsb will force data to be written with the FillOrder tag set to MSB2LSB.

−i

Ignore non-fatal read errors and continue processing of the input file.

−l

Specify the length of a tile (in pixels). tiffcp attempts to set the tile dimensions so that no more than 8 kilobytes of data appear in a tile.

−L

Force output to be written with Little-Endian byte order. This option only has an effect when the output file is created or overwritten and not when it is appended to.

−M

Suppress the use of memory-mapped files when reading images.

−p

Specify the planar configuration to use in writing image data that has one 8-bit sample per pixel. By default, tiffcp will create a new file with the same planar configuration as the original. Specifying −p contig will force data to be written with multi-sample data packed together, while −p separate will force samples to be written in separate planes.

−r

Specify the number of rows (scanlines) in each strip of data written to the output file. By default (or when value 0 is specified), tiffcp attempts to set the rows/strip that no more than 8 kilobytes of data appear in a strip. If you specify special value −1 it will results in infinite number of the rows per strip. The entire image will be the one strip in that case.

−s

Force the output file to be written with data organized in strips (rather than tiles).

−t

Force the output file to be written with data organized in tiles (rather than strips). options can be used to force the resultant image to be written as strips or tiles of data, respectively.

−w

Specify the width of a tile (in pixels). tiffcp attempts to set the tile dimensions so that no more than 8 kilobytes of data appear in a tile. tiffcp attempts to set the tile dimensions so that no more than 8 kilobytes of data appear in a tile.

−x

Force the output file to be written with PAGENUMBER value in sequence.

−,=character

substitute character for ‘,’ in parsing image directory indices in files. This is necessary if filenames contain commas. Note that −,= with whitespace immediately following will disable the special meaning of the ‘,’ entirely. See examples.

EXAMPLES

The following concatenates two files and writes the result using LZW encoding:

tiffcp −c lzw a.tif b.tif result.tif

To convert a G3 1d-encoded TIFF to a single strip of G4-encoded data the following might be used:

tiffcp −c g4 −r 10000 g3.tif g4.tif

(1000 is just a number that is larger than the number of rows in the source file.)

To extract a selected set of images from a multi-image TIFF file, the file name may be immediately followed by a ‘,’ separated list of image directory indices. The first image is always in directory 0. Thus, to copy the 1st and 3rd images of image file ‘‘album.tif’’ to ‘‘result.tif’’:

tiffcp album.tif,0,2 result.tif

A trailing comma denotes remaining images in sequence. The following command will copy all image with except the first one:

tiffcp album.tif,1, result.tif

Given file ‘‘CCD.tif’’ whose first image is a noise bias followed by images which include that bias, subtract the noise from all those images following it (while decompressing) with the command:

tiffcp −c none −b CCD.tif CCD.tif,1, result.tif

If the file above were named ‘‘CCD,X.tif’’, the −,= option would be required to correctly parse this filename with image numbers, as follows:

tiffcp −c none −,=% −b CCD,X.tif CCD,X%1%.tif result.tif

SEE ALSO

pal2rgb(1), tiffinfo(1), tiffcmp(1), tiffmedian(1), tiffsplit(1), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/tiff2rgba.1.html0000644000212300117540000001075410640473674014023 00000000000000 TIFF2RGBA

TIFF2RGBA

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

NAME

tiff2rgba − convert a TIFF image to RGBA color space

SYNOPSIS

tiff2rgba [ options ] input.tif output.tif

DESCRIPTION

Tiff2rgba converts a wide variety of TIFF images into an RGBA TIFF image. This includes the ability to translate different color spaces and photometric interpretation into RGBA, support for alpha blending, and translation of many different bit depths into a 32bit RGBA image.

Internally this program is implemented using the TIFFReadRGBAImage() function, and it suffers any limitations of that image. This includes limited support for > 8 BitsPerSample images, and flaws with some esoteric combinations of BitsPerSample, photometric interpretation, block organization and planar configuration.

The generated images are stripped images with four samples per pixel (red, green, blue and alpha) or if the −n flag is used, three samples per pixel (red, green, and blue). The resulting images are always planar configuration contiguous. For this reason, this program is a useful utility for transform exotic TIFF files into a form ingestible by almost any TIFF supporting software.

OPTIONS

−c

Specify a compression scheme to use when writing image data: −c none for no compression (the default), −c packbits for the PackBits compression algorithm, −c zip for the Deflate compression algorithm, −c jpeg for the JPEG compression algorithm, and −c lzw for Lempel-Ziv & Welch.

−r

Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes.

−b

Process the image one block (strip/tile) at a time instead of by reading the whole image into memory at once. This may be necessary for very large images on systems with limited RAM.

−n

Drop the alpha component from the output file, producing a pure RGB file. Currently this does not work if the −b flag is also in effect.

SEE ALSO

tiff2bw(1), TIFFReadRGBAImage(3t), libtiff(3)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFWriteTile.3tiff.html0000644000212300117540000000706610640473670015407 00000000000000 TIFFWriteTile

TIFFWriteTile

NAME
SYNOPSIS
DESCRIPTION
RETURN VALUES
DIAGNOSTICS
SEE ALSO

NAME

TIFFWriteTile − encode and write a tile of data to an open TIFF file

SYNOPSIS

#include <tiffio.h>

tsize_t TIFFWriteTile(TIFF *tif, tdata_t buf, uint32 x, uint32 y, uint32 z, tsample_t sample)

DESCRIPTION

Write the data for the tile containing the specified coordinates. The data in buf are is (potentially) compressed, and written to the indicated file, normally being appended to the end of the file. The buffer must be contain an entire tile of data. Applications should call the routine TIFFTileSize to find out the size (in bytes) of a tile buffer. The x and y parameters are always used by TIFFWriteTile. The z parameter is used if the image is deeper than 1 slice (ImageDepth>1). The sample parameter is used only if data are organized in separate planes (PlanarConfiguration=2).

RETURN VALUES

TIFFWriteTile returns −1 if it detects an error; otherwise the number of bytes in the tile is returned.

DIAGNOSTICS

All error messages are directed to the TIFFError(3TIFF) routine.

SEE ALSO

TIFFCheckTile(3TIFF), TIFFComputeTile(3TIFF), TIFFOpen(3TIFF), TIFFReadTile(3TIFF), TIFFWriteScanline(3TIFF), TIFFWriteEncodedTile(3TIFF), TIFFWriteRawTile(3TIFF), libtiff(3TIFF)

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFFieldDataType.3tiff.html0000644000212300117540000000420612005260704016134 00000000000000 TIFFFieldDataType

TIFFFieldDataType

NAME
SYNOPSIS
DESCRIPTION
RETURN VALUES
SEE ALSO

NAME

TIFFFieldDataType − Get TIFF data type from field information

SYNOPSIS

#include <tiffio.h>

TIFFDataType TIFFFieldDataType(const TIFFField* fip)

DESCRIPTION

TIFFFieldDataType returns the data type stored in a TIFF field.

fip is a field information pointer previously returned by TIFFFindField, TIFFFieldWithTag, or TIFFFieldWithName.

RETURN VALUES

TIFFFieldDataType returns a member of the enum type TIFFDataType.

SEE ALSO

libtiff(3TIFF),

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/TIFFFieldPassCount.3tiff.html0000644000212300117540000000506412005260704016343 00000000000000 TIFFFieldPassCount

TIFFFieldPassCount

NAME
SYNOPSIS
DESCRIPTION
RETURN VALUES
SEE ALSO

NAME

TIFFFieldPassCount − Get whether to pass a count to TIFFGet/SetField

SYNOPSIS

#include <tiffio.h>

int TIFFFieldPassCount(const TIFFField* fip)

DESCRIPTION

TIFFFieldPassCount returns true (nonzero) if TIFFGetField and TIFFSetField expect a count value to be passed before the actual data pointer.

fip is a field information pointer previously returned by TIFFFindField, TIFFFieldWithTag, or TIFFFieldWithName.

When a count is required, it will be of type uint32 when TIFFFieldReadCount reports TIFF_VARIABLE2, and of type uint16 otherwise. (This distinction is critical for use of TIFFGetField, but normally not so for use of TIFFSetField.)

RETURN VALUES

TIFFFieldPassCount returns an integer that is always 1 (true) or 0 (false).

SEE ALSO

libtiff(3TIFF),

Libtiff library home page: http://www.remotesensing.org/libtiff/


tiff-4.0.3/html/man/Makefile.am0000644000212300117540000000722612005263021013140 00000000000000# Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. docdir = $(LIBTIFF_DOCDIR)/html/man MANSRCDIR = $(top_srcdir)/man HTMLMANDIR = $(top_srcdir)/html/man GROFF = groff -Thtml -mandoc ECHO = echo indexfile = index.html docfiles = \ libtiff.3tiff.html \ TIFFbuffer.3tiff.html \ TIFFClose.3tiff.html \ TIFFcodec.3tiff.html \ TIFFcolor.3tiff.html \ TIFFDataWidth.3tiff.html \ TIFFError.3tiff.html \ TIFFFieldDataType.3tiff.html \ TIFFFieldName.3tiff.html \ TIFFFieldPassCount.3tiff.html \ TIFFFieldReadCount.3tiff.html \ TIFFFieldTag.3tiff.html \ TIFFFieldWriteCount.3tiff.html \ TIFFFlush.3tiff.html \ TIFFGetField.3tiff.html \ TIFFmemory.3tiff.html \ TIFFOpen.3tiff.html \ TIFFPrintDirectory.3tiff.html \ TIFFquery.3tiff.html \ TIFFReadDirectory.3tiff.html \ TIFFReadEncodedStrip.3tiff.html \ TIFFReadEncodedTile.3tiff.html \ TIFFReadRawStrip.3tiff.html \ TIFFReadRawTile.3tiff.html \ TIFFReadRGBAImage.3tiff.html \ TIFFReadRGBAStrip.3tiff.html \ TIFFReadRGBATile.3tiff.html \ TIFFReadScanline.3tiff.html \ TIFFReadTile.3tiff.html \ TIFFRGBAImage.3tiff.html \ TIFFSetDirectory.3tiff.html \ TIFFSetField.3tiff.html \ TIFFsize.3tiff.html \ TIFFstrip.3tiff.html \ TIFFswab.3tiff.html \ TIFFtile.3tiff.html \ TIFFWarning.3tiff.html \ TIFFWriteDirectory.3tiff.html \ TIFFWriteEncodedStrip.3tiff.html \ TIFFWriteEncodedTile.3tiff.html \ TIFFWriteRawStrip.3tiff.html \ TIFFWriteRawTile.3tiff.html \ TIFFWriteScanline.3tiff.html \ TIFFWriteTile.3tiff.html \ bmp2tiff.1.html \ fax2ps.1.html \ fax2tiff.1.html \ gif2tiff.1.html \ pal2rgb.1.html \ ppm2tiff.1.html \ ras2tiff.1.html \ raw2tiff.1.html \ rgb2ycbcr.1.html \ sgi2tiff.1.html \ thumbnail.1.html \ tiff2bw.1.html \ tiff2pdf.1.html \ tiff2ps.1.html \ tiff2rgba.1.html \ tiffcmp.1.html \ tiffcp.1.html \ tiffcrop.1.html \ tiffdither.1.html \ tiffdump.1.html \ tiffgt.1.html \ tiffinfo.1.html \ tiffmedian.1.html \ tiffset.1.html \ tiffsplit.1.html \ tiffsv.1.html dist_doc_DATA = $(indexfile) $(docfiles) INDEXSTART = 'Libtiff HTML manpage index

    Man Pages

    ' INDEXEND = '

' .PHONY: index index: ${ECHO} ${INDEXSTART} > $(indexfile) for i in $(docfiles); do \ ${ECHO} '
  • '$$i'' >> $(indexfile); \ done ${ECHO} ${INDEXEND} >> $(indexfile) manpages = $(docfiles:.html=) .PHONY: htmldoc htmldoc: for i in $(manpages); do \ ${GROFF} $(MANSRCDIR)/$$i > $(HTMLMANDIR)/$$i.html; \ done tiff-4.0.3/html/man/TIFFDataWidth.3tiff.html0000644000212300117540000000477410640473665015357 00000000000000 TIFFDataWidth

    TIFFDataWidth

    NAME
    SYNOPSIS
    DESCRIPTION
    RETURN VALUES
    SEE ALSO

    NAME

    TIFFDataWidth − Get the size of TIFF data types

    SYNOPSIS

    #include <tiffio.h>

    int TIFFDataWidth(TIFFDataType type)

    DESCRIPTION

    TIFFDataWidth returns a size of type in bytes. Currently following data types are supported:
    TIFF_BYTE
    TIFF_ASCII
    TIFF_SBYTE
    TIFF_UNDEFINED
    TIFF_SHORT
    TIFF_SSHORT
    TIFF_LONG
    TIFF_SLONG
    TIFF_FLOAT
    TIFF_IFD
    TIFF_RATIONAL
    TIFF_SRATIONAL
    TIFF_DOUBLE

    RETURN VALUES

    TIFFDataWidth returns a number of bytes occupied by the item of given type. 0 returned when uknown data type supplied.

    SEE ALSO

    libtiff(3TIFF),

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFReadTile.3tiff.html0000644000212300117540000001026610640473667015172 00000000000000 TIFFReadTile

    TIFFReadTile

    NAME
    SYNOPSIS
    DESCRIPTION
    NOTES
    RETURN VALUES
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFReadTile − read and decode a tile of data from an open TIFF file

    SYNOPSIS

    #include <tiffio.h>

    tsize_t TIFFReadTile(TIFF *tif, tdata_t buf, uint32 x, uint32 y, uint32 z, tsample_t sample)

    DESCRIPTION

    Return the data for the tile containing the specified coordinates. The data placed in buf are returned decompressed and, typically, in the native byte- and bit-ordering, but are otherwise packed (see further below). The buffer must be large enough to hold an entire tile of data. Applications should call the routine TIFFTileSize to find out the size (in bytes) of a tile buffer. The x and y parameters are always used by TIFFReadTile. The z parameter is used if the image is deeper than 1 slice (ImageDepth>1). The sample parameter is used only if data are organized in separate planes (PlanarConfiguration=2).

    NOTES

    The library attempts to hide bit- and byte-ordering differences between the image and the native machine by converting data to the native machine order. Bit reversal is done if the FillOrder tag is opposite to the native machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file was written with a byte order opposite to the native machine byte order,

    RETURN VALUES

    TIFFReadTile returns −1 if it detects an error; otherwise the number of bytes in the decoded tile is returned.

    DIAGNOSTICS

    All error messages are directed to the TIFFError(3TIFF) routine.

    SEE ALSO

    TIFFCheckTile(3TIFF), TIFFComputeTile(3TIFF), TIFFOpen(3TIFF), TIFFReadEncodedTile(3TIFF), TIFFReadRawTile(3TIFF), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFWriteDirectory.3tiff.html0000644000212300117540000001452610640473670016455 00000000000000 TIFFWriteDirectory

    TIFFWriteDirectory

    NAME
    SYNOPSIS
    DESCRIPTION
    RETURN VALUES
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFWriteDirectory, TIFFRewriteDirectory, TIFFCheckpointDirectory − write the current directory in an open TIFF file

    SYNOPSIS

    #include <tiffio.h>

    int TIFFWriteDirectory(TIFF *tif)
    int TIFFRewriteDirectory(TIFF *
    tif)
    int TIFFCheckpointDirectory(TIFF *
    tif)

    DESCRIPTION

    TIFFWriteDirectory will write the contents of the current directory to the file and setup to create a new subfile in the same file. Applications only need to call TIFFWriteDirectory when writing multiple subfiles to a single TIFF file. TIFFWriteDirectory is automatically called by TIFFClose and TIFFFlush to write a modified directory if the file is open for writing.

    The TIFFRewriteDirectory function operates similarly to TIFFWriteDirectory, but can be called with directories previously read or written that already have an established location in the file. It will rewrite the directory, but instead of place it at it’s old location (as TIFFWriteDirectory would) it will place them at the end of the file, correcting the pointer from the preceeding directory or file header to point to it’s new location. This is particularly important in cases where the size of the directory and pointed to data has grown, so it won’t fit in the space available at the old location.

    The TIFFCheckpointDirectory writes the current state of the tiff directory into the file to make what is currently in the file readable. Unlike TIFFWriteDirectory, TIFFCheckpointDirectory does not free up the directory data structures in memory, so they can be updated (as strips/tiles are written) and written again. Reading such a partial file you will at worst get a tiff read error for the first strip/tile encountered that is incomplete, but you will at least get all the valid data in the file before that. When the file is complete, just use TIFFWriteDirectory as usual to finish it off cleanly.

    RETURN VALUES

    1 is returned when the contents are successfully written to the file. Otherwise, 0 is returned if an error was encountered when writing the directory contents.

    DIAGNOSTICS

    All error messages are directed to the TIFFError(3TIFF) routine.

    Error post-encoding before directory write. Before writing the contents of the current directory, any pending data are flushed. This message indicates that an error occurred while doing this.

    Error flushing data before directory write. Before writing the contents of the current directory, any pending data are flushed. This message indicates that an error occurred while doing this.

    Cannot write directory, out of space. There was not enough space to allocate a temporary area for the directory that was to be written.

    Error writing directory count. A write error occurred when writing the count of fields in the directory.

    Error writing directory contents. A write error occurred when writing the directory fields.

    Error writing directory link. A write error occurred when writing the link to the next directory.

    Error writing data for field "%s". A write error occurred when writing indirect data for the specified field.

    Error writing TIFF header. A write error occurred when re-writing header at the front of the file.

    Error fetching directory count. A read error occurred when fetching the directory count field for a previous directory. This can occur when setting up a link to the directory that is being written.

    Error fetching directory link. A read error occurred when fetching the directory link field for a previous directory. This can occur when setting up a link to the directory that is being written.

    SEE ALSO

    TIFFOpen(3TIFF), TIFFError(3TIFF), TIFFReadDirectory(3TIFF), TIFFSetDirectory(3TIFF), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/ppm2tiff.1.html0000644000212300117540000000761310640473673013703 00000000000000 PPM2TIFF

    PPM2TIFF

    NAME
    SYNOPSIS
    DESCRIPTION
    OPTIONS
    SEE ALSO

    NAME

    ppm2tiff − create a TIFF file from PPM, PGM and PBM image files

    SYNOPSIS

    ppm2tiff [ options ] [ input.ppm ] output.tif

    DESCRIPTION

    ppm2tiff converts a file in the PPM, PGM and PBM image formats to TIFF. By default, the TIFF image is created with data samples packed (PlanarConfiguration=1), compressed with the Packbits algorithm (Compression=32773), and with each strip no more than 8 kilobytes. These characteristics can be overridden, or explicitly specified with the options described below

    If the PPM file contains greyscale data, then the PhotometricInterpretation tag is set to 1 (min-is-black), otherwise it is set to 2 (RGB).

    If no PPM file is specified on the command line, ppm2tiff will read from the standard input.

    OPTIONS

    −c

    Specify a compression scheme to use when writing image data: none for no compression, packbits for PackBits compression (will be used by default), lzw for Lempel-Ziv & Welch compression, jpeg for baseline JPEG compression, zip for Deflate compression, g3 for CCITT Group 3 (T.4) compression, and g4 for CCITT Group 4 (T.6) compression.

    −r

    Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes.

    −R

    Mark the resultant image to have the specified X and Y resolution (in dots/inch).

    SEE ALSO

    tiffinfo(1), tiffcp(1), tiffmedian(1), libtiff(3)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFSetField.3tiff.html0000644000212300117540000007456511370550376015206 00000000000000 TIFFSetField

    TIFFSetField

    NAME
    SYNOPSIS
    DESCRIPTION
    RETURN VALUES
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFSetField, TIFFVSetField − set the value(s) of a tag in a TIFF file open for writing

    SYNOPSIS

    #include <tiffio.h>

    int TIFFSetField(TIFF *tif, ttag_t tag, ...)

    #include <stdarg.h>

    int TIFFVSetField(TIFF *tif, ttag_t tag, va_list ap)

    DESCRIPTION

    TIFFSetField sets the value of a field or pseudo-tag in the current directory associated with the open TIFF file tif. (A pseudo-tag is a parameter that is used to control the operation of the TIFF library but whose value is not read or written to the underlying file.) To set the value of a field the file must have been previously opened for writing with TIFFOpen(3TIFF); pseudo-tags can be set whether the file was opened for reading or writing. The field is identified by tag, one of the values defined in the include file tiff.h (see also the table below). The actual value is specified using a variable argument list, as prescribed by the stdarg(3) interface (or, on some machines, the varargs(3) interface.)

    TIFFVSetField is functionally equivalent to TIFFSetField except that it takes a pointer to a variable argument list. TIFFVSetField is useful for writing routines that are layered on top of the functionality provided by TIFFSetField.

    The tags understood by libtiff, the number of parameter values, and the expected types for the parameter values are shown below. The data types are: char* is null-terminated string and corresponds to the ASCII data type; uint16 is an unsigned 16-bit value; uint32 is an unsigned 32-bit value; uint16* is an array of unsigned 16-bit values. void* is an array of data values of unspecified type.

    Consult the TIFF specification for information on the meaning of each tag.

    Tag Name

    Count

    Types

    Notes

    TIFFTAG_ARTIST

    1

    char*

    TIFFTAG_BADFAXLINES

    1

    uint32

    TIFFTAG_BITSPERSAMPLE

    1

    uint16

    TIFFTAG_CLEANFAXDATA

    1

    uint16

    TIFFTAG_COLORMAP

    3

    uint16*

    1<<BitsPerSample arrays

    TIFFTAG_COMPRESSION

    1

    uint16

    TIFFTAG_CONSECUTIVEBADFAXLINES

    1

    uint32

    TIFFTAG_COPYRIGHT

    1

    char*

    TIFFTAG_DATETIME

    1

    char*

    TIFFTAG_DOCUMENTNAME

    1

    char*

    TIFFTAG_DOTRANGE

    2

    uint16

    TIFFTAG_EXTRASAMPLES

    2

    uint16,uint16*

    † count & types array

    TIFFTAG_FAXFILLFUNC

    1

    TIFFFaxFillFunc

    G3/G4 compression pseudo-tag

    TIFFTAG_FAXMODE

    1

    int

    † G3/G4 compression pseudo-tag

    TIFFTAG_FILLORDER

    1

    uint16

    TIFFTAG_GROUP3OPTIONS

    1

    uint32

    TIFFTAG_GROUP4OPTIONS

    1

    uint32

    TIFFTAG_HALFTONEHINTS

    2

    uint16

    TIFFTAG_HOSTCOMPUTER

    1

    char*

    TIFFTAG_ICCPROFILE

    2

    uint32,void*

    count, profile data

    TIFFTAG_IMAGEDEPTH

    1

    uint32

    TIFFTAG_IMAGEDESCRIPTION

    1

    char*

    TIFFTAG_IMAGELENGTH

    1

    uint32

    TIFFTAG_IMAGEWIDTH

    1

    uint32

    TIFFTAG_INKNAMES

    2

    uint16, char*

    TIFFTAG_INKSET

    1

    uint16

    TIFFTAG_JPEGCOLORMODE

    1

    int

    † JPEG pseudo-tag

    TIFFTAG_JPEGQUALITY

    1

    int

    JPEG pseudo-tag

    TIFFTAG_JPEGTABLES

    2

    uint32*,void*

    † count & tables

    TIFFTAG_JPEGTABLESMODE

    1

    int

    † JPEG pseudo-tag

    TIFFTAG_MAKE

    1

    char*

    TIFFTAG_MATTEING

    1

    uint16

    TIFFTAG_MAXSAMPLEVALUE

    1

    uint16

    TIFFTAG_MINSAMPLEVALUE

    1

    uint16

    TIFFTAG_MODEL

    1

    char*

    TIFFTAG_ORIENTATION

    1

    uint16

    TIFFTAG_PAGENAME

    1

    char*

    TIFFTAG_PAGENUMBER

    2

    uint16

    TIFFTAG_PHOTOMETRIC

    1

    uint16

    TIFFTAG_PHOTOSHOP

    ?

    uint32,void*

    count, data

    TIFFTAG_PLANARCONFIG

    1

    uint16

    TIFFTAG_PREDICTOR

    1

    uint16

    TIFFTAG_PRIMARYCHROMATICITIES

    1

    float*

    6-entry array

    TIFFTAG_REFERENCEBLACKWHITE

    1

    float*

    † 6-entry array

    TIFFTAG_RESOLUTIONUNIT

    1

    uint16

    TIFFTAG_RICHTIFFIPTC

    2

    uint32,void*

    count, data

    TIFFTAG_ROWSPERSTRIP

    1

    uint32

    † must be > 0

    TIFFTAG_SAMPLEFORMAT

    1

    uint16

    TIFFTAG_SAMPLESPERPIXEL

    1

    uint16

    † value must be <= 4

    TIFFTAG_SMAXSAMPLEVALUE

    1

    double

    TIFFTAG_SMINSAMPLEVALUE

    1

    double

    TIFFTAG_SOFTWARE

    1

    char*

    TIFFTAG_STONITS

    1

    double

    TIFFTAG_SUBFILETYPE

    1

    uint32

    TIFFTAG_SUBIFD

    2

    uint16,uint32*

    count & offsets array

    TIFFTAG_TARGETPRINTER

    1

    char*

    TIFFTAG_THRESHHOLDING

    1

    uint16

    TIFFTAG_TILEDEPTH

    1

    uint32

    TIFFTAG_TILELENGTH

    1

    uint32

    † must be a multiple of 8

    TIFFTAG_TILEWIDTH

    1

    uint32

    † must be a multiple of 8

    TIFFTAG_TRANSFERFUNCTION

    1 or 3‡ uint16*

    1<<BitsPerSample entry arrays

    TIFFTAG_WHITEPOINT

    1

    float*

    2-entry array

    TIFFTAG_XMLPACKET

    2

    uint32,void*

    count, data

    TIFFTAG_XPOSITION

    1

    float

    TIFFTAG_XRESOLUTION

    1

    float

    TIFFTAG_YCBCRCOEFFICIENTS

    1

    float*

    † 3-entry array

    TIFFTAG_YCBCRPOSITIONING

    1

    uint16

    TIFFTAG_YCBCRSAMPLING

    2

    uint16

    TIFFTAG_YPOSITION

    1

    float

    TIFFTAG_YRESOLUTION

    1

    float

    † Tag may not have its values changed once data is written.
    ‡ If SamplesPerPixel is one, then a single array is passed; otherwise three arrays should be passed.
    * The contents of this field are quite complex. See The ICC Profile Format Specification, Annex B.3 "Embedding ICC Profiles in TIFF Files" (available at http://www.color.org) for an explanation.

    RETURN VALUES

    1 is returned if the operation was successful. Otherwise, 0 is returned if an error was detected.

    DIAGNOSTICS

    All error messages are directed to the TIFFError(3TIFF) routine.

    %s: Cannot modify tag "%s" while writing. Data has already been written to the file, so the specified tag’s value can not be changed. This restriction is applied to all tags that affect the format of written data.

    %d: Bad value for "%s". An invalid value was supplied for the named tag.

    SEE ALSO

    TIFFOpen(3TIFF), TIFFGetField(3TIFF), TIFFSetDirectory(3TIFF), TIFFWriteDirectory(3TIFF), TIFFReadDirectory(3TIFF), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFOpen.3tiff.html0000644000212300117540000003260410640473665014400 00000000000000 TIFFOpen

    TIFFOpen

    NAME
    SYNOPSIS
    DESCRIPTION
    OPTIONS
    BYTE ORDER
    RETURN VALUES
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFOpen, TIFFFdOpen, TIFFClientOpen − open a TIFF file for reading or writing

    SYNOPSIS

    #include <tiffio.h>

    TIFF* TIFFOpen(const char *filename, const char *mode)
    TIFF* TIFFFdOpen(const int
    fd, const char *filename, const char *mode)

    typedef tsize_t (*TIFFReadWriteProc)(thandle_t, tdata_t, tsize_t);
    typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
    typedef int (*TIFFCloseProc)(thandle_t);
    typedef toff_t (*TIFFSizeProc)(thandle_t);
    typedef int (*TIFFMapFileProc)(thandle_t, tdata_t*, toff_t*);
    typedef void (*TIFFUnmapFileProc)(thandle_t, tdata_t, toff_t);

    TIFF* TIFFClientOpen(const char *filename, const char *mode, thandle_t clientdata, TIFFReadWriteProc readproc, TIFFReadWriteProc writeproc, TIFFSeekProc seekproc, TIFFCloseProc closeproc, TIFFSizeProc sizeproc, TIFFMapFileProc mapproc, TIFFUnmapFileProc unmapproc)

    DESCRIPTION

    TIFFOpen opens a TIFF file whose name is filename and returns a handle to be used in subsequent calls to routines in libtiff. If the open operation fails, then zero is returned. The mode parameter specifies if the file is to be opened for reading (‘‘r’’), writing (‘‘w’’), or appending (‘‘a’’) and, optionally, whether to override certain default aspects of library operation (see below). When a file is opened for appending, existing data will not be touched; instead new data will be written as additional subfiles. If an existing file is opened for writing, all previous data is overwritten.

    If a file is opened for reading, the first TIFF directory in the file is automatically read (also see TIFFSetDirectory(3TIFF) for reading directories other than the first). If a file is opened for writing or appending, a default directory is automatically created for writing subsequent data. This directory has all the default values specified in TIFF Revision 6.0: BitsPerSample=1, ThreshHolding=bilevel art scan, FillOrder=1 (most significant bit of each data byte is filled first), Orientation=1 (the 0th row represents the visual top of the image, and the 0th column represents the visual left hand side), SamplesPerPixel=1, RowsPerStrip=infinity, ResolutionUnit=2 (inches), and Compression=1 (no compression). To alter these values, or to define values for additional fields, TIFFSetField(3TIFF) must be used.

    TIFFFdOpen is like TIFFOpen except that it opens a TIFF file given an open file descriptor fd. The file’s name and mode must reflect that of the open descriptor. The object associated with the file descriptor must support random access.

    TIFFClientOpen is like TIFFOpen except that the caller supplies a collection of functions that the library will use to do UNIX -like I/O operations. The readproc and writeproc are called to read and write data at the current file position. seekproc is called to change the current file position a la lseek(2). closeproc is invoked to release any resources associated with an open file. sizeproc is invoked to obtain the size in bytes of a file. mapproc and unmapproc are called to map and unmap a file’s contents in memory; c.f. mmap(2) and munmap(2). The clientdata parameter is an opaque ‘‘handle’’ passed to the client-specified routines passed as parameters to TIFFClientOpen.

    OPTIONS

    The open mode parameter can include the following flags in addition to the ‘‘r’’, ‘‘w’’, and ‘‘a’’ flags. Note however that option flags must follow the read-write-append specification.

    l

    When creating a new file force information be written with Little-Endian byte order (but see below). By default the library will create new files using the native CPU byte order.

    b

    When creating a new file force information be written with Big-Endian byte order (but see below). By default the library will create new files using the native CPU byte order.

    L

    Force image data that is read or written to be treated with bits filled from Least Significant Bit ( LSB ) to Most Significant Bit ( MSB ). Note that this is the opposite to the way the library has worked from its inception.

    B

    Force image data that is read or written to be treated with bits filled from Most Significant Bit ( MSB ) to Least Significant Bit ( LSB ); this is the default.

    H

    Force image data that is read or written to be treated with bits filled in the same order as the native CPU.

    M

    Enable the use of memory-mapped files for images opened read-only. If the underlying system does not support memory-mapped files or if the specific image being opened cannot be memory-mapped then the library will fallback to using the normal system interface for reading information. By default the library will attempt to use memory-mapped files.

    m

    Disable the use of memory-mapped files.

    C

    Enable the use of ‘‘strip chopping’’ when reading images that are comprised of a single strip or tile of uncompressed data. Strip chopping is a mechanism by which the library will automatically convert the single-strip image to multiple strips, each of which has about 8 Kilobytes of data. This facility can be useful in reducing the amount of memory used to read an image because the library normally reads each strip in its entirety. Strip chopping does however alter the apparent contents of the image because when an image is divided into multiple strips it looks as though the underlying file contains multiple separate strips. Finally, note that default handling of strip chopping is a compile-time configuration parameter. The default behaviour, for backwards compatibility, is to enable strip chopping.

    c

    Disable the use of strip chopping when reading images.

    h

    Read TIFF header only, do not load the first image directory. That could be useful in case of the broken first directory. We can open the file and proceed to the other directories.

    BYTE ORDER

    The TIFF specification (all versions) states that compliant readers must be capable of reading images written in either byte order. Nonetheless some software that claims to support the reading of TIFF images is incapable of reading images in anything but the native CPU byte order on which the software was written. (Especially notorious are applications written to run on Intel-based machines.) By default the library will create new files with the native byte-order of the CPU on which the application is run. This ensures optimal performance and is portable to any application that conforms to the TIFF specification. To force the library to use a specific byte-order when creating a new file the ‘‘b’’ and ‘‘l’’ option flags may be included in the call to open a file; for example, ‘‘wb’’ or ‘‘wl’’.

    RETURN VALUES

    Upon successful completion TIFFOpen, TIFFFdOpen, and TIFFClientOpen return a TIFF pointer. Otherwise, NULL is returned.

    DIAGNOSTICS

    All error messages are directed to the TIFFError(3TIFF) routine. Likewise, warning messages are directed to the TIFFWarning(3TIFF) routine.

    "%s": Bad mode. The specified mode parameter was not one of ‘‘r’’ (read), ‘‘w’’ (write), or ‘‘a’’ (append).

    %s: Cannot open. TIFFOpen() was unable to open the specified filename for read/writing.

    Cannot read TIFF header. An error occurred while attempting to read the header information.

    Error writing TIFF header. An error occurred while writing the default header information for a new file.

    Not a TIFF file, bad magic number %d (0x%x). The magic number in the header was not (hex) 0x4d4d or (hex) 0x4949.

    Not a TIFF file, bad version number %d (0x%x). The version field in the header was not 42 (decimal).

    Cannot append to file that has opposite byte ordering. A file with a byte ordering opposite to the native byte ordering of the current machine was opened for appending (‘‘a’’). This is a limitation of the library.

    SEE ALSO

    libtiff(3TIFF), TIFFClose(3TIFF)


    tiff-4.0.3/html/man/pal2rgb.1.html0000644000212300117540000001217410640473673013503 00000000000000 PAL2RGB

    PAL2RGB

    NAME
    SYNOPSIS
    DESCRIPTION
    OPTIONS
    BUGS
    SEE ALSO

    NAME

    pal2rgb − convert a palette color TIFF image to a full color image

    SYNOPSIS

    pal2rgb [ options ] input.tif output.tif

    DESCRIPTION

    Pal2rgb converts a palette color TIFF image to a full color image by applying the colormap of the palette image to each sample to generate a full color RGB image.

    OPTIONS

    Options that affect the interpretation of input data are:

    −C

    This option overrides the default behavior of pal2rgb in determining whether or not colormap entries contain 16-bit or 8-bit values. By default the colormap is inspected and if no colormap entry greater than 255 is found, the colormap is assumed to have only 8-bit values; otherwise 16-bit values (as required by the TIFF specification) are assumed. The −C option can be used to explicitly specify the number of bits for colormap entries: −C 8 for 8-bit values, −C 16 for 16-bit values.

    Options that affect the output file format are:

    −p

    Explicitly select the planar configuration used in organizing data samples in the output image: −p contig for samples packed contiguously, and −p separate for samples stored separately. By default samples are packed.

    −c

    Use the specific compression algorithm to encoded image data in the output file: −c packbits for Macintosh Packbits, −c lzw for Lempel-Ziv & Welch, −c zip for Deflate, −c none for no compression. If no compression-related option is specified, the input file’s compression algorithm is used.

    −r

    Explicitly specify the number of rows in each strip of the output file. If the −r option is not specified, a number is selected such that each output strip has approximately 8 kilobytes of data in it.

    BUGS

    Only 8-bit images are handled.

    SEE ALSO

    tiffinfo(1), tiffcp(1), tiffmedian(1), libtiff(3)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/tiff2ps.1.html0000644000212300117540000003142210640473674013525 00000000000000 TIFF2PS

    TIFF2PS

    NAME
    SYNOPSIS
    DESCRIPTION
    OPTIONS
    EXAMPLES
    BUGS
    SEE ALSO

    NAME

    tiff2ps − convert a TIFF image to PostScript™

    SYNOPSIS

    tiff2ps [ options ] input.tif ...

    DESCRIPTION

    tiff2ps reads TIFF images and writes PostScript or Encapsulated PostScript (EPS) on the standard output. By default, tiff2ps writes Encapsulated PostScript for the first image in the specified TIFF image file.

    By default, tiff2ps will generate PostScript that fills a printed area specified by the TIFF tags in the input file. If the file does not contain XResolution or YResolution tags, then the printed area is set according to the image dimensions. The −w and −h options (see below) can be used to set the dimensions of the printed area in inches; overriding any relevant TIFF tags.

    The PostScript generated for RGB, palette, and CMYK images uses the colorimage operator. The PostScript generated for greyscale and bilevel images uses the image operator. When the colorimage operator is used, PostScript code to emulate this operator on older PostScript printers is also generated. Note that this emulation code can be very slow.

    Color images with associated alpha data are composited over a white background.

    OPTIONS

    −1

    Generate PostScript Level 1 (the default).

    −2

    Generate PostScript Level 2.

    −3

    Generate PostScript Level 3. It basically allows one to use the /flateDecode filter for ZIP compressed TIFF images.

    −a

    Generate output for all IFDs (pages) in the input file.

    −b

    Specify the bottom margin for the output (in inches). This does not affect the height of the printed image.

    −c

    Center the image in the output. This option only shows an effect if both the −w and the −h option are given.

    −d

    Set the initial TIFF directory to the specified directory number. (NB: Directories are numbered starting at zero.) This option is useful for selecting individual pages in a multi-page (e.g. facsimile) file.

    −e

    Force the generation of Encapsulated PostScript (implies −z).

    −h

    Specify the vertical size of the printed area (in inches).

    −H

    Specify the maximum height of image (in inches). Images with larger sizes will be split in several pages. Option −L may be used for specifying size of split images overlapping.

    −i

    Enable/disable pixel interpolation. This option requires a single numeric value: zero to disable pixel interpolation and non-zero to enable. The default is enabled.

    −L

    Specify the size of overlapping for split images (in inches). Used in conjunction with −H option.

    −l

    Specify the left margin for the output (in inches). This does not affect the width of the printed image.

    −m

    Where possible render using the imagemask PostScript operator instead of the image operator. When this option is specified tiff2ps will use imagemask for rendering 1 bit deep images. If this option is not specified or if the image depth is greater than 1 then the image operator is used.

    −o

    Set the initial TIFF directory to the IFD at the specified file offset. This option is useful for selecting thumbnail images and the like which are hidden using the SubIFD tag.

    −p

    Force the generation of (non-Encapsulated) PostScript.

    −r

    Rotate image by 180 degrees.

    −s

    Generate output for a single IFD (page) in the input file.

    −w

    Specify the horizontal size of the printed area (in inches).

    −x

    Override resolution units specified in the TIFF as centimeters.

    −y

    Override resolution units specified in the TIFF as inches.

    −z

    When generating PostScript Level 2, data is scaled so that it does not image into the deadzone on a page (the outer margin that the printing device is unable to mark). This option suppresses this behavior. When PostScript Level 1 is generated, data is imaged to the entire printed page and this option has no affect.

    EXAMPLES

    The following generates PostScript Level 2 for all pages of a facsimile:

    tiff2ps −a2 fax.tif | lpr
    

    Note also that if you have version 2.6.1 or newer of Ghostscript then you can efficiently preview facsimile generated with the above command.

    To generate Encapsulated PostScript for a the image at directory 2 of an image use:

    tiff2ps −d 1 foo.tif
    

    (Notice that directories are numbered starting at zero.)

    If you have a long image, it may be split in several pages:

    tiff2ps −h11 −w8.5 −H14 −L.5 foo.tif > foo.ps
    

    The page size is set to 8.5x11 by −w and −h options. We will accept a small amount of vertical compression, so −H set to 14. Any pages between 11 and 14 inches will be fit onto one page. Pages longer than 14 inches are cut off at 11 and continued on the next page. The −L.5 option says to repeat a half inch on the next page (to improve readability).

    BUGS

    Because PostScript does not support the notion of a colormap, 8-bit palette images produce 24-bit PostScript images. This conversion results in output that is six times bigger than the original image and which takes a long time to send to a printer over a serial line. Matters are even worse for 4-, 2-, and 1-bit palette images.

    Does not handle tiled images when generating PostScript Level I output.

    SEE ALSO

    pal2rgb(1), tiffinfo(1), tiffcp(1), tiffgt(1), tiffmedian(1), tiff2bw(1), tiffsv(1), libtiff(3)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/gif2tiff.1.html0000644000212300117540000000746510640473672013660 00000000000000 GIF2TIFF

    GIF2TIFF

    NAME
    SYNOPSIS
    DESCRIPTION
    OPTIONS
    NOTES
    BUGS
    SEE ALSO

    NAME

    gif2tiff − create a TIFF file from a GIF87 format image file

    SYNOPSIS

    gif2tiff [ options ] input.gif output.tif

    DESCRIPTION

    Gif2tiff converts a file in the GIF87 format to TIFF. The TIFF image is created as a palette image, with samples compressed with the Lempel-Ziv & Welch algorithm (Compression=5). These characteristics can overridden, or explicitly specified with the options described below.

    OPTIONS

    −c

    Specify a compression scheme to use when writing image data: −c none for no compression, −c packbits for the PackBits compression algorithm, −c zip for the Deflate compression algorithm, and −c lzw for Lempel-Ziv & Welch (the default).

    −r

    Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes.

    NOTES

    The program is based on Paul Haeberli’s fromgif program which, in turn, is based on Marcel J.E. Mol’s GIF reader.

    BUGS

    Should have more options to control output format.

    SEE ALSO

    pal2rgb(1), tiffinfo(1), tiffcp(1), tiffmedian(1), libtiff(3)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFFieldWriteCount.3tiff.html0000644000212300117540000000611012005260704016520 00000000000000 TIFFFieldWriteCount

    TIFFFieldWriteCount

    NAME
    SYNOPSIS
    DESCRIPTION
    RETURN VALUES
    SEE ALSO

    NAME

    TIFFFieldWriteCount − Get number of values to be written to field

    SYNOPSIS

    #include <tiffio.h>

    int TIFFFieldWriteCount(const TIFFField* fip)

    DESCRIPTION

    TIFFFieldWriteCount returns the number of values to be written into the specified TIFF field; that is, the number of arguments that should be supplied to TIFFSetField. For most field types this is a small positive integer, typically 1 or 2, but there are some special values:
    TIFF_VARIABLE
    indicates that a variable number of values is possible; then, a uint16 count argument and a pointer data argument must be supplied to TIFFSetField.
    TIFF_VARIABLE2
    is the same as TIFF_VARIABLE except that the count argument must have type uint32. (On most modern machines, this makes no practical difference, and the count argument can simply be an int in either case.)
    TIFF_SPP
    indicates that the number of arguments must be equal to the image’s number of samples per pixel.

    fip is a field information pointer previously returned by TIFFFindField, TIFFFieldWithTag, or TIFFFieldWithName.

    For most field types, TIFFFieldWriteCount returns the same value as TIFFFieldReadCount, but there are some exceptions.

    RETURN VALUES

    TIFFFieldWriteCount returns an integer.

    SEE ALSO

    libtiff(3TIFF),

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFquery.3tiff.html0000644000212300117540000001205610640473671014640 00000000000000 QUERY

    QUERY

    NAME
    SYNOPSIS
    DESCRIPTION
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFCurrentRow, TIFFCurrentStrip, TIFFCurrentTile, TIFFCurrentDirectory, TIFFLastDirectory, TIFFFileno, TIFFFileName, TIFFGetMode, TIFFIsTiled, TIFFIsByteSwapped, TIFFIsUpSampled, TIFFIsMSB2LSB, TIFFGetVersion − query routines

    SYNOPSIS

    #include <tiffio.h>

    uint32 TIFFCurrentRow(TIFF* tif)
    tstrip_t TIFFCurrentStrip(TIFF*
    tif)
    ttile_t TIFFCurrentTile(TIFF*
    tif)
    tdir_t TIFFCurrentDirectory(TIFF*
    tif)
    int TIFFLastDirectory(TIFF*
    tif)
    int TIFFFileno(TIFF*
    tif)
    char* TIFFFileName(TIFF*
    tif)
    int TIFFGetMode(TIFF*
    tif)
    int TIFFIsTiled(TIFF*
    tif)
    int TIFFIsByteSwapped(TIFF*
    tif)
    int TIFFIsUpSampled(TIFF*
    tif)
    int TIFFIsMSB2LSB(TIFF*
    tif)
    const char* TIFFGetVersion(void)

    DESCRIPTION

    The following routines return status information about an open TIFF file.

    TIFFCurrentDirectory returns the index of the current directory (directories are numbered starting at 0). This number is suitable for use with the TIFFSetDirectory routine.

    TIFFLastDirectory returns a non-zero value if the current directory is the last directory in the file; otherwise zero is returned.

    TIFFCurrentRow, TIFFCurrentStrip, and TIFFCurrentTile, return the current row, strip, and tile, respectively, that is being read or written. These values are updated each time a read or write is done.

    TIFFFileno returns the underlying file descriptor used to access the TIFF image in the filesystem.

    TIFFFileName returns the pathname argument passed to TIFFOpen or TIFFFdOpen.

    TIFFGetMode returns the mode with which the underlying file was opened. On UNIX systems, this is the value passed to the open(2) system call.

    TIFFIsTiled returns a non-zero value if the image data has a tiled organization. Zero is returned if the image data is organized in strips.

    TIFFIsByteSwapped returns a non-zero value if the image data was in a different byte-order than the host machine. Zero is returned if the TIFF file and local host byte-orders are the same. Note that TIFFReadTile(), TIFFReadStrip() and TIFFReadScanline() functions already normally perform byte swapping to local host order if needed.

    TIFFIsUpSampled returns a non-zero value if image data returned through the read interface routines is being up-sampled. This can be useful to applications that want to calculate I/O buffer sizes to reflect this usage (though the usual strip and tile size routines already do this).

    TIFFIsMSB2LSB returns a non-zero value if the image data is being returned with bit 0 as the most significant bit.

    TIFFGetVersion returns an ASCII string that has a version stamp for the TIFF library software.

    DIAGNOSTICS

    None.

    SEE ALSO

    libtiff(3TIFF), TIFFOpen(3TIFF), TIFFFdOpen(3TIFF)


    tiff-4.0.3/html/man/TIFFWriteScanline.3tiff.html0000644000212300117540000001633310640473670016243 00000000000000 TIFFWriteScanline

    TIFFWriteScanline

    NAME
    SYNOPSIS
    DESCRIPTION
    NOTES
    RETURN VALUES
    DIAGNOSTICS
    BUGS
    SEE ALSO

    NAME

    TIFFWriteScanline − write a scanline to an open TIFF file

    SYNOPSIS

    #include <tiffio.h>

    int TIFFWriteScanline(TIFF *tif, tdata_t buf, uint32 row, tsample_t sample)

    DESCRIPTION

    Write data to a file at the specified row. The sample parameter is used only if data are organized in separate planes (PlanarConfiguration=2). The data are assumed to be uncompressed and in the native bit- and byte-order of the host machine. The data written to the file is compressed according to the compression scheme of the current TIFF directory (see further below). If the current scanline is past the end of the current subfile, the ImageLength field is automatically increased to include the scanline (except for PlanarConfiguration=2, where the ImageLength cannot be changed once the first data are written). If the ImageLength is increased, the StripOffsets and StripByteCounts fields are similarly enlarged to reflect data written past the previous end of image.

    NOTES

    The library writes encoded data using the native machine byte order. Correctly implemented TIFF readers are expected to do any necessary byte-swapping to correctly process image data with BitsPerSample greater than 8. The library attempts to hide bit-ordering differences between the image and the native machine by converting data from the native machine order.

    In C++ the sample parameter defaults to 0.

    Once data are written to a file for the current directory, the values of certain tags may not be altered; see TIFFSetField(3TIFF) for more information.

    It is not possible to write scanlines to a file that uses a tiled organization. The routine TIFFIsTiled can be used to determine if the file is organized as tiles or strips.

    RETURN VALUES

    TIFFWriteScanline returns −1 if it immediately detects an error and 1 for a successful write.

    DIAGNOSTICS

    All error messages are directed to the TIFFError(3TIFF) routine.

    %s: File not open for writing . The file was opened for reading, not writing.

    Can not write scanlines to a tiled image. An attempt was made to write a scanline to a tiled image. The image is assumed to be organized in tiles because the TileWidth and TileLength tags have been set with TIFFSetField(3TIFF).

    Compression algorithm does not support random access. Data was written in a non-sequential order to a file that uses a compression algorithm and that has RowsPerStrip greater than one. That is, data in the image is to be stored in a compressed form, and with multiple rows packed into a strip. In this case, the library does not support random access to the data. The data should either be written as entire strips, sequentially by rows, or the value of RowsPerStrip should be set to one.

    %s: Must set "ImageWidth" before writing data. The image’s width has not be set before the first write. See TIFFSetField(3TIFF) for information on how to do this.

    %s: Must set "PlanarConfiguration" before writing data. The organization of data has not be defined before the first write. See TIFFSetField(3TIFF) for information on how to do this.

    Can not change "ImageLength" when using separate planes. Separate image planes are being used (PlanarConfiguration=2), but the number of rows has not been specified before the first write. The library supports the dynamic growth of an image only when data are organized in a contiguous manner (PlanarConfiguration=1).

    %d: Sample out of range, max %d. The sample parameter was greater than the value of the SamplesPerPixel tag.

    %s: No space for strip arrays . There was not enough space for the arrays that hold strip offsets and byte counts.

    BUGS

    Writing subsampled YCbCR data does not work correctly because, for PlanarConfiguration=2 the size of a scanline is not calculated on a per-sample basis, and for PlanarConfiguration=1 the library does not pack the block-interleaved samples.

    SEE ALSO

    TIFFOpen(3TIFF), TIFFWriteEncodedStrip(3TIFF), TIFFWriteRawStrip(3TIFF), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/sgi2tiff.1.html0000644000212300117540000000770410640473673013672 00000000000000 SGI2TIFF

    SGI2TIFF

    NAME
    SYNOPSIS
    DESCRIPTION
    OPTIONS
    BUGS
    SEE ALSO

    NAME

    sgi2tiff − create a TIFF file from an SGI image file

    SYNOPSIS

    sgi2tiff [ options ] input.rgb output.tif

    DESCRIPTION

    sgi2tiff converts a file in the SGI image format to TIFF. By default, the TIFF image is created with data samples packed (PlanarConfiguration=1), compressed with the Lempel-Ziv & Welch algorithm (Compression=5), and with each strip no more than 8 kilobytes. These characteristics can overridden, or explicitly specified with the options described below.

    OPTIONS

    −c

    Specify a compression scheme to use when writing image data: −c none for no compression, −c packbits for the PackBits compression algorithm), −c jpeg for the baseline JPEG compression algorithm, −c zip for the Deflate compression algorithm, and −c lzw for Lempel-Ziv & Welch (the default).

    −p

    Explicitly select the planar configuration used in organizing data samples in the output image: −p contig for samples packed contiguously, and −p separate for samples stored separately. By default samples are packed.

    −r

    Write data with a specified number of rows per strip; by default the number of rows/strip is selected so that each strip is approximately 8 kilobytes.

    BUGS

    Does not record colormap information.

    SEE ALSO

    tiffinfo(1), tiffcp(1), tiffmedian(1), libtiff(3)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/libtiff.3tiff.html0000644000212300117540000006000010640473672014432 00000000000000 INTRO

    INTRO

    NAME
    SYNOPSIS
    DESCRIPTION
    DATA TYPES
    LIST OF ROUTINES
    TAG USAGE
    PSEUDO TAGS
    DIAGNOSTICS
    SEE ALSO
    BUGS

    NAME

    libtiff − introduction to libtiff, a library for reading and writing TIFF files

    SYNOPSIS

    #include <tiffio.h>

    cc file.c -ltiff

    DESCRIPTION

    libtiff is a library for reading and writing data files encoded with the Tag Image File format, Revision 6.0 (or revision 5.0 or revision 4.0). This file format is suitable for archiving multi-color and monochromatic image data.

    The library supports several compression algorithms, as indicated by the Compression field, including: no compression (1), CCITT 1D Huffman compression (2), CCITT Group 3 Facsimile compression (3), CCITT Group 4 Facsimile compression (4), Lempel-Ziv & Welch compression (5), baseline JPEG compression (7), word-aligned 1D Huffman compression (32771), and PackBits compression (32773). In addition, several nonstandard compression algorithms are supported: the 4-bit compression algorithm used by the ThunderScan program (32809) (decompression only), NeXT’s 2-bit compression algorithm (32766) (decompression only), an experimental LZ-style algorithm known as Deflate (32946), and an experimental CIE LogLuv compression scheme designed for images with high dynamic range (32845 for LogL and 32845 for LogLuv). Directory information may be in either little- or big-endian byte order−byte swapping is automatically done by the library. Data bit ordering may be either Most Significant Bit ( MSB ) to Least Significant Bit ( LSB ) or LSB to MSB. Finally, the library does not support files in which the BitsPerSample, Compression, MinSampleValue, or MaxSampleValue fields are defined differently on a per-sample basis (in Rev. 6.0 the Compression tag is not defined on a per-sample basis, so this is immaterial).

    DATA TYPES

    The library makes extensive use of C typedefs to promote portability. Two sets of typedefs are used, one for communication with clients of the library and one for internal data structures and parsing of the TIFF format. The following typedefs are exposed to users either through function definitions or through parameters passed through the varargs interfaces.

    typedef unsigned short uint16;

    16-bit unsigned integer

    typedef unsigned <thing> uint32;

    32-bit unsigned integer

    typedef unsigned int ttag_t;

    directory tag

    typedef uint16 tdir_t;

    directory index

    typedef uint16 tsample_t;

    sample number

    typedef uint32 tstrip_t;

    strip number

    typedef uint32 ttile_t;

    tile number

    typedef int32 tsize_t;

    i/o size in bytes

    typedef void* tdata_t;

    image data ref

    typedef void* thandle_t;

    client data handle

    typedef int32 toff_t;

    file offset

    Note that tstrip_t, ttile_t, and tsize_t are constrained to be no more than 32-bit quantities by 32-bit fields they are stored in in the TIFF image. Likewise tsample_t is limited by the 16-bit field used to store the SamplesPerPixel tag. tdir_t constrains the maximum number of IFDs that may appear in an image and may be an arbitrary size (w/o penalty). ttag_t must be either int, unsigned int, pointer, or double because the library uses a varargs interface and ANSI C restricts the type of the parameter before an ellipsis to be a promoted type. toff_t is defined as int32 because TIFF file offsets are (unsigned) 32-bit quantities. A signed value is used because some interfaces return −1 on error. Finally, note that user-specified data references are passed as opaque handles and only cast at the lowest layers where their type is presumed.

    LIST OF ROUTINES

    The following routines are part of the library. Consult specific manual pages for details on their operation; on most systems doing ‘‘man function-name’’ will work.

    Name Description

    TIFFCheckpointDirectory

    writes the current state of the directory

    TIFFCheckTile

    very x,y,z,sample is within image

    TIFFCIELabToRGBInit

    initialize CIE L*a*b* 1976 to RGB conversion state

    TIFFCIELabToXYZ

    perform CIE L*a*b* 1976 to CIE XYZ conversion

    TIFFClientOpen

    open a file for reading or writing

    TIFFClose

    close an open file

    TIFFComputeStrip

    return strip containing y,sample

    TIFFComputeTile

    return tile containing x,y,z,sample

    TIFFCurrentDirectory

    return index of current directory

    TIFFCurrentRow

    return index of current scanline

    TIFFCurrentStrip

    return index of current strip

    TIFFCurrentTile

    return index of current tile

    TIFFDataWidth

    return the size of TIFF data types

    TIFFError

    library error handler

    TIFFFdOpen

    open a file for reading or writing

    TIFFFileName

    return name of open file

    TIFFFileno

    return open file descriptor

    TIFFFindCODEC

    find standard codec for the specific scheme

    TIFFFlush

    flush all pending writes

    TIFFFlushData

    flush pending data writes

    TIFFGetBitRevTable

    return bit reversal table

    TIFFGetField

    return tag value in current directory

    TIFFGetFieldDefaulted

    return tag value in current directory

    TIFFGetMode

    return open file mode

    TIFFGetVersion

    return library version string

    TIFFIsCODECConfigured

    check, whether we have working codec

    TIFFIsMSB2LSB

    return true if image data is being returned

    with bit 0 as the most significant bit

    TIFFIsTiled

    return true if image data is tiled

    TIFFIsByteSwapped

    return true if image data is byte-swapped

    TIFFNumberOfStrips

    return number of strips in an image

    TIFFNumberOfTiles

    return number of tiles in an image

    TIFFOpen

    open a file for reading or writing

    TIFFPrintDirectory

    print description of the current directory

    TIFFReadBufferSetup

    specify i/o buffer for reading

    TIFFReadDirectory

    read the next directory

    TIFFReadEncodedStrip

    read and decode a strip of data

    TIFFReadEncodedTile

    read and decode a tile of data

    TIFFReadRawStrip

    read a raw strip of data

    TIFFReadRawTile

    read a raw tile of data

    TIFFReadRGBAImage

    read an image into a fixed format raster

    TIFFReadScanline

    read and decode a row of data

    TIFFReadTile

    read and decode a tile of data

    TIFFRegisterCODEC

    override standard codec for the specific scheme

    TIFFReverseBits

    reverse bits in an array of bytes

    TIFFRGBAImageBegin

    setup decoder state for TIFFRGBAImageGet

    TIFFRGBAImageEnd

    release TIFFRGBAImage decoder state

    TIFFRGBAImageGet

    read and decode an image

    TIFFRGBAImageOK

    is image readable by TIFFRGBAImageGet

    TIFFScanlineSize

    return size of a scanline

    TIFFSetDirectory

    set the current directory

    TIFFSetSubDirectory

    set the current directory

    TIFFSetErrorHandler

    set error handler function

    TIFFSetField

    set a tag’s value in the current directory

    TIFFSetWarningHandler

    set warning handler function

    TIFFStripSize

    returns size of a strip

    TIFFRawStripSize

    returns the number of bytes in a raw strip

    TIFFSwabShort

    swap bytes of short

    TIFFSwabLong

    swap bytes of long

    TIFFSwabArrayOfShort

    swap bytes of an array of shorts

    TIFFSwabArrayOfLong

    swap bytes of an array of longs

    TIFFTileRowSize

    return size of a row in a tile

    TIFFTileSize

    return size of a tile

    TIFFUnRegisterCODEC

    unregisters the codec

    TIFFVGetField

    return tag value in current directory

    TIFFVGetFieldDefaulted

    return tag value in current directory

    TIFFVSetField

    set a tag’s value in the current directory

    TIFFVStripSize

    returns the number of bytes in a strip

    TIFFWarning

    library warning handler

    TIFFWriteDirectory

    write the current directory

    TIFFWriteEncodedStrip

    compress and write a strip of data

    TIFFWriteEncodedTile

    compress and write a tile of data

    TIFFWriteRawStrip

    write a raw strip of data

    TIFFWriteRawTile

    write a raw tile of data

    TIFFWriteScanline

    write a scanline of data

    TIFFWriteTile

    compress and write a tile of data

    TIFFXYZToRGB

    perform CIE XYZ to RGB conversion

    TIFFYCbCrToRGBInit

    initialize YCbCr to RGB conversion state

    TIFFYCbCrtoRGB

    perform YCbCr to RGB conversion

    Auxiliary functions:

    _TIFFfree

    free memory buffer

    _TIFFmalloc

    dynamically allocate memory buffer

    _TIFFmemcmp

    compare contents of the memory buffers

    _TIFFmemcpy

    copy contents of the one buffer to another

    _TIFFmemset

    fill memory buffer with a constant byte

    _TIFFrealloc

    dynamically reallocate memory buffer

    TAG USAGE

    The table below lists the TIFF tags that are recognized and handled by the library. If no use is indicated in the table, then the library reads and writes the tag, but does not use it internally. Note that some tags are meaningful only when a particultiff-4.0.3/html/man/tiffmedian.1.html0000644000212300117540000001204210640473675014254 00000000000000 TIFFMEDIAN

    TIFFMEDIAN

    NAME
    SYNOPSIS
    DESCRIPTION
    OPTIONS
    NOTES
    SEE ALSO

    NAME

    tiffmedian − apply the median cut algorithm to data in a TIFF file

    SYNOPSIS

    tiffmedian [ options ] input.tif output.tif

    DESCRIPTION

    tiffmedian applies the median cut algorithm to an RGB image in input.tif to generate a palette image that is written to output.tif. The generated colormap has, by default, 256 entries. The image data is quantized by mapping each pixel to the closest color values in the colormap.

    OPTIONS

    −c

    Specify the compression to use for data written to the output file: none for no compression, packbits for PackBits compression, lzw for Lempel-Ziv & Welch compression, and zip for Deflate compression. By default tiffmedian will compress data according to the value of the Compression tag found in the source file.

    LZW compression can be specified together with a predictor value. A predictor value of 2 causes each scanline of the output image to undergo horizontal differencing before it is encoded; a value of 1 forces each scanline to be encoded without differencing. LZW-specific options are specified by appending a ‘‘:’’-separated list to the ‘‘lzw’’ option; e.g. −c lzw:2 for LZW compression with horizontal differencing.

    −C

    Specify the number of entries to use in the generated colormap. By default all 256 entries/colors are used.

    −f

    Apply Floyd-Steinberg dithering before selecting a colormap entry.

    −r

    Specify the number of rows (scanlines) in each strip of data written to the output file. By default, tiffmedian attempts to set the rows/strip that no more than 8 kilobytes of data appear in a strip.

    NOTES

    This program is derived from Paul Heckbert’s median program.

    SEE ALSO

    pal2rgb(1), tiffinfo(1), tiffcp(1), tiffcmp(1), libtiff(3TIFF)

    Color Image Quantization for Frame Buffer Display, Paul Heckbert, SIGGRAPH proceedings, 1982, pp. 297-307.

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFFieldName.3tiff.html0000644000212300117540000000411712005260704015302 00000000000000 TIFFFieldName

    TIFFFieldName

    NAME
    SYNOPSIS
    DESCRIPTION
    RETURN VALUES
    SEE ALSO

    NAME

    TIFFFieldName − Get TIFF field name from field information

    SYNOPSIS

    #include <tiffio.h>

    const char* TIFFFieldName(const TIFFField* fip)

    DESCRIPTION

    TIFFFieldName returns the textual name for a TIFF field.

    fip is a field information pointer previously returned by TIFFFindField, TIFFFieldWithTag, or TIFFFieldWithName.

    RETURN VALUES

    TIFFFieldName returns a constant C string.

    SEE ALSO

    libtiff(3TIFF),

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/tiffcrop.1.html0000644000212300117540000004766210640473675014002 00000000000000 TIFFCROP

    TIFFCROP

    NAME
    SYNOPSIS
    DESCRIPTION
    OPTIONS
    EXAMPLES
    SEE ALSO

    NAME

    tiffcrop − copy (and possibly convert and crop or process) a TIFF file

    SYNOPSIS

    tiffcrop [ options ] src1.tif ... srcN.tif dst.tif

    DESCRIPTION

    tiffcrop combines one or more files created according to the Tag Image File Format, Revision 6.0 into a single TIFF file. The output file may be compressed using a different algorithm than the input files. tiffcrop is most often used to extract portions of an image for processing with bar code recognizer or OCR software when that software cannot restrict the region of interest to a specific portion of the image or to improve efficiency when the regions of interest must be rotated.

    By default, tiffcrop will copy all the understood tags in a TIFF directory of an input file to the associated directory in the output file.

    tiffcrop can be used to reorganize the storage characteristics of data in a file, and it will alter or convert the image data content as specified at the same time, unlike tiffcp.

    tiffcrop will behave exactly like tiffcp if none of the new options are specified.

    OPTIONS

    −N odd|even|#,#-#,#|last

    sequences and ranges of images within file to process. The words odd or even may be used to specify all odd or even numbered images. The word last may be used in place of a number in the sequence to indicate the final image in the file without knowing how many images there are. Ranges of images may be specified with a dash and multiple sets can be indicated by joining them in a comma-separated list. e.g.. use −N 1,5-7,last to process the 1st, 5th through 7th, and final image in the file.

    −E top|bottom|left|right

    use the top, bottom, left, or right edge as origin reference for width and length of crop regions. May be abbreviated to first letter.

    −U in|cm|px

    units to apply to dimensions for margins and crop regions. Inches or centimeters are converted to pixels using the resolution unit specified in the TIFF file (which defaults to inches if not specified in the IFD).

    −m #,#,#,#

    margins to be removed from the image. The order must be top, left, bottom, right with only commas separating the elements of the list. Margins are scaled according to the current units and removed before any other extractions are computed. Capital M was in use.

    −X #

    horizontal (X-axis) dimension of a region to extract relative to the specified origin reference. If the origin is the top or bottom edge, the X axis value will be assumed to start at the left edge.

    −Y #

    vertical (Y-axis) dimension of a region to extract relative to the specified origin reference. If the origin is the left or right edge, the Y axis value will be assumed to start at the top.

    −Z #:#,#:#

    zones of the image designated as position X of Y equal sized portions measured from the reference edge, e.g. 1:3 would be first third of the image starting from the reference edge minus any margins specified for the confining edges. Multiple zones can be specified as a comma separated list but they must reference the same edge. To extract the top quarter and the bottom third of an image you would use −Z 1:4,3:3.

    −F horiz|vert

    flip, i.e. mirror, the image or extracted region horizontally or vertically.

    −R 90|180|270

    rotate the image or extracted region 90, 180, or 270 degrees clockwise.

    −I

    invert the colorspace values for grayscale and bi-level images. This would be used to correct negative images that have incorrect PHOTOMETRIC INTERPRETATION tags. No support for color images.

    −b image

    subtract the following monochrome image from all others processed. This can be used to remove a noise bias from a set of images. This bias image is typically an image of noise the camera saw with its shutter closed. Bias image support is not available with options for cropping, rotating, or inverting the image.

    −B

    Force output to be written with Big-Endian byte order. This option only has an effect when the output file is created or overwritten and not when it is appended to.

    −C

    Suppress the use of ‘‘strip chopping’’ when reading images that have a single strip/tile of uncompressed data.

    −c

    Specify the compression to use for data written to the output file: none for no compression, packbits for PackBits compression, lzw for Lempel-Ziv & Welch compression, jpeg for baseline JPEG compression, zip for Deflate compression, g3 for CCITT Group 3 (T.4) compression, and g4 for CCITT Group 4 (T.6) compression. By default tiffcrop will compress data according to the value of the Compression tag found in the source file.

    The CCITT Group 3 and Group 4 compression algorithms can only be used with bi-level data.

    Group 3 compression can be specified together with several T.4-specific options: 1d for 1-dimensional encoding, 2d for 2-dimensional encoding, and fill to force each encoded scanline to be zero-filled so that the terminating EOL code lies on a byte boundary. Group 3-specific options are specified by appending a ‘‘:’’-separated list to the ‘‘g3’’ option; e.g. −c g3:2d:fill to get 2D-encoded data with byte-aligned EOL codes.

    LZW compression can be specified together with a predictor value. A predictor value of 2 causes each scanline of the output image to undergo horizontal differencing before it is encoded; a value of 1 forces each scanline to be encoded without differencing. LZW-specific options are specified by appending a ‘‘:’’-separated list to the ‘‘lzw’’ option; e.g. −c lzw:2 for LZW compression with horizontal differencing.

    −f

    Specify the bit fill order to use in writing output data. By default, tiffcrop will create a new file with the same fill order as the original. Specifying −f lsb2msb will force data to be written with the FillOrder tag set to LSB2MSB, while −f msb2lsb will force data to be written with the FillOrder tag set to MSB2LSB.

    −i

    Ignore non-fatal read errors and continue processing of the input file.

    −l

    Specify the length of a tile (in pixels). tiffcrop attempts to set the tile dimensions so that no more than 8 kilobytes of data appear in a tile.

    −L

    Force output to be written with Little-Endian byte order. This option only has an effect when the output file is created or overwritten and not when it is appended to.

    −M

    Suppress the use of memory-mapped files when reading images.

    −p

    Specify the planar configuration to use in writing image data that has one 8-bit sample per pixel. By default, tiffcrop will create a new file with the same planar configuration as the original. Specifying −p contig will force data to be written with multi-sample data packed together, while −p separate will force samples to be written in separate planes.

    −r

    Specify the number of rows (scanlines) in each strip of data written to the output file. By default (or when value 0 is specified), tiffcrop attempts to set the rows/strip that no more than 8 kilobytes of data appear in a strip. If you specify special value -1 it will results in infinite number of the rows per strip. The entire image will be the one strip in that case.

    −s

    Force the output file to be written with data organized in strips (rather than tiles).

    −t

    Force the output file to be written with data organized in tiles (rather than strips). options can be used to force the resultant image to be written as strips or tiles of data, respectively.

    −w

    Specify the width of a tile (in pixels). tiffcrop attempts to set the tile dimensions so that no more than 8 kilobytes of data appear in a tile. tiffcrop attempts to set the tile dimensions so that no more than 8 kilobytes of data appear in a tile.

    −,={character}

    substitute {character} for ’,’ in parsing image directory indices in files. This is necessary if filenames contain commas. Note that ’,=’ with whitespace immediately following will disable the special meaning of the ’,’ entirely. See examples.

    EXAMPLES

    The following concatenates two files and writes the result using LZW encoding:

    tiffcrop -c lzw a.tif b.tif result.tif
    

    To convert a G3 1d-encoded TIFF to a single strip of G4-encoded data the following might be used:

    tiffcrop -c g4 -r 10000 g3.tif g4.tif
    

    (1000 is just a number that is larger than the number of rows in the source file.)

    To extract a selected set of images from a multi-image TIFF file use the -N option described above. Thus, to copy the 1st and 3rd images of image file "album.tif" to "result.tif":

    tiffcrop -N 1,3 album.tif result.tif
    

    Given file "CCD.tif" whose first image is a noise bias followed by images which include that bias, subtract the noise from all those images following it (while decompressing) with the command:

    tiffcrop -c none -b CCD.tif CCD.tif -d 2 result.tif
    

    SEE ALSO

    pal2rgb(1), tiffinfo(1), tiffcmp(1), tiffcp(1), tiffmedian(1), tiffsplit(1), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFcolor.3tiff.html0000644000212300117540000005435310640473671014617 00000000000000 COLOR

    COLOR

    NAME
    SYNOPSIS
    DESCRIPTION
    SEE ALSO

    NAME

    TIFFYCbCrToRGBInit, TIFFYCbCrtoRGB, TIFFCIELabToRGBInit, TIFFCIELabToXYZ, TIFFXYZToRGB − color conversion routines.

    SYNOPSIS

    #include <tiffio.h>

    int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB *ycbcr, float *luma, float *refBlackWhite");"
    void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *
    ycbcr, uint32 Y, int32 Cb, int32 Cr, uint32 *R, uint32 *G, uint32 *B );

    int TIFFCIELabToRGBInit(TIFFCIELabToRGB *cielab, TIFFDisplay *display, float *refWhite);
    void TIFFCIELabToXYZ(TIFFCIELabToRGB *
    cielab, uint32 L, int32 a, int32 b, float *X, float *Y, float *Z);
    void TIFFXYZToRGB(TIFFCIELabToRGB *
    cielab, float X, float Y, float Z",uint32*"R, uint32 *G, uint32 *B);

    DESCRIPTION

    TIFF supports several color spaces for images stored in that format. There is usually a problem of application to handle the data properly and convert between different colorspaces for displaying and printing purposes. To simplify this task libtiff implements several color conversion routines itself. In particular, these routines used in TIFFRGBAImage(3TIFF) interface.

    TIFFYCbCrToRGBInit() used to initialize YCbCr to RGB conversion state. Allocating and freeing of the ycbcr structure belongs to programmer. TIFFYCbCrToRGB defined in tiffio.h as

    typedef struct {                /* YCbCr->RGB support */
            TIFFRGBValue* clamptab; /* range clamping table */
    

    int*

    Cr_r_tab;
    int*

    Cb_b_tab;
    int32*

    Cr_g_tab;
    int32*

    Cb_g_tab;

    int32* Y_tab;
    } TIFFYCbCrToRGB;

    luma is a float array of three values representing proportions of the red, green and blue in luminance, Y (see section 21 of the TIFF 6.0 specification, where the YCbCr images discussed). TIFFTAG_YCBCRCOEFFICIENTS holds that values in TIFF file. refBlackWhite is a float array of 6 values which specifies a pair of headroom and footroom image data values (codes) for each image component (see section 20 of the TIFF 6.0 specification where the colorinmetry fields discussed). TIFFTAG_REFERENCEBLACKWHITE is responsible for storing these values in TIFF file. Following code snippet should helps to understand the the technique:

    float *luma, *refBlackWhite;
    uint16 hs, vs;
    
    /* Initialize structures */
    ycbcr = (TIFFYCbCrToRGB*)
    

    _TIFFmalloc(TIFFroundup(sizeof(TIFFYCbCrToRGB), sizeof(long))

    + 4*256*sizeof(TIFFRGBValue)

    + 2*256*sizeof(int)

    + 3*256*sizeof(int32));

    if (ycbcr == NULL) {
    TIFFError("YCbCr->RGB",

    "No space for YCbCr->RGB conversion state");

    exit(0);
    }

    TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRCOEFFICIENTS, &luma);
    TIFFGetFieldDefaulted(tif, TIFFTAG_REFERENCEBLACKWHITE, &refBlackWhite);
    if (TIFFYCbCrToRGBInit(ycbcr, luma, refBlackWhite) < 0)

    exit(0);

    /* Start conversion */
    uint32 r, g, b;
    uint32 Y;
    int32 Cb, Cr;

    for each pixel in image

    TIFFYCbCrtoRGB(img->ycbcr, Y, Cb, Cr, &r, &g, &b);

    /* Free state structure */
    _TIFFfree(ycbcr);

    TIFFCIELabToRGBInit() initializes the CIE L*a*b* 1976 to RGB conversion state. TIFFCIELabToRGB defined as

    #define CIELABTORGB_TABLE_RANGE 1500
    
    

    typedef struct {

    /* CIE Lab 1976->RGB support */

    int

    range;

    /* Size of conversion table */

    float

    rstep, gstep, bstep;

    float

    X0, Y0, Z0;

    /* Reference white point */

    TIFFDisplay display;

    float

    Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */

    float

    Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */

    float

    Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */

    } TIFFCIELabToRGB;

    display is a display device description, declared as

    typedef struct {
    

    float d_mat[3][3]; /* XYZ -> luminance matrix */

    float d_YCR; /* Light o/p for reference white */

    float d_YCG;

    float d_YCB;

    uint32 d_Vrwr; /* Pixel values for ref. white */

    uint32 d_Vrwg;

    uint32 d_Vrwb;

    float d_Y0R; /* Residual light for black pixel */

    float d_Y0G;

    float d_Y0B;

    float d_gammaR; /* Gamma values for the three guns */

    float d_gammaG;

    float d_gammaB;

    } TIFFDisplay;

    For example, the one can use sRGB device, which has the following parameters:

    TIFFDisplay display_sRGB = {
    

    { /* XYZ -> luminance matrix */

    { 3.2410F, -1.5374F, -0.4986F },

    { -0.9692F, 1.8760F, 0.0416F },

    { 0.0556F, -0.2040F, 1.0570F }

    },

    100.0F, 100.0F, 100.0F, /* Light o/p for reference white */

    255, 255, 255, /* Pixel values for ref. white */

    1.0F, 1.0F, 1.0F, /* Residual light o/p for black pixel */

    2.4F, 2.4F, 2.4F, /* Gamma values for the three guns */

    };

    refWhite is a color temperature of the reference white. The TIFFTAG_WHITEPOINT contains the chromaticity of the white point of the image from where the reference white can be calculated using following formulae:

    refWhite_Y = 100.0
    refWhite_X = whitePoint_x / whitePoint_y * refWhite_Y
    refWhite_Z = (1.0 - whitePoint_x - whitePoint_y) / whitePoint_y * refWhite_X

    The conversion itself performed in two steps: at the first one we will convert CIE L*a*b* 1976 to CIE XYZ using TIFFCIELabToXYZ() routine, and at the second step we will convert CIE XYZ to RGB using TIFFXYZToRGB(). Look at the code sample below:

    float   *whitePoint;
    float   refWhite[3];
    
    /* Initialize structures */
    img->cielab = (TIFFCIELabToRGB *)
    

    _TIFFmalloc(sizeof(TIFFCIELabToRGB));

    if (!cielab) {

    TIFFError("CIE L*a*b*->RGB",

    "No space for CIE L*a*b*->RGB conversion state.");

    exit(0);

    }

    TIFFGetFieldDefaulted(tif, TIFFTAG_WHITEPOINT, &whitePoint);
    refWhite[1] = 100.0F;
    refWhite[0] = whitePoint[0] / whitePoint[1] * refWhite[1];
    refWhite[2] = (1.0F - whitePoint[0] - whitePoint[1])

    / whitePoint[1] * refWhite[1];

    if (TIFFCIELabToRGBInit(cielab, &display_sRGB, refWhite) < 0) {

    TIFFError("CIE L*a*b*->RGB",

    "Failed to initialize CIE L*a*b*->RGB conversion state.");

    _TIFFfree(cielab);

    exit(0);

    }

    /* Now we can start to convert */
    uint32 r, g, b;
    uint32 L;
    int32 a, b;
    float X, Y, Z;

    for each pixel in image

    TIFFCIELabToXYZ(cielab, L, a, b, &X, &Y, &Z);

    TIFFXYZToRGB(cielab, X, Y, Z, &r, &g, &b);

    /* Don’t forget to free the state structure */
    _TIFFfree(cielab);

    SEE ALSO

    TIFFRGBAImage(3TIFF) libtiff(3TIFF),

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/Makefile.in0000644000212300117540000004234012027361163013157 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = html/man DIST_COMMON = $(dist_doc_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(docdir)" DATA = $(dist_doc_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = $(LIBTIFF_DOCDIR)/html/man dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ MANSRCDIR = $(top_srcdir)/man HTMLMANDIR = $(top_srcdir)/html/man GROFF = groff -Thtml -mandoc ECHO = echo indexfile = index.html docfiles = \ libtiff.3tiff.html \ TIFFbuffer.3tiff.html \ TIFFClose.3tiff.html \ TIFFcodec.3tiff.html \ TIFFcolor.3tiff.html \ TIFFDataWidth.3tiff.html \ TIFFError.3tiff.html \ TIFFFieldDataType.3tiff.html \ TIFFFieldName.3tiff.html \ TIFFFieldPassCount.3tiff.html \ TIFFFieldReadCount.3tiff.html \ TIFFFieldTag.3tiff.html \ TIFFFieldWriteCount.3tiff.html \ TIFFFlush.3tiff.html \ TIFFGetField.3tiff.html \ TIFFmemory.3tiff.html \ TIFFOpen.3tiff.html \ TIFFPrintDirectory.3tiff.html \ TIFFquery.3tiff.html \ TIFFReadDirectory.3tiff.html \ TIFFReadEncodedStrip.3tiff.html \ TIFFReadEncodedTile.3tiff.html \ TIFFReadRawStrip.3tiff.html \ TIFFReadRawTile.3tiff.html \ TIFFReadRGBAImage.3tiff.html \ TIFFReadRGBAStrip.3tiff.html \ TIFFReadRGBATile.3tiff.html \ TIFFReadScanline.3tiff.html \ TIFFReadTile.3tiff.html \ TIFFRGBAImage.3tiff.html \ TIFFSetDirectory.3tiff.html \ TIFFSetField.3tiff.html \ TIFFsize.3tiff.html \ TIFFstrip.3tiff.html \ TIFFswab.3tiff.html \ TIFFtile.3tiff.html \ TIFFWarning.3tiff.html \ TIFFWriteDirectory.3tiff.html \ TIFFWriteEncodedStrip.3tiff.html \ TIFFWriteEncodedTile.3tiff.html \ TIFFWriteRawStrip.3tiff.html \ TIFFWriteRawTile.3tiff.html \ TIFFWriteScanline.3tiff.html \ TIFFWriteTile.3tiff.html \ bmp2tiff.1.html \ fax2ps.1.html \ fax2tiff.1.html \ gif2tiff.1.html \ pal2rgb.1.html \ ppm2tiff.1.html \ ras2tiff.1.html \ raw2tiff.1.html \ rgb2ycbcr.1.html \ sgi2tiff.1.html \ thumbnail.1.html \ tiff2bw.1.html \ tiff2pdf.1.html \ tiff2ps.1.html \ tiff2rgba.1.html \ tiffcmp.1.html \ tiffcp.1.html \ tiffcrop.1.html \ tiffdither.1.html \ tiffdump.1.html \ tiffgt.1.html \ tiffinfo.1.html \ tiffmedian.1.html \ tiffset.1.html \ tiffsplit.1.html \ tiffsv.1.html dist_doc_DATA = $(indexfile) $(docfiles) INDEXSTART = 'Libtiff HTML manpage index

      Man Pages

      ' INDEXEND = '

    ' manpages = $(docfiles:.html=) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign html/man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign html/man/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_docDATA: $(dist_doc_DATA) @$(NORMAL_INSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-dist_docDATA: @$(NORMAL_UNINSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_docDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_docDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dist_docDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-dist_docDATA .PHONY: index index: ${ECHO} ${INDEXSTART} > $(indexfile) for i in $(docfiles); do \ ${ECHO} '
  • '$$i'' >> $(indexfile); \ done ${ECHO} ${INDEXEND} >> $(indexfile) .PHONY: htmldoc htmldoc: for i in $(manpages); do \ ${GROFF} $(MANSRCDIR)/$$i > $(HTMLMANDIR)/$$i.html; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/html/man/fax2ps.1.html0000644000212300117540000001707510640473672013361 00000000000000 FAX2PS

    FAX2PS

    NAME
    SYNOPSIS
    DESCRIPTION
    OPTIONS
    DIAGNOSTICS
    NOTES
    BUGS
    SEE ALSO

    NAME

    fax2ps − convert a TIFF facsimile to compressed PostScript™

    SYNOPSIS

    fax2ps [ options ] [ file ... ]

    DESCRIPTION

    fax2ps reads one or more TIFF facsimile image files and prints a compressed form of PostScript on the standard output that is suitable for printing.

    By default, each page is scaled to reflect the image dimensions and resolutions stored in the file. The −x and −y options can be used to specify the horizontal and vertical image resolutions (lines/inch), respectively. If the −S option is specified, each page is scaled to fill an output page. The default output page is 8.5 by 11 inches. Alternate page dimensions can be specified in inches with the −W and −H options.

    By default fax2ps generates PostScript for all pages in the file. The −p option can be used to select one or more pages from a multi-page document.

    fax2ps generates a compressed form of PostScript that is optimized for sending pages of text to a PostScript printer attached to a host through a low-speed link (such as a serial line). Each output page is filled with white and then only the black areas are drawn. The PostScript specification of the black drawing operations is optimized by using a special font that encodes the move-draw operations required to fill the black regions on the page. This compression scheme typically results in a substantially reduced PostScript description, relative to the straightforward imaging of the page with a PostScript image operator. This algorithm can, however, be ineffective for continuous-tone and white-on-black images. For these images, it sometimes is more efficient to send the raster bitmap image directly; see tiff2ps(1).

    OPTIONS

    −p number

    Print only the indicated page. Multiple pages may be printed by specifying this option more than once.

    −x resolution

    Use resolution as the horizontal resolution, in dots/inch, of the image data. By default this value is taken from the file.

    −y resolution

    Use resolution as the vertical resolution, in lines/inch, of the image data. By default this value is taken from the file.

    −S

    Scale each page of image data to fill the output page dimensions. By default images are presented according to the dimension information recorded in the TIFF file.

    −W width

    Use width as the width, in inches, of the output page.

    −H height

    Use height as the height, in inches, of the output page.

    DIAGNOSTICS

    Some messages about malformed TIFF images come from the TIFF library.

    Various messages about badly formatted facsimile images may be generated due to transmission errors in received facsimile. fax2ps attempts to recover from such data errors by resynchronizing decoding at the end of the current scanline. This can result in long horizontal black lines in the resultant PostScript image.

    NOTES

    If the destination printer supports PostScript Level II then it is always faster to just send the encoded bitmap generated by the tiff2ps(1) program.

    BUGS

    fax2ps should probably figure out when it is doing a poor job of compressing the output and just generate PostScript to image the bitmap raster instead.

    SEE ALSO

    tiff2ps(1), libtiff(3)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFWriteRawStrip.3tiff.html0000644000212300117540000001063710640473670016263 00000000000000 TIFFWriteRawstrip

    TIFFWriteRawstrip

    NAME
    SYNOPSIS
    DESCRIPTION
    NOTES
    RETURN VALUES
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFWriteRawStrip − write a strip of raw data to an open TIFF file

    SYNOPSIS

    #include <tiffio.h>

    tsize_t TIFFWriteRawStrip(TIFF *tif, tstrip_t strip, tdata_t buf, tsize_t size)

    DESCRIPTION

    Append size bytes of raw data to the specified strip.

    NOTES

    The strip number must be valid according to the current settings of the ImageLength and RowsPerStrip tags. An image may be dynamically grown by increasing the value of ImageLength prior to each call to TIFFWriteRawStrip.

    RETURN VALUES

    −1 is returned if an error occurred. Otherwise, the value of size is returned.

    DIAGNOSTICS

    All error messages are directed to the TIFFError(3TIFF) routine.

    %s: File not open for writing. The file was opened for reading, not writing.

    Can not write scanlines to a tiled image. The image is assumed to be organized in tiles because the TileWidth and TileLength tags have been set with TIFFSetField(3TIFF).

    %s: Must set "ImageWidth" before writing data. The image’s width has not be set before the first write. See TIFFSetField(3TIFF) for information on how to do this.

    %s: Must set "PlanarConfiguration" before writing data. The organization of data has not be defined before the first write. See TIFFSetField(3TIFF) for information on how to do this.

    %s: No space for strip arrays". There was not enough space for the arrays that hold strip offsets and byte counts.

    %s: Strip %d out of range, max %d. The specified strip is not a valid strip according to the currently specified image dimensions.

    SEE ALSO

    TIFFOpen(3TIFF), TIFFWriteEncodedStrip(3TIFF), TIFFWriteScanline(3TIFF), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFRGBAImage.3tiff.html0000644000212300117540000003002610640473665015151 00000000000000 TIFFRGBAImage

    TIFFRGBAImage

    NAME
    SYNOPSIS
    DESCRIPTION
    ALTERNATE RASTER FORMATS
    SIMULTANEOUS RASTER STORE AND DISPLAY
    SUPPORTING ADDITIONAL TIFF FORMATS
    NOTES
    RETURN VALUES
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFRGBAImageOK, TIFFRGBAImageBegin, TIFFRGBAImageGet, TIFFRGBAImageEnd − read and decode an image into a raster

    SYNOPSIS

    #include <tiffio.h>

    typedef unsigned char TIFFRGBValue; typedef struct _TIFFRGBAImage TIFFRGBAImage;

    int TIFFRGBAImageOK(TIFF *tif, char emsg[1024])
    int TIFFRGBAImageBegin(TIFFRGBAImage *
    img, TIFF* tif, int stopOnError, char emsg[1024])
    int TIFFRGBAImageGet(TIFFRGBAImage *
    img, uint32* raster, uint32 width , uint32 height)
    void TIFFRGBAImageEnd(TIFFRGBAImage *
    img)

    DESCRIPTION

    The routines described here provide a high-level interface through which TIFF images may be read into memory. Images may be strip- or tile-based and have a variety of different characteristics: bits/sample, samples/pixel, photometric, etc. Decoding state is encapsulated in a TIFFRGBAImage structure making it possible to capture state for multiple images and quickly switch between them. The target raster format can be customized to a particular application’s needs by installing custom routines that manipulate image data according to application requirements.

    The default usage for these routines is: check if an image can be processed using TIFFRGBAImageOK, construct a decoder state block using TIFFRGBAImageBegin, read and decode an image into a target raster using TIFFRGBAImageGet, and then release resources using TIFFRGBAImageEnd. TIFFRGBAImageGet can be called multiple times to decode an image using different state parameters. If multiple images are to be displayed and there is not enough space for each of the decoded rasters, multiple state blocks can be managed and then calls can be made to TIFFRGBAImageGet as needed to display an image.

    The generated raster is assumed to be an array of width times height 32-bit entries, where width must be less than or equal to the width of the image (height may be any non-zero size). If the raster dimensions are smaller than the image, the image data is cropped to the raster bounds. If the raster height is greater than that of the image, then the image data are placed in the lower part of the raster. (Note that the raster is assume to be organized such that the pixel at location (x,y) is raster[y*width+x]; with the raster origin in the lower-left hand corner.)

    Raster pixels are 8-bit packed red, green, blue, alpha samples. The macros TIFFGetR, TIFFGetG, TIFFGetB, and TIFFGetA should be used to access individual samples. Images without Associated Alpha matting information have a constant Alpha of 1.0 (255).

    TIFFRGBAImageGet converts non-8-bit images by scaling sample values. Palette, grayscale, bilevel, CMYK , and YCbCr images are converted to RGB transparently. Raster pixels are returned uncorrected by any colorimetry information present in the directory.

    The parameter stopOnError specifies how to act if an error is encountered while reading the image. If stopOnError is non-zero, then an error will terminate the operation; otherwise TIFFRGBAImageGet will continue processing data until all the possible data in the image have been requested.

    ALTERNATE RASTER FORMATS

    To use the core support for reading and processing TIFF images, but write the resulting raster data in a different format one need only override the ‘‘put methods’’ used to store raster data. These methods are are defined in the TIFFRGBAImage structure and initially setup by TIFFRGBAImageBegin to point to routines that pack raster data in the default ABGR pixel format. Two different routines are used according to the physical organization of the image data in the file: PlanarConfiguration=1 (packed samples), and PlanarConfiguration=2 (separated samples). Note that this mechanism can be used to transform the data before storing it in the raster. For example one can convert data to colormap indices for display on a colormap display.

    SIMULTANEOUS RASTER STORE AND DISPLAY

    It is simple to display an image as it is being read into memory by overriding the put methods as described above for supporting alternate raster formats. Simply keep a reference to the default put methods setup by TIFFRGBAImageBegin and then invoke them before or after each display operation. For example, the tiffgt(1) utility uses the following put method to update the display as the raster is being filled:

    static void
    putContigAndDraw(TIFFRGBAImage* img, uint32* raster,
        uint32 x, uint32 y, uint32 w, uint32 h,
        int32 fromskew, int32 toskew,
        unsigned char* cp)
    {
        (*putContig)(img, raster, x, y, w, h, fromskew, toskew, cp);
        if (x+w == width) {
         w = width;
         if (img->orientation == ORIENTATION_TOPLEFT)
             lrectwrite(0, y-(h-1), w-1, y, raster-x-(h-1)*w);
         else
             lrectwrite(0, y, w-1, y+h-1, raster);
        }
    }
    

    (the original routine provided by the library is saved in the variable putContig.)

    SUPPORTING ADDITIONAL TIFF FORMATS

    The TIFFRGBAImage routines support the most commonly encountered flavors of TIFF. It is possible to extend this support by overriding the ‘‘get method’’ invoked by TIFFRGBAImageGet to read TIFF image data. Details of doing this are a bit involved, it is best to make a copy of an existing get method and modify it to suit the needs of an application.

    NOTES

    Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be either 1, 3, or 4 (i.e. SamplesPerPixel minus ExtraSamples).

    Palette image colormaps that appear to be incorrectly written as 8-bit values are automatically scaled to 16-bits.

    RETURN VALUES

    All routines return 1 if the operation was successful. Otherwise, 0 is returned if an error was encountered and stopOnError is zero.

    DIAGNOSTICS

    All error messages are directed to the TIFFError(3TIFF) routine.

    Sorry, can not handle %d-bit pictures. The image had BitsPerSample other than 1, 2, 4, 8, or 16.

    Sorry, can not handle %d-channel images. The image had SamplesPerPixel other than 1, 3, or 4.

    Missing needed "PhotometricInterpretation" tag. The image did not have a tag that describes how to display the data.

    No "PhotometricInterpretation" tag, assuming RGB. The image was missing a tag that describes how to display it, but because it has 3 or 4 samples/pixel, it is assumed to be RGB.

    No "PhotometricInterpretation" tag, assuming min-is-black. The image was missing a tag that describes how to display it, but because it has 1 sample/pixel, it is assumed to be a grayscale or bilevel image.

    No space for photometric conversion table. There was insufficient memory for a table used to convert image samples to 8-bit RGB.

    Missing required "Colormap" tag. A Palette image did not have a required Colormap tag.

    No space for tile buffer. There was insufficient memory to allocate an i/o buffer.

    No space for strip buffer. There was insufficient memory to allocate an i/o buffer.

    Can not handle format. The image has a format (combination of BitsPerSample, SamplesPerPixel, and PhotometricInterpretation) that can not be handled.

    No space for B&W mapping table. There was insufficient memory to allocate a table used to map grayscale data to RGB.

    No space for Palette mapping table. There was insufficient memory to allocate a table used to map data to 8-bit RGB.

    SEE ALSO

    TIFFOpen(3TIFF), TIFFReadRGBAImage(3TIFF), TIFFReadRGBAImageOriented(3TIFF), TIFFReadRGBAStrip(3TIFF), TIFFReadRGBATile(3TIFF), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFFlush.3tiff.html0000644000212300117540000000642110640473665014556 00000000000000 TIFFFlush

    TIFFFlush

    NAME
    SYNOPSIS
    DESCRIPTION
    RETURN VALUES
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFFlush, TIFFFlushData − flush pending writes to an open TIFF file

    SYNOPSIS

    #include <tiffio.h>

    int TIFFFlush(TIFF *tif)
    int TIFFFlushData(TIFF *
    tif)

    DESCRIPTION

    TIFFFlush causes any pending writes for the specified file (including writes for the current directory) to be done. In normal operation this call is never needed − the library automatically does any flushing required.

    TIFFFlushData flushes any pending image data for the specified file to be written out; directory-related data are not flushed. In normal operation this call is never needed − the library automatically does any flushing required.

    RETURN VALUES

    0 is returned if an error is encountered, otherwise 1 is returned.

    DIAGNOSTICS

    All error messages are directed to the TIFFError(3TIFF) routine.

    SEE ALSO

    TIFFOpen(3TIFF), TIFFWriteEncodedStrip(3TIFF), TIFFWriteEncodedTile(3TIFF), TIFFWriteRawStrip(3TIFF), TIFFWriteRawTile(3TIFF), TIFFWriteScanline(3TIFF), TIFFWriteTile(3TIFF) libtiff(3TIFF),

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/tiffinfo.1.html0000644000212300117540000001054610640473675013761 00000000000000 TIFFINFO

    TIFFINFO

    NAME
    SYNOPSIS
    DESCRIPTION
    OPTIONS
    SEE ALSO

    NAME

    tiffinfo − print information about TIFF files

    SYNOPSIS

    tiffinfo [ options ] input.tif ...

    DESCRIPTION

    Tiffinfo displays information about files created according to the Tag Image File Format, Revision 6.0. By default, the contents of each TIFF directory in each file is displayed, with the value of each tag shown symbolically (where sensible).

    OPTIONS

    −c

    Display the colormap and color/gray response curves, if present.

    −D

    In addition to displaying the directory tags, read and decompress all the data in each image (but not display it).

    −d

    In addition to displaying the directory tags, print each byte of decompressed data in hexadecimal.

    −j

    Display any JPEG -related tags that are present.

    −o

    Set the initial TIFF directory according to the specified file offset. The file offset may be specified using the usual C-style syntax; i.e. a leading ‘‘0x’’ for hexadecimal and a leading ‘‘0’’ for octal.

    −s

    Display the offsets and byte counts for each data strip in a directory.

    −z

    Enable strip chopping when reading image data.

    −#

    Set the initial TIFF directory to #.

    SEE ALSO

    pal2rgb(1), tiffcp(1), tiffcmp(1), tiffmedian(1), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFWarning.3tiff.html0000644000212300117540000000643111763656232015103 00000000000000 TIFFWarning

    TIFFWarning

    NAME
    SYNOPSIS
    DESCRIPTION
    RETURN VALUES
    SEE ALSO

    NAME

    TIFFWarning, TIFFSetWarningHandler − library warning interface

    SYNOPSIS

    #include <tiffio.h>

    void TIFFWarning(const char *module, const char *fmt, ...)

    #include <stdarg.h>

    typedef void (*TIFFWarningHandler)(const char *module, const char *fmt, va_list ap);

    TIFFWarningHandler TIFFSetWarningHandler(TIFFWarningHandler handler);

    DESCRIPTION

    TIFFWarning invokes the library-wide warning handler function to (normally) write a warning message to the stderr. The fmt parameter is a printf(3S) format string, and any number arguments can be supplied. The module parameter is interpreted as a string that, if non-zero, should be printed before the message; it typically is used to identify the software module in which a warning is detected.

    Applications that desire to capture control in the event of a warning should use TIFFSetWarningHandler to override the default warning handler. A NULL (0) warning handler function may be installed to suppress error messages.

    RETURN VALUES

    TIFFSetWarningHandler returns a reference to the previous error handling function.

    SEE ALSO

    TIFFError(3TIFF), libtiff(3TIFF), printf(3)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFPrintDirectory.3tiff.html0000644000212300117540000001117510640473665016460 00000000000000 TIFFPrintDirectory

    TIFFPrintDirectory

    NAME
    SYNOPSIS
    DESCRIPTION
    NOTES
    RETURN VALUES
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFPrintDirectory − print a description of a TIFF directory

    SYNOPSIS

    #include <tiffio.h>

    void TIFFPrintDirectory(TIFF *tif, FILE *fd, long flags)

    DESCRIPTION

    TIFFPrintDirectory prints a description of the current directory in the specified TIFF file to the standard I/O output stream fd. The flags parameter is used to control the level of detail of the printed information; it is a bit-or of the flags defined in tiffio.h:

    #define TIFFPRINT_NONE 0x0 /* no extra info */

    #define

    TIFFPRINT_STRIPS

    0x1

    /* strips/tiles info */

    #define

    TIFFPRINT_CURVES

    0x2

    /* color/gray response curves */

    #define

    TIFFPRINT_COLORMAP

    0x4

    /* colormap */

    #define

    TIFFPRINT_JPEGQTABLES

    0x100

    /* JPEG Q matrices */

    #define

    TIFFPRINT_JPEGACTABLES

    0x200

    /* JPEG AC tables */

    #define

    TIFFPRINT_JPEGDCTABLES

    0x200

    /* JPEG DC tables */

    NOTES

    In C++ the flags parameter defaults to 0.

    RETURN VALUES

    None.

    DIAGNOSTICS

    None.

    SEE ALSO

    libtiff(3TIFF), TIFFOpen(3TIFF), TIFFReadDirectory(3TIFF), TIFFSetDirectory(3TIFF)


    tiff-4.0.3/html/man/TIFFbuffer.3tiff.html0000644000212300117540000000745010640473671014746 00000000000000 TIFFBUFFER

    TIFFBUFFER

    NAME
    SYNOPSIS
    DESCRIPTION
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFReadBufferSetup, TIFFWriteBufferSetup − I/O buffering control routines

    SYNOPSIS

    #include <tiffio.h>
    
    int TIFFReadBufferSetup(TIFF *tif, tdata_t buffer, tsize_t size);
    int TIFFWriteBufferSetup(TIFF *tif, tdata_t buffer, tsize_t size);
    

    DESCRIPTION

    The following routines are provided for client-control of the I/O buffers used by the library. Applications need never use these routines; they are provided only for ‘‘intelligent clients’’ that wish to optimize memory usage and/or eliminate potential copy operations that can occur when working with images that have data stored without compression.

    TIFFReadBufferSetup sets up the data buffer used to read raw (encoded) data from a file. If the specified pointer is NULL (zero), then a buffer of the appropriate size is allocated. Otherwise the caller must guarantee that the buffer is large enough to hold any individual strip of raw data. TIFFReadBufferSetup returns a non-zero value if the setup was successful and zero otherwise.

    TIFFWriteBufferSetup sets up the data buffer used to write raw (encoded) data to a file. If the specified size is −1 then the buffer size is selected to hold a complete tile or strip, or at least 8 kilobytes, whichever is greater. If the specified buffer is NULL (zero), then a buffer of the appropriate size is dynamically allocated. TIFFWriteBufferSetup returns a non-zero value if the setup was successful and zero otherwise.

    DIAGNOSTICS

    %s: No space for data buffer at scanline %ld. TIFFReadBufferSetup was unable to dynamically allocate space for a data buffer.

    %s: No space for output buffer. TIFFWriteBufferSetup was unable to dynamically allocate space for a data buffer.

    SEE ALSO

    libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/tiffcmp.1.html0000644000212300117540000001046110640473674013600 00000000000000 TIFFCMP

    TIFFCMP

    NAME
    SYNOPSIS
    DESCRIPTION
    OPTIONS
    BUGS
    SEE ALSO

    NAME

    tiffcmp − compare two TIFF files

    SYNOPSIS

    tiffcmp [ options ] file1.tif file2.tif

    DESCRIPTION

    Tiffcmp compares the tags and data in two files created according to the Tagged Image File Format, Revision 6.0. The schemes used for compressing data in each file are immaterial when data are compared−data are compared on a scanline-by-scanline basis after decompression. Most directory tags are checked; notable exceptions are: GrayResponseCurve, ColorResponseCurve, and ColorMap tags. Data will not be compared if any of the BitsPerSample, SamplesPerPixel, or ImageWidth values are not equal. By default, tiffcmp will terminate if it encounters any difference.

    OPTIONS

    −l

    List each byte of image data that differs between the files.

    −z number

    List specified number of image data bytes that differs between the files.

    −t

    Ignore any differences in directory tags.

    BUGS

    Tags that are not recognized by the library are not compared; they may also generate spurious diagnostics.

    The image data of tiled files is not compared, since the TIFFReadScanline() function is used. An error will be reported for tiled files.

    The pixel and/or sample number reported in differences may be off in some exotic cases.

    SEE ALSO

    pal2rgb(1), tiffcp(1), tiffmedian(1), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFWriteEncodedStrip.3tiff.html0000644000212300117540000001174510640473670017074 00000000000000 TIFFWriteEncodedStrip

    TIFFWriteEncodedStrip

    NAME
    SYNOPSIS
    DESCRIPTION
    NOTES
    RETURN VALUES
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFWritedEncodedStrip − compress and write a strip of data to an open TIFF file

    SYNOPSIS

    #include <tiffio.h>

    tsize_t TIFFWriteEncodedStrip(TIFF *tif, tstrip_t strip, tdata_t buf, tsize_t size)

    DESCRIPTION

    Compress size bytes of raw data from buf and write the result to the specified strip; replacing any previously written data. Note that the value of strip is a ‘‘raw strip number.’’ That is, the caller must take into account whether or not the data are organized in separate planes (PlanarConfiguration=2).

    NOTES

    The library writes encoded data using the native machine byte order. Correctly implemented TIFF readers are expected to do any necessary byte-swapping to correctly process image data with BitsPerSample greater than 8.

    The strip number must be valid according to the current settings of the ImageLength and RowsPerStrip tags. An image may be dynamically grown by increasing the value of ImageLength prior to each call to TIFFWriteEncodedStrip.

    RETURN VALUES

    −1 is returned if an error was encountered. Otherwise, the value of size is returned.

    DIAGNOSTICS

    All error messages are directed to the TIFFError(3TIFF) routine.

    %s: File not open for writing. The file was opened for reading, not writing.

    Can not write scanlines to a tiled image. The image is assumed to be organized in tiles because the TileWidth and TileLength tags have been set with TIFFSetField(3TIFF).

    %s: Must set "ImageWidth" before writing data. The image’s width has not be set before the first write. See TIFFSetField(3TIFF) for information on how to do this.

    %s: Must set "PlanarConfiguration" before writing data. The organization of data has not be defined before the first write. See TIFFSetField(3TIFF) for information on how to do this.

    %s: No space for strip arrays". There was not enough space for the arrays that hold strip offsets and byte counts.

    SEE ALSO

    TIFFOpen(3TIFF), TIFFWriteScanline(3TIFF), TIFFWriteRawStrip(3TIFF), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFWriteEncodedTile.3tiff.html0000644000212300117540000001143610640473670016665 00000000000000 TIFFWriteEncodedTile

    TIFFWriteEncodedTile

    NAME
    SYNOPSIS
    DESCRIPTION
    NOTES
    RETURN VALUES
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFWritedEncodedTile − compress and write a tile of data to an open TIFF file

    SYNOPSIS

    #include <tiffio.h>

    tsize_t TIFFWriteEncodedTile(TIFF *tif, ttile_t tile, tdata_t buf, tsize_t size)

    DESCRIPTION

    Compress size bytes of raw data from buf and append the result to the end of the specified tile. Note that the value of tile is a ‘‘raw tile number.’’ That is, the caller must take into account whether or not the data are organized in separate places (PlanarConfiguration=2). TIFFComputeTile automatically does this when converting an (x,y,z,sample) coordinate quadruple to a tile number.

    NOTES

    The library writes encoded data using the native machine byte order. Correctly implemented TIFF readers are expected to do any necessary byte-swapping to correctly process image data with BitsPerSample greater than 8.

    RETURN VALUES

    −1 is returned if an error was encountered. Otherwise, the value of size is returned.

    DIAGNOSTICS

    All error messages are directed to the TIFFError(3TIFF) routine.

    %s: File not open for writing. The file was opened for reading, not writing.

    Can not write tiles to a stripped image. The image is assumed to be organized in strips because neither of the TileWidth or TileLength tags have been set with TIFFSetField(3TIFF).

    %s: Must set "ImageWidth" before writing data. The image’s width has not be set before the first write. See TIFFSetField(3TIFF) for information on how to do this.

    %s: Must set "PlanarConfiguration" before writing data. The organization of data has not be defined before the first write. See TIFFSetField(3TIFF) for information on how to do this.

    %s: No space for tile arrays". There was not enough space for the arrays that hold tile offsets and byte counts.

    SEE ALSO

    TIFFOpen(3TIFF), TIFFWriteTile(3TIFF), TIFFWriteRawTile(3TIFF), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFtile.3tiff.html0000644000212300117540000001162610640473672014433 00000000000000 TIFFTILE

    TIFFTILE

    NAME
    SYNOPSIS
    DESCRIPTION
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFTileSize, TIFFTileRowSize, TIFFVTileSize, TIFFDefaultTileSize, TIFFComputeTile, TIFFCheckTile, TIFFNumberOfTiles − tile-related utility routines

    SYNOPSIS

    #include <tiffio.h>

    void TIFFDefaultTileSize(TIFF *tif, uint32 *tw, uint32 *th)
    tsize_t TIFFTileSize(TIFF *
    tif)
    tsize_t TIFFTileRowSize(TIFF *
    tif)
    tsize_t TIFFVTileSize(TIFF *
    tif, uint32 nrows)
    ttile_t TIFFComputeTile(TIFF *
    tif, uint32 x, uint32 y, uint32 z, tsample_t sample)
    int TIFFCheckTile(TIFF *
    tif, uint32 x, uint32 y, uint32 z, tsample_t sample)
    ttile_t TIFFNumberOfTiles(TIFF *
    tif)

    DESCRIPTION

    TIFFDefaultTileSize returns the pixel width and height of a reasonable-sized tile; suitable for setting up the TileWidth and TileLength tags. If the tw and th values passed in are non-zero, then they are adjusted to reflect any compression-specific requirements. The returned width and height are constrained to be a multiple of 16 pixels to conform with the TIFF specification.

    TIFFTileSize returns the equivalent size for a tile of data as it would be returned in a call to TIFFReadTile or as it would be expected in a call to TIFFWriteTile.

    TIFFVTileSize returns the number of bytes in a row-aligned tile with nrows of data.

    TIFFTileRowSize returns the number of bytes of a row of data in a tile.

    TIFFComputeTile returns the tile that contains the specified coordinates. A valid tile is always returned; out-of-range coordinate values are clamped to the bounds of the image. The x and y parameters are always used in calculating a tile. The z parameter is used if the image is deeper than 1 slice (ImageDepth>1). The sample parameter is used only if data are organized in separate planes (PlanarConfiguration=2).

    TIFFCheckTile returns a non-zero value if the supplied coordinates are within the bounds of the image and zero otherwise. The x parameter is checked against the value of the ImageWidth tag. The y parameter is checked against the value of the ImageLength tag. The z parameter is checked against the value of the ImageDepth tag (if defined). The sample parameter is checked against the value of the SamplesPerPixel parameter if the data are organized in separate planes.

    TIFFNumberOfTiles returns the number of tiles in the image.

    DIAGNOSTICS

    None.

    SEE ALSO

    TIFFReadEncodedTile(3TIFF), TIFFReadRawTile(3TIFF), TIFFReadTile(3TIFF), TIFFWriteEncodedTile(3TIFF), TIFFWriteRawTile(3TIFF), TIFFWriteTile(3TIFF), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/TIFFClose.3tiff.html0000644000212300117540000000465710640473664014552 00000000000000 TIFFClose

    TIFFClose

    NAME
    SYNOPSIS
    DESCRIPTION
    DIAGNOSTICS
    SEE ALSO

    NAME

    TIFFClose − close a previously opened TIFF file

    SYNOPSIS

    #include <tiffio.h>

    void TIFFClose(TIFF *tif)

    DESCRIPTION

    TIFFClose closes a file that was previously opened with TIFFOpen(3TIFF). Any buffered data are flushed to the file, including the contents of the current directory (if modified); and all resources are reclaimed.

    DIAGNOSTICS

    All error messages are directed to the routine. Likewise, warning messages are directed to the TIFFWarning(3TIFF) routine.

    SEE ALSO

    libtiff(3TIFF), TIFFOpen(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/man/index.html0000644000212300117540000000731610573703017013115 00000000000000Libtiff HTML manpage index tiff-4.0.3/html/man/tiffset.1.html0000644000212300117540000001147010640473676013617 00000000000000 TIFFSET

    TIFFSET

    NAME
    SYNOPSIS
    DESCRIPTION
    OPTIONS
    EXAMPLES
    SEE ALSO

    NAME

    tiffset − set a field in a TIFF header

    SYNOPSIS

    tiffset [ options ] filename.tif

    DESCRIPTION

    Tiffset sets the value of a TIFF header to a specified value.

    OPTIONS

    −s tagnumber [ count ] value ...

    Set the value of the named tag to the value or values specified.

    −sf tagnumber filename

    Set the value of the tag to the contents of filename. This option is supported for ASCII tags only.

    EXAMPLES

    The following example sets the image description tag (270) of a.tif to the contents of the file descrip:

    tiffset −sf 270 descrip a.tif
    

    The following example sets the artist tag (315) of a.tif to the string ‘‘Anonymous’’:

    tiffset −s 305 Anonymous a.tif
    

    This example sets the resolution of the file a.tif to 300 dpi:

    tiffset −s 296 2 a.tif
    tiffset −s 282 300.0 a.tif
    tiffset −s 283 300.0 a.tif
    

    SEE ALSO

    tiffdump(1), tiffinfo(1), tiffcp(1), libtiff(3TIFF)

    Libtiff library home page: http://www.remotesensing.org/libtiff/


    tiff-4.0.3/html/internals.html0000644000212300117540000004544410120457562013235 00000000000000 Modifying The TIFF Library

    Modifying The TIFF Library

    This chapter provides information about the internal structure of the library, how to control the configuration when building it, and how to add new support to the library. The following sections are found in this chapter:


    Library Configuration

    Information on compiling the library is given elsewhere in this documentation. This section describes the low-level mechanisms used to control the optional parts of the library that are configured at build time. Control is based on a collection of C defines that are specified either on the compiler command line or in a configuration file such as port.h (as generated by the configure script for UNIX systems) or tiffconf.h.

    Configuration defines are split into three areas:

    • those that control which compression schemes are configured as part of the builtin codecs,
    • those that control support for groups of tags that are considered optional, and
    • those that control operating system or machine-specific support.

    If the define COMPRESSION_SUPPORT is not defined then a default set of compression schemes is automatically configured:

    • CCITT Group 3 and 4 algorithms (compression codes 2, 3, 4, and 32771),
    • the Macintosh PackBits algorithm (compression 32773),
    • a 4-bit run-length encoding scheme from ThunderScan (compression 32809),
    • a 2-bit encoding scheme used by NeXT (compression 32766), and
    • two experimental schemes intended for images with high dynamic range (compression 34676 and 34677).

    To override the default compression behaviour define COMPRESSION_SUPPORT and then one or more additional defines to enable configuration of the appropriate codecs (see the table below); e.g.

      #define	COMPRESSION_SUPPORT
      #define	CCITT_SUPPORT
      #define	PACKBITS_SUPPORT
      
    Several other compression schemes are configured separately from the default set because they depend on ancillary software packages that are not distributed with libtiff.

    Support for JPEG compression is controlled by JPEG_SUPPORT. The JPEG codec that comes with libtiff is designed for use with release 5 or later of the Independent JPEG Group's freely available software distribution. This software can be retrieved from the directory ftp.uu.net:/graphics/jpeg/.

    NOTE: Enabling JPEG support automatically enables support for the TIFF 6.0 colorimetry and YCbCr-related tags.

    Experimental support for the deflate algorithm is controlled by DEFLATE_SUPPORT. The deflate codec that comes with libtiff is designed for use with version 0.99 or later of the freely available libz library written by Jean-loup Gailly and Mark Adler. The data format used by this library is described in the files zlib-3.1.doc, and deflate-1.1.doc, available in the directory ftp.uu.net:/pub/archiving/zip/doc. The library can be retried from the directory ftp.uu.net:/pub/archiving/zip/zlib/ (or try quest.jpl.nasa.gov:/beta/zlib/).

    NOTE: The deflate algorithm is experimental. Do not expect to exchange files using this compression scheme; it is included only because the similar, and more common, LZW algorithm is claimed to be governed by licensing restrictions.

    By default tiffconf.h defines COLORIMETRY_SUPPORT, YCBCR_SUPPORT, and CMYK_SUPPORT.

    DefineDescription
    CCITT_SUPPORT CCITT Group 3 and 4 algorithms (compression codes 2, 3, 4, and 32771)
    PACKBITS_SUPPORT Macintosh PackBits algorithm (compression 32773)
    LZW_SUPPORT Lempel-Ziv & Welch (LZW) algorithm (compression 5)
    THUNDER_SUPPORT 4-bit run-length encoding scheme from ThunderScan (compression 32809)
    NEXT_SUPPORT 2-bit encoding scheme used by NeXT (compression 32766)
    OJPEG_SUPPORT obsolete JPEG scheme defined in the 6.0 spec (compression 6)
    JPEG_SUPPORT current JPEG scheme defined in TTN2 (compression 7)
    ZIP_SUPPORT experimental Deflate scheme (compression 32946)
    PIXARLOG_SUPPORT Pixar's compression scheme for high-resolution color images (compression 32909)
    SGILOG_SUPPORT SGI's compression scheme for high-resolution color images (compression 34676 and 34677)
    COLORIMETRY_SUPPORT support for the TIFF 6.0 colorimetry tags
    YCBCR_SUPPORT support for the TIFF 6.0 YCbCr-related tags
    CMYK_SUPPORT support for the TIFF 6.0 CMYK-related tags
    ICC_SUPPORT support for the ICC Profile tag; see The ICC Profile Format Specification, Annex B.3 "Embedding ICC Profiles in TIFF Files"; available at http://www.color.org


    General Portability Comments

    This software is developed on Silicon Graphics UNIX systems (big-endian, MIPS CPU, 32-bit ints, IEEE floating point). The configure shell script generates the appropriate include files and make files for UNIX systems. Makefiles exist for non-UNIX platforms that the code runs on -- this work has mostly been done by other people.

    In general, the code is guaranteed to work only on SGI machines. In practice it is highly portable to any 32-bit or 64-bit system and much work has been done to insure portability to 16-bit systems. If you encounter portability problems please return fixes so that future distributions can be improved.

    The software is written to assume an ANSI C compilation environment. If your compiler does not support ANSI function prototypes, const, and <stdarg.h> then you will have to make modifications to the software. In the past I have tried to support compilers without const and systems without <stdarg.h>, but I am no longer interested in these antiquated environments. With the general availability of the freely available GCC compiler, I see no reason to incorporate modifications to the software for these purposes.

    An effort has been made to isolate as many of the operating system-dependencies as possible in two files: tiffcomp.h and libtiff/tif_<os>.c. The latter file contains operating system-specific routines to do I/O and I/O-related operations. The UNIX (tif_unix.c), Macintosh (tif_apple.c), and VMS (tif_vms.c) code has had the most use; the MS/DOS support (tif_msdos.c) assumes some level of UNIX system call emulation (i.e. open, read, write, fstat, malloc, free).

    Native CPU byte order is determined on the fly by the library and does not need to be specified. The HOST_FILLORDER and HOST_BIGENDIAN definitions are not currently used, but may be employed by codecs for optimization purposes.

    The following defines control general portability:

    BSDTYPES Define this if your system does NOT define the usual BSD typedefs: u_char, u_short, u_int, u_long.
    HAVE_IEEEFP Define this as 0 or 1 according to the floating point format suported by the machine. If your machine does not support IEEE floating point then you will need to add support to tif_machdep.c to convert between the native format and IEEE format.
    HAVE_MMAP Define this if there is mmap-style support for mapping files into memory (used only to read data).
    HOST_FILLORDER Define the native CPU bit order: one of FILLORDER_MSB2LSB or FILLORDER_LSB2MSB
    HOST_BIGENDIAN Define the native CPU byte order: 1 if big-endian (Motorola) or 0 if little-endian (Intel); this may be used in codecs to optimize code

    On UNIX systems HAVE_MMAP is defined through the running of the configure script; otherwise support for memory-mapped files is disabled. Note that tiffcomp.h defines HAVE_IEEEFP to be 1 (BSDTYPES is not defined).


    Types and Portability

    The software makes extensive use of C typedefs to promote portability. Two sets of typedefs are used, one for communication with clients of the library and one for internal data structures and parsing of the TIFF format. There are interactions between these two to be careful of, but for the most part you should be able to deal with portability purely by fiddling with the following machine-dependent typedefs:

    uint8 8-bit unsigned integer tiff.h
    int8 8-bit signed integer tiff.h
    uint16 16-bit unsigned integer tiff.h
    int16 16-bit signed integer tiff.h
    uint32 32-bit unsigned integer tiff.h
    int32 32-bit signed integer tiff.h
    dblparam_t promoted type for floats tiffcomp.h

    (to clarify dblparam_t, it is the type that float parameters are promoted to when passed by value in a function call.)

    The following typedefs are used throughout the library and interfaces to refer to certain objects whose size is dependent on the TIFF image structure:

    typedef unsigned int ttag_t; directory tag
    typedef uint16 tdir_t; directory index
    typedef uint16 tsample_t; sample number
    typedef uint32 tstrip_t; strip number
    typedef uint32 ttile_t; tile number
    typedef int32 tsize_t; i/o size in bytes
    typedef void* tdata_t; image data ref
    typedef void* thandle_t; client data handle
    typedef int32 toff_t; file offset (should be off_t)
    typedef unsigned char* tidata_t; internal image data

    Note that tstrip_t, ttile_t, and tsize_t are constrained to be no more than 32-bit quantities by 32-bit fields they are stored in in the TIFF image. Likewise tsample_t is limited by the 16-bit field used to store the SamplesPerPixel tag. tdir_t constrains the maximum number of IFDs that may appear in an image and may be an arbitrary size (without penalty). ttag_t must be either int, unsigned int, pointer, or double because the library uses a varargs interface and ANSI C restricts the type of the parameter before an ellipsis to be a promoted type. toff_t is defined as int32 because TIFF file offsets are (unsigned) 32-bit quantities. A signed value is used because some interfaces return -1 on error (sigh). Finally, note that tidata_t is used internally to the library to manipulate internal data. User-specified data references are passed as opaque handles and only cast at the lowest layers where their type is presumed.


    General Comments

    The library is designed to hide as much of the details of TIFF from applications as possible. In particular, TIFF directories are read in their entirety into an internal format. Only the tags known by the library are available to a user and certain tag data may be maintained that a user does not care about (e.g. transfer function tables).


    Adding New Builtin Codecs

    To add builtin support for a new compression algorithm, you can either use the "tag-extension" trick to override the handling of the TIFF Compression tag (see Adding New Tags), or do the following to add support directly to the core library:
    1. Define the tag value in tiff.h.
    2. Edit the file tif_codec.c to add an entry to the _TIFFBuiltinCODECS array (see how other algorithms are handled).
    3. Add the appropriate function prototype declaration to tiffiop.h (close to the bottom).
    4. Create a file with the compression scheme code, by convention files are named tif_*.c (except perhaps on some systems where the tif_ prefix pushes some filenames over 14 chars.
    5. Edit Makefile.in (and any other Makefiles) to include the new source file.

    A codec, say foo, can have many different entry points:

    TIFFInitfoo(tif, scheme)/* initialize scheme and setup entry points in tif */
    fooSetupDecode(tif)	/* called once per IFD after tags has been frozen */
    fooPreDecode(tif, sample)/* called once per strip/tile, after data is read,
    			    but before the first row is decoded */
    fooDecode*(tif, bp, cc, sample)/* decode cc bytes of data into the buffer */
        fooDecodeRow(...)	/* called to decode a single scanline */
        fooDecodeStrip(...)	/* called to decode an entire strip */
        fooDecodeTile(...)	/* called to decode an entire tile */
    fooSetupEncode(tif)	/* called once per IFD after tags has been frozen */
    fooPreEncode(tif, sample)/* called once per strip/tile, before the first row in
    			    a strip/tile is encoded */
    fooEncode*(tif, bp, cc, sample)/* encode cc bytes of user data (bp) */
        fooEncodeRow(...)	/* called to decode a single scanline */
        fooEncodeStrip(...)	/* called to decode an entire strip */
        fooEncodeTile(...)	/* called to decode an entire tile */
    fooPostEncode(tif)	/* called once per strip/tile, just before data is written */
    fooSeek(tif, row)	/* seek forwards row scanlines from the beginning
    			   of a strip (row will always be >0 and <rows/strip */
    fooCleanup(tif)		/* called when compression scheme is replaced by user */
    

    Note that the encoding and decoding variants are only needed when a compression algorithm is dependent on the structure of the data. For example, Group 3 2D encoding and decoding maintains a reference scanline. The sample parameter identifies which sample is to be encoded or decoded if the image is organized with PlanarConfig=2 (separate planes). This is important for algorithms such as JPEG. If PlanarConfig=1 (interleaved), then sample will always be 0.


    Other Comments

    The library handles most I/O buffering. There are two data buffers when decoding data: a raw data buffer that holds all the data in a strip, and a user-supplied scanline buffer that compression schemes place decoded data into. When encoding data the data in the user-supplied scanline buffer is encoded into the raw data buffer (from where it is written). Decoding routines should never have to explicitly read data -- a full strip/tile's worth of raw data is read and scanlines never cross strip boundaries. Encoding routines must be cognizant of the raw data buffer size and call TIFFFlushData1() when necessary. Note that any pending data is automatically flushed when a new strip/tile is started, so there's no need do that in the tif_postencode routine (if one exists). Bit order is automatically handled by the library when a raw strip or tile is filled. If the decoded samples are interpreted by the decoding routine before they are passed back to the user, then the decoding logic must handle byte-swapping by overriding the tif_postdecode routine (set it to TIFFNoPostDecode) and doing the required work internally. For an example of doing this look at the horizontal differencing code in the routines in tif_predict.c.

    The variables tif_rawcc, tif_rawdata, and tif_rawcp in a TIFF structure are associated with the raw data buffer. tif_rawcc must be non-zero for the library to automatically flush data. The variable tif_scanlinesize is the size a user's scanline buffer should be. The variable tif_tilesize is the size of a tile for tiled images. This should not normally be used by compression routines, except where it relates to the compression algorithm. That is, the cc parameter to the tif_decode* and tif_encode* routines should be used in terminating decompression/compression. This ensures these routines can be used, for example, to decode/encode entire strips of data.

    In general, if you have a new compression algorithm to add, work from the code for an existing routine. In particular, tif_dumpmode.c has the trivial code for the "nil" compression scheme, tif_packbits.c is a simple byte-oriented scheme that has to watch out for buffer boundaries, and tif_lzw.c has the LZW scheme that has the most complexity -- it tracks the buffer boundary at a bit level. Of course, using a private compression scheme (or private tags) limits the portability of your TIFF files.


    Last updated: $Date: 2004/09/10 14:47:31 $ tiff-4.0.3/html/v3.4beta028.html0000644000212300117540000001353606753634101013016 00000000000000 Changes in TIFF v3.4beta028 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • a -noninteractive flag was added to configure to control whether or not it prints and prompts for configuration information
    • various typos and fixes were made in configure for the the library-only build support (this and other configure fixes from Richard Mlynarik <mly@adoc.xerox.com>)
    • bugs were fixed in the handling of pathnames supplied for external packages; e.g. DIR_JPEG
    • the handling of SETMAKE is now done properly
    • the default prototype function declaration for pow was corrected
    • a bug was fixed in libtiff/Makefile.in that caused installation to fail on systems without DSO support


    CHANGES IN LIBTIFF:
    • Acorn RISC O/S support that was accidentally left out of the left out of the previous distribution is present (from Peter Greenham)
    • complaints about unknown and/or unsupported codecs have been delayed until they are invoked; this permits applications to open images and look at tags even if the image data is compressed with an unknown/unsupported compression scheme
    • bugs in handling unknown tags have been corrected; applications that use multiple codecs, each with codec-specific tags, no longer generate confusing error messages
    • a missing pseudo-tag definition in the CCITT G3 codec was fixed (this problem caused core dumps in the tiffcp program)
    • pseudo-tags are now treated specially; they are always considered to be set (i.e. they do not use bits in the FIELD_* bit-vectors).
    • the use of strip chopping can now be controlled on a per-file basis through a mode parameter supplied when opening a file (``C'' to enable strip chopping and ``c'' to disable)
    • two bugs were fixed in the writing of opposite-endian byte-order files
    • support was added for three new fax-related tags registered to SGI: FaxRecvParams, FaxRecvTime, and FaxSubAddress
    • the bit order of image data read and written can now be controlled on a per-file basis through a mode parameter supplied when opening a file (``B'' to force MSB2LSB bit order, ``L'' for LSB2MSB bit order, and ``H'' for the bit order of the native CPU)
    • the byte order of image and tag data written to newly-created files can now be controlled on a per-file basis through a mode parameter supplied when openening a file (``b'' to force Big-Endian byte order and ``l'' to force Little-Endian byte order)
    • the use memory-mapped files for images opened read-only can now be controlled on a per-file basis through a mode parameter supplied when opening a file (``M'' to enable use of memory-mapped files and ``m'' to disable use)
    • the use of the WIN32 define in tiffiop.h has been replaced by __WIN32__


    CHANGES IN THE TOOLS:
    • fax2ps now does a save and restore around each page of PostScript; this fixes a problem with VM overflow when printing a many-page document on some printers
    • a bug in the handling of 3-channel images by ras2tiff was fixed
    • tiffcp has new options to control the byte order of newly created files: -B for Big-Endian byte order, -L for Little-Endian byte order; a -M option to disable the use of memory-mapped files, and a -C option to disable the use of strip chopping
    • bugs were fixed in tiffcp's handling of codec-specific tags


    CHANGES IN THE MANUAL PAGES:
    • the TIFFOpen page has been updated to reflect the new optional open mode parameters


    CHANGES IN THE CONTRIBUTED SOFTWARE:
    • contrib/win95 contains information and code from Philippe Tenenhaus <100423.3705@compuserve.com> about using the software under Windows 95
    • contrib/winnt contains information and code from Dave Dyer <ddyer@triple-i.com> about using the software under Windows NT
    TIFF home page.

    Sam Leffler / sam@engr.sgi.com Last updated $Date: 1999/08/09 20:21:21 $.
    tiff-4.0.3/html/v3.5.3.html0000644000212300117540000001024310153177756012071 00000000000000 Changes in TIFF v3.5.3 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:

    The ChangeLog will follow, but please note the most important change: LZW compression has been removed.

    Unisys has the patent on LZW compression and have been very active in their enforcement of late, demanding payments of $5000 or more from websites using unlicensed software to create GIF's. They could well do the same do persons using libtiff to create LZW compressed TIFF images.

    From Burn All GIF's Day:
    The catch is that it appears to be difficult or impossible to get a Unisys license to use LZW in free software that complies with the Open Source Definition

    Unfortunatly, the removal of LZW compression means that saved image size has grown dramatically. Without a change in the TIFF spec to support another lossless compression format, this is unavoidable.

    The library can use zip for lossless compression, but as this is not part of the spec, TIFFs using zip compression may not work with other software

    We will be making a patch available that will contain the LZW compression code for users who have either obtained a license from Unisys or are willing to risk it.

    LZW decompression is unchanged.


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • Added zip creation to release makefile target


    CHANGES IN LIBTIFF:
    • Added html for TIFFWriteTile.3t man page.
    • Added some changes to tif_write.c to support rewriting existing fixed sized tiles and strips. Code mods disabled by default, only enabled if REWRITE_HACK is defined for now.
    • Added TIFFWriteTile.3t man page.
    • Added notes on use of makefile.vc in build.html, and fixed email subscription address.
    • Fixed apocalypse-inducing y2k bug in contrib/ras/ras2tiff.c
    • Did some casts cleaning up to reduce compiler warnings in tif_fax3.c, from Bruce Carmeron -- modifications of changes made by Frank (sun cc still complained on cast).
    • fixed various VC++ warnings as suggested by Gilles Vollant .
    • Modified TIFFquery.3t man pages info on TIFFIsByteSwapped() to not imply applications are responsible for image data swapping.
    • HTML-ized the man pages, added to html/man
    • Removed LZW Compression to comply with Unisys patent extortion.
    • Corrected one remaining 16 -> 32 bit value in tif_fax3.c, From Ivo Penzar Added patch from Ivo Penzar to have TiffAdvanceDirectory handle memory mapped files.


    CHANGES IN THE TOOLS:
    • Fixed apocalypse-inducing y2k bug in contrib/ras/ras2tiff.c
    TIFF home page.

    Last updated $Date: 2004/11/26 14:37:20 $. tiff-4.0.3/html/v4.0.0.html0000644000212300117540000002500611550144414012050 00000000000000 Changes in TIFF v4.0.0 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. Please consult the ChangeLog file in the source package for full change details. The following information is located here:


    MAJOR CHANGES:

    BigTIFF support changes:
    • The options parameter in the TIFFOpen and TIFFClientOpen funcs has been extended. When creating new files, you can add option '4' to specify you want to create a ClassicTIFF file, though that is the default and the option is not strictly necessary. (As such, old calling code will continue to function and create ClassicTIFF files.) Or you can add option '8' to specify you want to create a BigTIFF file instead. This new option is also reflected in some of the tools we already upgraded. For instance, you can use the -8 option on tiffcp to have tiffcp produce BigTIFF files instead of the default ClassicTIFF. (Whilst on additional option is provided for version selection when creating new files, no such option is necessary when reading TIFF files. LibTiff reads ClassicTIFF and BigTIFF both, and the application does not need to be aware which TIFF version an opened file is.)
    • Although the tag count in BigTIFF is 64bit, we restricted the count in the implementation to a much more reasonable size. This is necessary in current implementation, because all tag data gets read automatically in the IFD reading stage, so if there's half a dozen private tags with multiple gigabytes of data that causes considerable overhead even if the application level is never interested in these tags. Our choice to ignore tags with data longer then a certain sanity value is much needed as things stand. We also recommend to step away from writing tiles that are 8 kilobyte in their uncompressed form, or writing single-line strips, in really big files, resulting in mega's of tiles or strips. It's much more efficient to choose bigger tile or strip sizes, up to several megabyte if needed, and have a few kilo of tiles or strips instead.
    • Although it's rare, some application code does directly access file offsets. Some of these are automatically upgraded because they used the toff_t type, others need to be aware that the datatype changed and need to start using toff_t or uint64. This impacts access to tags like the EXIF IFD tag, for example, or the SubIfds tag, or to StripOffsets or TileOffsets, the return type of functions like TIFFCurrentDirOffset, and a parameter type to functions like TIFFSetSubDirectory.
    • Although it's rare, some application code does use structures like TIFFHeader or TIFFDirEntry that used to be an exact binary representation of TIFF structures. These need to change. The old TIFFHeader structure is replaced by the new TIFFHeaderClassic, TIFFHeaderBig, and TIFFHeaderCommon structures that are an exact binary representation of the ClassicTIFF and BigTIFF header, and of the part that is common to both. There is no new equivalent for the old TIFFDirEntry structure (or more precisely, there is still a TIFFDirEntry structure, but it is changed, moved to library-private definition, and no longer an exact binary representation of the tag structure of either TIFF version).
    • Sizer functions, like TIFFTileSize or TIFFScanlineSize and the like, return a tmsize_t value (tmsize_t is defined as int32 on 32bit machines, and int64 on 64bit machines, and as such it is meant to represent signed memory sizes). This is because we figure 98% of the calling code uses the return value as sizes in allocations and the like. So, any overflow that is theoretically possible with BigTIFF when LibTiff is running on a 32bit system, is best detected inside the sizer functions and it is best to return a type that makes sense as a memory size. If your calling code is the exception and is interested in actual file size, you best use the newer TIFFTileSize64 or TIFFScanlineSize64 function that returns an uint64 type.
    • These TIFF tags require a 64-bit type as an argument in libtiff 4.0.0:
      • TIFFTAG_FREEBYTECOUNTS
      • TIFFTAG_FREEOFFSETS
      • TIFFTAG_STRIPBYTECOUNTS
      • TIFFTAG_STRIPOFFSETS
      • TIFFTAG_TILEBYTECOUNTS
      • TIFFTAG_TILEOFFSETS
    Other important backward incompatible changes in the public API:
    • TIFFRewriteField() renamed into _TIFFRewriteField() and moved out from the public interface (from tiffio.h to tiffiop.h). Type of its 'count' parameter changed from uint32 to tmsize_t.
    • TIFFMergeFieldInfo() returns non-void result now. It returns 0 if successful and -1 if failed. Though this is now obsoleted function and should not be used in new programs. Use the new tag extension scheme instead.
    • TIFFFieldWithTag() and TIFFFieldWithName() functions now return pointer to TIFFField constant object instead of TIFFFieldInfo.
    • TIFFReassignTagToIgnore() function and TIFFIgnoreSense enumeration have been removed. They was unused and never been used properly. Should be unneeded for high-level applications.
    • TIFFTagValue structure removed from the public tiffio.h to private tif_dir.h and not accessible anymore. It should be unneeded for high-level applications.


    CHANGES IN THE SOFTWARE CONFIGURATION:

    • Updated autotools: Autoconf 2.68, Automake 1.11.1, libtool 2.4.
    • Enabled support for Automake silent build rules (--enable-silent-rules or 'make V=0')
    • Enabled support for Automake colorized and parallel tests.
    • Added detection of 64-bit integer types since libtiff 4.0 requires use of 64-bit signed and unsigned integer types.
    • Libtiff now provides a more comprehensive test suite with over 72 tests, which may be executed on Unix-like systems, or under Microsoft Windows using MinGW/MSYS or Cygwin.
    • --disable-lzma configure option to disable use of liblzma.
    • --enable-defer-strile-load configure option to enable experimental deferred strip/tile offset/size loading. May cause some extremely sophisticated uses of libtiff to fail.
    • --enable-chunky-strip-read configure option to enable experimental enable reading large strips in chunks in TIFFReadScanline().
    • Now always uses WIN32 native I/O functions for Microsoft Windows except for under Cygwin.
    • Now provides a pkg-config support file (libtiff-4.pc).


    CHANGES IN LIBTIFF:

    • Patches/fixes made to stable libtiff (v3.9.X) are also applied to 4.0.0. There are too many to list here. See the distribution ChangeLog for a detailed change list.
    • There is considerable change in some files like tif_dirread and tif_dirwrite. These changes don't impact backwards compatibility, they are mostly a clean rewrite that does allow BigTIFF support as well as somewhat more robust reading of the unexpected already and will also serve future API extension but does not impact current API or functionality in a negative way that you need to know about.
    • Although there is still a functional definition for types like toff_t (file offset), tstrip_t (strip index number), etc, we recommend against using these in newer code. We have learned that it is next to impossible to use these consistently and make real abstraction of the binary format of these types. Instead, at a certain level we always end up doing casts anyway, and taking the exact binary format into account, so these types are nothing but dangerously misleading and obfuscating. You do not need to update calling code that uses them, as 99.9% of such code will continue to work. But we recommend against using them in newer calling code, and we started replacing them with binary clear types like uint16, uint32 and such in the library.
    • We do use and will continue to use one functional type that is an exception to the above rule, being tmsize_t. This is a signed memory size type, i.e. it is int32 on 32bit machines, or int64 on 64bit machines.
    • Optionally support LZMA compression via TIFF tag 34925. Tiffcp supports compression levels similar to "-c lzma:p1" or "-c zip:p9 for setting the LZMA compression parameters.
    • Optionally defer the load of strip/tile offset and size tags for optimized scanning of directories. Enabled with the --enable-defer-strile-load configure option (DEFER_STRILE_LOAD #define in tif_config.h).
    • Optionally enable experimental support for reading big strips in chunks. Enabled with the --enable-chunky-strip-read configure option.


    CHANGES IN THE TOOLS:

    • tiffset: add -d and -sd switches to allow operation on a particular directory, not just the first.


    CHANGES IN THE CONTRIB AREA:

    Last updated $Date: 2011-04-09 21:01:00 $. tiff-4.0.3/html/v3.4beta034.html0000644000212300117540000000416106753634101013005 00000000000000 Changes in TIFF v3.4beta034 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • support was added for building the library as a DSO under NetBSD
    • a bug was fixed in the DSO support for Linux
    • the handling of version strings has changed slightly to simplify parsing
    • a new parameter, TIFFLIBREF, was added to control how the library is referenced when linking programs in the tools directory


    CHANGES IN LIBTIFF:
    • DSO creation under Solaris now forces the DSO name with a -h option
    • the interface to the mkversion program was changed to eliminate the need to parse files
    • a bug was fixed in the EOL-detection logic of the T.4/T.6 decoder
    • ANSI IT8 TIFF/IT tag definitions were added to tiff.h
    TIFF home page.

    Sam Leffler / sam@engr.sgi.com Last updated $Date: 1999/08/09 20:21:21 $.
    tiff-4.0.3/html/v3.5.7.html0000644000212300117540000002345410153177757012106 00000000000000 Changes in TIFF v3.5.7 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • libtiff/libtiff.def: Brent Roman submitted new version adding serveral missing entry points. Also add a few other entry points later.
    • configure, Makefile.in, etc: added support for OPTIMIZER being set from config.site.
    • config.guess: updated wholesale to an FSF version apparently from 1998 (as opposed to 1994). This is mainly inspired by providing for MacOS X support.
    • configure/config.site: modified to check if -lm is needed for MACHDEPLIBS if not supplied by config.site. Needed for Darwin.
    • libtiff/tiff.h: Applied hac to try and resolve the problem with the inttypes.h include file on AIX. (Bug 39)
    • configure, *Makefile.in: Various changes to improve configuration for HP/UX specifically, and also in general. (Bug 40) They include:
      • Try to handle /usr/bin/sh instead of /bin/sh where necessary.
      • Upgrade to HP/UX 10.x+ compiler, linker and dso options.
      • Fixed mmap() test to avoid MMAP_FIXED ... it isn't available on HP
      • Use -${MAKEFLAGS} in sub makes from makefiles.
      • Fixed SCRIPT_SH/SHELL handling.
    • configure: Changes for DSO generation on AIX provided by John Marquart .
    • configure, libtiff/Makefile.in: Modified to build DSOs properly on Darwin thanks to Robert Krajewski (rpk@alum.mit.edu) and Keisuke Fujii (fujiik@jlcuxf.kek.jp).
    • configure, libtiff/Makefile.in: applied OpenBSD patches as per bug 61.
    • Makefile.in: added DESTDIR support as per bug 60.
    • libtiff/tif_jpeg.c: Define HAVE_BOOLEAN on windows if RPCNDR.H has been included.
    • man/Makefile.in: add TIFFClientOpen link as per debian submitted bug 66.
    • libtiff/Makefile.in: Fixed @DSOSUB_VERSION to be @DSOSUF_VERSION@ in two places.


    CHANGES IN LIBTIFF:
    • tif_fax3.c: keep rw_mode flag internal to fax3 state to remember whether we are encoding or decoding. This is to ensure graceful recovery if TIFFClientOpen() discovers an attempt to open a compressed file for "r+" access, and subsequently close it, as it resets the tif_mode flag to O_RDONLY in this case to avoid writes, confusing the compressor's concept of whether it is in encode or decode mode.
    • tif_luv.c/tiff.h/tiffio.h: New version of TIFF LogLuv (SGILOG) modules contributed by Greg Ward (greg@shutterfly.com). He writes:
      1. I improved the gamut-mapping function in tif_luv.c for imaginary colors, because some images were being super-saturated on the input side and this resulted in some strange color shifts in the output.
      2. I added a psuedotag in tiff.h to control random dithering during LogLuv encoding. This is turned off by default for 32-bit LogLuv and on for 24-bit LogLuv output. Dithering improves the average color accuracy over the image.
      3. I added a #define for LOG_LUV_PUBLIC, which is enabled by default in tiffio.h, to expose internal routines for converting between LogLuv and XYZ coordinates. This is helpful for writing more efficient, specialized conversion routines, especially for reading LogLuv files.
    • libtiff/tif_dirinfo.c: don't declare tiffFieldInfo static on VMS.
    • Added TIFFTAG_COPYRIGHT support.
    • tif_getimage.c: Added support for 16bit minisblack/miniswhite images in RGBA interface.
    • libtiff/tif_dirinfo.c: removed duplicate TIFFTAG_PHOTOSHOP as per bug 44.
    • libtiff/tif_dirwrite.c: Added support for TIFF_VARIABLE2 in the case of writing TIFF_BYTE/TIFF_SBYTE fields as per bug 43.
    • libtiff/tif_dirinfo.c: Modified the TIFF_BYTE definition for TIFFTAG_PHOTOSHOP to use a writecount of TIFF_VARIABLE2 (-3) to force use of uint32 counts instead of short counts.
    • libtiff/tif_dirinfo.c: moved pixar and copyright flags to ensure everything is in order.
    • Integrated experimental OJPEG support from Scott Marovich of HP.
    • libtiff/tif_open.c: Seek back to zero after failed read, before writing header.
    • libtiff/tiff.h, libtiff/tif_fax3.c: added check for __LP64__ when checking for 64 bit architectures as per bugzilla bug 67.
    • libtiff/tif_getimage.c: Use memmove() instead of TIFFmemcpy() in TIFFReadRGBATile() to avoid issues in cases of overlapping buffers. See Bug 69 in Bugzilla.
    • libtiff/tif_getimage.c: Don't complain for CMYK (separated) images with more than four samples per pixel as per bug 73.
    • libtiff/tif_getimage.c: relax handling of contig case where there are extra samples that are supposed to be ignored as per bug 75. This should now work for 8bit greyscale or palletted images.
    • libtiff/tif_packbits.c: fixed memory overrun error as per bug 77.
    • libtiff/tif_getimage.c: Fixed problem with reading strips or tiles that don't start on a tile boundary. Fix contributed by Josep Vallverdu (from HP), and further described in bug 47.
    • libtif/tif_fax3.c: Removed #ifdef PURIFY logic, and modified to always use the "safe" version, even if there is a very slight cost in performance as per bug 54.
    • libtiff/tif_lzw.c: added dummy LZWSetupEncode() to report an error about LZW not being available.
    • libtiff/tif_dir.c: propagate failure to initialize compression back from TIFFSetField() as an error status, so applications can detect failure.
    • libtiff/tif_lzw.c: Avoid MS VC++ 5.0 optimization bug as per bug 78.
    • libtiff/tif_dirwrite.c: added TIFFRewriteDirectory() function. Updated TIFFWriteDirectory man page to include TIFFRewriteDirectory.
    • libtiff/tiff.h: I have created COMPRESSION_CCITT_T4, COMPRESSION_CCITT_T6, TIFFTAG_T4OPTIONS and TIFFTAG_T6OPTIONS aliases in keeping with TIFF 6.0 standard in tiff.h as per bug 83.
    • Added PHOTOMETRIC_ITULAB as per bug 90.


    CHANGES IN THE TOOLS:
    • Brent Roman contributed updated tiffcp utility (and tiffcp.1) with support for extracting subimages with the ,n syntax, and also adding the -b bias removal flag.
    • tiff2ps.c/tiff2ps.1: Substantial changes to tiff2ps by Bruce A. Mallett, including a faster encoder, fixes for level 2 PostScript, and support for the imagemask operator.
    • fax2ps.c: Helge (libtiff at oldach.net) submitted fix that corrects behaviour for non-Letter paper sizes. (Bug 35) It fixes two problems:
      Without scaling (-S) the fax is now centered on the page size specified with -H and/or -W. Before, fax2ps was using an obscure and practially useless algorithm to allocate the image relative to Letter sized paper which sometime sled to useless whitespace on the paper, while at the same time cutting of the faxes printable area at the opposite border.
      Second, scaling now preserves aspect ratio, which makes unusual faxes (in particular short ones) print properly.
    • thumbnail.c: changed default output compression to packbits from LZW since LZW isn't generally available.
    • tiff2rgba.c: added -n flag to avoid emitting alpha component. Also added a man page for tiff2rgba.
    • tiffcmp.c: Fixed multi samples per pixel support for ContigCompare as per bug 53. Updated bug section of tiffcmp.1 to note tiled file issues.
    • libtiff/tif_getimage.c: Fixed so that failure is properly reported by gtTileContig, gtStripContig, gtTileSeparate and gtStripSeparate as per bug 51.


    CHANGES IN THE LZW COMPRESSION KIT:
    • Rewrote lzw patching process so that is required to enable full LZW support is to drop the tif_lzw.c from the libtiff-lzw-compression-kit over the one in the libtiff directory.
    • Some changes were made to make recovery from failure to initialize the LZW compressor more graceful.
    • Note that as distributed libtiff support LZW decompression, but not LZW compression.
    CHANGES IN THE CONTRIB AREA:
    • Fixed distribution to include contrib/addtiffo/tif_ovrcache.{c,h}.
    TIFF home page.

    Last updated $Date: 2004/11/26 14:37:20 $. tiff-4.0.3/html/v3.9.1.html0000644000212300117540000000617311246023723012066 00000000000000 Changes in TIFF v3.9.1 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • This is a bug-fix release for several bugs (two of which are dire) which were discovered in the 3.9.0 release.


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • Several defines were missing from tif_config.vc.h which are necessary to compile the library using MSVC.
    • Colorized tests were actually not enabled as expected. Parallel tests mode is now also enabled so that tests can be run in parallel, and test output is sent to .log files.


    CHANGES IN LIBTIFF:
    • libtiff/tif_write.c (TIFFAppendToStrip): Remove cast which caused libtiff to output a wrong last strip with byte-count and strip-offset of zero. This cast was added on the day of the 3.9.0 release.
    • libtiff/tif_dirwrite.c: Back out changes from 2007-11-22 that resulted in the final strip not being written in some circumstances. http://bugzilla.maptools.org/show_bug.cgi?id=2088


    CHANGES IN THE TOOLS:
    • None


    CHANGES IN THE CONTRIB AREA:
    • None
    Last updated $Date: 2009-08-28 18:54:11 $. tiff-4.0.3/html/document.html0000644000212300117540000000310410463707071013042 00000000000000 TIFF Documentation

    TIFF Documentation

    A copy of the 6.0 specification is available from Adobe at http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf, or from the libtiff ftp site at ftp://ftp.remotesensing.org/pub/libtiff/doc/TIFF6.pdf.

    Draft TIFF Technical Note #2 covers problems with the TIFF 6.0 design for embedding JPEG-compressed data in TIFF, and describes an alternative.

    Other Adobe information on TIFF can be retrieved from: http://partners.adobe.com/public/developer/tiff/index.html

    Joris Van Damme maintains a list of known tags and their descriptions and definitions. It is available online at http://www.awaresystems.be/imaging/tiff/tifftags.html

    There is a FAQ, related both to TIFF format and libtiff library: http://www.awaresystems.be/imaging/tiff/faq.html

    There is a preliminary BigTIFF Design for a TIFF variation supporting files larger than 4GB.


    Last updated: $Date: 2006/07/10 18:13:52 $
    tiff-4.0.3/html/v3.7.3.html0000644000212300117540000002007710360260173012063 00000000000000 Changes in TIFF v3.7.3 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • Replace runtime endianess check with the compile time one.
    • Added support for the new predictor type (floating point predictor), defined at the TIFF Technical Note 3.
    • Added Support for custom tags, passed by value. Added support for all DNG tags.


    CHANGES IN THE SOFTWARE CONFIGURATION:


    CHANGES IN LIBTIFF:
    • tiffiop.h, tif_open.c: Added open option 'h' to avoid reading the first IFD when needed. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=875
    • tiff.h: Use correct int size on Sparc 64bit/Sun compiler platform. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=855
    • tif_dirinfo.c: Added support for ClipPath, XClipPathUnits and YClipPathUnits tags.
    • tif_dirinfo.c, tif_dir.h, tif_dir.c, tif_print.c: Make DocumentName, Artist, HostComputer, ImageDescription, Make, Model, Copyright, DateTime, PageName, TextureFormat, TextureWrapModes and TargetPrinter tags custom.
    • tif_jpeg.c: Cleanup the codec state depending on TIFF_CODERSETUP flag (to fix memory leaks).
    • tif_dirwrite.c: Use tdir_count when calling TIFFCvtNativeToIEEEDouble() in the TIFFWriteDoubleArray() function as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=845
    • tif_dirinfo.c, tif_print.c: TIFFFetchByteArray() returns uint16 array when fetching the BYTE and SBYTE fields, so we should consider result as pointer to uint16 array and not as array of chars. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=831
    • tif_dir.c: More efficient custom tags retrieval as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=830
    • tif_win32.c: Use FILE_SHARE_READ | FILE_SHARE_WRITE share mode in CreateFile() call as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=829
    • tif_jpeg.c: Substantial fix for addtiffo problems with JPEG encoded TIFF files. Pre-allocate lots of space for jpegtables in directory.
    • tif_dirread.c: Changed the code that computes stripbytecount[0] if it appears bogus to ignore if stripoffset[0] is zero. This is a common case with GDAL indicating a "null" tile/strip.
    • tif_jpeg.c: added LIB_JPEG_MK1 support in JPEGDecodeRaw().
    • tif_dirread.c: Ensure that broken files with too many values in PerSampleShorts, TIFFFetchPerSampleLongs and TIFFFetchPerSampleAnys work ok instead of crashing. http://bugzilla.remotesensing.org/show_bug.cgi?id=843
    • tif_predict.h, tif_predict.c: Added ability to decode and encode floating point predictor, as per TIFF Technical Note 3. See http://chriscox.org/TIFF_TN3_Draft2.pdf for details.
    • tiffio.h, tiffiop.h, tif_dir.c, tif_read.c, tif_swab.c: Added _TIFFSwab24BitData() and TIFFSwabArrayOfLong() functions used to swap 24-bit floating point values.
    • tiff.h: Added predictor constants.
    • tiffiop.h, tif_dir.c: Use uint32 type for appropriate values in _TIFFVSetField() function. Inspired by the bug http://bugzilla.remotesensing.org/show_bug.cgi?id=816
    • tif_open.c: Do not read header in case the output file should be truncated (Ron).
    • tif_dirinfo.c, tif_config.h.vc: Use lfind() instead of bsearch() in _TIFFFindFieldInfoByName() function (Ron).
    • tif_dir.c, tif_print.c: Properly handle all data types in custom tags.
    • dirinfo.c: Added DNG tags.
    • tiff.h: Added missed DNG tag (LensInfo); added DNG 1.1.0.0 tags.
    • tif_dir.c, tif_print.c: Added Support for custom tags, passed by value.
    • tiff.h, tif_dirinfo.c, tiffiop.h: Added EXIF related tags.


    CHANGES IN THE TOOLS:


    CHANGES IN THE CONTRIB AREA:
    • addtiffo/{tif_overview.c, tif_ovrcache.c, tif_ovrcache.h}: Make overviews working for contiguous images.
    Last updated $Date: 2006/01/04 22:04:46 $. tiff-4.0.3/html/v3.6.1.html0000644000212300117540000001525107772407667012106 00000000000000 Changes in TIFF v3.6.1 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • libtiff/makefile.vc, tools/makefile.vc: Support for IJG JPEG library.
    • Makefile.in: Add an absolute path to the test_pics.sh call.
    • Makefile.in: Add an absolute path to the test_pics.sh call.
    • libtiff/tiffcomp.h: #define _BSDTYPES_DEFINED when defining BSD typedefs.
    • configure, libtiff/{Makefile.in, mkversion.c}: Relative buildings fixed.
    • Makefile.in: Add an absolute path to the test_pics.sh call.


    CHANGES IN LIBTIFF:
    • libtiff/{tif_color.c, tif_getimage.c, tiffio.h}: Added support for ReferenceBlackWhite tag handling when converted from YCbCr color space as per bug 120.
    • libtiff/{tif_getimage.c, tif_aux.c}: Read WhitePoint tag from the file and properly use it for CIE Lab 1976 to RGB transform.
    • libtiff/{tif_getimage.c, tiffio.h}: Finally resolved problems with orientation handling. TIFFRGBAImage interface now properly supports all possible orientations, i.e. images will be flipped both in horizontal and vertical directions if required. 'Known bugs' section now removed from the appropriate manual pages.
    • libtiff/tif_luv.c: Fixed bug in 48-bit to 24-bit conversion routine, reported by Antonio Scuri.
    • libtiff/{tiffio.h, tif_codec.c}: Added new function TIFFIsCODECConfigured(), suggested by Ross Finlayson.
    • libtiff/tif_ojpeg.c: TIFFVGetField() function now can properly extract the fields from the OJPEG files. Patch supplied by Ross Finlayson.
    • libtiff/tif_dir.h: _TIFFFindOrRegisterdInfo declaration replaced with _TIFFFindOrRegisterFieldInfo as reported by Ross Finlayson.
    • libtiff/tif_dirinfo.c: Implemented binary search in _TIFFMergeFieldInfo(). Patch supplied by Ross Finlayson.
    • tif_dirread.c: do not mark all anonymously defined tags to be IGNOREd (as it was done in 3.6.0).
    • libtiff/{tiff.h, tif_dirinfo.c}: Added support for IFD (13) datatype, intruduced in "Adobe PageMaker TIFF Technical Notes".
    • libtiff/{tif_color.c, tif_getimage.c, tiffio.h}: New color space conversion code: CIE L*a*b* 1976 images now supported by the TIFFRGBAImage interface. YCbCr to RGB conversion code also moved there and now has publicly available interface. These routines currently used in TIFFRGBAImage interface only and not supported in other libtiff tools yet. So if you want, for example, to convert CIE Lab image into PostScript file you should do it in two steps: chnge colorspace to RGB using tiff2rgba utility abd then process it with the tiff2ps.
    • libtiff/tif_tile.c: Remove spurious use of "s" (sample) in the planarconfig_contig case in TIFFComputeTile() as per bug 387
    • libtiff/tiffiop.h: New macros: TIFFmax and TIFFmin.
    • libtiff/{tiffio.h, tif_strip.c}: Added TIFFRawStripSize() function as suggested by Chris Hanson.
    • libtiff/{tif_lzw.c, tif_fax3.c}: Proper support for update mode as per bug 424.


    CHANGES IN THE TOOLS:
    • tiff2pdf: New tool, written by Ross Finlayson, to directly convert TIFF files to PDF.
    • tiffgt: Unmaintained and platform dependent sgigt utility removed and replaced with the completely rewritten portable tiffgt tool (depend on OpenGL and GLUT). This tool will not build by default.
    • ras2tiff: Properly determine SUN Rasterfiles with the reverse byte order (it is reported by the magic header field). Problem reported by Andreas Wiesmann.
    • raw2tiff: Implemented image size guessing using correlation coefficient calculation between two neighbour lines.


    CHANGES IN THE CONTRIB AREA:
    • contrib/pds/{tif_pdsdirread.c, tif_pdsdirwrite.c}: Use TIFFDataWidth() function insted of tiffDataWidth array.
    CHANGES IN THE LZW COMPRESSION KIT:
    • Proper support for update mode as per bug 424.
    TIFF home page.

    Last updated $Date: 2003/12/24 22:14:15 $. tiff-4.0.3/html/v3.4beta024.html0000644000212300117540000001233206753634101013003 00000000000000 Changes in TIFF v3.4beta024 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • It is now possible to setup the software to build only the library; configure reconizes this is the intent when the VERSION, tiff.alpha, and tif_version.c files are in the local directory (i.e. ``.'')
    • configure no longer tries to setup HTML materials
    • include file directories needed in building the library are now specified with a DIRS_LIBINC config parameter
    • configure no longer checks for alternate compilers if CC is set; if the specified compiler is not found or is not appropriate the configuration procedure aborts
    • the port.h file generated by configure is now used only by the library and as such as have been moved to the libtiff directory
    • there is beginning support for building DSO's on systems other than IRIX
    • configure now verifies the JPEG and zlib directory pathnames by checking for well-known include files in these directories
    • configure no longer creates the dist directory needed only on SGI machines (for building SGI binary distributions)
    • a bug was fixed whereby configure would incorrectly set ENVOPTS when building the software with gcc under AIX


    CHANGES IN LIBTIFF:
    • two new typedefs were added to tiff.h: int8 and uint8 for signed and unsigned 8-bit quantities, respectively; these are currently used only by programs in the tools directory
    • the BadFaxLines, CleanFaxData, and ConsecutiveBadFaxLines tags are now supported with Group 4 compression
    • byte order is now correctly identified on 64-bit machines
    • a bug was fixed in the PackBits decoder where input data would appear short when a no-op run was present
    • a bug was fixed in calculations with very wide strips
    • TIFFWriteEncodedStrip and TIFFWriteRawStrip were extended to support dynamically growing the number of strips in an image (must set ImageLength prior to making calls though)
    • TIFFDefaultTileSize now rounds tile width and height up to a multiple of 16 pixels, as required by the TIFF 6.0 specification
    • the file version.h is now built by a new mkversion program; this was done for portability to non-UNIX systems
    • support was added for the Acorn RISC OS (from Peter Greenham)
    • the builtin codec table is now made const when compiling under VMS so that libtiff can be built as a shared library
    • support for the PowerPC Mac (from Ruedi Boesch)
    • support for Window NT/Window 95 (from Scott Wagner)


    CHANGES IN THE TOOLS:
    • the tools no longer include port.h
    • various portability fixes; mostly to eliminate implicit assumptions about how long int32 data types are
    • PostScript Level II additions to tiff2ps from Bjorn Brox
    • sgi2tiff now handles RGBA images


    CHANGES IN THE MANUAL PAGES:
    • the documentation has been updated to reflect the current state of the software
    • some routines have been moved to different manual pages to group like-routines together


    CHANGES IN THE CONTRIBUTED SOFTWARE:
    • support was added for the Acorn RISC OS (from Peter Greenham)
    • support for Windows NT/Windows 95 contributed for a previous version of this software was sort of incorporated (it's broken right now) (from Scott Wagner)
    TIFF home page.

    Sam Leffler / sam@engr.sgi.com Last updated $Date: 1999/08/09 20:21:21 $.
    tiff-4.0.3/html/Makefile.in0000644000212300117540000005522312027361163012410 00000000000000# Makefile.in generated by automake 1.12.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Tag Image File Format (TIFF) Software # # Copyright (C) 2004, Andrey Kiselev # # Permission to use, copy, modify, distribute, and sell this software and # its documentation for any purpose is hereby granted without fee, provided # that (i) the above copyright notices and this permission notice appear in # all copies of the software and related documentation, and (ii) the names of # Sam Leffler and Silicon Graphics may not be used in any advertising or # publicity relating to the software without the specific, prior written # permission of Sam Leffler and Silicon Graphics. # # THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, # EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY # WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR # ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF # LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE # OF THIS SOFTWARE. # Process this file with automake to produce Makefile.in. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = html DIST_COMMON = $(dist_doc_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/config/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/libtiff/tif_config.h \ $(top_builddir)/libtiff/tiffconf.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(docdir)" DATA = $(dist_doc_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GLUT_CFLAGS = @GLUT_CFLAGS@ GLUT_LIBS = @GLUT_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBDIR = @LIBDIR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTIFF_ALPHA_VERSION = @LIBTIFF_ALPHA_VERSION@ LIBTIFF_DOCDIR = @LIBTIFF_DOCDIR@ LIBTIFF_MAJOR_VERSION = @LIBTIFF_MAJOR_VERSION@ LIBTIFF_MICRO_VERSION = @LIBTIFF_MICRO_VERSION@ LIBTIFF_MINOR_VERSION = @LIBTIFF_MINOR_VERSION@ LIBTIFF_RELEASE_DATE = @LIBTIFF_RELEASE_DATE@ LIBTIFF_VERSION = @LIBTIFF_VERSION@ LIBTIFF_VERSION_INFO = @LIBTIFF_VERSION_INFO@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = $(LIBTIFF_DOCDIR)/html dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tiff_libs_private = @tiff_libs_private@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ docfiles = \ addingtags.html \ bugs.html \ build.html \ contrib.html \ document.html \ images.html \ index.html \ internals.html \ intro.html \ libtiff.html \ misc.html \ support.html \ TIFFTechNote2.html \ tools.html \ v3.4beta007.html \ v3.4beta016.html \ v3.4beta018.html \ v3.4beta024.html \ v3.4beta028.html \ v3.4beta029.html \ v3.4beta031.html \ v3.4beta032.html \ v3.4beta033.html \ v3.4beta034.html \ v3.4beta035.html \ v3.4beta036.html \ v3.5.1.html \ v3.5.2.html \ v3.5.3.html \ v3.5.4.html \ v3.5.5.html \ v3.5.6-beta.html \ v3.5.7.html \ v3.6.0.html \ v3.6.1.html \ v3.7.0alpha.html \ v3.7.0beta.html \ v3.7.0beta2.html \ v3.7.0.html \ v3.7.1.html \ v3.7.2.html \ v3.7.3.html \ v3.7.4.html \ v3.8.0.html \ v3.8.1.html \ v3.8.2.html \ v3.9.0beta.html \ v3.9.1.html \ v3.9.2.html \ v4.0.0.html \ v4.0.1.html \ v4.0.2.html dist_doc_DATA = $(docfiles) SUBDIRS = images man all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign html/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign html/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_docDATA: $(dist_doc_DATA) @$(NORMAL_INSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-dist_docDATA: @$(NORMAL_UNINSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_docDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-dist_docDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ cscopelist cscopelist-recursive ctags ctags-recursive \ distclean distclean-generic distclean-libtool distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dist_docDATA \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-dist_docDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: tiff-4.0.3/html/v3.4beta032.html0000644000212300117540000000520606753634101013004 00000000000000 Changes in TIFF v3.4beta032 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • various fixups and subtle improvements to configure from Richard Mlynarik


    CHANGES IN LIBTIFF:
    • a new codec from Pixar designed for high-resolution color images; note that this codec is not configured by default
    • a bug fix for reading tags with a single FLOAT value
    • change to the TIFFGetField calling convention: a tag that has a single value of type DOUBLE is now retrieved by passing a ``double*'' instead of a ``double**'' (this change makes the handling of tags with DOUBLE values identical to the handling of tags with FLOAT values)
    • fix to VMS support for the handling of floating point values


    CHANGES IN THE TOOLS:
    • tiffdump now handles tags with FLOAT and DOUBLE values


    CHANGES IN THE CONTRIBUTED SOFTWARE:
    • updates to the Acorn OS support from Peter Greenham
    TIFF home page.

    Sam Leffler / sam@engr.sgi.com Last updated $Date: 1999/08/09 20:21:21 $.
    tiff-4.0.3/html/support.html0000644000212300117540000004243610354614524012752 00000000000000 TIFF 6.0 Specification Coverage

    TIFF 6.0 Specification Coverage

    The library is capable of dealing with images that are written to follow the 5.0 or 6.0 TIFF spec. There is also considerable support for some of the more esoteric portions of the 6.0 TIFF spec.


    Core requirements

    Both "MM" and "II" byte orders are handled. Both packed and separated planar configuration of samples. Any number of samples per pixel (memory permitting). Any image width and height (memory permitting). Multiple subfiles can be read and written. Editing is not supported in that related subfiles (e.g. a reduced resolution version of an image) are not automatically updated.

    Tags handled: ExtraSamples, ImageWidth, ImageLength, NewSubfileType, ResolutionUnit. Rowsperstrip, StripOffsets, StripByteCounts, XResolution, YResolution

    Tiled Images TileWidth, TileLength, TileOffsets, TileByteCounts
    Image Colorimetry Information WhitePoint, PrimaryChromaticities, TransferFunction, ReferenceBlackWhite
    Class B for bilevel images SamplesPerPixel = 1
    BitsPerSample = 1
    Compression = 1 (none), 2 (CCITT 1D), or 32773 (PackBits)
    PhotometricInterpretation = 0 (Min-is-White), 1 (Min-is-Black)
    Class G for grayscale images SamplesPerPixel = 1
    BitsPerSample = 4, 8
    Compression = 1 (none) 5 (LZW)
    PhotometricInterpretation = 0 (Min-is-White), 1 (Min-is-Black)
    Class P for palette color images SamplesPerPixel = 1
    BitsPerSample = 1-8
    Compression = 1 (none) 5 (LZW)
    PhotometricInterpretation = 3 (Palette RGB)
    ColorMap
    Class R for RGB full color images SamplesPerPixel = 3
    BitsPerSample = <8,8,8>
    PlanarConfiguration = 1, 2
    Compression = 1 (none) 5 (LZW)
    PhotometricInterpretation = 2 (RGB)
    Class F for facsimile (Class B tags plus...)
    Compression = 3 (CCITT Group 3), 4 (CCITT Group 4)
    FillOrder = 1 (MSB), 2 (LSB)
    Group3Options = 1 (2d encoding), 4 (zero fill), 5 (2d+fill)
    ImageWidth = 1728, 2048, 2482
    NewSubFileType = 2
    ResolutionUnit = 2 (Inch), 3 (Centimeter)
    PageNumber, XResolution, YResolution, Software, BadFaxLines, CleanFaxData, ConsecutiveBadFaxLines, DateTime, DocumentName, ImageDescription, Orientation
    Class S for separated images SamplesPerPixel = 4
    PlanarConfiguration = 1, 2
    Compression = 1 (none), 5 (LZW)
    PhotometricInterpretation = 5 (Separated)
    InkSet = 1 (CMYK)
    DotRange, InkNames, DotRange, TargetPrinter
    Class Y for YCbCr images SamplesPerPixel = 3
    BitsPerSample = <8,8,8>
    PlanarConfiguration = 1, 2
    Compression = 1 (none), 5 (LZW), 7 (JPEG)
    PhotometricInterpretation = 6 (YCbCr)
    YCbCrCoefficients, YCbCrSubsampling, YCbCrPositioning
    (colorimetry info from Appendix H; see above)
    Class "JPEG" for JPEG images (per TTN2) PhotometricInterpretation = 1 (grayscale), 2 (RGB), 5 (CMYK), 6 (YCbCr)
    (Class Y tags if YCbCr)
    (Class S tags if CMYK)
    Compression = 7 (JPEG)

    In addition, the library supports some optional compression algorithms that are, in some cases, of dubious value.

    Compression tag valueCompression algorithm
    32766NeXT 2-bit encoding
    32809ThunderScan 4-bit encoding
    32909Pixar companded 11-bit ZIP encoding
    32946PKZIP-style Deflate encoding (experimental)
    34676SGI 32-bit Log Luminance encoding (experimental)
    34677SGI 24-bit Log Luminance encoding (experimental)

    Note that there is no support for the JPEG-related tags defined in the 6.0 specification; the JPEG support is based on the post-6.0 proposal given in TIFF Technical Note #2.

    For more information on the experimental Log Luminance encoding consult the materials available at http://www.anyhere.com/gward/pixformat/tiffluv.html.

    The following table shows the tags that are recognized and how they are used by the library. If no use is indicated, then the library reads and writes the tag, but does not use it internally.

    Tag Name Value R/W Library's Use (Comments)
    NewSubFileType 254 R/W none (called SubFileType in <tiff.h>)
    SubFileType 255 R/W none (called OSubFileType in <tiff.h>)
    ImageWidth 256 R/W lots
    ImageLength 257 R/W lots
    BitsPerSample 258 R/W lots
    Compression 259 R/W to select appropriate codec
    PhotometricInterpretation 262 R/W lots
    Thresholding 263 R/W  
    CellWidth 264   parsed but ignored
    CellLength 265   parsed but ignored
    FillOrder 266 R/W control bit order
    DocumentName 269 R/W  
    ImageDescription 270 R/W  
    Make 271 R/W  
    Model 272 R/W  
    StripOffsets 273 R/W data i/o
    Orientation 274 R/W  
    SamplesPerPixel 277 R/W lots
    RowsPerStrip 278 R/W data i/o
    StripByteCounts 279 R/W data i/o
    MinSampleValue 280 R/W  
    MaxSampleValue 281 R/W  
    XResolution 282 R/W  
    YResolution 283 R/W used by Group 3 2d encoder
    PlanarConfiguration 284 R/W data i/o
    PageName 285 R/W  
    XPosition 286 R/W  
    YPosition 286 R/W  
    FreeOffsets 288   parsed but ignored
    FreeByteCounts 289   parsed but ignored
    GrayResponseUnit 290   parsed but ignored
    GrayResponseCurve 291   parsed but ignored
    Group3Options 292 R/W used by Group 3 codec
    Group4Options 293 R/W  
    ResolutionUnit 296 R/W used by Group 3 2d encoder
    PageNumber 297 R/W  
    ColorResponseUnit 300   parsed but ignored
    TransferFunction 301 R/W  
    Software 305 R/W  
    DateTime 306 R/W  
    Artist 315 R/W  
    HostComputer 316 R/W  
    Predictor 317 R/W used by LZW codec
    WhitePoint 318 R/W  
    PrimaryChromacities 319 R/W  
    ColorMap 320 R/W  
    TileWidth 322 R/W data i/o
    TileLength 323 R/W data i/o
    TileOffsets 324 R/W data i/o
    TileByteCounts 324 R/W data i/o
    BadFaxLines 326 R/W  
    CleanFaxData 327 R/W  
    ConsecutiveBadFaxLines 328 R/W  
    SubIFD 330 R/W subimage descriptor support
    InkSet 332 R/W  
    InkNames 333 R/W  
    DotRange 336 R/W  
    TargetPrinter 337 R/W  
    ExtraSamples 338 R/W lots
    SampleFormat 339 R/W  
    SMinSampleValue 340 R/W  
    SMaxSampleValue 341 R/W  
    JPEGTables 347 R/W used by JPEG codec
    YCbCrCoefficients 529 R/W used by TIFFReadRGBAImage support
    YCbCrSubsampling 530 R/W tile/strip size calculations
    YCbCrPositioning 531 R/W  
    ReferenceBlackWhite 532 R/W  
    Matteing 32995 R none (obsoleted by ExtraSamples tag)
    DataType 32996 R none (obsoleted by SampleFormat tag)
    ImageDepth 32997 R/W tile/strip calculations
    TileDepth 32998 R/W tile/strip calculations
    StoNits 37439 R/W  

    The Matteing and DataType tags have been obsoleted by the 6.0 ExtraSamples and SampleFormat tags. Consult the documentation on the ExtraSamples tag and Associated Alpha for elaboration. Note however that if you use Associated Alpha, you are expected to save data that is pre-multipled by Alpha. If this means nothing to you, check out Porter & Duff's paper in the '84 SIGGRAPH proceedings: "Compositing Digital Images".

    The ImageDepth tag is a non-standard, but registered tag that specifies the Z-dimension of volumetric data. The combination of ImageWidth, ImageLength, and ImageDepth, defines a 3D volume of pixels that are further specified by BitsPerSample and SamplesPerPixel. The TileDepth tag (also non-standard, but registered) can be used to specified a subvolume "tiling" of a volume of data.

    The Colorimetry, and CMYK tags are additions that appear in TIFF 6.0. Consult the TIFF 6.0 specification included in the doc directory and online.

    The JPEG-related tag is specified in TIFF Technical Note #2 which defines a revised JPEG-in-TIFF scheme (revised over that appendix that was part of the TIFF 6.0 specification).


    Last updated: $Date: 2005/12/28 06:53:18 $

    tiff-4.0.3/html/images.html0000644000212300117540000000210010356336124012462 00000000000000 TIFF Test Images

    TIFF Test Images

    Test images are available for most formats supported by the library. Most of the images included in the test kit are also part of this documentation (albeit in TIFF rather than GIF or JFIF). The images are kept in a separate archive that should be located in the same directory as this software.

    The latest archive of test images is located at ftp://ftp.remotesensing.org/pub/libtiff/pics-3.8.0.tar.gz

    There are two other good sources for TIFF test images: the contributed software contrib/dbs includes several programs that generate test images suitable for debugging, and the tiffcp program can be used to generate a variety of images with different storage characteristics.


    Last updated: $Date: 2006/01/02 23:50:44 $ tiff-4.0.3/html/v3.8.1.html0000644000212300117540000001757310405303434012067 00000000000000 Changes in TIFF v3.8.1 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • Bug-fix release.


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • libtool related stuff updated from the 2.1a branch.
    • Fix with_default_strip_size comparison as reported by Norihiko Murase.


    CHANGES IN LIBTIFF:


    CHANGES IN THE TOOLS:


    CHANGES IN THE CONTRIB AREA:
    Last updated $Date: 2006/03/13 14:52:12 $. tiff-4.0.3/html/v3.9.0beta.html0000644000212300117540000002671111243352343012721 00000000000000 Changes in TIFF v3.9.0beta TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • New tiffcrop utility contributed by Richard Nolde. tiffcrop does the same as tiffcp, but also can crop, extract, rotate and mirror images.
    • tif_jbig.c: Added support for JBIG compression scheme (34661 code), contributed by Lee Howard.
    • Totally new implementation of OJPEG module from Joris Van Damme. No need to patch libjpeg anymore. Many OJPEG files should be supported now that was not supported previously.


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • tif_config.wince.h, tiffconf.wince.h, tif_wince.c: WinCE-specific compatibility stuff from Mateusz Loskot.
    • Rename config.h.vc and tif_config.h.vc to config.vc.h and tif_config.vc.h for easier identification by folks using an IDE.
    • configure, configure.ac: OJPEG support enabled by default (i.e., whe the conformant JPEG support enabled).
    • README.vms, Makefile.am, configure.com, libtiff/{Makefile.am, tif_config.h-vms, tif_stream.cxx, tif_vms.c, tiffconf.h-vms}: Added support for OpenVMS by Alexey Chupahin.
    • nmake.opt: use /EHsc for VS2005 compatibility. Also define _CRT_SECURE_NO_DEPRECATE to avoid noise on VS2005.


    CHANGES IN LIBTIFF:
    • tif_dirinfo.c (_TIFFFindFieldInfo): Don't attempt to bsearch() on a NULL fieldinfo list. (_TIFFFindFieldInfoByName): Don't attempt to lfind() on a NULL fieldinfo list.
    • tif_jpeg.c: Changed JPEGInitializeLibJPEG() so that it will convert from decompressor to compressor or compress to decompress if required by the force arguments. This works around a problem in where the JPEGFixupTestSubsampling() may cause a decompressor to be setup on a directory when later a compressor is required with the force flag set. Occurs with the addtiffo program for instance.
    • tif_dirwrite.c: Fixed swapping of byte arrays stored in-place in tag offsets as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1363
    • tif_getimage.c: workaround for 'Fractional scanline' error reading OJPEG images with rowsperstrip that is not a multiple of vertical subsampling factor. This bug is mentioned in http://bugzilla.remotesensing.org/show_bug.cgi?id=1390 and http://www.asmail.be/msg0054766825.html
    • tif_dirread.c: Added special function to handle SubjectDistance EXIF tag as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1362
    • tif_dirread.c, tif_read.c: Type of the byte counters changed from tsize_t to uint32 to be able to work with data arrays larger than 2GB. Fixes bug http://bugzilla.remotesensing.org/show_bug.cgi?id=89 Idea submitted by Matt Hancher.
    • tif_dir.c: Workaround for incorrect TIFFs with ExtraSamples == 999 produced by Corel Draw. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1490
    • tif_write.c: TIFFAppendToStrip() - clear sorted flag if we move a strip. http://bugzilla.remotesensing.org/show_bug.cgi?id=1359
    • tif_fax3.c: Save the state of printdir codec dependent method.
    • tif_jpeg.c: Save the state of printdir codec dependent method as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1273
    • tif_win32.c: Fixed problem with offset value manipulation as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1322
    • tif_fax3.c, tif_next.c, tif_pixarlog.c: Fixed multiple vulnerabilities, as per Gentoo bug (): http://bugs.gentoo.org/show_bug.cgi?id=142383
    • tif_lzw.c, tif_zip.c: Fixed problems with mixing encoding and decoding on the same read-write TIFF handle. The LZW code can now maintain encode and decode state at the same time. The ZIP code will switch back and forth as needed. http://bugzilla.remotesensing.org/show_bug.cgi?id=757
    • tif_msdos.c: Avoid handle leak for failed opens. c/o Thierry Pierron
    • tif_dirwrite.c: take care not to flush out buffer of strip/tile data in _TIFFWriteDirectory if TIFF_BEENWRITING not set. Relates to bug report by Peng Gao with black strip at bottom of images.
    • tif_dirwrite.c: make sure to use uint32 for wordcount in TIFFWriteNormanTag if writecount is VARIABLE2 for ASCII fields. It already seems to have been done for other field types. Needed for "tiffset" on files with geotiff ascii text.
    • tif_dirinfo.c: Added missed EXIF tag ColorSpace (40961).
    • tif_dirread.c: Move IFD fetching code in the separate function TIFFFetchDirectory() avoiding code duplication in TIFFReadDirectory() and TIFFReadCustomDirectory().
    • tif_readdir.c: Added case in EstimateStripByteCounts() for tiled files. Modified TIFFReadDirectory() to not invoke EstimateStripByteCounts() for case where entry 0 and 1 are unequal but one of them is zero. http://bugzilla.remotesensing.org/show_bug.cgi?id=1204
    • tif_open.c, tif_dirread.c, tiffiop.h: Move IFD looping checking code in the separate function TIFFCheckDirOffset().
    • tif_aux.c: Added _TIFFCheckRealloc() function.
    • tif_fax3.c: Fixed problems in fax decoder as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1194
    • tif_jbig.c: Added support for JBIG compression scheme (34661 code) contributed by Lee Howard. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=896
    • tif_getimage.c: Added support for planarconfig separate non-subsampled YCbCr (i.e. separate YCbCr with subsampling [1,1]).
    • tif_getimage.c: Revision of all RGB(A) put routines:
      • Conversion of unassociated alpha to associated alpha now done with more performant LUT, and calculation more correct.
      • Conversion of 16bit data to 8bit data now done with more performant LUT, and calculation more correct
      • Bugfix of handling of 16bit RGB with unassociated alpha
    • tif_ojpeg.c: totally new implementation
    • tif_getimage.c: removed TIFFTAG_JPEGCOLORMODE handling of OJPEG images in favor of tif_getimage.c native handling of YCbCr and desubsampling.
    • tif_jpeg.c: JPEGVSetField() so that altering the photometric interpretation causes the "upsampled" flag to be recomputed. Fixes peculiar bug where photometric flag had to be set before jpegcolormode flag.


    CHANGES IN THE TOOLS:


    CHANGES IN THE CONTRIB AREA:
    • contrib/addtiffo/tif_overview.c: Fix problems with odd sized output blocks in TIFF_DownSample_Subsampled() (bug 1542).
    • contrib/dbs/xtiff/xtiff.c: Make xtiff utility compilable. Though it is still far from the state of being working and useful.
    Last updated $Date: 2009-08-20 22:57:39 $. tiff-4.0.3/html/v3.5.1.html0000644000212300117540000000417310356353206012063 00000000000000 Changes in TIFF v3.5.1 TIFF CHANGE INFORMATION


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • None of consequence


    CHANGES IN LIBTIFF:
    • Support was added for IPTC Newsphoto metadata (TIFFTAGE_IPTCNEWSPHOTO)
    • Support was added for photoshop caption handling (TIFFTAG_PHOTOSHOP)


    CHANGES IN THE TOOLS:
    • Bill Radcliffe's iptcutil was added to the "contrib" subdirectory . It can convert an IPTC binary blob to ASCII text and vice-versa. The blob itself can be extracted from or added to an image with the ImageMagick convert(1) utility.
    TIFF home page.

    Last updated $Date: 2006/01/03 01:42:30 $. tiff-4.0.3/html/v3.4beta007.html0000644000212300117540000000746706753634101013021 00000000000000 Changes in TIFF v3.4beta007 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • bit order was corrected for Pentium systems
    • a new define, HOST_BIGENDIAN, was added for code that wants to statically use information about native cpu byte order


    CHANGES IN LIBTIFF:
    • the G3/G4 decoder was replaced by a new one that is faster and has smaller state tables
    • Niles Ritter's client tag extension hooks were added
    • a new routine TIFFCurrentDirOffset was added for applications that want to find out the file offset of a TIFF directory
    • the calculation of the number of strips in an image was corected for images with certain esoteric configurations
    • a potential memory leak (very unlikely) was plugged
    • the TIFFReadRGBAImage support was completely rewritten and new, more flexible support was added for reading images into a fixed-format raster
    • YCbCr to RGB conversion done in the TIFFReadRGBAImage support was optimized
    • a bug in JPEG support calculation of strip size was corrected
    • the LZW decoder was changed to initialize the code table to zero to lessen potential problems that arise when invalid data is decoded
    • tiffcomp.h is now aware of OS/2
    • some function prototypes in tiffio.h and tiffiop.h that contained parameter names have been changed to avoid complaints from certain compilers


    CHANGES IN THE PORTABILITY SUPPORT:
    • Makefile.in has been corrected to use the parameters chosen by the configure script


    CHANGES IN THE TOOLS:
    • fax2ps has been rewritten and moved over from the user contributed software
    • an uninitialized variable in pal2rgb has been fixed
    • ras2tiff now converts 24-bit RGB raster data so that samples are written in the proper order
    • tiff2ps has been updated to include fixes and enhancements from Alberto Accomazzi
    • tiffcp now has a -o option to select a directory by file offset
    • tiffinfo is now capable of displaying the raw undecoded image data in a file
    • tiffgt has been rewritten to use the new TIFFRGBAImage support and to handle multiple files
    TIFF home page.

    Sam Leffler / sam@engr.sgi.com Last updated $Date: 1999/08/09 20:21:21 $.
    tiff-4.0.3/html/v4.0.2.html0000644000212300117540000000571212027355722012062 00000000000000 Changes in TIFF v4.0.2 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • None


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • None


    CHANGES IN LIBTIFF:
    • tif_getimage.c: added support for _SEPARATED CMYK images.
    • tif_getimage.c: Added support for greyscale + alpha.
    • Added TIFFCreateCustomDirectory() and TIFFCreateEXIFDirectory() functions.
    • tif_print.c: Lots of fixes around printing corrupt or hostile input.
    • Improve handling of corrupt ycbcrsubsampling values.
    • tif_unix.c: use strerror to get meaningful error messages.
    • tif_jpeg.c: fix serious bugs in JPEGDecodeRaw().
    • tif_jpeg.c: Fix size overflow (zdi-can-1221,CVE-2012-1173).


    CHANGES IN THE TOOLS:
    • tiff2pdf: Defend against integer overflows while calculating required buffer sizes (CVE-2012-2113).


    CHANGES IN THE CONTRIB AREA:
    • None
    Last updated $Date: 2012-06-16 00:19:37 $. tiff-4.0.3/html/v3.4beta036.html0000644000212300117540000001072706753634101013014 00000000000000 Changes in TIFF v3.4beta036 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • support was added for building the library as a DSO under HP-UX with the native C compiler
    • tools are now built with explicit pathnames for the DSO under IRIX, Solaris, and Linux
    • DSO configuration support for Linux was changed to require that libc.so only be readable (not executable)


    CHANGES IN LIBTIFF:
    • support was add for ICC: NumberOfInks, and ICCProfile
    • a memory leak caused by doing TIFFSetDirectory(0) was fixed
    • a bug was fixed whereby certain multi-directory files were not properly handled when accessed by mapping the data into memory
    • the strip chopping support is now always compiled into the library with the default usage controlled by a STRIPCHOP_DEFAULT configuration parameter
    • the strip chopping support no longer chops tiled images
    • all static strings are now const--for shared libraries
    • the logic for estimating the strip size of images without a StripByteCounts tag was improved by handling PlanarContig images differently from PlanarSeparate
    • a bug was fixed in the G3 codec when converting the Y resolution of data specified in metric units
    • a bug was fixed in the G3/G4 decoder for data where lines terminate with a v0 code
    • the TIFFRGBAImage support was changed to scale 16-bit colormap entries more conservatively to avoid problems with applications that do not generate fully saturated pixel values
    • the LZW decoder was changed to use a more conservative scheme when bounds checking the hash table array; this avoids pitfalls with systems that load objects into memory in unusual locations
    • a bug was fixed in TIFFPrintDirectory's handling of the InkNames tag
    • TIFFPrintDirectory now understands NumberOfInks and ICC-related tags
    • the routines for reading image data now provide more useful information when a read error is encountered
    • support was added for compiling with Microsoft Visual C++ 4.0


    CHANGES IN THE TOOLS:
    • a bug was fixed in pal2rgb's colormap handling
    • tiff2ps now includes John Wehle's changes for maintaining the aspect ratio of images when scaling and for honoring the deadzone on a page when generating PostScript Level II
    • tiff2ps does a better job guarding against the mishandling of greyscale images
    • tiff2ps now correctly converts X- and Y-resolution values specified in metric units
    • tiffdump has a new -m option to control the maximum number of indirect data values printed for a tag (by default 24)
    • tiffdump understands several new tags
    • tiffdump now shows any terminating null in ASCII strings
    • tiffinfo now suppresses strip chopping when interpreting an image; a new -z option has been added to enable strip chopping
    TIFF home page.

    Sam Leffler / sam@engr.sgi.com Last updated $Date: 1999/08/09 20:21:21 $.
    tiff-4.0.3/html/v3.5.5.html0000644000212300117540000001160710153177757012101 00000000000000 Changes in TIFF v3.5.5 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • configure: added test for libc6 for linux targets. Bug reported by Stanislav Brabec
    • configure: fixed bugs in sed scripts (applied sed script s:/@:s;@:;s:/s;;:;: to configure). fix submitted by Stanislav Brabec
    • tools/iptcutil was not in files list, and wasn't being added to tar archive. Updated Makefile.in.
    • Added 3.5 docs to html/Makefile.in. Thanks to Stanislav Brabec
    • Fixed tools/tiffcmp so that stopondiff testing works. Patch care of Joseph Orost .
    • Added fax3sm_winnt.c to distribution list in Makefile.in.
    • Added libtiff/libtiff.def to TIFFILES distribution list.


    CHANGES IN LIBTIFF:
    • tif_fax3.c: Fixed serious bug introduced during the uint16->uint32 conversion for the run arrays.
    • Set td_sampleformat default to SAMPLEFORMAT_UINT instead of SAMPLEFORMAT_VOID in TIFFDefaultDirectory() in tif_dir.c.
    • Added "GetDefaulted" support for TIFFTAG_SAMPLEFORMAT in tif_aux.c.
    • Patched tif_fax3.c so that dsp->runs is allocated a bit bigger to avoid overruns encountered with frle_bug.tif.
    • Modified tif_unix.c to support 2-4GB seeks if USE_64BIT_API is set to 1, and added default (off) setting in tiffconf.h. This should eventually be set by the configure script somehow. The original work on all these 2-4GB changes was done by Peter Smith (psmith@creo.com).
    • Modified tif_win32.c to support 2-4GB seeks.
    • tentatively changed toff_t to be unsigned instead of signed to facilitate support for 2-4GB files.
    • Updated a variety of files to use toff_t. Fixed some mixups between toff_t and tsize_t.
    • Set tif_rawdatasize to zero when freeing raw data buffer in TIFFWriteDirectory().
    • Enabled "REWRITE_HACK" in tif_write.c by default.
    • Fix bug in tif_write.c when switching between reading one directory and writing to another.
    • Made TIFFWriteCheck() public, and added TIFFCreateDirectory()
    • Added TIFFmemory(3t) functions to libtiff.def.
    • Added libtiff/libtiff.def to TIFFILES distribution list.


    CHANGES IN THE TOOLS:
    • fax2ps: Fixed mixup of width and height in bounding box statement as per submission by Nalin Dahyabhai .
    • fax2ps: Modified printruns to take uint32 instead of uint16. Patch courtesy of Bernt Herd
    • Largely reimplemented contrib/addtiffo to avoid temp files, updating the TIFF file in place. Fixed a few other bugs to.
    • Altered descriptions in tools to reflect "by default" lzw not supported


    CHANGES IN THE LZW COMPRESSION KIT
    • created mangle-src.sh -- sed scripts to munge src into LZW enabled format. Thanks to Stanislav Brabec
    • created Makefile
    • merged tif_dir.c with current source.
    • Created lzw compression kit, as a new CVS module (libtiff-lzw-compression-kit).
    • Updated index.html to note lzw compression kit.
    TIFF home page.

    Last updated $Date: 2004/11/26 14:37:20 $. tiff-4.0.3/html/v3.7.1.html0000644000212300117540000002000510161624240012046 00000000000000 Changes in TIFF v3.7.1 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • This is mostly bugfix release. Most important fix is the one related to wrong custom tag read/write code.


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • autogen.sh: aclocal and autoheader should be executed after libtoolize. Also add '-I .' to aclocal invocation to check current directory for macros.
    • nmake.opt: Link with the user32.lib in windowed mode. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=697
    • nmake.opt, makefile.vc: make it easier to rename the libtiff DLL.
    • configure, configure.ac: Added --enable-rpath option to embed linker paths into library binary.


    CHANGES IN LIBTIFF:


    CHANGES IN THE TOOLS:
    • fax2ps.c: Be able to extract the first page (#0). As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=690
    • tiff2ps.c: Fixed wrong variable data type when read Position tags (Tristan Hill).
    • tiff2ps.c: Fixed wrong variable data type when read Resolution tags (Peter Fales).
    • tiffset.c: Check the malloc return value (Dmitry V. Levin).


    CHANGES IN THE CONTRIB AREA:
    • No changes.
    Last updated $Date: 2004/12/20 19:31:44 $. tiff-4.0.3/html/v3.7.0alpha.html0000644000212300117540000002161410407147572013075 00000000000000 Changes in TIFF v3.7.0alpha TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • Significant changes in software configuration: we are switched to GNU autotools now.
    • tiffset: tiffset now can set any libtiff supported tags. Tags can be supplied by the mnemonic name or number.


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • Get rid of the old configuration system and switch to GNU autotools.


    CHANGES IN LIBTIFF:


    CHANGES IN THE TOOLS:
    • tiffset: tiffset now can set any libtiff supported tags. Tags can be supplied by the mnemonic name or number.
    • ycbcr.c: fixed main() declaration as per: http://bugzilla.remotesensing.org/show_bug.cgi?id=513.
    • tiffsplit: Don't forget to copy Photometric Interpretation tag.
    • tiffsplit: Fixed problem with unproperly written multibyte files. Now output files will be written using the same byte order flag as in the input image. See .
    • tiffsplit: Copy JPEGTables tag contents for JPEG compressed images. Reported by Artem Mirolubov.
    • tiffcp: Close output file on normal exit.
    • tiffcp: Don't emit warnings when Orientation tag does not present in the input image.
    • tiffcp: Properly set Photometric Interpretation in case of JPEG compression of grayscale images.
    • tiffcp: Fixed problem with wrong interpretation of the InkNames tag as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=466. Memory leak fixed.
    • tiffcp: Fixed problem with wrong Photometric setting for non-RGB images.


    CHANGES IN THE CONTRIB AREA:
    • Outdated stuff removed.
    • Almost all programs are sinchronized with the current libtiff and should compile without problems.
    CHANGES IN THE LZW COMPRESSION KIT:
    • No changes.
    TIFF home page.

    Last updated $Date: 2006/03/18 17:12:47 $. tiff-4.0.3/html/build.html0000644000212300117540000005614211720014737012332 00000000000000 Building the TIFF Software Distribution

    Building the Software Distribution


    This chapter contains step-by-step instructions on how to configure and build the TIFF software distribution. The software is most easily built on a UNIX system, but with a little bit of work it can easily be built and used on other non-UNIX platforms.

    Building on a UNIX System

    To build the software on a UNIX system you need to first run the configure shell script that is located in the top level of the source directory. This script probes the target system for necessary tools and functions and constructs a build environment in which the software may be compiled. Once configuration is done, you simply run make (or gmake) to build the software and then make install to do the installation; for example:
    hyla% cd ./tiff-4.0.0
    hyla% ./configure
        ...lots of messages...
    hyla% make
        ...lots of messages...
    hyla% make check
        ...lots of messages...
    hyla# make install
    
    Supplied makefiles are dependent on a make utility and a C (and optionally a C++ compiler), so you will need these tools.

    In general, the software is designed such that the following should be ``make-able'' in each directory:

    make [all]      build stuff
    make check      run the test suite
    make install    build&install stuff
    make clean      remove .o files, executables and cruft
    make distclean  remove everything, that can be recreated
    
    Note that after running "make distclean" the configure script must be run again to create the Makefiles and other make-related files.

    Build Trees

    There are two schemes for configuring and building the software. If you intend to build the software for only one target system, you can configure the software so that it is built in the same directories as the source code.
    hyla% gzip -dc tiff-4.0.0.tar.gz | tar -xf -
    hyla% cd ./tiff-4.0.0
    hyla% ./configure
    hyla% make
    hyla% make check
    hyla% make install
    

    Otherwise, you can configure a build tree that is parallel to the source tree hierarchy (or in some completely different place) but which contains only configured files and files created during the build procedure.

    hyla% gzip -dc tiff-4.0.0.tar.gz | tar -xf -
    hyla% mkdir tiff-4.0.0-build
    hyla% cd ./tiff-4.0.0-build
    hyla% ../tiff-4.0.0/configure
    hyla% make
    hyla% make check
    hyla% make install
    
    This second scheme is useful for:
    • building multiple targets from a single source tree
    • building from a read-only source tree (e.g. if you receive the distribution on CD-ROM)
    • sharing the source files via a network, but building on multiple systems

    Configuration Options

    The configuration process is critical to the proper compilation, installation, and operation of the software. The configure script runs a series of tests to decide whether or not the target system supports required functionality and, if it does not, whether it can emulate or workaround the missing functions. This procedure is fairly complicated and, due to the nonstandard nature of most UNIX systems, prone to error. The first time that you configure the software for use you should check the output from the configure script and look for anything that does not make sense for your system.

    A second function of the configure script is to set the default configuration parameters for the software. Of particular note are the directories where the software is to be installed. By default the software is installed in the /usr/local hierarchy. To change this behaviour the appropriate parameters can be specified on the command line to configure. Run ./configure --help to get a full list of possible options. Standard installation related options are shown below.

    
    Installation directories:
      --prefix=PREFIX         install architecture-independent files in PREFIX
                              [/usr/local]
      --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                              [PREFIX]
    
    By default, `make install' will install all the files in
    `/usr/local/bin', `/usr/local/lib' etc.  You can specify
    an installation prefix other than `/usr/local' using `--prefix',
    for instance `--prefix=$HOME'.
    
    For better control, use the options below.
    
    Fine tuning of the installation directories:
      --bindir=DIR            user executables [EPREFIX/bin]
      --sbindir=DIR           system admin executables [EPREFIX/sbin]
      --libexecdir=DIR        program executables [EPREFIX/libexec]
      --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
      --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
      --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
      --libdir=DIR            object code libraries [EPREFIX/lib]
      --includedir=DIR        C header files [PREFIX/include]
      --oldincludedir=DIR     C header files for non-gcc [/usr/include]
      --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
      --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
      --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
      --mandir=DIR            man documentation [DATAROOTDIR/man]
      --docdir=DIR            documentation root [DATAROOTDIR/doc/tiff]
      --htmldir=DIR           html documentation [DOCDIR]
    
    Program names:
      --program-prefix=PREFIX            prepend PREFIX to installed program names
      --program-suffix=SUFFIX            append SUFFIX to installed program names
      --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
    
    

    Configuring Optional Packages/Support

    The TIFF software comes with several packages that are installed only as needed, or only if specifically configured at the time the configure script is run. Packages can be configured via the configure script commandline parameters.
    Static/Shared Objects Support
    --enable-shared[=PKGS]    build shared libraries [default=yes]
    --enable-static[=PKGS]    build static libraries [default=yes]

    These options control whether or not to configure the software to build a shared and static binaries for the TIFF library. Use of shared libraries can significantly reduce the disk space needed for users of the TIFF software. If shared libarries are not used then the code is statically linked into each application that uses it. By default both types of binaries is configured.

    --enable-rpath             Enable runtime linker paths (-R libtool option)

    Add library directories (see other options below) to the TIFF library run-time linker path.

    --enable-ld-version-script  Enable linker version script (default is disabled)

    Add shared library symbol versioning on ELF-based systems (e.g. Linux and FreeBSD) which use the GNU linker. This is needed if several major versions of libtiff might be loaded at once into the same program.

    JPEG Support
    --disable-jpeg    disable IJG JPEG library usage (required for JPEG compression, enabled by default) --with-jpeg-include-dir=DIR    location of IJG JPEG library headers --with-jpeg-lib-dir=DIR    location of IJG JPEG library binary)
    The JPEG package enables support for the handling of TIFF images with JPEG-encoded data. Support for JPEG-encoded data requires the Independent JPEG Group (IJG) libjpeg distribution; this software is available at http://www.ijg.org/. configure script automatically tries to search for a working IJG JPEG installation. If it fails to find library, JPEG support will be automatically disabled.If you want specify the exact paths to library binary and headers, use above switches for that.
    ZIP Support
    The ZIP support enables support for the handling of TIFF images with deflate-encoded data. Support for deflate-encoded data requires the freely available zlib distribution written by Jean-loup Gailly and Mark Adler; this software is available at http://www.zlib.org/. If ZIP support is enabled the DIRS_LIBINC and DIR_GZLIB parameters should also be set (see below). By default this package is not configured.

    Building the Software under Windows 95/98/NT/2000 with MS VC++

    With Microsoft Visual C++ installed, and properly configured for commandline use (you will likely need to source VCVARS32.BAT in AUTOEXEC.bAT or somewhere similar) you should be able to use the provided makefile.vc.

    The source package is delivered using Unix line termination conventions, which work with MSVC but do not work with Windows 'notepad'. If you use unzip from the Info-Zip package, you can extract the files using Windows normal line termination conventions with a command similar to:

      unzip -aa -a tiff-4.0.0.zip
    

    By default libtiff expects that a pre-built zlib and jpeg library are provided by the user. If this is not the case, then you may edit libtiff\tiffconf.h using a text editor (e.g. notepad) and comment out the entries for JPEG_SUPPORT, PIXARLOG_SUPPORT, and ZIP_SUPPORT. Ignore the comment at the top of the file which says that it has no influence on the build, because the statement is not true for Windows. However, by taking this approach, libtiff will not be able to open some TIFF files.

    To build using the provided makefile.vc you may use:

      C:\tiff-4.0.0> nmake /f makefile.vc clean
      C:\tiff-4.0.0> nmake /f makefile.vc
    
        or (the hard way)
    
      C:\tiff-4.0.0> cd port
      C:\tiff-4.0.0\port> nmake /f makefile.vc clean
      C:\tiff-4.0.0\port> nmake /f makefile.vc
      C:\tiff-4.0.0> cd ../libtiff
      C:\tiff-4.0.0\libtiff> nmake /f makefile.vc clean
      C:\tiff-4.0.0\libtiff> nmake /f makefile.vc
      C:\tiff-4.0.0\libtiff> cd ..\tools
      C:\tiff-4.0.0\tools> nmake /f makefile.vc clean
      C:\tiff-4.0.0\tools> nmake /f makefile.vc
    

    This will build the library file libtiff\libtiff\libtiff.lib. This can be used in Win32 programs. You may want to adjust the build options before start compiling. All parameters contained in the nmake.opt file.This is a plain text file you can open with your favorite text editor.

    The makefile also builds a DLL (libtiff.dll) with an associated import library (libtiff_i.lib). Any builds using libtiff will need to include the LIBTIFF\LIBTIFF directory in the include path.

    The libtiff\tools\makefile.vc should build .exe's for all the standard TIFF tool programs.


    Building the Software on a VMS System

    The VMS port was done by Karsten Spang (krs@kampsax.dk), who also "sort of" maintains it. The VMS specific files are not in the main directories. Instead they are placed under [.CONTRIB.VMS...] in the distribution tree. Installation: It is assumed that you have unpacked the tar file into a VMS directory tree, in this text called DISK:[TIFF].
    1. Move the VMS specific files to their proper directories.
      $ SET DEFAULT DISK:[TIFF.CONTRIB.VMS]
      $ RENAME [.LIBTIFF]*.* [-.-.LIBTIFF]
      $ RENAME [.TOOLS]*.* [-.-.TOOLS]
      
    2. Compile the library.
      $ SET DEFAULT DISK:[TIFF.LIBTIFF]
      $ @MAKEVMS
      
    3. Compile the tools.
      $ SET DEFAULT DISK:[TIFF.TOOLS]
      $ @MAKEVMS
      
    4. Define the programs.
      $ DEFINE TIFFSHR DISK:[TIFF.LIBTIFF]TIFFSHR
      $ FAX2PS    :==$DISK:[TIFF.TOOLS]FAX2PS
      $ FAX2TIFF  :==$DISK:[TIFF.TOOLS]FAX2TIFF
      $ GIF2TIFF  :==$DISK:[TIFF.TOOLS]GIF2TIFF
      $ PAL2RGB   :==$DISK:[TIFF.TOOLS]PAL2RGB
      $ PPM2TIFF  :==$DISK:[TIFF.TOOLS]PPM2TIFF
      $ RAS2TIFF  :==$DISK:[TIFF.TOOLS]RAS2TIFF
      $ RGB2YCBCR :==$DISK:[TIFF.TOOLS]RGB2YCBCR
      $ THUMBNAIL :==$DISK:[TIFF.TOOLS]THUMBNAIL
      $ TIFF2BW   :==$DISK:[TIFF.TOOLS]TIFF2BW
      $ TIFF2PS   :==$DISK:[TIFF.TOOLS]TIFF2PS
      $ TIFFCMP   :==$DISK:[TIFF.TOOLS]TIFFCMP
      $ TIFFCP    :==$DISK:[TIFF.TOOLS]TIFFCP
      $ TIFFDITHER:==$DISK:[TIFF.TOOLS]TIFFDITHER
      $ TIFFDUMP  :==$DISK:[TIFF.TOOLS]TIFFDUMP
      $ TIFFINFO  :==$DISK:[TIFF.TOOLS]TIFFINFO
      $ TIFFMEDIAN:==$DISK:[TIFF.TOOLS]TIFFMEDIAN
      $ TIFFSPLIT :==$DISK:[TIFF.TOOLS]TIFFSPLIT
      $ YCBCR     :==$DISK:[TIFF.TOOLS]YCBCR
      
    You will want to add these lines to your LOGIN.COM file, after changing the name of the directory that you have used on your machine.

    This release has been tested on OpenVMS/VAX 5.5-2, using VAX C 3.2. A previous release was tested under OpenVMS/AXP ?.? using DEC C ?.?, it is believed that this release as well works on AXP. The code contains some GNU C specific things. This does *not* imply, however, that the VAX/GCC configuration has been tested, *it has not*.

    The command procedures (MAKEVMS.COM) for building the library and tools, is believed to choose the correct options for the VAX and AXP cases automatically.

    On the AXP, IEEE floating point is used by default. If you want VAX floating point, remove the /FLOAT=IEEE_FLOAT qualifier, and change HAVE_IEEEFP=1 to HAVE_IEEEFP=0 in the MAKEVMS.COM files in both the libtiff and tools directories.

    Compiling your own program on a VMS system:

    When compiling a source file in which you "#include <tiffio.h>", use the following command
        $ CC/INCLUDE=DISK:[TIFF.LIBTIFF]
    
    This ensures that the header file is found. On the AXP, also add /FLOAT=IEEE_FLOAT (if used when building the library).

    Linking your own program to the TIFF library on a VMS system:

    You can link to the library in two ways: Either using the shareable library, or using the object library. On the VAX these possibilities are:
    1. Using the shareable TIFF library.
      $ LINK MY_PROGRAM,DISK:[TIFF.LIBTIFF]TIFF/OPTIONS,SYS$INPUT:/OPTIONS
          SYS$SHARE:VAXCRTL/SHAREABLE
      
    2. Using the TIFF object library.
      $ LINK MY_PROGRAM, -
          DISK:[TIFF.LIBTIFF]TIFF/LIBRARY/INCLUDE=(TIF_FAX3SM,TIF_CODEC), -
          SYS$INPUT:/OPTIONS
          SYS$SHARE:VAXCRTL/SHAREABLE
      
    On AXP (and possibly also using DEC C on VAX) the corresponding commands are
    1. Using the shareable TIFF library.
      $ LINK MY_PROGRAM,DISK:[TIFF.LIBTIFF]TIFF/OPTIONS
      
    2. Using the TIFF object library.
      $ LINK MY_PROGRAM,DISK:[TIFF.LIBTIFF]TIFF/LIBRARY
      
    Method 1 uses the shortest link time and smallest .EXE files, but it requires that TIFFSHR is defined as above at link time and at run time. Using the compilation procedure above, the tools are linked in this way.

    Method 2 gives somewhat longer link time and larger .EXE files, but does not require TIFFSHR to be defined. This method is recommended if you want to run your program on another machine, and for some reason don't want to have the library on that machine. If you plan to have more than one program (including the tools) on the machine, it is recommended that you copy the library to the other machine and use method 1.


    Building the Software on Other Systems

    This section contains information that might be useful if you are working on a non-UNIX system that is not directly supported. All library-related files described below are located in the libtiff directory.

    The library requires two files that are generated on-the-fly. The file tif_fax3sm.c has the state tables for the Group 3 and Group 4 decoders. This file is generated by the mkg3states program on a UNIX system; for example,

    
    cd libtiff
    cc -o mkg3states mkg3states.c
    rm -f tif_fax3sm.c
    ./mkg3states -c const tif_fax3sm.c
    
    
    The -c option can be used to control whether or not the resutling tables are generated with a const declaration. The -s option can be used to specify a C storage class for the table declarations. The -b option can be used to force data values to be explicitly bracketed with ``{}'' (apparently needed for some MS-Windows compilers); otherwise the structures are emitted in as compact a format as possible. Consult the source code for this program if you have questions.

    The second file required to build the library, version.h, contains the version information returned by the TIFFGetVersion routine. This file is built on most systems using the mkversion program and the contents of the VERSION and tiff.alpha files; for example,

    cd libtiff
    cc -o mkversion mkversion.c
    rm -f version.h
    ./mkversion -v ../VERSION -a ../dist/tiff.alpha version.h
    

    Otherwise, when building the library on a non-UNIX system be sure to consult the files tiffcomp.h and tiffconf.h. The former contains system compatibility definitions while the latter is provided so that the software configuration can be controlled on systems that do not support the make facility for building the software.

    Systems without a 32-bit compiler may not be able to handle some of the codecs in the library; especially the Group 3 and 4 decoder. If you encounter problems try disabling support for a particular codec; consult the documentation.

    Programs in the tools directory are written to assume an ANSI C compilation environment. There may be a few POSIX'isms as well. The code in the port directory is provided to emulate routines that may be missing on some systems. On UNIX systems the configure script automatically figures out which routines are not present on a system and enables the use of the equivalent emulation routines from the port directory. It may be necessary to manually do this work on a non-UNIX system.


    Checking out the Software

    Assuming you have working versions of tiffgt and tiffsv, you can just use them to view any of the sample images available for testing (see the section on obtaining the test images). Otherwise, you can do a cursory check of the library with the tiffcp and tiffcmp programs. For example,

    tiffcp -lzw cramps.tif x.tif
    tiffcmp cramps.tif x.tif
    

    (tiffcmp should be silent if the files compare correctly).


    Table of Contents

    The following files makup the core library:
    libtiff/tiff.h                  TIFF spec definitions
    libtiff/tiffcomp.h              non-UNIX OS-compatibility definitions
    libtiff/tiffconf.h              non-UNIX configuration definitions
    libtiff/tiffio.h                public TIFF library definitions
    libtiff/tiffiop.h               private TIFF library definitions
    libtiff/t4.h                    CCITT Group 3/4 code tables+definitions
    libtiff/tif_dir.h               private defs for TIFF directory handling
    libtiff/tif_fax3.h              CCITT Group 3/4-related definitions
    libtiff/tif_predict.h           private defs for Predictor tag support
    libtiff/uvcode.h                LogL/LogLuv codec-specific definitions
    libtiff/version.h               version string (generated by Makefile)
    libtiff/tif_apple.c             Apple-related OS support
    libtiff/tif_atari.c             Atari-related OS support
    libtiff/tif_aux.c               auxilary directory-related functions
    libtiff/tif_close.c             close an open TIFF file
    libtiff/tif_codec.c             configuration table of builtin codecs
    libtiff/tif_compress.c          compression scheme support
    libtiff/tif_dir.c               directory tag interface code
    libtiff/tif_dirinfo.c           directory known tag support code
    libtiff/tif_dirread.c           directory reading code
    libtiff/tif_dirwrite.c          directory writing code
    libtiff/tif_dumpmode.c          "no" compression codec
    libtiff/tif_error.c             library error handler
    libtiff/tif_fax3.c              CCITT Group 3 and 4 codec
    libtiff/tif_fax3sm.c            G3/G4 state tables (generated by mkg3states)
    libtiff/tif_flush.c             i/o and directory state flushing
    libtiff/tif_getimage.c          TIFFRGBAImage support
    libtiff/tif_jpeg.c              JPEG codec (interface to the IJG distribution)
    libtiff/tif_luv.c               SGI LogL/LogLuv codec
    libtiff/tif_lzw.c               LZW codec
    libtiff/tif_msdos.c             MSDOS-related OS support
    libtiff/tif_next.c              NeXT 2-bit scheme codec (decoding only)
    libtiff/tif_open.c              open and simply query code
    libtiff/tif_packbits.c          Packbits codec
    libtiff/tif_pixarlog.c          Pixar codec
    libtiff/tif_predict.c           Predictor tag support
    libtiff/tif_print.c             directory printing support
    libtiff/tif_read.c              image data reading support
    libtiff/tif_strip.c             some strip-related code
    libtiff/tif_swab.c              byte and bit swapping support
    libtiff/tif_thunder.c           Thunderscan codec (decoding only)
    libtiff/tif_tile.c              some tile-related code
    libtiff/tif_unix.c              UNIX-related OS support
    libtiff/tif_version.c           library version support
    libtiff/tif_vms.c               VMS-related OS support
    libtiff/tif_warning.c           library warning handler
    libtiff/tif_win3.c              Windows-3.1-related OS support
    libtiff/tif_win32.c             Win32 (95/98/NT) related OS support
    libtiff/tif_write.c             image data writing support
    libtiff/tif_zip.c               Deflate codec
    
    libtiff/mkg3states.c            program to generate G3/G4 decoder state tables
    libtiff/mkspans.c               program to generate black-white span tables
    libtiff/mkversion.c             program to generate libtiff/version.h.
    

    Last updated: $Date: 2012-02-18 21:36:31 $ tiff-4.0.3/html/TIFFTechNote2.html0000644000212300117540000010556207421334160013476 00000000000000
    DRAFT TIFF Technical Note #2				17-Mar-95
    ============================
    
    This Technical Note describes serious problems that have been found in
    TIFF 6.0's design for embedding JPEG-compressed data in TIFF (Section 22
    of the TIFF 6.0 spec of 3 June 1992).  A replacement TIFF/JPEG
    specification is given.  Some corrections to Section 21 are also given.
    
    To permit TIFF implementations to continue to read existing files, the 6.0
    JPEG fields and tag values will remain reserved indefinitely.  However,
    TIFF writers are strongly discouraged from using the 6.0 JPEG design.  It
    is expected that the next full release of the TIFF specification will not
    describe the old design at all, except to note that certain tag numbers
    are reserved.  The existing Section 22 will be replaced by the
    specification text given in the second part of this Tech Note.
    
    
    Problems in TIFF 6.0 JPEG
    =========================
    
    Abandoning a published spec is not a step to be taken lightly.  This
    section summarizes the reasons that have forced this decision.
    TIFF 6.0's JPEG design suffers from design errors and limitations,
    ambiguities, and unnecessary complexity.
    
    
    Design errors and limitations
    -----------------------------
    
    The fundamental design error in the existing Section 22 is that JPEG's
    various tables and parameters are broken out as separate fields which the
    TIFF control logic must manage.  This is bad software engineering: that
    information should be treated as private to the JPEG codec
    (compressor/decompressor).  Worse, the fields themselves are specified
    without sufficient thought for future extension and without regard to
    well-established TIFF conventions.  Here are some of the significant
    problems:
    
    * The JPEGxxTable fields do not store the table data directly in the
    IFD/field structure; rather, the fields hold pointers to information
    elsewhere in the file.  This requires special-purpose code to be added to
    *every* TIFF-manipulating application, whether it needs to decode JPEG
    image data or not.  Even a trivial TIFF editor, for example a program to
    add an ImageDescription field to a TIFF file, must be explicitly aware of
    the internal structure of the JPEG-related tables, or else it will probably
    break the file.  Every other auxiliary field in the TIFF spec contains
    data, not pointers, and can be copied or relocated by standard code that
    doesn't know anything about the particular field.  This is a crucial
    property of the TIFF format that must not be given up.
    
    * To manipulate these fields, the TIFF control logic is required to know a
    great deal about JPEG details, for example such arcana as how to compute
    the length of a Huffman code table --- the length is not supplied in the
    field structure and can only be found by inspecting the table contents.
    This is again a violation of good software practice.  Moreover, it will
    prevent easy adoption of future JPEG extensions that might change these
    low-level details.
    
    * The design neglects the fact that baseline JPEG codecs support only two
    sets of Huffman tables: it specifies a separate table for each color
    component.  This implies that encoders must waste space (by storing
    duplicate Huffman tables) or else violate the well-founded TIFF convention
    that prohibits duplicate pointers.  Furthermore, baseline decoders must
    test to find out which tables are identical, a waste of time and code
    space.
    
    * The JPEGInterchangeFormat field also violates TIFF's proscription against
    duplicate pointers: the normal strip/tile pointers are expected to point
    into the larger data area pointed to by JPEGInterchangeFormat.  All TIFF
    editing applications must be specifically aware of this relationship, since
    they must maintain it or else delete the JPEGInterchangeFormat field.  The
    JPEGxxTables fields are also likely to point into the JPEGInterchangeFormat
    area, creating additional pointer relationships that must be maintained.
    
    * The JPEGQTables field is fixed at a byte per table entry; there is no
    way to support 16-bit quantization values.  This is a serious impediment
    to extending TIFF to use 12-bit JPEG.
    
    * The 6.0 design cannot support using different quantization tables in
    different strips/tiles of an image (so as to encode some areas at higher
    quality than others).  Furthermore, since quantization tables are tied
    one-for-one to color components, the design cannot support table switching
    options that are likely to be added in future JPEG revisions.
    
    
    Ambiguities
    -----------
    
    Several incompatible interpretations are possible for 6.0's treatment of
    JPEG restart markers:
    
      * It is unclear whether restart markers must be omitted at TIFF segment
        (strip/tile) boundaries, or whether they are optional.
    
      * It is unclear whether the segment size is required to be chosen as
        a multiple of the specified restart interval (if any); perhaps the
        JPEG codec is supposed to be reset at each segment boundary as if
        there were a restart marker there, even if the boundary does not fall
        at a multiple of the nominal restart interval.
    
      * The spec fails to address the question of restart marker numbering:
        do the numbers begin again within each segment, or not?
    
    That last point is particularly nasty.  If we make numbering begin again
    within each segment, we give up the ability to impose a TIFF strip/tile
    structure on an existing JPEG datastream with restarts (which was clearly a
    goal of Section 22's authors).  But the other choice interferes with random
    access to the image segments: a reader must compute the first restart
    number to be expected within a segment, and must have a way to reset its
    JPEG decoder to expect a nonzero restart number first.  This may not even
    be possible with some JPEG chips.
    
    The tile height restriction found on page 104 contradicts Section 15's
    general description of tiles.  For an image that is not vertically
    downsampled, page 104 specifies a tile height of one MCU or 8 pixels; but
    Section 15 requires tiles to be a multiple of 16 pixels high.
    
    This Tech Note does not attempt to resolve these ambiguities, so
    implementations that follow the 6.0 design should be aware that
    inter-application compatibility problems are likely to arise.
    
    
    Unnecessary complexity
    ----------------------
    
    The 6.0 design creates problems for implementations that need to keep the
    JPEG codec separate from the TIFF control logic --- for example, consider
    using a JPEG chip that was not designed specifically for TIFF.  JPEG codecs
    generally want to produce or consume a standard ISO JPEG datastream, not
    just raw compressed data.  (If they were to handle raw data, a separate
    out-of-band mechanism would be needed to load tables into the codec.)
    With such a codec, the TIFF control logic must parse JPEG markers emitted
    by the codec to create the TIFF table fields (when writing) or synthesize
    JPEG markers from the TIFF fields to feed the codec (when reading).  This
    means that the control logic must know a great deal more about JPEG details
    than we would like.  The parsing and reconstruction of the markers also
    represents a fair amount of unnecessary work.
    
    Quite a few implementors have proposed writing "TIFF/JPEG" files in which
    a standard JPEG datastream is simply dumped into the file and pointed to
    by JPEGInterchangeFormat.  To avoid parsing the JPEG datastream, they
    suggest not writing the JPEG auxiliary fields (JPEGxxTables etc) nor even
    the basic TIFF strip/tile data pointers.  This approach is incompatible
    with implementations that handle the full TIFF 6.0 JPEG design, since they
    will expect to find strip/tile pointers and auxiliary fields.  Indeed this
    is arguably not TIFF at all, since *all* TIFF-reading applications expect
    to find strip or tile pointers.  A subset implementation that is not
    upward-compatible with the full spec is clearly unacceptable.  However,
    the frequency with which this idea has come up makes it clear that
    implementors find the existing Section 22 too complex.
    
    
    Overview of the solution
    ========================
    
    To solve these problems, we adopt a new design for embedding
    JPEG-compressed data in TIFF files.  The new design uses only complete,
    uninterpreted ISO JPEG datastreams, so it should be much more forgiving of
    extensions to the ISO standard.  It should also be far easier to implement
    using unmodified JPEG codecs.
    
    To reduce overhead in multi-segment TIFF files, we allow JPEG overhead
    tables to be stored just once in a JPEGTables auxiliary field.  This
    feature does not violate the integrity of the JPEG datastreams, because it
    uses the notions of "tables-only datastreams" and "abbreviated image
    datastreams" as defined by the ISO standard.
    
    To prevent confusion with the old design, the new design is given a new
    Compression tag value, Compression=7.  Readers that need to handle
    existing 6.0 JPEG files may read both old and new files, using whatever
    interpretation of the 6.0 spec they did before.  Compression tag value 6
    and the field tag numbers defined by 6.0 section 22 will remain reserved
    indefinitely, even though detailed descriptions of them will be dropped
    from future editions of the TIFF specification.
    
    
    Replacement TIFF/JPEG specification
    ===================================
    
    [This section of the Tech Note is expected to replace Section 22 in the
    next release of the TIFF specification.]
    
    This section describes TIFF compression scheme 7, a high-performance
    compression method for continuous-tone images.
    
    Introduction
    ------------
    
    This TIFF compression method uses the international standard for image
    compression ISO/IEC 10918-1, usually known as "JPEG" (after the original
    name of the standards committee, Joint Photographic Experts Group).  JPEG
    is a joint ISO/CCITT standard for compression of continuous-tone images.
    
    The JPEG committee decided that because of the broad scope of the standard,
    no one algorithmic procedure was able to satisfy the requirements of all
    applications.  Instead, the JPEG standard became a "toolkit" of multiple
    algorithms and optional capabilities.  Individual applications may select
    a subset of the JPEG standard that meets their requirements.
    
    The most important distinction among the JPEG processes is between lossy
    and lossless compression.  Lossy compression methods provide high
    compression but allow only approximate reconstruction of the original
    image.  JPEG's lossy processes allow the encoder to trade off compressed
    file size against reconstruction fidelity over a wide range.  Typically,
    10:1 or more compression of full-color data can be obtained while keeping
    the reconstructed image visually indistinguishable from the original.  Much
    higher compression ratios are possible if a low-quality reconstructed image
    is acceptable.  Lossless compression provides exact reconstruction of the
    source data, but the achievable compression ratio is much lower than for
    the lossy processes; JPEG's rather simple lossless process typically
    achieves around 2:1 compression of full-color data.
    
    The most widely implemented JPEG subset is the "baseline" JPEG process.
    This provides lossy compression of 8-bit-per-channel data.  Optional
    extensions include 12-bit-per-channel data, arithmetic entropy coding for
    better compression, and progressive/hierarchical representations.  The
    lossless process is an independent algorithm that has little in
    common with the lossy processes.
    
    It should be noted that the optional arithmetic-coding extension is subject
    to several US and Japanese patents.  To avoid patent problems, use of
    arithmetic coding processes in TIFF files intended for inter-application
    interchange is discouraged.
    
    All of the JPEG processes are useful only for "continuous tone" data,
    in which the difference between adjacent pixel values is usually small.
    Low-bit-depth source data is not appropriate for JPEG compression, nor
    are palette-color images good candidates.  The JPEG processes work well
    on grayscale and full-color data.
    
    Describing the JPEG compression algorithms in sufficient detail to permit
    implementation would require more space than we have here.  Instead, we
    refer the reader to the References section.
    
    
    What data is being compressed?
    ------------------------------
    
    In lossy JPEG compression, it is customary to convert color source data
    to YCbCr and then downsample it before JPEG compression.  This gives
    2:1 data compression with hardly any visible image degradation, and it
    permits additional space savings within the JPEG compression step proper.
    However, these steps are not considered part of the ISO JPEG standard.
    The ISO standard is "color blind": it accepts data in any color space.
    
    For TIFF purposes, the JPEG compression tag is considered to represent the
    ISO JPEG compression standard only.  The ISO standard is applied to the
    same data that would be stored in the TIFF file if no compression were
    used.  Therefore, if color conversion or downsampling are used, they must
    be reflected in the regular TIFF fields; these steps are not considered to
    be implicit in the JPEG compression tag value.  PhotometricInterpretation
    and related fields shall describe the color space actually stored in the
    file.  With the TIFF 6.0 field definitions, downsampling is permissible
    only for YCbCr data, and it must correspond to the YCbCrSubSampling field.
    (Note that the default value for this field is not 1,1; so the default for
    YCbCr is to apply downsampling!)  It is likely that future versions of TIFF
    will provide additional PhotometricInterpretation values and a more general
    way of defining subsampling, so as to allow more flexibility in
    JPEG-compressed files.  But that issue is not addressed in this Tech Note.
    
    Implementors should note that many popular JPEG codecs
    (compressor/decompressors) provide automatic color conversion and
    downsampling, so that the application may supply full-size RGB data which
    is nonetheless converted to downsampled YCbCr.  This is an implementation
    convenience which does not excuse the TIFF control layer from its
    responsibility to know what is really going on.  The
    PhotometricInterpretation and subsampling fields written to the file must
    describe what is actually in the file.
    
    A JPEG-compressed TIFF file will typically have PhotometricInterpretation =
    YCbCr and YCbCrSubSampling = [2,1] or [2,2], unless the source data was
    grayscale or CMYK.
    
    
    Basic representation of JPEG-compressed images
    ----------------------------------------------
    
    JPEG compression works in either strip-based or tile-based TIFF files.
    Rather than repeating "strip or tile" constantly, we will use the term
    "segment" to mean either a strip or a tile.
    
    When the Compression field has the value 7, each image segment contains
    a complete JPEG datastream which is valid according to the ISO JPEG
    standard (ISO/IEC 10918-1).  Any sequential JPEG process can be used,
    including lossless JPEG, but progressive and hierarchical processes are not
    supported.  Since JPEG is useful only for continuous-tone images, the
    PhotometricInterpretation of the image shall not be 3 (palette color) nor
    4 (transparency mask).  The bit depth of the data is also restricted as
    specified below.
    
    Each image segment in a JPEG-compressed TIFF file shall contain a valid
    JPEG datastream according to the ISO JPEG standard's rules for
    interchange-format or abbreviated-image-format data.  The datastream shall
    contain a single JPEG frame storing that segment of the image.  The
    required JPEG markers within a segment are:
    	SOI	(must appear at very beginning of segment)
    	SOFn
    	SOS	(one for each scan, if there is more than one scan)
    	EOI	(must appear at very end of segment)
    The actual compressed data follows SOS; it may contain RSTn markers if DRI
    is used.
    
    Additional JPEG "tables and miscellaneous" markers may appear between SOI
    and SOFn, between SOFn and SOS, and before each subsequent SOS if there is
    more than one scan.  These markers include:
    	DQT
    	DHT
    	DAC	(not to appear unless arithmetic coding is used)
    	DRI
    	APPn	(shall be ignored by TIFF readers)
    	COM	(shall be ignored by TIFF readers)
    DNL markers shall not be used in TIFF files.  Readers should abort if any
    other marker type is found, especially the JPEG reserved markers;
    occurrence of such a marker is likely to indicate a JPEG extension.
    
    The tables/miscellaneous markers may appear in any order.  Readers are
    cautioned that although the SOFn marker refers to DQT tables, JPEG does not
    require those tables to precede the SOFn, only the SOS.  Missing-table
    checks should be made when SOS is reached.
    
    If no JPEGTables field is used, then each image segment shall be a complete
    JPEG interchange datastream.  Each segment must define all the tables it
    references.  To allow readers to decode segments in any order, no segment
    may rely on tables being carried over from a previous segment.
    
    When a JPEGTables field is used, image segments may omit tables that have
    been specified in the JPEGTables field.  Further details appear below.
    
    The SOFn marker shall be of type SOF0 for strict baseline JPEG data, of
    type SOF1 for non-baseline lossy JPEG data, or of type SOF3 for lossless
    JPEG data.  (SOF9 or SOF11 would be used for arithmetic coding.)  All
    segments of a JPEG-compressed TIFF image shall use the same JPEG
    compression process, in particular the same SOFn type.
    
    The data precision field of the SOFn marker shall agree with the TIFF
    BitsPerSample field.  (Note that when PlanarConfiguration=1, this implies
    that all components must have the same BitsPerSample value; when
    PlanarConfiguration=2, different components could have different bit
    depths.)  For SOF0 only precision 8 is permitted; for SOF1, precision 8 or
    12 is permitted; for SOF3, precisions 2 to 16 are permitted.
    
    The image dimensions given in the SOFn marker shall agree with the logical
    dimensions of that particular strip or tile.  For strip images, the SOFn
    image width shall equal ImageWidth and the height shall equal RowsPerStrip,
    except in the last strip; its SOFn height shall equal the number of rows
    remaining in the ImageLength.  (In other words, no padding data is counted
    in the SOFn dimensions.)  For tile images, each SOFn shall have width
    TileWidth and height TileHeight; adding and removing any padding needed in
    the edge tiles is the concern of some higher level of the TIFF software.
    (The dimensional rules are slightly different when PlanarConfiguration=2,
    as described below.)
    
    The ISO JPEG standard only permits images up to 65535 pixels in width or
    height, due to 2-byte fields in the SOFn markers.  In TIFF, this limits
    the size of an individual JPEG-compressed strip or tile, but the total
    image size can be greater.
    
    The number of components in the JPEG datastream shall equal SamplesPerPixel
    for PlanarConfiguration=1, and shall be 1 for PlanarConfiguration=2.  The
    components shall be stored in the same order as they are described at the
    TIFF field level.  (This applies both to their order in the SOFn marker,
    and to the order in which they are scanned if multiple JPEG scans are
    used.)  The component ID bytes are arbitrary so long as each component
    within an image segment is given a distinct ID.  To avoid any possible
    confusion, we require that all segments of a TIFF image use the same ID
    code for a given component.
    
    In PlanarConfiguration 1, the sampling factors given in SOFn markers shall
    agree with the sampling factors defined by the related TIFF fields (or with
    the default values that are specified in the absence of those fields).
    
    When DCT-based JPEG is used in a strip TIFF file, RowsPerStrip is required
    to be a multiple of 8 times the largest vertical sampling factor, i.e., a
    multiple of the height of an interleaved MCU.  (For simplicity of
    specification, we require this even if the data is not actually
    interleaved.)  For example, if YCbCrSubSampling = [2,2] then RowsPerStrip
    must be a multiple of 16.  An exception to this rule is made for
    single-strip images (RowsPerStrip >= ImageLength): the exact value of
    RowsPerStrip is unimportant in that case.  This rule ensures that no data
    padding is needed at the bottom of a strip, except perhaps the last strip.
    Any padding required at the right edge of the image, or at the bottom of
    the last strip, is expected to occur internally to the JPEG codec.
    
    When DCT-based JPEG is used in a tiled TIFF file, TileLength is required
    to be a multiple of 8 times the largest vertical sampling factor, i.e.,
    a multiple of the height of an interleaved MCU; and TileWidth is required
    to be a multiple of 8 times the largest horizontal sampling factor, i.e.,
    a multiple of the width of an interleaved MCU.  (For simplicity of
    specification, we require this even if the data is not actually
    interleaved.)  All edge padding required will therefore occur in the course
    of normal TIFF tile padding; it is not special to JPEG.
    
    Lossless JPEG does not impose these constraints on strip and tile sizes,
    since it is not DCT-based.
    
    Note that within JPEG datastreams, multibyte values appear in the MSB-first
    order specified by the JPEG standard, regardless of the byte ordering of
    the surrounding TIFF file.
    
    
    JPEGTables field
    ----------------
    
    The only auxiliary TIFF field added for Compression=7 is the optional
    JPEGTables field.  The purpose of JPEGTables is to predefine JPEG
    quantization and/or Huffman tables for subsequent use by JPEG image
    segments.  When this is done, these rather bulky tables need not be
    duplicated in each segment, thus saving space and processing time.
    JPEGTables may be used even in a single-segment file, although there is no
    space savings in that case.
    
    JPEGTables:
    	Tag = 347 (15B.H)
    	Type = UNDEFINED
    	N = number of bytes in tables datastream, typically a few hundred
    JPEGTables provides default JPEG quantization and/or Huffman tables which
    are used whenever a segment datastream does not contain its own tables, as
    specified below.
    
    Notice that the JPEGTables field is required to have type code UNDEFINED,
    not type code BYTE.  This is to cue readers that expanding individual bytes
    to short or long integers is not appropriate.  A TIFF reader will generally
    need to store the field value as an uninterpreted byte sequence until it is
    fed to the JPEG decoder.
    
    Multibyte quantities within the tables follow the ISO JPEG convention of
    MSB-first storage, regardless of the byte ordering of the surrounding TIFF
    file.
    
    When the JPEGTables field is present, it shall contain a valid JPEG
    "abbreviated table specification" datastream.  This datastream shall begin
    with SOI and end with EOI.  It may contain zero or more JPEG "tables and
    miscellaneous" markers, namely:
    	DQT
    	DHT
    	DAC	(not to appear unless arithmetic coding is used)
    	DRI
    	APPn	(shall be ignored by TIFF readers)
    	COM	(shall be ignored by TIFF readers)
    Since JPEG defines the SOI marker to reset the DAC and DRI state, these two
    markers' values cannot be carried over into any image datastream, and thus
    they are effectively no-ops in the JPEGTables field.  To avoid confusion,
    it is recommended that writers not place DAC or DRI markers in JPEGTables.
    However readers must properly skip over them if they appear.
    
    When JPEGTables is present, readers shall load the table specifications
    contained in JPEGTables before processing image segment datastreams.
    Image segments may simply refer to these preloaded tables without defining
    them.  An image segment can still define and use its own tables, subject to
    the restrictions below.
    
    An image segment may not redefine any table defined in JPEGTables.  (This
    restriction is imposed to allow readers to process image segments in random
    order without having to reload JPEGTables between segments.)  Therefore, use
    of JPEGTables divides the available table slots into two groups: "global"
    slots are defined in JPEGTables and may be used but not redefined by
    segments; "local" slots are available for local definition and use in each
    segment.  To permit random access, a segment may not reference any local
    tables that it does not itself define.
    
    
    Special considerations for PlanarConfiguration 2
    ------------------------------------------------
    
    In PlanarConfiguration 2, each image segment contains data for only one
    color component.  To avoid confusing the JPEG codec, we wish the segments
    to look like valid single-channel (i.e., grayscale) JPEG datastreams.  This
    means that different rules must be used for the SOFn parameters.
    
    In PlanarConfiguration 2, the dimensions given in the SOFn of a subsampled
    component shall be scaled down by the sampling factors compared to the SOFn
    dimensions that would be used in PlanarConfiguration 1.  This is necessary
    to match the actual number of samples stored in that segment, so that the
    JPEG codec doesn't complain about too much or too little data.  In strip
    TIFF files the computed dimensions may need to be rounded up to the next
    integer; in tiled files, the restrictions on tile size make this case
    impossible.
    
    Furthermore, all SOFn sampling factors shall be given as 1.  (This is
    merely to avoid confusion, since the sampling factors in a single-channel
    JPEG datastream have no real effect.)
    
    Any downsampling will need to happen externally to the JPEG codec, since
    JPEG sampling factors are defined with reference to the full-precision
    component.  In PlanarConfiguration 2, the JPEG codec will be working on
    only one component at a time and thus will have no reference component to
    downsample against.
    
    
    Minimum requirements for TIFF/JPEG
    ----------------------------------
    
    ISO JPEG is a large and complex standard; most implementations support only
    a subset of it.  Here we define a "core" subset of TIFF/JPEG which readers
    must support to claim TIFF/JPEG compatibility.  For maximum
    cross-application compatibility, we recommend that writers confine
    themselves to this subset unless there is very good reason to do otherwise.
    
    Use the ISO baseline JPEG process: 8-bit data precision, Huffman coding,
    with no more than 2 DC and 2 AC Huffman tables.  Note that this implies
    BitsPerSample = 8 for each component.  We recommend deviating from baseline
    JPEG only if 12-bit data precision or lossless coding is required.
    
    Use no subsampling (all JPEG sampling factors = 1) for color spaces other
    than YCbCr.  (This is, in fact, required with the TIFF 6.0 field
    definitions, but may not be so in future revisions.)  For YCbCr, use one of
    the following choices:
    	YCbCrSubSampling field		JPEG sampling factors
    	1,1				1h1v, 1h1v, 1h1v
    	2,1				2h1v, 1h1v, 1h1v
    	2,2  (default value)		2h2v, 1h1v, 1h1v
    We recommend that RGB source data be converted to YCbCr for best compression
    results.  Other source data colorspaces should probably be left alone.
    Minimal readers need not support JPEG images with colorspaces other than
    YCbCr and grayscale (PhotometricInterpretation = 6 or 1).
    
    A minimal reader also need not support JPEG YCbCr images with nondefault
    values of YCbCrCoefficients or YCbCrPositioning, nor with values of
    ReferenceBlackWhite other than [0,255,128,255,128,255].  (These values
    correspond to the RGB<=>YCbCr conversion specified by JFIF, which is widely
    implemented in JPEG codecs.)
    
    Writers are reminded that a ReferenceBlackWhite field *must* be included
    when PhotometricInterpretation is YCbCr, because the default
    ReferenceBlackWhite values are inappropriate for YCbCr.
    
    If any subsampling is used, PlanarConfiguration=1 is preferred to avoid the
    possibly-confusing requirements of PlanarConfiguration=2.  In any case,
    readers are not required to support PlanarConfiguration=2.
    
    If possible, use a single interleaved scan in each image segment.  This is
    not legal JPEG if there are more than 4 SamplesPerPixel or if the sampling
    factors are such that more than 10 blocks would be needed per MCU; in that
    case, use a separate scan for each component.  (The recommended color
    spaces and sampling factors will not run into that restriction, so a
    minimal reader need not support more than one scan per segment.)
    
    To claim TIFF/JPEG compatibility, readers shall support multiple-strip TIFF
    files and the optional JPEGTables field; it is not acceptable to read only
    single-datastream files.  Support for tiled TIFF files is strongly
    recommended but not required.
    
    
    Other recommendations for implementors
    --------------------------------------
    
    The TIFF tag Compression=7 guarantees only that the compressed data is
    represented as ISO JPEG datastreams.  Since JPEG is a large and evolving
    standard, readers should apply careful error checking to the JPEG markers
    to ensure that the compression process is within their capabilities.  In
    particular, to avoid being confused by future extensions to the JPEG
    standard, it is important to abort if unknown marker codes are seen.
    
    The point of requiring that all image segments use the same JPEG process is
    to ensure that a reader need check only one segment to determine whether it
    can handle the image.  For example, consider a TIFF reader that has access
    to fast but restricted JPEG hardware, as well as a slower, more general
    software implementation.  It is desirable to check only one image segment
    to find out whether the fast hardware can be used.  Thus, writers should
    try to ensure that all segments of an image look as much "alike" as
    possible: there should be no variation in scan layout, use of options such
    as DRI, etc.  Ideally, segments will be processed identically except
    perhaps for using different local quantization or entropy-coding tables.
    
    Writers should avoid including "noise" JPEG markers (COM and APPn markers).
    Standard TIFF fields provide a better way to transport any non-image data.
    Some JPEG codecs may change behavior if they see an APPn marker they
    think they understand; since the TIFF spec requires these markers to be
    ignored, this behavior is undesirable.
    
    It is possible to convert an interchange-JPEG file (e.g., a JFIF file) to
    TIFF simply by dropping the interchange datastream into a single strip.
    (However, designers are reminded that the TIFF spec discourages huge
    strips; splitting the image is somewhat more work but may give better
    results.)  Conversion from TIFF to interchange JPEG is more complex.  A
    strip-based TIFF/JPEG file can be converted fairly easily if all strips use
    identical JPEG tables and no RSTn markers: just delete the overhead markers
    and insert RSTn markers between strips.  Converting tiled images is harder,
    since the data will usually not be in the right order (unless the tiles are
    only one MCU high).  This can still be done losslessly, but it will require
    undoing and redoing the entropy coding so that the DC coefficient
    differences can be updated.
    
    There is no default value for JPEGTables: standard TIFF files must define all
    tables that they reference.  For some closed systems in which many files will
    have identical tables, it might make sense to define a default JPEGTables
    value to avoid actually storing the tables.  Or even better, invent a
    private field selecting one of N default JPEGTables settings, so as to allow
    for future expansion.  Either of these must be regarded as a private
    extension that will render the files unreadable by other applications.
    
    
    References
    ----------
    
    [1] Wallace, Gregory K.  "The JPEG Still Picture Compression Standard",
    Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44.
    
    This is the best short technical introduction to the JPEG algorithms.
    It is a good overview but does not provide sufficiently detailed
    information to write an implementation.
    
    [2] Pennebaker, William B. and Mitchell, Joan L.  "JPEG Still Image Data
    Compression Standard", Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.
    638pp.
    
    This textbook is by far the most complete exposition of JPEG in existence.
    It includes the full text of the ISO JPEG standards (DIS 10918-1 and draft
    DIS 10918-2).  No would-be JPEG implementor should be without it.
    
    [3] ISO/IEC IS 10918-1, "Digital Compression and Coding of Continuous-tone
    Still Images, Part 1: Requirements and guidelines", February 1994.
    ISO/IEC DIS 10918-2, "Digital Compression and Coding of Continuous-tone
    Still Images, Part 2: Compliance testing", final approval expected 1994.
    
    These are the official standards documents.  Note that the Pennebaker and
    Mitchell textbook is likely to be cheaper and more useful than the official
    standards.
    
    
    Changes to Section 21: YCbCr Images
    ===================================
    
    [This section of the Tech Note clarifies section 21 to make clear the
    interpretation of image dimensions in a subsampled image.  Furthermore,
    the section is changed to allow the original image dimensions not to be
    multiples of the sampling factors.  This change is necessary to support use
    of JPEG compression on odd-size images.]
    
    Add the following paragraphs to the Section 21 introduction (p. 89),
    just after the paragraph beginning "When a Class Y image is subsampled":
    
    	In a subsampled image, it is understood that all TIFF image
    	dimensions are measured in terms of the highest-resolution
    	(luminance) component.  In particular, ImageWidth, ImageLength,
    	RowsPerStrip, TileWidth, TileLength, XResolution, and YResolution
    	are measured in luminance samples.
    
    	RowsPerStrip, TileWidth, and TileLength are constrained so that
    	there are an integral number of samples of each component in a
    	complete strip or tile.  However, ImageWidth/ImageLength are not
    	constrained.  If an odd-size image is to be converted to subsampled
    	format, the writer should pad the source data to a multiple of the
    	sampling factors by replication of the last column and/or row, then
    	downsample.  The number of luminance samples actually stored in the
    	file will be a multiple of the sampling factors.  Conversely,
    	readers must ignore any extra data (outside the specified image
    	dimensions) after upsampling.
    
    	When PlanarConfiguration=2, each strip or tile covers the same
    	image area despite subsampling; that is, the total number of strips
    	or tiles in the image is the same for each component.  Therefore
    	strips or tiles of the subsampled components contain fewer samples
    	than strips or tiles of the luminance component.
    
    	If there are extra samples per pixel (see field ExtraSamples),
    	these data channels have the same number of samples as the
    	luminance component.
    
    Rewrite the YCbCrSubSampling field description (pp 91-92) as follows
    (largely to eliminate possibly-misleading references to
    ImageWidth/ImageLength of the subsampled components):
    
    	(first paragraph unchanged)
    
    	The two elements of this field are defined as follows:
    
    	Short 0: ChromaSubsampleHoriz:
    
    	1 = there are equal numbers of luma and chroma samples horizontally.
    
    	2 = there are twice as many luma samples as chroma samples
    	horizontally.
    
    	4 = there are four times as many luma samples as chroma samples
    	horizontally.
    
    	Short 1: ChromaSubsampleVert:
    
    	1 = there are equal numbers of luma and chroma samples vertically.
    
    	2 = there are twice as many luma samples as chroma samples
    	vertically.
    
    	4 = there are four times as many luma samples as chroma samples
    	vertically.
    
    	ChromaSubsampleVert shall always be less than or equal to
    	ChromaSubsampleHoriz.  Note that Cb and Cr have the same sampling
    	ratios.
    
    	In a strip TIFF file, RowsPerStrip is required to be an integer
    	multiple of ChromaSubSampleVert (unless RowsPerStrip >=
    	ImageLength, in which case its exact value is unimportant).
    	If ImageWidth and ImageLength are not multiples of
    	ChromaSubsampleHoriz and ChromaSubsampleVert respectively, then the
    	source data shall be padded to the next integer multiple of these
    	values before downsampling.
    
    	In a tiled TIFF file, TileWidth must be an integer multiple of
    	ChromaSubsampleHoriz and TileLength must be an integer multiple of
    	ChromaSubsampleVert.  Padding will occur to tile boundaries.
    
    	The default values of this field are [ 2,2 ].  Thus, YCbCr data is
    	downsampled by default!
    
    tiff-4.0.3/html/misc.html0000644000212300117540000000736610573703012012166 00000000000000 Acknowledgments and Other Issues

    Acknowledgments and Other Issues

    Silicon Graphics has seen fit to allow us to give this work away. It is free. There is no support or guarantee of any sort as to its operations, correctness, or whatever. If you do anything useful with all or parts of it you need to honor the copyright notices. It would also be nice to be acknowledged.


    Acknowledgements

    The libtiff software was written by Sam Leffler while working for Silicon Graphics.

    The LZW algorithm is derived from the compress program (the proper attribution is included in the source code). The Group 3 fax stuff originated as code from Jef Poskanzer, but has since been rewritten several times. The latest version uses an algorithm from Frank Cringle -- consult libtiff/mkg3states.c and libtiff/tif_fax3.h for further information. The JPEG support was written by Tom Lane and is dependent on the excellent work of Tom Lane and the Independent JPEG Group (IJG) who distribute their work under friendly licensing similar to this software. Joris Van Damme implemented the robust Old JPEG decoder (as included in libtiff since version 3.9.0, there was another Old JPEG module in older releases, which was incomplete and unsuitable for many existing images of that format). JBIG module was written by Lee Howard and depends on JBIG library from the Markus Kuhn. Many other people have by now helped with bug fixes and code; a few of the more persistent contributors have been:

        Bjorn P. Brox
        Dan McCoy
        J.T. Conklin                
        Richard Minner
        Frank D. Cringle        
        Richard Mlynarik
        Soren Pingel Dalsgaard  
        Niles Ritter
        Steve Johnson           
        Karsten Spang
        Tom Lane               
        Peter Smith
        Brent Roman            
        Mike Welles
        Frank Warmerdam
        Greg Ward
        Stanislav Brabec        
        Roman Shpount
        Peter Skarpetis        
        Arvan Pritchard
        Bernt Herd             
        Joseph Orost
        Phil Beffery           
        Ivo Penzar
        Francois Dagand        
        Albert Chin-A-Young
        Bruce A. Mallett
        Dwight Kelly
        Andrey Kiselev
        Ross Finlayson
        Dmitry V. Levin
        Bob Friesenhahn
        Lee Howard
        Joris Van Damme
        Tavis Ormandy
        Richard Nolde
    
    (my apology to anyone that was inadvertently not listed.)

    Use and Copyright

    Copyright (c) 1988-1997 Sam Leffler
    Copyright (c) 1991-1997 Silicon Graphics, Inc.
    
    Permission to use, copy, modify, distribute, and sell this software and 
    its documentation for any purpose is hereby granted without fee, provided
    that (i) the above copyright notices and this permission notice appear in
    all copies of the software and related documentation, and (ii) the names of
    Sam Leffler and Silicon Graphics may not be used in any advertising or
    publicity relating to the software without the specific, prior written
    permission of Sam Leffler and Silicon Graphics.
    
    THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
    EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
    WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
    
    IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
    ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
    OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
    WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
    LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
    OF THIS SOFTWARE.
    


    Last updated: $Date: 2007/02/24 15:47:04 $ tiff-4.0.3/html/v3.7.0.html0000644000212300117540000001010010166653060012047 00000000000000 Changes in TIFF v3.7.0 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • Several bugs found after 3.7.0beta2 release were fixed.


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • ltmain.sh: Fix for MinGW compilation.


    CHANGES IN LIBTIFF:
    • libtiff/{tif_dirread.c, tif_jpeg.c, tif_luv.c, tif_ojpeg.c, tif_pixarlog.c, tif_write.c}: Handle the zero strip/tile sizes properly (Dmitry V. Levin, Marcus Meissner).
    • libtiff/tif_dirinfo.c: Type of the TIFFTAG_SUBIFD field changed to TIFF_IFD.
    • Preliminary support for BigTIFF files: now libtiff can recognize and reject to open such images. ;-)
    • libtiff/tif_dir.c: Initialize td_tilewidth and td_tilelength fields of the TIFFDirectory structure with the 0 instead of -1 to avoid confusing integer overflows in TIFFTileRowSize() for striped images.
    • libtiff/tif_dir.c: Initialize td_tilewidth and td_tilelength fields of the TIFFDirectory structure with the 0 instead of -1 to avoid confusing integer overflows in TIFFTileRowSize() for striped images.
    • libtiff/tif_dirinfo.c: Fix bug with tif_foundfield and reallocation of tif_fieldinfo as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=630
    • libtiff/tif_compress.c: Improved error reporting in TIFFGetConfiguredCODECs() (Dmitry V. Levin).


    CHANGES IN THE TOOLS:
    • tiffcmp.c (leof): Renamed from 'eof' in order to avoid conflict noticed under MinGW.
    • tiff2pdf.c: Fixed TransferFunction tag handling reported by Ross A. Finlayson.


    CHANGES IN THE CONTRIB AREA:
    • No changes.
    CHANGES IN THE LZW COMPRESSION KIT:
    • This one is not longer needed.
    TIFF home page.

    Last updated $Date: 2004/12/20 19:31:44 $. tiff-4.0.3/html/tools.html0000644000212300117540000001514111272141021012352 00000000000000 TIFF Tools Overview

    TIFF Tools Overview

    This software distribution comes with a small collection of programs for converting non-TIFF format images to TIFF and for manipulating and interrogating the contents of TIFF images. Several of these tools are useful in their own right. Many of them however are more intended to serve as programming examples for using the TIFF library.

    Device-dependent Programs

    There are two device-dependent programs that serve as simple examples for writing programs to display and save TIFF images.
    tiffgt     Display the contents of one or more TIFF images using OpenGL. The software makes extensive use of the TIFFRGBAImage facilities described elsewhere.
    tiffsv A program to save all or part of a screen dump on a Silicon Graphics system. As for tiffgt this code, while written to use the IRIS GL, can be easily tailored to other devices.

    Device-independent Programs

    The remaining programs should be device-independent:
    bmp2tiff Convert BMP images to TIFF
    fax2ps Convert a Group 3- or Group 4- compressed TIFF to PostScript that is significantly more compressed than is generated by tiff2ps (unless tiff2ps writes PS Level II)
    fax2tiff Convert raw Group 3 or Group 4 facsimile data to TIFF
    gif2tiff A quick hack that converts GIF 87a (old) format images to TIFF
    pal2rgb Convert a Palette-style image to a full color RGB image by applying the colormap
    ppm2tiff A quick hack that converts 8-bit PPM format images to TIFF
    ras2tiff A quick hack that converts Sun rasterfile format images to TIFF -- it's less than complete
    raw2tiff Create a TIFF file from raw data
    rgb2ycbcr Convert an RGB, grayscale, or bilevel TIFF image to a YCbCr TIFF image; it's mainly provided for testing
    sgi2tiff A program to convert SGI image files to TIFF. This program is only useful on SGI machines as it uses -limage.
    thumbnail Copy a bilevel TIFF to one that includes 8-bit greyscale "thumbnail images" for each page; it is provided as an example of how one might use the SubIFD tag (and the library support for it)
    tiff2bw A simple program to convert a color image to grayscale
    tiff2pdf Convert TIFF images to PDF
    tiff2ps Convert TIFF images to PostScript
    tiff2rgba Convert a TIFF image to RGBA color space
    tiffcmp Compare the contents of two TIFF files (it does not check all the directory information, but does check all the data)
    tiffcp Copy, concatenate, and convert TIFF images (e.g. switching from Compression=5 to Compression=1)
    tiffcrop Provides selection of images from within one or more multi-image TIFF files, with orthogonal rotation, mirroring, cropping, and extraction of multiple sections and exporting to one or more files. It extends the functionality of tiffcp to support additional bit depths in strips and tiles and enhances the selection capabilities of tiffsplit. Bilevel images can be inverted and images may be split into segments to fit on multiple /pages/ (standard paper sizes), plus other functions described in the tiffcrop man page
    tiffdither Dither a b&w image into a bilevel image (suitable for use in creating fax files)
    tiffdump Display the verbatim contents of the TIFF directory in a file (it's very useful for debugging bogus files that you may get from someone that claims they support TIFF)
    tiffinfo Display information about one or more TIFF files.
    tiffmedian A version of Paul Heckbert's median cut program that reads an RGB TIFF image, and creates a TIFF palette file as a result
    tiffset Set a field in a TIFF header
    tiffsplit Create one or more single-image files from a (possibly) multi-image file

    Check out the manual pages for details about the above programs.


    Last updated: $Date: 2009-10-28 22:13:37 $ tiff-4.0.3/html/v3.4beta016.html0000644000212300117540000000766706753634101013023 00000000000000 Changes in TIFF v3.4beta016 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • support was added for configuring the Deflate codec
    • support was added for the HTML documentation
    • codecs that are not configured for inclusion in the library are no longer compiled


    CHANGES IN LIBTIFF:
    • support was added for registering new codecs external to the library and for overriding the codecs that are builtin to the library
    • emulation support for the old DataType tag was improved
    • suppport was added for the SMinSampleValue and SMaxSampleValue tags
    • the library no longer ignores TileWidth and TileLength tags whose values are not a multiple of 16 (per the spec); this permits old, improperly written, images to be read
    • the support for the Predictor tag was placed in a reusable module so that it can be shared by multiple codecs
    • experimental compression support was added for the Deflate algorithm (using the freely available zlib package)
    • a new routine, TIFFWriteBufferSetup was added a la the routine TIFFReadBufferSetup
    • the DSO version of the library is now statically linked with the JPEG and Deflate libraries; this means applications that link against the DSO do not also need to link against these ancillary libraries


    CHANGES IN THE TOOLS:
    • all the tools now use common code to process compress-oriented arguments
    • tiffdump should now compile on a Macintosh with MPW


    CHANGES IN THE MANUAL PAGES:
    • everything was updated


    CHANGES IN THE DOCUMENTATION:
    • everything was updated


    CHANGES IN CONTRIBUTED SOFTWARE:
    • contrib/dbs/xtiff was made to compile
    • contrib/mac-mpw is new support for compiling the software on a Macintosh under MPW; consult the documentation for details
    • contrib/tags is information on how to use the tag extenion facilities; consult contrib/tags/README for details
    TIFF home page.

    Sam Leffler / sam@engr.sgi.com Last updated $Date: 1999/08/09 20:21:21 $.
    tiff-4.0.3/html/v3.7.4.html0000644000212300117540000001025110344151060012051 00000000000000 Changes in TIFF v3.7.4 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • Fixed important bug in custom tags handling code..


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • Applied patch from Patrick Welche (all scripts moved in the 'config' and 'm4' directories).
    • SConstruct, libtiff/SConstruct: Added the first very preliminary support for SCons software building tool (http://www.scons.org/). This is experimental infrastructure and it will exist along with the autotools stuff.
    • port/lfind.c: Added lfind() replacement module.


    CHANGES IN LIBTIFF:
    • tif_dir.c: When prefreeing tv->value in TIFFSetFieldV also set it to NULL to avoid double free when re-setting custom string fields as per: http://bugzilla.remotesensing.org/show_bug.cgi?id=922
    • tif_dir.c: Fixed up support for swapping "double complex" values (128 bits as 2 64 bits doubles). GDAL gcore tests now pass on bigendian (macosx) system.
    • libtiff/{tif_dirread.c, tif_dirinfo.c}: Do not upcast BYTEs to SHORTs in the TIFFFetchByteArray(). Remove TIFFFetchExtraSamples() function, use TIFFFetchNormalTag() instead as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=831 Remove TIFFFetchExtraSamples() function, use TIFFFetchNormalTag() instead.
    • tif_print.c: Fixed printing of the BYTE and SBYTE arrays.
    • tif_write.c: Do not check the PlanarConfiguration field in the TIFFWriteCheck() function in case of single band images (as per TIFF spec).
    • libtiff/{tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_print.c}: Make FieldOfViewCotangent, MatrixWorldToScreen, MatrixWorldToCamera, ImageFullWidth, ImageFullLength and PrimaryChromaticities tags custom.


    CHANGES IN THE TOOLS:
    • tiffcp.c: Fixed WhitePoint tag copying.


    CHANGES IN THE CONTRIB AREA:
    • tiffdump.c: Added support for TIFF_IFD datatype.
    • addtiffo/{tif_overview.c, tif_ovrcache.c, tif_ovrcache.h}: Make overviews working for contiguous images.
    Last updated $Date: 2005/11/03 14:18:43 $. tiff-4.0.3/html/v3.4beta033.html0000644000212300117540000000436006753634101013005 00000000000000 Changes in TIFF v3.4beta033 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • support was added for building the library as a DSO under OSF/1


    CHANGES IN LIBTIFF:
    • fixes to the Pixar codec
    • portability mods for VMS


    CHANGES IN THE TOOLS:
    • fixes to gif2tiff and ppm2tiff for building under MS/DOS
    • portability mods to fax2ps and ycbcr for VMS


    CHANGES IN THE CONTRIBUTED SOFTWARE:
    • a new package from Alexander Lehmann for building the library and tools under MS/DOS with DJGPP v2
    • updated VMS support from Karsten Spang
    TIFF home page.

    Sam Leffler / sam@engr.sgi.com Last updated $Date: 1999/08/09 20:21:21 $.
    tiff-4.0.3/html/v3.8.0.html0000644000212300117540000001526010360260173012057 00000000000000 Changes in TIFF v3.8.0 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • Read-only support for custom directories (e.g. EXIF directory).
    • Preliminary support for MS MDI format.


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • Make the default strip size configurable via the --with-default-strip-size and STRIP_SIZE_DEFAULT options.


    CHANGES IN LIBTIFF:
    • tiffio.h: Added VC_EXTRALEAN definition before including windows.h, to reduce the compile time.
    • tif_jpeg.c: Improve compilation under MinGW.
    • {tif_aux.c, tif_dir.c, tif_dir.h, tif_dirwrite.c, tif_print.c, tif_getimage.c}: Make InkSet, NumberOfInks, DotRange and StoNits tags custom.
    • {tif_aux.c, tif_dir.c, tif_dir.h, tif_print.c}: Make WhitePoint tag custom.
    • tiffio.h: fixed typo that potentially resulted in redefininition of USE_WIN32_FILEIO
    • {tif_dir.c, tif_dir.h, tif_print.c}: Make RichTIFFIPTC, Photoshop and ICCProfile tags custom.
    • libtiff/*, contrib/*: Added 'dual-mode' error handling, enabling newer code to get context indicator in error handler and still remain compatible with older code: Done TIFFError calls everywhere except in tools.
    • tiffinfo.c: Print EXIF directory contents if exist.
    • {tif_dirinfo.c, tif_dirread.c, tif_dir.h, tif_dir.c}: Custom directory read-only support.
    • {tif_aux.c, tif_dirinfo.c, tif_dirread.c, tif_dir.h, tif_dir.c, tif_print.c}: Make YCbCrCoefficients and ReferenceBlackWhite tags custom.
    • tif_dirread.c: One more workaround for broken StripByteCounts tag. Handle the case when StripByteCounts array filled with completely wrong values.
    • tif_dirinfo.c: Release file descriptor in case of failure in the TIFFOpenW() function as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1003
    • tif_dirinfo.c: Correctly yse bsearch() and lfind() functions as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1008
    • tif_open.c, tiff.h, tiffdump.c: Incorporate preliminary support for MS MDI format. http://bugzilla.remotesensing.org/show_bug.cgi?id=1002
    • libtiff.def, tiffiop.h, tiffio.h: Made TIFFFreeDirectory public.
    • /tif_dirinfo.c: Make XResolution, YResolution and ResolutionUnit tags modifiable during write process. As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=977
    • if_dirread.c: Don't try and split single strips into "0" strips in ChopUpSingleUncompressedStrip. This happens in some degenerate cases (like 1x1 files with stripbytecounts==0 (gtsmall.jp2 embed tiff)
    • tif_fax3.c: changed 'at scanline ...' style warning/errors with incorrect use of tif_row, to 'at line ... of strip/tile ...' style.


    CHANGES IN THE TOOLS:


    CHANGES IN THE CONTRIB AREA:
    • contrib/addtiffo/*: Major upgrade by Joris to support subsampled YCbCr images in jpeg compressed TIFF files.
    Last updated $Date: 2006/01/04 23:38:38 $. tiff-4.0.3/html/v3.7.0beta.html0000644000212300117540000001154210407147572012722 00000000000000 Changes in TIFF v3.7.0beta TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • LZW compression enabled by default. You don't need the separate compression kit anymore.
    • bmp2tiff: Added new utility to convert Windows BMP files into TIFFs.
    • The first attempt to implement a test suite.


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • Many portability fixes in the new autotooled build suite.


    CHANGES IN LIBTIFF:
    • libtiff/{tif_luv.c, tif_next.c, tif_thunder.c}: Several buffer overruns fixed, as noted by Chris Evans.
    • BSD data types (u_char, u_short, u_int, u_long) is no longer used internally in the libtiff. Should result in simpler configuration and better portability.
    • libtiff/tiff.h: Fix column tagging. Reference current Adobe XMP specification. Reference libtiff bug tracking system to submit private tag additions.
    • libtiff/tif_dirread.c: Don't reject to read tags of the SamplesPerPixel size when the tag count is greater than number of samples as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=576.
    • libtiff/{tiffio.h, tif_open.c}: Applied patches from Joris Van Damme to avoid requirement for tiffiop.h inclusion in some applications. Look for details here: http://www.asmail.be/msg0054799560.html.
    • libtiff/{tiffiop.h, tif_dirinfo.c}: Fixed problem with the static variable as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=593.
    • libtiff/tif_lzw.c: LZW compression code is merged back from the separate package. All libtiff tools are updated to not advertise an abcence of LZW support.
    • libtiff/tif_dir.c: Call TIFFError() instead of producing warnings when setting custom tags by value. Reported by Eric Fieleke.


    CHANGES IN THE TOOLS:
    • tiff2ps: Avoid zero division in setupPageState() function; properly initialize array in PSDataBW().
    • tiff2pdf: Multiple bugfixes.
    • ras2tiff: Fixed issue with missed big-endian checks as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=586.
    • bmp2tiff: Added new utility to convert Windows BMP files into TIFFs.


    CHANGES IN THE CONTRIB AREA:
    • No changes.
    CHANGES IN THE LZW COMPRESSION KIT:
    • This one is not longer needed.
    TIFF home page.

    Last updated $Date: 2006/03/18 17:12:47 $. tiff-4.0.3/html/v3.5.6-beta.html0000644000212300117540000001373210407147572013006 00000000000000 Changes in TIFF v3.5.6 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • Added GNULDdso target and switched linux and freebsd to use it.
    • tools/Makefile.in: Modified to install properly on SGI.
    • configure: Fixed DSO test for Linux as per patch from Jan Van Buggenhout .


    CHANGES IN LIBTIFF:
    • tif_dir.c: Clear TIFF_ISTILED flag in TIFFDefaultDirectory as per http://bugzilla.remotesensing.org/show_bug.cgi?id=18 from vandrove@vc.cvut.cz.
    • Modified tif_packbits.c decoding to avoid overrunning the output buffer, and to issue a warning if data needs to be discarded. See http://bugzilla.remotesensing.org/show_bug.cgi?id=18
    • Modified TIFFClientOpen() to emit an error on an attempt to open a comperessed file for update (O_RDWR/r+) access. This is because the compressor/decompressor code gets very confused when the mode is O_RDWR, assuming this means writing only. See bug http://bugzilla.remotesensing.org/show_bug.cgi?id=13
    • Applied patch for 0x0000 sequences in tif_fax3.h's definition of EXPAND1D() as per bug 11 (from Roman).
    • Fixed tiffcomp.h to avoid win32 stuff if unix #defined, to improve cygwin compatibility.
    • Applied patch from Roman Shpount to tif_fax3.c. This seems to be a proper fix to the buffer sizing problem. See http://bugzilla.remotesensing.org/show_bug.cgi?id=11
    • Fixed tif_getimage.c to fix overrun bug with YCbCr images without downsampling. http://bugzilla.remotesensing.org/show_bug.cgi?id=10 Thanks to Nick Lamb for reporting the bug and proving the patch.
    • Fixed tif_jpeg.c so avoid destroying the decompressor before we are done access data thanks to bug report from: Michael Eckstein .
    • tif_open.c: Don't set MMAP for O_RDWR files.
    • tif_open.c: Set STRIPCHOP_DEFAULT for O_RDWR as well as O_RDONLY so that files opened for update can be strip chopped too.
    • tif_read.c: fixed up bug with files missing rowsperstrip and the strips per separation fix done a few weeks ago.
    • Tentatively added support for SAMPLEFORMAT_COMPLEXIEEEFP, and SAMPLEFORMAT_COMPLEXINT.
    • index.html, bugs.html: added bugzilla info.
    • tif_read.c: fix subtle bug with determining the number of rows for strips that are the last strip in a separation but not the last strip of all in TIFFReadEncodedStrip().
    • Applied 16/32 bit fix to tif_fax3.c. Fix supplied by Peter Skarpetis
    • Modified tiffio.h logic with regard to including windows.h. It won't include it when building with __CYGWIN__.
    • README: update to mention www.libtiff.org, don't list Sam's old email address.
    • libtiff/tif_dirread.c: Don't use estimate strip byte count for one tile/strip images with an offset, and byte count of zero. These could be "unpopulated" images.
    • tif_win32.c: Applied patch to fix overreads and ovverwrites caught by BoundsChecker. From Arvan Pritchard (untested).
    • tif_getimage.c: Applied patch to silence VC6 warnings. From Arvan Pritchard
    • tif_lzw.c: Applied patch to silence VC6 warnings. From Arvan Pritchard
    • libtiff/tif_apple.c: Applied "Carbon" support patches supplied by Leonard Rosenthol . May interfere with correct building on older systems. If so, please let me know.


    CHANGES IN THE TOOLS:
    • tools/rgb2ycbcr.c: fixed output strip size to account for vertical roundup if rows_per_strip not a multiple of vertical sample size.
    • tools/tiffsplit.c: Copy TIFFTAG_SAMPLEFORMAT.
    • Modified tiff2bw to ensure portions add to 100%, and that white is properly recovered. See bug http://bugzilla.remotesensing.org/show_bug.cgi?id=15 Patch c/o Stanislav Brabec


    CHANGES IN CONTRIB:
    • contrib/addtiffo: Added "averaging" resampling option.
    • Added contrib/stream (stream io) code submitted by Avi Bleiweiss.


    CHANGES IN THE LZW COMPRESSION KIT
    • updated tif_dir.c to reflect changes to no-lzw tif_dir.c
    TIFF home page.

    Last updated $Date: 2006/03/18 17:12:47 $. tiff-4.0.3/html/v3.5.4.html0000644000212300117540000000451010356353505012063 00000000000000 Changes in TIFF v3.5.4 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • None


    CHANGES IN LIBTIFF:
    • Added Pixar tag support. Contributed by Phil Beffery
    • Made one more change to tif_dir.c for removal of LZW compression. Also added notice when LZW compression invoked.
    • Fixed bug that caused LZW (non) compression to segfault. Added warning about LZW compression removed being removed, and why.


    CHANGES IN THE TOOLS:
    • Changed default compression in tools to TIFF_PACKBITS, and changed usage descriptions in tools to reflect removal of LZW compression
    • Added nostrip to install in tools/Makefile.in so that debugging symbols are kept.
    • Made Packbits the default compression in tools/tiff2rgba.c instead of LZW.
    TIFF home page.

    Last updated $Date: 2006/01/03 01:45:41 $. tiff-4.0.3/html/contrib.html0000644000212300117540000000723310356353206012671 00000000000000 Contributed TIFF Software

    Contributed TIFF Software

    The contrib directory has contributed software that uses the TIFF library or which is associated with the library (typically glue and guidance for ports to non-UNIX platforms, or tools that aren't directly TIFF related).

    contrib/vms scripts and files from Karsten Spang for building the library and tools under VMS
    contrib/dbs various tools from Dan & Chris Sears, including a simple X-based viewer
    contrib/ras two programs by Patrick Naughton for converting between Sun rasterfile format and TIFF (these require libpixrect.a, as opposed to the one in tools that doesn't)
    contrib/mac-mpw
    contrib/mac-cw
    scripts and files from Niles Ritter for building the library and tools under Macintosh/MPW C and code warrior.
    contrib/acorn scripts and files from Peter Greenham for building the library and tools on an Acorn RISC OS system.
    contrib/win32 scripts and files from Scott Wagner for building the library under Windows NT and Windows 95. (The makefile.vc in the libtiff/libtiff directory may be sufficient for most users.)
    contrib/win_dib two separate implementations of TIFF to DIB code suitable for any Win32 platform. Contributed by Mark James, and Philippe Tenenhaus.
    contrib/ojpeg Patch for IJG JPEG library related to support for some Old JPEG in TIFF files. Contributed by Scott Marovich.
    contrib/dosdjgpp scripts and files from Alexander Lehmann for building the library under MSDOS with the DJGPP v2 compiler.
    contrib/tags scripts and files from Niles Ritter for adding private tag support at runtime, without changing libtiff.
    contrib/mfs code from Mike Johnson to read+write images in memory without modifying the library
    contrib/pds various routines from Conrad Poelman; a TIFF image iterator and code to support ``private sub-directories''
    contrib/iptcutil A utility by Bill Radcliffe to convert an extracted IPTC Newsphoto caption from a binary blob to ASCII text, and vice versa. IPTC binary blobs can be extracted from images via the ImageMagick convert(1) utility.
    contrib/addtiffo A utility (and supporting subroutine) for building one or more reduce resolution overviews to an existing TIFF file. Supplied by Frank Warmerdam.
    contrib/stream A class (TiffStream) for accessing TIFF files through a C++ stream interface. Supplied by Avi Bleiweiss.

    Questions regarding these packages are usually best directed toward their authors.


    Last updated: $Date: 2006/01/03 01:42:30 $ tiff-4.0.3/html/addingtags.html0000644000212300117540000002703610120336606013333 00000000000000 Modifying The TIFF Library

    Defining New TIFF Tags

    Libtiff has built-in knowledge of all the standard TIFF tags, as well as extentions. The following describes how to add knowledge of new tags as builtins to libtiff, or how to application specific tags can be used by applications without modifying libtiff.

    TIFFFieldInfo

    How libtiff manages specific tags is primarily controlled by the definition for that tag value stored internally as a TIFFFieldInfo structure. This structure looks like this:

    typedef	struct {
      ttag_t    field_tag;          /* field's tag */
      short	    field_readcount;    /* read count/TIFF_VARIABLE/TIFF_SPP */
      short	    field_writecount;   /* write count/TIFF_VARIABLE */
      TIFFDataType field_type;      /* type of associated data */
      unsigned short field_bit;     /* bit in fieldsset bit vector */
      unsigned char field_oktochange;/* if true, can change while writing */
      unsigned char field_passcount;/* if true, pass dir count on set */
      char	*field_name;		/* ASCII name */
    } TIFFFieldInfo;
    
    • field_tag: the tag number. For instance 277 for the SamplesPerPixel tag. Builtin tags will generally have a #define in tiff.h for each known tag.

    • field_readcount: The number of values which should be read. The special value TIFF_VARIABLE (-1) indicates that a variable number of values may be read. The special value TIFFTAG_SPP (-2) indicates that there should be one value for each sample as defined by TIFFTAG_SAMPLESPERPIXEL. The special value TIFF_VARIABLE2 (-3) is presumably similar to TIFF_VARIABLE though I am not sure what the distinction in behaviour is. This field is TIFF_VARIABLE for variable length ascii fields.

    • field_writecount: The number of values which should be written. Generally the same as field_readcount. A few built-in exceptions exist, but I haven't analysed why they differ.

    • field_type: Type of the field. One of TIFF_BYTE, TIFF_ASCII, TIFF_SHORT, TIFF_LONG, TIFF_RATIONAL, TIFF_SBYTE, TIFF_UNDEFINED, TIFF_SSHORT, TIFF_SLONG, TIFF_SRATIONAL, TIFF_FLOAT, TIFF_DOUBLE or TIFF_IFD. Note that some fields can support more than one type (for instance short and long). These fields should have multiple TIFFFieldInfos.

    • field_bit: Built-in tags stored in special fields in the TIFF structure have assigned field numbers to distinguish them (ie. FIELD_SAMPLESPERPIXEL). New tags should generally just use FIELD_CUSTOM indicating they are stored in the generic tag list.

    • field_oktochange: TRUE if it is OK to change this tag value while an image is being written. FALSE for stuff that must be set once and then left unchanged (like ImageWidth, or PhotometricInterpretation for instance).

    • field_passcount: If TRUE, then the count value must be passed in TIFFSetField(), and TIFFGetField(), otherwise the count is not required. This should generally be TRUE for non-ascii variable count tags unless the count is implicit (such as with the colormap).

    • field_name: A name for the tag. Normally mixed case (studly caps) like "StripByteCounts" and relatively short.

    A TIFFFieldInfo definition exists for each built-in tag in the tif_dirinfo.c file. Some tags which support multiple data types have more than one definition, one per data type supported.

    Various functions exist for getting the internal TIFFFieldInfo definitions, including _TIFFFindFieldInfo(), and _TIFFFindFieldInfoByName(). See tif_dirinfo.c for details. There must be some mechanism to get the whole list, though I don't see it off hand.

    Default Tag Auto-registration

    In libtiff 3.6.0 a new mechanism was introduced allowing libtiff to read unrecognised tags automatically. When an unknown tags is encountered, it is automatically internally defined with a default name and a type derived from the tag value in the file. Applications only need to predefine application specific tags if they need to be able to set them in a file, or if particular calling conventions are desired for TIFFSetField() and TIFFGetField().

    When tags are autodefined like this the field_readcount and field_writecount values are always TIFF_VARIABLE. The field_passcount is always TRUE, and the field_bit is FIELD_CUSTOM. The field name will be "Tag %d" where the %d is the tag number.

    Defining Application Tags

    For various reasons, it is common for applications to want to define their own tags to store information outside the core TIFF specification. This is done by calling TIFFMergeFieldInfo() with one or more TIFFFieldInfos.

    The libgeotiff library provides geospatial information extentions within a TIFF file. First, a set of TIFFFieldInfo's is prepared with information on the new tags:

    static const TIFFFieldInfo xtiffFieldInfo[] = {
      
      /* XXX Insert Your tags here */
        { TIFFTAG_GEOPIXELSCALE,	-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
          TRUE,	TRUE,	"GeoPixelScale" },
        { TIFFTAG_GEOTRANSMATRIX,	-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
          TRUE,	TRUE,	"GeoTransformationMatrix" },
        { TIFFTAG_GEOTIEPOINTS,	-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
          TRUE,	TRUE,	"GeoTiePoints" },
        { TIFFTAG_GEOKEYDIRECTORY, -1,-1, TIFF_SHORT,	FIELD_CUSTOM,
          TRUE,	TRUE,	"GeoKeyDirectory" },
        { TIFFTAG_GEODOUBLEPARAMS,	-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
          TRUE,	TRUE,	"GeoDoubleParams" },
        { TIFFTAG_GEOASCIIPARAMS,	-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
          TRUE,	FALSE,	"GeoASCIIParams" }
    };
    
    In order to define the tags, we call TIFFMergeFieldInfo() on the desired TIFF handle with the list of TIFFFieldInfos.

    #define	N(a)	(sizeof (a) / sizeof (a[0]))
    
        /* Install the extended Tag field info */
        TIFFMergeFieldInfo(tif, xtiffFieldInfo, N(xtiffFieldInfo));
    
    The tags need to be defined for each TIFF file opened - and when reading they should be defined before the tags of the file are read, yet a valid TIFF * is needed to merge the tags against. In order to get them registered at the appropriate part of the setup process, it is necessary to register our merge function as an extender callback with libtiff. This is done with TIFFSetTagExtender(). We also keep track of the previous tag extender (if any) so that we can call it from our extender allowing a chain of customizations to take effect.

    static TIFFExtendProc _ParentExtender = NULL;
    
    static
    void _XTIFFInitialize(void)
    {
        static int first_time=1;
    	
        if (! first_time) return; /* Been there. Done that. */
        first_time = 0;
    	
        /* Grab the inherited method and install */
        _ParentExtender = TIFFSetTagExtender(_XTIFFDefaultDirectory);
    }
    
    The extender callback is looks like this. It merges in our new fields and then calls the next extender if there is one in effect.

    static void
    _XTIFFDefaultDirectory(TIFF *tif)
    {
        /* Install the extended Tag field info */
        TIFFMergeFieldInfo(tif, xtiffFieldInfo, N(xtiffFieldInfo));
    
        /* Since an XTIFF client module may have overridden
         * the default directory method, we call it now to
         * allow it to set up the rest of its own methods.
         */
    
        if (_ParentExtender) 
            (*_ParentExtender)(tif);
    }
    
    The above approach ensures that our new definitions are used when reading or writing any TIFF file. However, since on reading we already have default definitions for tags, it is usually not critical to pre-define them. If tag definitions are only required for writing custom tags, you can just call TIFFMergeFieldInfo() before setting new tags. The whole extender architecture can then be avoided.

    Adding New Builtin Tags

    A similar approach is taken to the above. However, the TIFFFieldInfo should be added to the tiffFieldInfo[] list in tif_dirinfo.c. Ensure that new tags are added in sorted order by the tag number.

    Normally new built-in tags should be defined with FIELD_CUSTOM; however, if it is desirable for the tag value to have it's own field in the TIFFDirectory structure, then you will need to #define a new FIELD_ value for it, and add appropriate handling as follows:

    1. Define the tag in tiff.h.
    2. Add a field to the directory structure in tif_dir.h and define a FIELD_* bit (also update the definition of FIELD_CODEC to reflect your addition).
    3. Add an entry in the TIFFFieldInfo array defined at the top of tif_dirinfo.c. Note that you must keep this array sorted by tag number and that the widest variant entry for a tag should come first (e.g. LONG before SHORT).
    4. Add entries in _TIFFVSetField() and _TIFFVGetField() for the new tag.
    5. (optional) If the value associated with the tag is not a scalar value (e.g. the array for TransferFunction) and requires special processing, then add the appropriate code to TIFFReadDirectory() and TIFFWriteDirectory(). You're best off finding a similar tag and cribbing code.
    6. Add support to TIFFPrintDirectory() in tif_print.c to print the tag's value.

    If you want to maintain portability, beware of making assumptions about data types. Use the typedefs (uint16, etc. when dealing with data on disk and t*_t when stuff is in memory) and be careful about passing items through printf or similar vararg interfaces.

    Adding New Codec-private Tags

    To add tags that are meaningful only when a particular compression algorithm is used follow these steps:
    1. Define the tag in tiff.h.
    2. Allocate storage for the tag values in the private state block of the codec.
    3. Insure the state block is created when the codec is initialized.
    4. At TIFFInitfoo time override the method pointers in the TIFF structure for getting, setting and printing tag values. For example,
          sp->vgetparent = tif->tif_vgetfield;
          tif->tif_vgetfield = fooVGetField;	/* hook for codec tags */
          sp->vsetparent = tif->tif_vsetfield;
          tif->tif_vsetfield = fooVSetField;	/* hook for codec tags */
          tif->tif_printdir = fooPrintDir;	/* hook for codec tags */
      
      (Actually you may decide not to override the tif_printdir method, but rather just specify it).
    5. Create a private TIFFFieldInfo array for your tags and merge them into the core tags at initialization time using _TIFFMergeFieldInfo; e.g.
          _TIFFMergeFieldInfo(tif, fooFieldInfo, N(fooFieldInfo));
      
      (where N is a macro used liberaly throughout the distributed code).
    6. Fill in the get and set routines. Be sure to call the parent method for tags that you are not handled directly. Also be sure to set the FIELD_* bits for tags that are to be written to the file. Note that you can create ``pseudo-tags'' by defining tags that are processed exclusively in the get/set routines and never written to file (see the handling of TIFFTAG_FAXMODE in tif_fax3.c for an example of this).
    7. Fill in the print routine, if appropriate.
    Note that space has been allocated in the FIELD_* bit space for codec-private tags. Define your bits as FIELD_CODEC+<offset> to keep them away from the core tags. If you need more tags than there is room for, just increase FIELD_SETLONGS at the top of tiffiop.h.
    Last updated: $Date: 2004/09/10 14:43:18 $ tiff-4.0.3/html/v3.9.2.html0000644000212300117540000000650611274336005012070 00000000000000 Changes in TIFF v3.9.2 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • Fixes a number of bugs present in the 3.9.1 release.
    • OJPEG support updated to work with IJG JPEG 7 release.
    • Tiffcrop validated for most TIFF storage subformats and sample depths.


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • x86_64 now uses the same default fill order as i386.


    CHANGES IN LIBTIFF:
    • Writing tags with an array value of type TIFF_DOUBLE now returns correct error status. The TIFFTAG_SMINSAMPLEVALUE and TIFFTAG_SMAXSAMPLEVALUE tags failed to write without this fix.
    • OJPEG decoder now works with IJG JPEG 7. Resolves "Bug 2090 - OJPEG crash with libjpeg v7". http://bugzilla.maptools.org/show_bug.cgi?id=2090
    • Eliminate most GCC "dereferencing type-punned pointer" warnings.


    CHANGES IN THE TOOLS:
    • New tiffcrop from Richard Nolde. Major updates to add significant functionality for reading and writing tile based images with bit depths not a multiple of 8 which cannot be handled by tiffcp.
    • Allow building tools with GCC using the "-Wformat -Werror=format-security" flags.


    CHANGES IN THE CONTRIB AREA:
    • None
    Last updated $Date: 2009-11-04 17:38:13 $. tiff-4.0.3/html/v3.7.0beta2.html0000644000212300117540000000704510407147572013007 00000000000000 Changes in TIFF v3.7.0beta2 TIFF CHANGE INFORMATION

    This document describes the changes made to the software between the previous and current versions (see above). If you don't find something listed here, then it was not done in this timeframe, or it was not considered important enough to be mentioned. The following information is located here:


    MAJOR CHANGES:
    • The code has been reviewed by Dmitry Levin: added checks for values, returned by the space allocation functions, fixed problems with the possible integer overflows.


    CHANGES IN THE SOFTWARE CONFIGURATION:
    • Several fixes in the test suite.


    CHANGES IN LIBTIFF:
    • Preliminary support for BigTIFF files: now libtiff can recognize and reject to open such images. ;-)
    • libtiff/tif_dirinfo.c: changed type of XMLPacket (tag 700) to TIFFTAG_BYTE instead of TIFFTAG_UNDEFINED to comply with the info in the Adobe XMP Specification.
    • Added many checks for integer overflow and for successful space allocations in the different parts of library. Code review completed by Dmitry V. Levin.
    • libtiff/{tiffio.h, tif_compress.c}: Added TIFFGetConfiguredCODECs()function to get the list of configured codecs.


    CHANGES IN THE TOOLS:
    • tiff2bw: Write ImageWidth/Height tags to output file, as noted by Gennady Khokhorin.


    CHANGES IN THE CONTRIB AREA:
    • No changes.
    CHANGES IN THE LZW COMPRESSION KIT:
    • This one is not longer needed.
    TIFF home page.

    Last updated $Date: 2006/03/18 17:12:47 $.