Compare commits

...

No commits in common. "c8" and "c8s" have entirely different histories.
c8 ... c8s

90 changed files with 4943 additions and 1 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
SOURCES/tiff-4.0.9.tar.gz
/tiff-4.0.9.tar.gz

View File

@ -1 +0,0 @@
87d4543579176cc568668617c22baceccd568296 SOURCES/tiff-4.0.9.tar.gz

7
gating.yaml Normal file
View File

@ -0,0 +1,7 @@
--- !Policy
product_versions:
- rhel-8
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}
- !PassingTestCaseRule {test_case_name: baseos-ci.brew-build.tier1.functional}

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (tiff-4.0.9.tar.gz) = 04f3d5eefccf9c1a0393659fe27f3dddd31108c401ba0dc587bca152a1c1f6bc844ba41622ff5572da8cc278593eff8c402b44e7af0a0090e91d326c2d79f6cd

View File

@ -0,0 +1,8 @@
cmake_minimum_required(VERSION 2.8.9)
cmake_policy(VERSION 2.8.9)
project(tiff-test-suite C)
enable_testing()
add_subdirectory(tools)
add_subdirectory(test)

8
tests/libtiff/README Normal file
View File

@ -0,0 +1,8 @@
libtiff test suite modified to run against installed libtiff.so
All files except the following are taken unmodified from upstream tarball:
tif_config.h
CMakeLists.txt
test/CMakeLists.txt
tools/CMakeLists.txt

View File

@ -0,0 +1,309 @@
/* $Id: tif_dir.h,v 1.55 2017-06-01 12:44:04 erouault 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);
extern int _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag);
#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:
*/

View File

