67
67
static enum TIFFReadDirEntryErr TIFFReadDirEntryShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
68
68
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value);
69
69
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
71
70
static enum TIFFReadDirEntryErr TIFFReadDirEntryFloat(TIFF* tif, TIFFDirEntry* direntry, float* value);
73
71
static enum TIFFReadDirEntryErr TIFFReadDirEntryDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
74
72
static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
87
85
static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value);
89
87
static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
90
89
static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
92
92
static void TIFFReadDirEntryCheckedByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value);
93
93
static void TIFFReadDirEntryCheckedSbyte(TIFF* tif, TIFFDirEntry* direntry, int8* value);
586
585
err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
587
586
if (err!=TIFFReadDirEntryErrOk)
588
#if defined(__WIN32__) && (_MSC_VER < 1500)
590
* XXX: MSVC 6.0 does not support conversion
591
* of 64-bit integers into floating point
594
*value = _TIFFUInt64ToFloat(m);
590
598
return(TIFFReadDirEntryErrOk);
592
600
case TIFF_SLONG8:
2734
if (direntry->tdir_count!=(uint64)tif->tif_dir.td_samplesperpixel)
2741
if (direntry->tdir_count<(uint64)tif->tif_dir.td_samplesperpixel)
2735
2742
return(TIFFReadDirEntryErrCount);
2736
2743
err=TIFFReadDirEntryShortArray(tif,direntry,&m);
2737
2744
if (err!=TIFFReadDirEntryErrOk)
2756
2764
static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
2758
2766
enum TIFFReadDirEntryErr err;
2762
if (direntry->tdir_count!=(uint64)tif->tif_dir.td_samplesperpixel)
2770
if (direntry->tdir_count<(uint64)tif->tif_dir.td_samplesperpixel)
2763
2771
return(TIFFReadDirEntryErrCount);
2764
2772
err=TIFFReadDirEntryDoubleArray(tif,direntry,&m);
2765
2773
if (err!=TIFFReadDirEntryErrOk)
2796
2805
static void TIFFReadDirEntryCheckedShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
2798
2807
*value = direntry->tdir_offset.toff_short;
2799
//*value=*(uint16*)(&direntry->tdir_offset);
2808
/* *value=*(uint16*)(&direntry->tdir_offset); */
2800
2809
if (tif->tif_flags&TIFF_SWAB)
2801
2810
TIFFSwabShort(value);
3432
3441
TIFFReadDirectoryCheckOrder(tif,dir,dircount);
3445
for (ma=dir, mb=0; mb<dircount; ma++, mb++)
3449
for (na=ma+1, nb=mb+1; nb<dircount; na++, nb++)
3451
if (ma->tdir_tag==na->tdir_tag)
3452
na->tdir_tag=IGNORE;
3433
3456
tif->tif_flags &= ~TIFF_BEENWRITING; /* reset before new dir */
3434
3457
tif->tif_flags &= ~TIFF_BUF4WRITE; /* reset before new dir */
3435
3458
/* free any old stuff and reinit */
3569
3592
if ((tif->tif_dir.td_compression==COMPRESSION_OJPEG)&&
3570
3593
(tif->tif_dir.td_planarconfig==PLANARCONFIG_SEPARATE))
3595
if (!_TIFFFillStriles(tif))
3572
3597
dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_STRIPOFFSETS);
3573
3598
if ((dp!=0)&&(dp->tdir_count==1))
3664
3689
err=TIFFReadDirEntryPersampleShort(tif,dp,&value);
3665
3690
if (err!=TIFFReadDirEntryErrOk)
3667
TIFFReadDirEntryOutputErr(tif,err,module,TIFFFieldWithTag(tif,dp->tdir_tag)->field_name,0);
3692
fip = TIFFFieldWithTag(tif,dp->tdir_tag);
3693
TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
3670
3696
if (!TIFFSetField(tif,dp->tdir_tag,value))
3674
3700
case TIFFTAG_SMINSAMPLEVALUE:
3675
3701
case TIFFTAG_SMAXSAMPLEVALUE:
3678
3705
enum TIFFReadDirEntryErr err;
3679
err=TIFFReadDirEntryPersampleDouble(tif,dp,&value);
3708
if (dp->tdir_count != (uint64)tif->tif_dir.td_samplesperpixel)
3709
err = TIFFReadDirEntryErrCount;
3711
err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
3680
3712
if (err!=TIFFReadDirEntryErrOk)
3682
TIFFReadDirEntryOutputErr(tif,err,module,TIFFFieldWithTag(tif,dp->tdir_tag)->field_name,0);
3714
fip = TIFFFieldWithTag(tif,dp->tdir_tag);
3715
TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
3685
if (!TIFFSetField(tif,dp->tdir_tag,value))
3718
saved_flags = tif->tif_flags;
3719
tif->tif_flags |= TIFF_PERSAMPLE;
3720
m = TIFFSetField(tif,dp->tdir_tag,data);
3721
tif->tif_flags = saved_flags;
3689
3727
case TIFFTAG_STRIPOFFSETS:
3690
3728
case TIFFTAG_TILEOFFSETS:
3729
#if defined(DEFER_STRILE_LOAD)
3730
_TIFFmemcpy( &(tif->tif_dir.td_stripoffset_entry),
3731
dp, sizeof(TIFFDirEntry) );
3691
3733
if (!TIFFFetchStripThing(tif,dp,tif->tif_dir.td_nstrips,&tif->tif_dir.td_stripoffset))
3694
3737
case TIFFTAG_STRIPBYTECOUNTS:
3695
3738
case TIFFTAG_TILEBYTECOUNTS:
3739
#if defined(DEFER_STRILE_LOAD)
3740
_TIFFmemcpy( &(tif->tif_dir.td_stripbytecount_entry),
3741
dp, sizeof(TIFFDirEntry) );
3696
3743
if (!TIFFFetchStripThing(tif,dp,tif->tif_dir.td_nstrips,&tif->tif_dir.td_stripbytecount))
3699
3747
case TIFFTAG_COLORMAP:
3700
3748
case TIFFTAG_TRANSFERFUNCTION:
3721
3769
err=TIFFReadDirEntryShortArray(tif,dp,&value);
3722
3770
if (err!=TIFFReadDirEntryErrOk)
3723
TIFFReadDirEntryOutputErr(tif,err,module,TIFFFieldWithTag(tif,dp->tdir_tag)->field_name,1);
3772
fip = TIFFFieldWithTag(tif,dp->tdir_tag);
3773
TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",1);
3726
3777
TIFFSetField(tif,dp->tdir_tag,value,value+incrementpersample,value+2*incrementpersample);
3794
3845
if (!TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
3796
if ((tif->tif_dir.td_photometric==PHOTOMETRIC_RGB)
3797
|| (tif->tif_dir.td_photometric==PHOTOMETRIC_YCBCR))
3847
if (tif->tif_dir.td_photometric==PHOTOMETRIC_RGB)
3799
3849
TIFFWarningExt(tif->tif_clientdata,module,
3800
3850
"SamplesPerPixel tag is missing, "
3802
3852
if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3))
3855
if (tif->tif_dir.td_photometric==PHOTOMETRIC_YCBCR)
3857
TIFFWarningExt(tif->tif_clientdata,module,
3858
"SamplesPerPixel tag is missing, "
3859
"applying correct SamplesPerPixel value of 3");
3860
if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3))
3805
3863
else if ((tif->tif_dir.td_photometric==PHOTOMETRIC_MINISWHITE)
3806
3864
|| (tif->tif_dir.td_photometric==PHOTOMETRIC_MINISBLACK))
3808
TIFFWarningExt(tif->tif_clientdata,module,
3809
"SamplesPerPixel tag is missing, "
3810
"assuming correct SamplesPerPixel value is 1");
3867
* SamplesPerPixel tag is missing, but is not required
3868
* by spec. Assume correct SamplesPerPixel value of 1.
3811
3870
if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,1))
3819
3878
if (tif->tif_dir.td_photometric == PHOTOMETRIC_PALETTE &&
3820
3879
!TIFFFieldSet(tif, FIELD_COLORMAP)) {
3821
MissingRequired(tif, "Colormap");
3880
if ( tif->tif_dir.td_bitspersample>=8 && tif->tif_dir.td_samplesperpixel==3)
3881
tif->tif_dir.td_photometric = PHOTOMETRIC_RGB;
3882
else if (tif->tif_dir.td_bitspersample>=8)
3883
tif->tif_dir.td_photometric = PHOTOMETRIC_MINISBLACK;
3885
MissingRequired(tif, "Colormap");
3885
3951
TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name);
3886
3952
if(EstimateStripByteCounts(tif, dir, dircount) < 0)
3955
#if !defined(DEFER_STRILE_LOAD)
3888
3956
} else if (tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG
3889
3957
&& tif->tif_dir.td_nstrips > 2
3890
3958
&& tif->tif_dir.td_compression == COMPRESSION_NONE
3896
3964
* absolutely wrong values (it can be equal to
3897
3965
* StripOffset array, for example). Catch this case
3968
* We avoid this check if deferring strile loading
3969
* as it would always force us to load the strip/tile
3900
3972
TIFFWarningExt(tif->tif_clientdata, module,
3901
3973
"Wrong \"%s\" field, ignoring and calculating from imagelength",
3902
3974
TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name);
3903
3975
if (EstimateStripByteCounts(tif, dir, dircount) < 0)
3977
#endif /* !defined(DEFER_STRILE_LOAD) */
3951
4027
(tif->tif_dir.td_nstrips==1)&&
3952
4028
(tif->tif_dir.td_compression==COMPRESSION_NONE)&&
3953
4029
((tif->tif_flags&(TIFF_STRIPCHOP|TIFF_ISTILED))==TIFF_STRIPCHOP))
4031
if ( !_TIFFFillStriles(tif) || !tif->tif_dir.td_stripbytecount )
3954
4033
ChopUpSingleUncompressedStrip(tif);
3957
4037
* Clear the dirty directory flag.
4323
4405
CheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count)
4325
4407
if ((uint64)count > dir->tdir_count) {
4408
const TIFFField* fip = TIFFFieldWithTag(tif, dir->tdir_tag);
4326
4409
TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
4327
4410
"incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT ", expecting %u); tag ignored",
4328
TIFFFieldWithTag(tif, dir->tdir_tag)->field_name,
4411
fip ? fip->field_name : "unknown tagname",
4329
4412
dir->tdir_count, count);
4331
4414
} else if ((uint64)count < dir->tdir_count) {
4415
const TIFFField* fip = TIFFFieldWithTag(tif, dir->tdir_tag);
4332
4416
TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
4333
4417
"incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT ", expecting %u); tag trimmed",
4334
TIFFFieldWithTag(tif, dir->tdir_tag)->field_name,
4418
fip ? fip->field_name : "unknown tagname",
4335
4419
dir->tdir_count, count);
4420
dir->tdir_count = count;
4502
4587
dircount16 = (uint16)dircount64;
4590
if (dircount16 == 0 )
4592
TIFFErrorExt(tif->tif_clientdata, module,
4593
"Sanity check on directory count failed, zero tag directories not supported");
4505
4596
origdir = _TIFFCheckMalloc(tif, dircount16,
4507
4598
"to read TIFF directory");
4811
case TIFF_SETGET_FLOAT:
4814
assert(fip->field_readcount==1);
4815
assert(fip->field_passcount==0);
4816
err=TIFFReadDirEntryFloat(tif,dp,&data);
4817
if (err==TIFFReadDirEntryErrOk)
4819
if (!TIFFSetField(tif,dp->tdir_tag,data))
4720
4824
case TIFF_SETGET_DOUBLE:
5236
5340
if (err!=TIFFReadDirEntryErrOk)
5238
TIFFReadDirEntryOutputErr(tif,err,module,fip->field_name,recover);
5342
TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",recover);
5254
5358
err=TIFFReadDirEntryLong8Array(tif,dir,&data);
5255
5359
if (err!=TIFFReadDirEntryErrOk)
5257
TIFFReadDirEntryOutputErr(tif,err,module,TIFFFieldWithTag(tif,dir->tdir_tag)->field_name,0);
5361
const TIFFField* fip = TIFFFieldWithTag(tif,dir->tdir_tag);
5362
TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
5260
5365
if (dir->tdir_count!=(uint64)nstrips)
5262
5367
uint64* resizeddata;
5263
5368
resizeddata=(uint64*)_TIFFCheckMalloc(tif,nstrips,sizeof(uint64),"for strip array");
5369
if (resizeddata==0) {
5266
5373
if (dir->tdir_count<(uint64)nstrips)
5268
5375
_TIFFmemcpy(resizeddata,data,(uint32)dir->tdir_count*sizeof(uint64));
5431
5539
td->td_stripbytecountsorted = 1;
5542
int _TIFFFillStriles( TIFF *tif )
5544
#if defined(DEFER_STRILE_LOAD)
5545
register TIFFDirectory *td = &tif->tif_dir;
5546
int return_value = 1;
5548
if( td->td_stripoffset != NULL )
5551
if( td->td_stripoffset_entry.tdir_count == 0 )
5554
if (!TIFFFetchStripThing(tif,&(td->td_stripoffset_entry),
5555
td->td_nstrips,&td->td_stripoffset))
5560
if (!TIFFFetchStripThing(tif,&(td->td_stripbytecount_entry),
5561
td->td_nstrips,&td->td_stripbytecount))
5566
_TIFFmemset( &(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
5567
_TIFFmemset( &(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
5569
if (tif->tif_dir.td_nstrips > 1 && return_value == 1 ) {
5572
tif->tif_dir.td_stripbytecountsorted = 1;
5573
for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++) {
5574
if (tif->tif_dir.td_stripoffset[strip - 1] >
5575
tif->tif_dir.td_stripoffset[strip]) {
5576
tif->tif_dir.td_stripbytecountsorted = 0;
5582
return return_value;
5583
#else /* !defined(DEFER_STRILE_LOAD) */
5434
5590
/* vim: set ts=8 sts=8 sw=8 noet: */