@ -0,0 +1,451 @@
/* $Id: tiffiop.h,v 1.95 2017-09-07 14:02:52 erouault 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 <fcntl.h>
#endif
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#ifdef HAVE_STRING_H
# include <string.h>
#endif
#ifdef HAVE_ASSERT_H
# include <assert.h>
#else
# define assert(x)
#endif
#ifdef HAVE_SEARCH_H
# include <search.h>
#else
extern void *lfind(const void *, const void *, size_t *, size_t,
int (*)(const void *, const void *));
#endif
#if !defined(HAVE_SNPRINTF) && !defined(HAVE__SNPRINTF)
#undef snprintf
#define snprintf _TIFF_snprintf_f
extern int snprintf(char* str, size_t size, const char* format, ...);
#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)
#define strneq(a,b,n) (strncmp(a,b,n) == 0)
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
#define TIFF_SIZE_T_MAX ((size_t) ~ ((size_t)0))
#define TIFF_TMSIZE_T_MAX (tmsize_t)(TIFF_SIZE_T_MAX >> 1)
typedef struct client_info {
struct client_info *next;
void *data;
char *name;
} TIFFClientInfoLink;
/*
* Typedefs for ``method pointers'' used internally.
* these are deprecated 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 0x00003U /* natural bit fill order for machine */
#define TIFF_DIRTYHEADER 0x00004U /* header must be written on close */
#define TIFF_DIRTYDIRECT 0x00008U /* current directory must be written */
#define TIFF_BUFFERSETUP 0x00010U /* data buffers setup */
#define TIFF_CODERSETUP 0x00020U /* encoder/decoder setup done */
#define TIFF_BEENWRITING 0x00040U /* written 1+ scanlines to file */
#define TIFF_SWAB 0x00080U /* byte swap file information */
#define TIFF_NOBITREV 0x00100U /* inhibit bit reversal logic */
#define TIFF_MYBUFFER 0x00200U /* my raw data buffer; free on close */
#define TIFF_ISTILED 0x00400U /* file is tile, not strip- based */
#define TIFF_MAPPED 0x00800U /* file is mapped into memory */
#define TIFF_POSTENCODE 0x01000U /* need call to postencode routine */
#define TIFF_INSUBIFD 0x02000U /* currently writing a subifd */
#define TIFF_UPSAMPLED 0x04000U /* library is doing data up-sampling */
#define TIFF_STRIPCHOP 0x08000U /* enable strip chopping support */
#define TIFF_HEADERONLY 0x10000U /* read header only, do not process the first directory */
#define TIFF_NOREADRAW 0x20000U /* skip reading of raw uncompressed image data */
#define TIFF_INCUSTOMIFD 0x40000U /* currently writing a custom IFD */
#define TIFF_BIGTIFF 0x80000U /* read/write bigtiff */
#define TIFF_BUF4WRITE 0x100000U /* rawcc bytes are for writing */
#define TIFF_DIRTYSTRIP 0x200000U /* stripoffsets/stripbytecount dirty*/
#define TIFF_PERSAMPLE 0x400000U /* get/set per sample tags as arrays */
#define TIFF_BUFFERMMAP 0x800000U /* 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 entries 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) _TIFFSeekOK(tif, 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)
/* Variant of TIFFhowmany_32() that doesn't return 0 if x close to MAXUINT. */
/* Caution: TIFFhowmany_32_maxuint_compat(x,y)*y might overflow */
#define TIFFhowmany_32_maxuint_compat(x, y) \
(((uint32)(x) / (uint32)(y)) + ((((uint32)(x) % (uint32)(y)) != 0) ? 1 : 0))
#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 *unsigned* integer overflow. This macro is not safe for *signed* integer types */
#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]))
/*
Support for large files.
Windows read/write APIs support only 'unsigned int' rather than 'size_t'.
Windows off_t is only 32-bit, even in 64-bit builds.
*/
#if defined(HAVE_FSEEKO)
/*
Use fseeko() and ftello() if they are available since they use
'off_t' rather than 'long'. It is wrong to use fseeko() and
ftello() only on systems with special LFS support since some systems
(e.g. FreeBSD) support a 64-bit off_t by default.
For MinGW, __MSVCRT_VERSION__ must be at least 0x800 to expose these
interfaces. The MinGW compiler must support the requested version. MinGW
does not distribute the CRT (it is supplied by Microsoft) so the correct CRT
must be available on the target computer in order for the program to run.
*/
#if defined(HAVE_FSEEKO)
# define fseek(stream,offset,whence) fseeko(stream,offset,whence)
# define ftell(stream,offset,whence) ftello(stream,offset,whence)
#endif
#endif
#if defined(__WIN32__) && \
!(defined(_MSC_VER) && _MSC_VER < 1400) && \
!(defined(__MSVCRT_VERSION__) && __MSVCRT_VERSION__ < 0x800)
typedef unsigned int TIFFIOSize_t;
#define _TIFF_lseek_f(fildes,offset,whence) _lseeki64(fildes,/* __int64 */ offset,whence)
/* #define _TIFF_tell_f(fildes) /\* __int64 *\/ _telli64(fildes) */
#define _TIFF_fseek_f(stream,offset,whence) _fseeki64(stream,/* __int64 */ offset,whence)
#define _TIFF_fstat_f(fildes,stat_buff) _fstati64(fildes,/* struct _stati64 */ stat_buff)
/* #define _TIFF_ftell_f(stream) /\* __int64 *\/ _ftelli64(stream) */
/* #define _TIFF_stat_f(path,stat_buff) _stati64(path,/\* struct _stati64 *\/ stat_buff) */
#define _TIFF_stat_s struct _stati64
#define _TIFF_off_t __int64
#else
typedef size_t TIFFIOSize_t;
#define _TIFF_lseek_f(fildes,offset,whence) lseek(fildes,offset,whence)
/* #define _TIFF_tell_f(fildes) (_TIFF_lseek_f(fildes,0,SEEK_CUR)) */
#define _TIFF_fseek_f(stream,offset,whence) fseek(stream,offset,whence)
#define _TIFF_fstat_f(fildes,stat_buff) fstat(fildes,stat_buff)
/* #define _TIFF_ftell_f(stream) ftell(stream) */
/* #define _TIFF_stat_f(path,stat_buff) stat(path,stat_buff) */
#define _TIFF_stat_s struct stat
#define _TIFF_off_t off_t
#endif
#if __clang_major__ >= 4 || (__clang_major__ == 3 && __clang_minor__ >= 8)
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW __attribute__((no_sanitize("unsigned-integer-overflow")))
#else
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
#endif
#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 tmsize_t _TIFFMultiplySSize(TIFF*, tmsize_t, tmsize_t, const char*);
extern tmsize_t _TIFFCastUInt64ToSSize(TIFF*, 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 tmsize_t
_TIFFReadEncodedStripAndAllocBuffer(TIFF* tif, uint32 strip,
void **buf, tmsize_t bufsizetoalloc,
tmsize_t size_to_read);
extern tmsize_t
_TIFFReadEncodedTileAndAllocBuffer(TIFF* tif, uint32 tile,
void **buf, tmsize_t bufsizetoalloc,
tmsize_t size_to_read);
extern tmsize_t
_TIFFReadTileAndAllocBuffer(TIFF* tif,
void **buf, tmsize_t bufsizetoalloc,
uint32 x, uint32 y, uint32 z, uint16 s);
extern int _TIFFSeekOK(TIFF* tif, toff_t off);
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);
extern int TIFFJPEGIsFullStripRequired(TIFF*);
#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:
*/

View File

@ -0,0 +1,270 @@
find_package(TIFF REQUIRED)
find_package(JPEG REQUIRED)
include_directories(${TIFF_INCLUDES}
${JPEG_INCLUDES}
"${CMAKE_CURRENT_SOURCE_DIR}/.."
"${CMAKE_CURRENT_SOURCE_DIR}/../libtiff")
# 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".
set(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
images/quad-lzw-compat.tiff)
# All uncompressed image files
set(UNCOMPRESSEDIMAGES
images/minisblack-1c-16b.tiff
images/minisblack-1c-8b.tiff
images/miniswhite-1c-1b.tiff
images/palette-1c-1b.tiff
images/palette-1c-4b.tiff
images/palette-1c-8b.tiff
images/rgb-3c-8b.tiff)
add_executable(ascii_tag ascii_tag.c)
target_link_libraries(ascii_tag tiff)
add_executable(long_tag long_tag.c check_tag.c)
target_link_libraries(long_tag tiff)
add_executable(short_tag short_tag.c check_tag.c)
target_link_libraries(short_tag tiff)
add_executable(strip_rw strip_rw.c strip.c test_arrays.c test_arrays.h)
target_link_libraries(strip_rw tiff)
add_executable(rewrite rewrite_tag.c)
target_link_libraries(rewrite tiff)
add_executable(raw_decode raw_decode.c)
target_link_libraries(raw_decode tiff)
add_executable(custom_dir custom_dir.c)
target_link_libraries(custom_dir tiff)
add_test(NAME "ascii_tag"
COMMAND "$<TARGET_FILE:ascii_tag>")
add_test(NAME "long_tag"
COMMAND "$<TARGET_FILE:long_tag>")
add_test(NAME "short_tag"
COMMAND "$<TARGET_FILE:short_tag>")
add_test(NAME "strip_rw"
COMMAND "$<TARGET_FILE:strip_rw>")
add_test(NAME "rewrite"
COMMAND "$<TARGET_FILE:rewrite>")
add_test(NAME "raw_decode"
COMMAND "$<TARGET_FILE:raw_decode>")
add_test(NAME "custom_dir"
COMMAND "$<TARGET_FILE:custom_dir>")
set(TEST_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/output")
file(MAKE_DIRECTORY "${TEST_OUTPUT}")
set(tiff_test_extra_args
"-DTIFFCP=tiffcp"
"-DTIFFINFO=tiffinfo"
"-DTIFFSPLIT=tiffsplit")
macro(tiff_test_convert name command1 command2 command3 infile outfile validate)
add_test(NAME "${name}"
COMMAND "${CMAKE_COMMAND}"
"-DCONVERT_COMMAND1=${command1}"
"-DCONVERT_COMMAND2=${command2}"
"-DCONVERT_COMMAND3=${command3}"
"-DINFILE=${infile}"
"-DOUTFILE=${outfile}"
"-DVALIDATE=${validate}"
${tiff_test_extra_args}
-P "${CMAKE_CURRENT_SOURCE_DIR}/TiffTest.cmake")
endmacro()
macro(tiff_test_stdout name command infile outfile)
add_test(NAME "${name}"
COMMAND "${CMAKE_COMMAND}"
"-DSTDOUT_COMMAND=${command}"
"-DINFILE=${infile}"
"-DOUTFILE=${outfile}"
${tiff_test_extra_args}
-P "${CMAKE_CURRENT_SOURCE_DIR}/TiffTest.cmake")
endmacro()
macro(tiff_test_reader name command infile)
add_test(NAME "${name}"
COMMAND "${CMAKE_COMMAND}"
"-DREADER_COMMAND=${command}"
"-DINFILE=${infile}"
${tiff_test_extra_args}
-P "${CMAKE_CURRENT_SOURCE_DIR}/TiffTest.cmake")
endmacro()
macro(add_convert_test_multi commandname1 commandname2 commandname3
categoryname commandargs1 commandargs2 commandargs3
image validate)
string(REPLACE " " "^" escaped_commandargs1 "${commandargs1}")
string(REPLACE " " "^" escaped_commandargs2 "${commandargs2}")
string(REPLACE " " "^" escaped_commandargs3 "${commandargs3}")
get_filename_component(name "${image}" NAME)
get_filename_component(base "${image}" NAME_WE)
set(testname "${commandname1}-${categoryname}-${base}")
if(${commandname1} MATCHES ".+")
set(command1
"${commandname1}^${escaped_commandargs1}")
else()
set(command1)
endif()
if(${commandname2} MATCHES ".+")
set(command2
"${commandname2}^${escaped_commandargs2}")
else()
set(command2)
endif()
if(${commandname3} MATCHES ".+")
set(command3
"${commandname3}^${escaped_commandargs3}")
else()
set(command3)
endif()
set(infile "${CMAKE_CURRENT_SOURCE_DIR}/${image}")
set(outfile "${TEST_OUTPUT}/${commandname1}-${categoryname}-${name}")
string(REGEX REPLACE "\\.tiff\$" "" name "${name}")
tiff_test_convert("${testname}" "${command1}" "${command2}" "${command3}"
"${infile}" "${outfile}" "${validate}")
endmacro()
macro(add_convert_test commandname
categoryname commandargs
image validate)
add_convert_test_multi("${commandname}" "" ""
"${categoryname}" "${commandargs}" "" ""
"${image}" "${validate}")
endmacro()
macro(add_convert_tests_multi commandname commandname2 commandname3
categoryname
commandargs1 commandargs2 commandargs3
images validate)
foreach(file ${${images}})
add_convert_test_multi("${commandname1}" "${commandname2}"
"${commandname3}" "${categoryname}"
"${commandargs1}" "${commandargs2}"
"${commandargs3}" "${file}" "${validate}")
endforeach()
endmacro()
macro(add_convert_tests commandname categoryname commandargs images validate)
foreach(file ${${images}})
add_convert_test("${commandname}" "${categoryname}"
"${commandargs}" "${file}" "${validate}")
endforeach()
endmacro()
macro(add_stdout_test commandname categoryname commandargs image)
string(REPLACE " " "^" escaped_commandargs "${commandargs}")
get_filename_component(name "${image}" NAME)
get_filename_component(base "${image}" NAME_WE)
set(testname "${commandname}-${categoryname}-${base}")
set(command "${commandname}^${escaped_commandargs}")
set(infile "${CMAKE_CURRENT_SOURCE_DIR}/${image}")
set(outfile "${TEST_OUTPUT}/${commandname}-${categoryname}-${name}")
string(REGEX REPLACE "\\.tiff\$" "" name "${name}")
tiff_test_stdout("${testname}" "${command}" "${infile}" "${outfile}")
endmacro()
macro(add_reader_test commandname commandargs image)
string(REPLACE " " "^" escaped_commandargs "${commandargs}")
get_filename_component(name "${image}" NAME)
get_filename_component(base "${image}" NAME_WE)
set(testname "${commandname}-${base}")
set(command "${commandname}^${escaped_commandargs}")
set(infile "${CMAKE_CURRENT_SOURCE_DIR}/${image}")
string(REGEX REPLACE "\\.tiff\$" "" name "${name}")
tiff_test_reader("${testname}" "${command}" "${infile}")
endmacro()
# PPM
add_convert_test(ppm2tiff miniswhite "" "images/miniswhite-1c-1b.pbm" TRUE)
add_convert_test(ppm2tiff minisblack "" "images/minisblack-1c-8b.pgm" TRUE)
add_convert_test(ppm2tiff rgb "" "images/rgb-3c-8b.ppm" TRUE)
# tiffcp
add_convert_test(tiffcp g3 "-c g3" "images/miniswhite-1c-1b.tiff" FALSE)
add_convert_test(tiffcp g31d "-c g3:1d" "images/miniswhite-1c-1b.tiff" FALSE)
add_convert_test(tiffcp g31dfill "-c g3:1d:fill" "images/miniswhite-1c-1b.tiff" FALSE)
add_convert_test(tiffcp g32d "-c g3:2d" "images/miniswhite-1c-1b.tiff" FALSE)
add_convert_test(tiffcp g32dfill "-c g3:2d:fill" "images/miniswhite-1c-1b.tiff" FALSE)
add_convert_test(tiffcp g4 "-c g4" "images/miniswhite-1c-1b.tiff" FALSE)
add_convert_test(tiffcp none "-c none" "images/quad-lzw-compat.tiff" FALSE)
add_convert_test_multi(tiffcp tiffcp "" logluv "-c none" "-c sgilog" ""
"images/logluv-3c-16b.tiff" FALSE)
add_convert_test_multi(tiffcp "$<TARGET_FILE:thumbnail>" "" thumbnail "-c g3:1d" "" ""
"images/miniswhite-1c-1b.tiff" FALSE)
# tiffdump
add_reader_test(tiffdump "" "images/miniswhite-1c-1b.tiff")
# tiffinfo
add_reader_test(tiffinfo "-c -D -d -j -s" "images/minisblack-1c-16b.tiff")
# tiffcp split/join
foreach(image ${UNCOMPRESSEDIMAGES})
list(APPEND ESCAPED_UNCOMPRESSED "${CMAKE_CURRENT_SOURCE_DIR}/${image}")
endforeach()
string(REPLACE ";" "^" ESCAPED_UNCOMPRESSED "${ESCAPED_UNCOMPRESSED}")
add_test(NAME "tiffcp-split"
COMMAND "${CMAKE_COMMAND}"
"-DTESTFILES=${ESCAPED_UNCOMPRESSED}"
"-DCONJOINED=${TEST_OUTPUT}/tiffcp-split-conjoined.tif"
"-DSPLITFILE=${TEST_OUTPUT}/tiffcp-split-split-"
${tiff_test_extra_args}
-P "${CMAKE_CURRENT_SOURCE_DIR}/TiffSplitTest.cmake")
add_test(NAME "tiffcp-split-join"
COMMAND "${CMAKE_COMMAND}"
"-DTESTFILES=${ESCAPED_UNCOMPRESSED}"
"-DCONJOINED=${TEST_OUTPUT}/tiffcp-split-join-conjoined.tif"
"-DSPLITFILE=${TEST_OUTPUT}/tiffcp-split-join-split-"
"-DRECONJOINED=${TEST_OUTPUT}/tiffcp-split-join-reconjoined.tif"
${tiff_test_extra_args}
-P "${CMAKE_CURRENT_SOURCE_DIR}/TiffSplitTest.cmake")
# PDF
add_stdout_test(tiff2pdf default "" "images/miniswhite-1c-1b.tiff" TRUE)
# PS
add_stdout_test(tiff2ps PS1 "-a -p -1" "images/miniswhite-1c-1b.tiff" TRUE)
add_stdout_test(tiff2ps PS2 "-a -p -2" "images/miniswhite-1c-1b.tiff" TRUE)
add_stdout_test(tiff2ps PS3 "-a -p -3" "images/miniswhite-1c-1b.tiff" TRUE)
add_stdout_test(tiff2ps EPS1 "-e -1" "images/miniswhite-1c-1b.tiff" TRUE)
# BW
add_convert_test(tiff2bw default "" "images/palette-1c-8b.tiff" TRUE)
add_convert_test(tiff2bw default "" "images/quad-lzw-compat.tiff" TRUE)
add_convert_test(tiff2bw default "" "images/rgb-3c-8b.tiff" TRUE)
# RGBA
add_convert_tests(tiff2rgba default "" TIFFIMAGES TRUE)
# Test rotations
add_convert_tests(tiffcrop R90 "-R90" TIFFIMAGES TRUE)
# Test flip (mirror)
add_convert_tests(tiffcrop doubleflip "-F both" TIFFIMAGES TRUE)
# Test extracting a section 60 pixels wide and 60 pixels high
add_convert_tests(tiffcrop extract "-U px -E top -X 60 -Y 60" TIFFIMAGES TRUE)
# Test extracting the first and fourth quarters from the left side.
add_convert_tests(tiffcrop extractz14 "-E left -Z1:4,2:4" TIFFIMAGES TRUE)

View File

@ -0,0 +1,34 @@
# CMake tests for libtiff
#
# Copyright © 2015 Open Microscopy Environment / University of Dundee
# Written by Roger Leigh <rleigh@codelibre.net>
#
# 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(${CMAKE_CURRENT_LIST_DIR}/TiffTestCommon.cmake)
string(REPLACE "^" ";" TESTFILES "${TESTFILES}")
test_convert_multi("${TIFFCP}" "${TESTFILES}" "${CONJOINED}")
test_convert("${TIFFSPLIT}" "${CONJOINED}" "${SPLITFILE}")
if (RECONJOINED)
file(GLOB SPLITFILES "${SPLITFILE}*")
test_convert_multi("${TIFFCP}" "${SPLITFILES}" "${RECONJOINED}")
endif()

View File

@ -0,0 +1,63 @@
# CMake tests for libtiff
#
# Copyright © 2015 Open Microscopy Environment / University of Dundee
# Written by Roger Leigh <rleigh@codelibre.net>
#
# 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(${CMAKE_CURRENT_LIST_DIR}/TiffTestCommon.cmake)
string(REPLACE "^" ";" CONVERT_COMMAND1 "${CONVERT_COMMAND1}")
string(REPLACE "^" ";" CONVERT_COMMAND2 "${CONVERT_COMMAND2}")
string(REPLACE "^" ";" CONVERT_COMMAND3 "${CONVERT_COMMAND3}")
string(REPLACE "^" ";" STDOUT_COMMAND "${STDOUT_COMMAND}")
string(REPLACE "^" ";" READER_COMMAND "${READER_COMMAND}")
if(CONVERT_COMMAND1)
test_convert("${CONVERT_COMMAND1}" "${INFILE}" "${OUTFILE}")
if(VALIDATE)
tiffinfo_validate("${OUTFILE}")
endif()
endif()
get_filename_component(base "${OUTFILE}" NAME)
get_filename_component(ext "${OUTFILE}" EXT)
if(CONVERT_COMMAND2)
test_convert("${CONVERT_COMMAND2}" "${OUTFILE}" "${base}-2${ext}")
if(VALIDATE)
tiffinfo_validate("${base}-2${ext}")
endif()
endif()
if(CONVERT_COMMAND3)
test_convert("${CONVERT_COMMAND3}" "${base}-2${ext}" "${base}-3${ext}")
if(VALIDATE)
tiffinfo_validate("${base}-3${ext}")
endif()
endif()
if(STDOUT_COMMAND)
test_stdout("${STDOUT_COMMAND}" "${INFILE}" "${OUTFILE}")
endif()
if(READER_COMMAND)
test_reader("${READER_COMMAND}" "${INFILE}")
endif()

View File

@ -0,0 +1,108 @@
# CMake tests for libtiff (common functionality)
#
# Copyright © 2015 Open Microscopy Environment / University of Dundee
# Written by Roger Leigh <rleigh@codelibre.net>
#
# 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.
#
# Test a simple convert-like command.
#
# test_convert command infile outfile
macro(test_convert command infile outfile)
file(TO_NATIVE_PATH "${infile}" native_infile)
file(TO_NATIVE_PATH "${outfile}" native_outfile)
file(REMOVE "${outfile}")
message(STATUS Running "${MEMCHECK} ${command} ${native_infile} ${native_outfile}")
execute_process(COMMAND ${MEMCHECK} ${command} "${native_infile}" "${native_outfile}"
RESULT_VARIABLE TEST_STATUS)
if(TEST_STATUS)
message(FATAL_ERROR "Returned failed status ${TEST_STATUS}! Output (if any) is in \"${native_outfile}\"")
endif()
endmacro()
#
# Test a simple convert-like command.
#
# test_convert command infile outfile
macro(test_convert_multi command infile outfile)
foreach(file ${infile})
file(TO_NATIVE_PATH "${file}" native_file)
list(APPEND native_infile "${native_file}")
endforeach()
file(TO_NATIVE_PATH "${outfile}" native_outfile)
file(REMOVE "${outfile}")
message(STATUS Running "${MEMCHECK} ${command} ${native_infile} ${native_outfile}")
execute_process(COMMAND ${MEMCHECK} ${command} ${native_infile} "${native_outfile}"
RESULT_VARIABLE TEST_STATUS)
if(TEST_STATUS)
message(FATAL_ERROR "Returned failed status ${TEST_STATUS}! Output (if any) is in \"${native_outfile}\"")
endif()
endmacro()
#
# Test a simple command which sends output to stdout
#
# test_stdout command infile outfile
macro(test_stdout command infile outfile)
file(TO_NATIVE_PATH "${infile}" native_infile)
file(TO_NATIVE_PATH "${outfile}" native_outfile)
file(REMOVE "${outfile}")
message(STATUS "Running ${MEMCHECK} ${command} ${native_infile} > ${native_outfile}")
execute_process(COMMAND ${MEMCHECK} ${command} "${native_infile}"
OUTPUT_FILE "${outfile}"
RESULT_VARIABLE TEST_STATUS)
if(TEST_STATUS)
message(FATAL_ERROR "Returned failed status ${TEST_STATUS}! Output (if any) is in \"${native_outfile}")
endif()
endmacro()
#
# Execute a simple command (e.g. tiffinfo) with one input file
#
# test_exec command infile
macro(test_reader command infile)
file(TO_NATIVE_PATH "${infile}" native_infile)
message(STATUS "Running ${MEMCHECK} ${command} ${native_infile}")
execute_process(COMMAND ${MEMCHECK} ${command} "${native_infile}"
RESULT_VARIABLE TEST_STATUS)
if(TEST_STATUS)
message(FATAL_ERROR "Returned failed status ${TEST_STATUS}! Output (if any) is in \"${native_outfile}")
endif()
endmacro()
#
# Execute tiffinfo on a specified file to validate it
#
# tiffinfo_validate infile
macro(tiffinfo_validate file)
test_reader("${TIFFINFO};-D" "${file}")
endmacro()
# Add the directory containing libtiff to the PATH (Windows only)
if(WIN32)
get_filename_component(LIBTIFF_DIR "${LIBTIFF}" DIRECTORY)
file(TO_NATIVE_PATH "${LIBTIFF_DIR}" LIBTIFF_DIR)
set(ENV{PATH} "${LIBTIFF_DIR};$ENV{PATH}")
endif()
if(CYGWIN)
get_filename_component(LIBTIFF_DIR "${LIBTIFF}" DIRECTORY)
file(TO_NATIVE_PATH "${LIBTIFF_DIR}" LIBTIFF_DIR)
set(ENV{PATH} "${LIBTIFF_DIR}:$ENV{PATH}")
endif()

View File

@ -0,0 +1,177 @@
/* $Id: ascii_tag.c,v 1.8 2013-12-17 14:41:57 bfriesen Exp $ */
/*
* Copyright (c) 2004, Andrey Kiselev <dron@ak4719.spb.edu>
*
* 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 <stdio.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#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) == -1) {
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: */

View File

@ -0,0 +1,91 @@
/* $Id: check_tag.c,v 1.3 2008/04/15 14:19:37 dron Exp $ */
/*
* Copyright (c) 2004, Andrey Kiselev <dron@ak4719.spb.edu>
*
* 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;
}

View File

@ -0,0 +1,247 @@
/* $Id: custom_dir.c,v 1.3 2013-12-17 14:41:58 bfriesen Exp $ */
/*
* Copyright (c) 2012, Frank Warmerdam <warmerdam@pobox.com>
*
* 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 <stdio.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#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) == -1) {
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: */

View File

@ -0,0 +1,29 @@
The 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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,156 @@
/* $Id: long_tag.c,v 1.5 2013-12-17 14:41:58 bfriesen Exp $ */
/*
* Copyright (c) 2004, Andrey Kiselev <dron@ak4719.spb.edu>
*
* 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 <stdio.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#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) == -1) {
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: */

View File

@ -0,0 +1,304 @@
/* $Id: raw_decode.c,v 1.7 2015-08-16 20:08:21 bfriesen Exp $ */
/*
* Copyright (c) 2012, Frank Warmerdam <warmerdam@pobox.com>
*
* 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#include "tiffio.h"
/*
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" /* 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 min_red, int max_red,
int min_green, int max_green,
int min_blue, int max_blue,
unsigned char *buffer ) {
unsigned char *rgb = buffer + 3 * pixel;
if( rgb[0] >= min_red && rgb[0] <= max_red &&
rgb[1] >= min_green && rgb[1] <= max_green &&
rgb[2] >= min_blue && rgb[2] <= max_blue ) {
return 0;
}
fprintf( stderr, "Pixel %d did not match expected results.\n", pixel );
fprintf( stderr, "Got R=%d (expected %d..%d), G=%d (expected %d..%d), B=%d (expected %d..%d)\n",
rgb[0], min_red, max_red,
rgb[1], min_green, max_green,
rgb[2], min_blue, max_blue );
return 1;
}
static int check_rgba_pixel( int pixel,
int min_red, int max_red,
int min_green, int max_green,
int min_blue, int max_blue,
int min_alpha, int max_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) min_red &&
TIFFGetR(rgba) <= (uint32) max_red &&
TIFFGetG(rgba) >= (uint32) min_green &&
TIFFGetG(rgba) <= (uint32) max_green &&
TIFFGetB(rgba) >= (uint32) min_blue &&
TIFFGetB(rgba) <= (uint32) max_blue &&
TIFFGetA(rgba) >= (uint32) min_alpha &&
TIFFGetA(rgba) <= (uint32) max_alpha ) {
return 0;
}
fprintf( stderr, "Pixel %d did not match expected results.\n", pixel );
fprintf( stderr, "Got R=%d (expected %d..%d), G=%d (expected %d..%d), B=%d (expected %d..%d), A=%d (expected %d..%d)\n",
TIFFGetR(rgba), min_red, max_red,
TIFFGetG(rgba), min_green, max_green,
TIFFGetB(rgba), min_blue, max_blue,
TIFFGetA(rgba), min_alpha, max_alpha );
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;
}
/*
* JPEG decoding is inherently inexact, so we can't test for exact
* pixel values. (Well, if we knew exactly which libjpeg version
* we were using, and with what settings, we could expect specific
* values ... but it's not worth the trouble to keep track of.)
* Hence, use ranges of expected values. The ranges may need to be
* widened over time as more versions of libjpeg appear.
*/
pixel_status |= check_rgb_pixel( 0, 15, 18, 0, 0, 18, 41, buffer );
pixel_status |= check_rgb_pixel( 64, 0, 0, 0, 0, 0, 2, buffer );
pixel_status |= check_rgb_pixel( 512, 5, 6, 34, 36, 182, 196, buffer );
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.
*/
pixel_status |= check_rgba_pixel( 0, 15, 18, 0, 0, 18, 41, 255, 255,
rgba_buffer );
pixel_status |= check_rgba_pixel( 64, 0, 0, 0, 0, 0, 2, 255, 255,
rgba_buffer );
pixel_status |= check_rgba_pixel( 512, 5, 6, 34, 36, 182, 196, 255, 255,
rgba_buffer );
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:
*/

View File

@ -0,0 +1,344 @@
/* $Id: rewrite_tag.c,v 1.9 2015-08-23 14:23:00 bfriesen Exp $ */
/*
* Copyright (c) 2007, Frank Warmerdam <warmerdam@pobox.com>
*
* 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 <stdio.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#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 ) == -1 )
{
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(void)
{
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: */

View File

@ -0,0 +1,205 @@
/* $Id: short_tag.c,v 1.9 2013-12-17 14:41:58 bfriesen Exp $ */
/*
* Copyright (c) 2004, Andrey Kiselev <dron@ak4719.spb.edu>
*
* 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 <stdio.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#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) == -1) {
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: */

290
tests/libtiff/test/strip.c Normal file
View File

@ -0,0 +1,290 @@
/* $Id: strip.c,v 1.5 2013-12-17 14:41:58 bfriesen Exp $ */
/*
* Copyright (c) 2004, Andrey Kiselev <dron@ak4719.spb.edu>
*
* 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 <stdio.h>
#include <string.h>
#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) == -1) {
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: */

View File

@ -0,0 +1,157 @@
/* $Id: strip_rw.c,v 1.6 2008/03/28 01:42:07 bfriesen Exp $ */
/*
* Copyright (c) 2004, Andrey Kiselev <dron@ak4719.spb.edu>
*
* 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 <stdio.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#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: */

View File

@ -0,0 +1,829 @@
/* $Id: test_arrays.c,v 1.3 2006/03/23 14:54:02 dron Exp $ */
/*
* Copyright (c) 2004, Andrey Kiselev <dron@ak4719.spb.edu>
*
* 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 <stddef.h>
#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: */

View File

@ -0,0 +1,63 @@
/* $Id: test_arrays.h,v 1.3 2006/03/23 14:54:02 dron Exp $ */
/*
* Copyright (c) 2004, Andrey Kiselev <dron@ak4719.spb.edu>
*
* 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 <stddef.h>
#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: */

View File

@ -0,0 +1,42 @@
/* $Id: tifftest.h,v 1.1 2008/04/15 14:18:36 dron Exp $ */
/*
* Copyright (c) 2008, Andrey Kiselev <dron@ak4719.spb.edu>
*
* 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_ */

View File

@ -0,0 +1,4 @@
#include <tiffconf.h>
#define HAVE_UNISTD_H 1
#define HAVE_GETOPT 1

View File

@ -0,0 +1,8 @@
find_package(TIFF REQUIRED)
include_directories(${TIFF_INCLUDES}
"${CMAKE_CURRENT_SOURCE_DIR}/.."
"${CMAKE_CURRENT_SOURCE_DIR}/../libtiff")
add_executable(thumbnail thumbnail.c)
target_link_libraries(thumbnail m tiff)

View File

@ -0,0 +1,691 @@
/* $Id: thumbnail.c,v 1.21 2015-06-21 01:09:10 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.
*/
#include "tif_config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#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);
#if !HAVE_DECL_OPTARG
extern char* optarg;
extern int optind;
#endif
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 },*/ /* Needs much more complicated logic. See tiffcp */
{ 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++)
{
/* Horrible: but TIFFGetField() expects 2 arguments to be passed */
/* if we request a tag that is defined in a codec, but that codec */
/* isn't used */
if( p->tag == TIFFTAG_GROUP3OPTIONS )
{
uint16 compression;
if( !TIFFGetField(in, TIFFTAG_COMPRESSION, &compression) ||
compression != COMPRESSION_CCITTFAX3 )
continue;
}
if( p->tag == TIFFTAG_GROUP4OPTIONS )
{
uint16 compression;
if( !TIFFGetField(in, TIFFTAG_COMPRESSION, &compression) ||
compression != COMPRESSION_CCITTFAX4 )
continue;
}
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)
{
/* We should perhaps error loudly, but I can't make sense of that */
/* code... */
if( nrows == 256 )
break;
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);
/* +3 : add a few guard bytes since setrow() can read a bit */
/* outside buffer */
raster = (unsigned char*)_TIFFmalloc(rastersize+3);
if (!raster) {
TIFFError(TIFFFileName(in),
"Can't allocate space for raster buffer.");
return 0;
}
raster[rastersize] = 0;
raster[rastersize+1] = 0;
raster[rastersize+2] = 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:
*/

17
tests/tests.yml Normal file
View File

@ -0,0 +1,17 @@
- hosts: localhost
roles:
- role: standard-test-beakerlib
tags:
- atomic
- classic
- container
tests:
- upstream-test-suite
required_packages:
- libtiff
- libtiff-tools
- libtiff-devel
- libjpeg-turbo-devel
- gcc
- make
- cmake

29
tests/upstream-test-suite Executable file
View File

@ -0,0 +1,29 @@
#!/bin/bash
. /usr/share/beakerlib/beakerlib.sh
TEST="/AppStream/libtiff/Sanity/upstream-test-suite"
PACKAGES=${PACKAGES:-"libtiff"}
REQUIRES=${REQUIRES:-"libtiff-tools libtiff-devel libjpeg-turbo-devel gcc make cmake"}
rlJournalStart
rlPhaseStartSetup
rlAssertRpm --all
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
rlRun "cp -r libtiff/* $TmpDir/." 0 "Copying test suite"
rlRun "pushd $TmpDir"
rlPhaseEnd
rlPhaseStartTest
rlRun "cmake ." 0 "Running cmake"
rlRun "make" 0 "Compiling sources"
rlRun "make test" 0 "Running tests"
rlPhaseEnd
rlPhaseStartCleanup
rlRun "popd"
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
rlPhaseEnd
rlJournalPrintText
rlJournalEnd