4 * Copyright (c) 1988-1997 Sam Leffler
5 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
7 * Permission to use, copy, modify, distribute, and sell this software and
8 * its documentation for any purpose is hereby granted without fee, provided
9 * that (i) the above copyright notices and this permission notice appear in
10 * all copies of the software and related documentation, and (ii) the names of
11 * Sam Leffler and Silicon Graphics may not be used in any advertising or
12 * publicity relating to the software without the specific, prior written
13 * permission of Sam Leffler and Silicon Graphics.
15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
30 * Directory Read Support Routines.
34 #define IGNORE 0 /* tag placeholder used below */
37 #define TIFFCvtIEEEFloatToNative(tif, n, fp)
38 #define TIFFCvtIEEEDoubleToNative(tif, n, dp)
40 extern void TIFFCvtIEEEFloatToNative(TIFF
*, uint32
, float*);
41 extern void TIFFCvtIEEEDoubleToNative(TIFF
*, uint32
, double*);
44 static int EstimateStripByteCounts(TIFF
*, TIFFDirEntry
*, uint16
);
45 static void MissingRequired(TIFF
*, const char*);
46 static int CheckDirCount(TIFF
*, TIFFDirEntry
*, uint32
);
47 static tsize_t
TIFFFetchData(TIFF
*, TIFFDirEntry
*, char*);
48 static tsize_t
TIFFFetchString(TIFF
*, TIFFDirEntry
*, char*);
49 static float TIFFFetchRational(TIFF
*, TIFFDirEntry
*);
50 static int TIFFFetchNormalTag(TIFF
*, TIFFDirEntry
*);
51 static int TIFFFetchPerSampleShorts(TIFF
*, TIFFDirEntry
*, int*);
52 static int TIFFFetchPerSampleAnys(TIFF
*, TIFFDirEntry
*, double*);
53 static int TIFFFetchShortArray(TIFF
*, TIFFDirEntry
*, uint16
*);
54 static int TIFFFetchStripThing(TIFF
*, TIFFDirEntry
*, long, uint32
**);
55 static int TIFFFetchExtraSamples(TIFF
*, TIFFDirEntry
*);
56 static int TIFFFetchRefBlackWhite(TIFF
*, TIFFDirEntry
*);
57 static float TIFFFetchFloat(TIFF
*, TIFFDirEntry
*);
58 static int TIFFFetchFloatArray(TIFF
*, TIFFDirEntry
*, float*);
59 static int TIFFFetchDoubleArray(TIFF
*, TIFFDirEntry
*, double*);
60 static int TIFFFetchAnyArray(TIFF
*, TIFFDirEntry
*, double*);
61 static int TIFFFetchShortPair(TIFF
*, TIFFDirEntry
*);
62 static void ChopUpSingleUncompressedStrip(TIFF
*);
65 CheckMalloc(TIFF
* tif
, size_t nmemb
, size_t elem_size
, const char* what
)
68 tsize_t bytes
= nmemb
* elem_size
;
70 if (elem_size
&& bytes
/ elem_size
== nmemb
)
71 cp
= (char*)_TIFFmalloc(bytes
);
74 TIFFError(tif
->tif_name
, "No space %s", what
);
80 * Read the next TIFF directory from a file
81 * and convert it to the internal format.
82 * We read directories sequentially.
85 TIFFReadDirectory(TIFF
* tif
)
87 static const char module[] = "TIFFReadDirectory";
89 register TIFFDirEntry
* dp
;
91 register TIFFDirectory
* td
;
96 const TIFFFieldInfo
* fip
;
101 int diroutoforderwarning
= 0;
104 tif
->tif_diroff
= tif
->tif_nextdiroff
;
105 if (tif
->tif_diroff
== 0) /* no more directories */
109 * XXX: Trick to prevent IFD looping. The one can create TIFF file
110 * with looped directory pointers. We will maintain a list of already
111 * seen directories and check every IFD offset against this list.
113 for (n
= 0; n
< tif
->tif_dirnumber
; n
++) {
114 if (tif
->tif_dirlist
[n
] == tif
->tif_diroff
)
117 tif
->tif_dirnumber
++;
118 new_dirlist
= _TIFFrealloc(tif
->tif_dirlist
,
119 tif
->tif_dirnumber
* sizeof(toff_t
));
122 "%.1000s: Failed to allocate space for IFD list",
126 tif
->tif_dirlist
= new_dirlist
;
127 tif
->tif_dirlist
[tif
->tif_dirnumber
- 1] = tif
->tif_diroff
;
130 * Cleanup any previous compression state.
132 (*tif
->tif_cleanup
)(tif
);
135 if (!isMapped(tif
)) {
136 if (!SeekOK(tif
, tif
->tif_diroff
)) {
138 "%.1000s: Seek error accessing TIFF directory",
142 if (!ReadOK(tif
, &dircount
, sizeof (uint16
))) {
144 "%.1000s: Can not read TIFF directory count",
148 if (tif
->tif_flags
& TIFF_SWAB
)
149 TIFFSwabShort(&dircount
);
150 dir
= (TIFFDirEntry
*)CheckMalloc(tif
,
151 dircount
, sizeof (TIFFDirEntry
), "to read TIFF directory");
154 if (!ReadOK(tif
, dir
, dircount
*sizeof (TIFFDirEntry
))) {
156 "%.100s: Can not read TIFF directory",
161 * Read offset to next directory for sequential scans.
163 (void) ReadOK(tif
, &nextdiroff
, sizeof (uint32
));
165 toff_t off
= tif
->tif_diroff
;
167 if (off
+ sizeof (uint16
) > tif
->tif_size
) {
169 "%.1000s: Can not read TIFF directory count",
173 _TIFFmemcpy(&dircount
, tif
->tif_base
+ off
, sizeof (uint16
));
174 off
+= sizeof (uint16
);
175 if (tif
->tif_flags
& TIFF_SWAB
)
176 TIFFSwabShort(&dircount
);
177 dir
= (TIFFDirEntry
*)CheckMalloc(tif
,
178 dircount
, sizeof (TIFFDirEntry
), "to read TIFF directory");
181 if (off
+ dircount
*sizeof (TIFFDirEntry
) > tif
->tif_size
) {
183 "%.1000s: Can not read TIFF directory",
187 _TIFFmemcpy(dir
, tif
->tif_base
+ off
,
188 dircount
*sizeof (TIFFDirEntry
));
190 off
+= dircount
* sizeof (TIFFDirEntry
);
191 if (off
+ sizeof (uint32
) <= tif
->tif_size
)
192 _TIFFmemcpy(&nextdiroff
, tif
->tif_base
+off
, sizeof (uint32
));
194 if (tif
->tif_flags
& TIFF_SWAB
)
195 TIFFSwabLong(&nextdiroff
);
196 tif
->tif_nextdiroff
= nextdiroff
;
198 tif
->tif_flags
&= ~TIFF_BEENWRITING
; /* reset before new dir */
200 * Setup default value and then make a pass over
201 * the fields to check type and tag information,
202 * and to extract info required to size data
203 * structures. A second pass is made afterwards
204 * to read in everthing not taken in the first pass.
207 /* free any old stuff and reinit */
208 TIFFFreeDirectory(tif
);
209 TIFFDefaultDirectory(tif
);
211 * Electronic Arts writes gray-scale TIFF files
212 * without a PlanarConfiguration directory entry.
213 * Thus we setup a default value here, even though
214 * the TIFF spec says there is no default value.
216 TIFFSetField(tif
, TIFFTAG_PLANARCONFIG
, PLANARCONFIG_CONTIG
);
219 * Sigh, we must make a separate pass through the
220 * directory for the following reason:
222 * We must process the Compression tag in the first pass
223 * in order to merge in codec-private tag definitions (otherwise
224 * we may get complaints about unknown tags). However, the
225 * Compression tag may be dependent on the SamplesPerPixel
226 * tag value because older TIFF specs permited Compression
227 * to be written as a SamplesPerPixel-count tag entry.
228 * Thus if we don't first figure out the correct SamplesPerPixel
229 * tag value then we may end up ignoring the Compression tag
230 * value because it has an incorrect count value (if the
231 * true value of SamplesPerPixel is not 1).
233 * It sure would have been nice if Aldus had really thought
234 * this stuff through carefully.
236 for (dp
= dir
, n
= dircount
; n
> 0; n
--, dp
++) {
237 if (tif
->tif_flags
& TIFF_SWAB
) {
238 TIFFSwabArrayOfShort(&dp
->tdir_tag
, 2);
239 TIFFSwabArrayOfLong(&dp
->tdir_count
, 2);
241 if (dp
->tdir_tag
== TIFFTAG_SAMPLESPERPIXEL
) {
242 if (!TIFFFetchNormalTag(tif
, dp
))
244 dp
->tdir_tag
= IGNORE
;
248 * First real pass over the directory.
251 for (dp
= dir
, n
= dircount
; n
> 0; n
--, dp
++) {
254 * Find the field information entry for this tag.
255 * Added check for tags to ignore ... [BFC]
257 if( TIFFReassignTagToIgnore(TIS_EXTRACT
, dp
->tdir_tag
) )
258 dp
->tdir_tag
= IGNORE
;
260 if (fix
>= tif
->tif_nfields
|| dp
->tdir_tag
== IGNORE
)
264 * Silicon Beach (at least) writes unordered
265 * directory tags (violating the spec). Handle
266 * it here, but be obnoxious (maybe they'll fix it?).
268 if (dp
->tdir_tag
< tif
->tif_fieldinfo
[fix
]->field_tag
) {
269 if (!diroutoforderwarning
) {
271 "%.1000s: invalid TIFF directory; tags are not sorted in ascending order",
273 diroutoforderwarning
= 1;
275 fix
= 0; /* O(n^2) */
277 while (fix
< tif
->tif_nfields
&&
278 tif
->tif_fieldinfo
[fix
]->field_tag
< dp
->tdir_tag
)
280 if (fix
>= tif
->tif_nfields
||
281 tif
->tif_fieldinfo
[fix
]->field_tag
!= dp
->tdir_tag
) {
284 "%.1000s: unknown field with tag %d (0x%x) encountered",
285 tif
->tif_name
, dp
->tdir_tag
, dp
->tdir_tag
);
287 TIFFMergeFieldInfo( tif
,
288 _TIFFCreateAnonFieldInfo( tif
,
290 (TIFFDataType
) dp
->tdir_type
),
293 while (fix
< tif
->tif_nfields
&&
294 tif
->tif_fieldinfo
[fix
]->field_tag
< dp
->tdir_tag
)
298 * Null out old tags that we ignore.
300 if (tif
->tif_fieldinfo
[fix
]->field_bit
== FIELD_IGNORE
) {
302 dp
->tdir_tag
= IGNORE
;
308 fip
= tif
->tif_fieldinfo
[fix
];
309 while (dp
->tdir_type
!= (u_short
) fip
->field_type
) {
310 if (fip
->field_type
== TIFF_ANY
) /* wildcard */
313 if (fix
== tif
->tif_nfields
||
314 fip
->field_tag
!= dp
->tdir_tag
) {
316 "%.1000s: wrong data type %d for \"%s\"; tag ignored",
317 tif
->tif_name
, dp
->tdir_type
,
323 * Check count if known in advance.
325 if (fip
->field_readcount
!= TIFF_VARIABLE
) {
326 uint32 expected
= (fip
->field_readcount
== TIFF_SPP
) ?
327 (uint32
) td
->td_samplesperpixel
:
328 (uint32
) fip
->field_readcount
;
329 if (!CheckDirCount(tif
, dp
, expected
))
333 switch (dp
->tdir_tag
) {
334 case TIFFTAG_COMPRESSION
:
336 * The 5.0 spec says the Compression tag has
337 * one value, while earlier specs say it has
338 * one value per sample. Because of this, we
339 * accept the tag if one value is supplied.
341 if (dp
->tdir_count
== 1) {
342 v
= TIFFExtractData(tif
,
343 dp
->tdir_type
, dp
->tdir_offset
);
344 if (!TIFFSetField(tif
, dp
->tdir_tag
, (int)v
))
348 if (!TIFFFetchPerSampleShorts(tif
, dp
, &iv
) ||
349 !TIFFSetField(tif
, dp
->tdir_tag
, iv
))
351 dp
->tdir_tag
= IGNORE
;
353 case TIFFTAG_STRIPOFFSETS
:
354 case TIFFTAG_STRIPBYTECOUNTS
:
355 case TIFFTAG_TILEOFFSETS
:
356 case TIFFTAG_TILEBYTECOUNTS
:
357 TIFFSetFieldBit(tif
, fip
->field_bit
);
359 case TIFFTAG_IMAGEWIDTH
:
360 case TIFFTAG_IMAGELENGTH
:
361 case TIFFTAG_IMAGEDEPTH
:
362 case TIFFTAG_TILELENGTH
:
363 case TIFFTAG_TILEWIDTH
:
364 case TIFFTAG_TILEDEPTH
:
365 case TIFFTAG_PLANARCONFIG
:
366 case TIFFTAG_ROWSPERSTRIP
:
367 if (!TIFFFetchNormalTag(tif
, dp
))
369 dp
->tdir_tag
= IGNORE
;
371 case TIFFTAG_EXTRASAMPLES
:
372 (void) TIFFFetchExtraSamples(tif
, dp
);
373 dp
->tdir_tag
= IGNORE
;
379 * Allocate directory structure and setup defaults.
381 if (!TIFFFieldSet(tif
, FIELD_IMAGEDIMENSIONS
)) {
382 MissingRequired(tif
, "ImageLength");
385 if (!TIFFFieldSet(tif
, FIELD_PLANARCONFIG
)) {
386 MissingRequired(tif
, "PlanarConfiguration");
390 * Setup appropriate structures (by strip or by tile)
392 if (!TIFFFieldSet(tif
, FIELD_TILEDIMENSIONS
)) {
393 td
->td_nstrips
= TIFFNumberOfStrips(tif
);
394 td
->td_tilewidth
= td
->td_imagewidth
;
395 td
->td_tilelength
= td
->td_rowsperstrip
;
396 td
->td_tiledepth
= td
->td_imagedepth
;
397 tif
->tif_flags
&= ~TIFF_ISTILED
;
399 td
->td_nstrips
= TIFFNumberOfTiles(tif
);
400 tif
->tif_flags
|= TIFF_ISTILED
;
402 if (!td
->td_nstrips
) {
403 TIFFError(module, "%s: cannot handle zero number of %s",
404 tif
->tif_name
, isTiled(tif
) ? "tiles" : "strips");
407 td
->td_stripsperimage
= td
->td_nstrips
;
408 if (td
->td_planarconfig
== PLANARCONFIG_SEPARATE
)
409 td
->td_stripsperimage
/= td
->td_samplesperpixel
;
410 if (!TIFFFieldSet(tif
, FIELD_STRIPOFFSETS
)) {
412 isTiled(tif
) ? "TileOffsets" : "StripOffsets");
417 * Second pass: extract other information.
419 for (dp
= dir
, n
= dircount
; n
> 0; n
--, dp
++) {
420 if (dp
->tdir_tag
== IGNORE
)
422 switch (dp
->tdir_tag
) {
423 case TIFFTAG_MINSAMPLEVALUE
:
424 case TIFFTAG_MAXSAMPLEVALUE
:
425 case TIFFTAG_BITSPERSAMPLE
:
427 * The 5.0 spec says the Compression tag has
428 * one value, while earlier specs say it has
429 * one value per sample. Because of this, we
430 * accept the tag if one value is supplied.
432 * The MinSampleValue, MaxSampleValue and
433 * BitsPerSample tags are supposed to be written
434 * as one value/sample, but some vendors incorrectly
435 * write one value only -- so we accept that
438 if (dp
->tdir_count
== 1) {
439 v
= TIFFExtractData(tif
,
440 dp
->tdir_type
, dp
->tdir_offset
);
441 if (!TIFFSetField(tif
, dp
->tdir_tag
, (int)v
))
446 case TIFFTAG_DATATYPE
:
447 case TIFFTAG_SAMPLEFORMAT
:
448 if (!TIFFFetchPerSampleShorts(tif
, dp
, &iv
) ||
449 !TIFFSetField(tif
, dp
->tdir_tag
, iv
))
452 case TIFFTAG_SMINSAMPLEVALUE
:
453 case TIFFTAG_SMAXSAMPLEVALUE
:
454 if (!TIFFFetchPerSampleAnys(tif
, dp
, &dv
) ||
455 !TIFFSetField(tif
, dp
->tdir_tag
, dv
))
458 case TIFFTAG_STRIPOFFSETS
:
459 case TIFFTAG_TILEOFFSETS
:
460 if (!TIFFFetchStripThing(tif
, dp
,
461 td
->td_nstrips
, &td
->td_stripoffset
))
464 case TIFFTAG_STRIPBYTECOUNTS
:
465 case TIFFTAG_TILEBYTECOUNTS
:
466 if (!TIFFFetchStripThing(tif
, dp
,
467 td
->td_nstrips
, &td
->td_stripbytecount
))
470 case TIFFTAG_COLORMAP
:
471 case TIFFTAG_TRANSFERFUNCTION
:
473 * TransferFunction can have either 1x or 3x data
474 * values; Colormap can have only 3x items.
476 v
= 1L<<td
->td_bitspersample
;
477 if (dp
->tdir_tag
== TIFFTAG_COLORMAP
||
478 dp
->tdir_count
!= (uint32
) v
) {
479 if (!CheckDirCount(tif
, dp
, (uint32
)(3*v
)))
482 v
*= sizeof (uint16
);
483 cp
= CheckMalloc(tif
, dp
->tdir_count
, sizeof (uint16
),
484 "to read \"TransferFunction\" tag");
486 if (TIFFFetchData(tif
, dp
, cp
)) {
488 * This deals with there being only
489 * one array to apply to all samples.
492 (uint32
)1 << td
->td_bitspersample
;
493 if (dp
->tdir_count
== c
)
495 TIFFSetField(tif
, dp
->tdir_tag
,
501 case TIFFTAG_PAGENUMBER
:
502 case TIFFTAG_HALFTONEHINTS
:
503 case TIFFTAG_YCBCRSUBSAMPLING
:
504 case TIFFTAG_DOTRANGE
:
505 (void) TIFFFetchShortPair(tif
, dp
);
507 #ifdef COLORIMETRY_SUPPORT
508 case TIFFTAG_REFERENCEBLACKWHITE
:
509 (void) TIFFFetchRefBlackWhite(tif
, dp
);
512 /* BEGIN REV 4.0 COMPATIBILITY */
513 case TIFFTAG_OSUBFILETYPE
:
515 switch (TIFFExtractData(tif
, dp
->tdir_type
,
517 case OFILETYPE_REDUCEDIMAGE
:
518 v
= FILETYPE_REDUCEDIMAGE
;
525 (void) TIFFSetField(tif
,
526 TIFFTAG_SUBFILETYPE
, (int)v
);
528 /* END REV 4.0 COMPATIBILITY */
530 (void) TIFFFetchNormalTag(tif
, dp
);
535 * Verify Palette image has a Colormap.
537 if (td
->td_photometric
== PHOTOMETRIC_PALETTE
&&
538 !TIFFFieldSet(tif
, FIELD_COLORMAP
)) {
539 MissingRequired(tif
, "Colormap");
543 * Attempt to deal with a missing StripByteCounts tag.
545 if (!TIFFFieldSet(tif
, FIELD_STRIPBYTECOUNTS
)) {
547 * Some manufacturers violate the spec by not giving
548 * the size of the strips. In this case, assume there
549 * is one uncompressed strip of data.
551 if ((td
->td_planarconfig
== PLANARCONFIG_CONTIG
&&
552 td
->td_nstrips
> 1) ||
553 (td
->td_planarconfig
== PLANARCONFIG_SEPARATE
&&
554 td
->td_nstrips
!= td
->td_samplesperpixel
)) {
555 MissingRequired(tif
, "StripByteCounts");
559 "%.1000s: TIFF directory is missing required "
560 "\"%s\" field, calculating from imagelength",
562 _TIFFFieldWithTag(tif
,TIFFTAG_STRIPBYTECOUNTS
)->field_name
);
563 if (EstimateStripByteCounts(tif
, dir
, dircount
) < 0)
566 * Assume we have wrong StripByteCount value (in case of single strip) in
568 * - it is equal to zero along with StripOffset;
569 * - it is larger than file itself (in case of uncompressed image).
571 #define BYTECOUNTLOOKSBAD \
572 ( (td->td_stripbytecount[0] == 0 && td->td_stripoffset[0] != 0) || \
573 (td->td_compression == COMPRESSION_NONE && \
574 td->td_stripbytecount[0] > TIFFGetFileSize(tif) - td->td_stripoffset[0]) )
575 } else if (td
->td_nstrips
== 1 && BYTECOUNTLOOKSBAD
) {
577 * Plexus (and others) sometimes give a value
578 * of zero for a tag when they don't know what
579 * the correct value is! Try and handle the
580 * simple case of estimating the size of a one
584 "%.1000s: Bogus \"%s\" field, ignoring and calculating from imagelength",
586 _TIFFFieldWithTag(tif
,TIFFTAG_STRIPBYTECOUNTS
)->field_name
);
587 if(EstimateStripByteCounts(tif
, dir
, dircount
) < 0)
591 _TIFFfree((char *)dir
);
594 if (!TIFFFieldSet(tif
, FIELD_MAXSAMPLEVALUE
))
595 td
->td_maxsamplevalue
= (uint16
)((1L<<td
->td_bitspersample
)-1);
597 * Setup default compression scheme.
599 if (!TIFFFieldSet(tif
, FIELD_COMPRESSION
))
600 TIFFSetField(tif
, TIFFTAG_COMPRESSION
, COMPRESSION_NONE
);
602 * Some manufacturers make life difficult by writing
603 * large amounts of uncompressed data as a single strip.
604 * This is contrary to the recommendations of the spec.
605 * The following makes an attempt at breaking such images
606 * into strips closer to the recommended 8k bytes. A
607 * side effect, however, is that the RowsPerStrip tag
608 * value may be changed.
610 if (td
->td_nstrips
== 1 && td
->td_compression
== COMPRESSION_NONE
&&
611 (tif
->tif_flags
& (TIFF_STRIPCHOP
|TIFF_ISTILED
)) == TIFF_STRIPCHOP
)
612 ChopUpSingleUncompressedStrip(tif
);
614 * Reinitialize i/o since we are starting on a new directory.
616 tif
->tif_row
= (uint32
) -1;
617 tif
->tif_curstrip
= (tstrip_t
) -1;
618 tif
->tif_col
= (uint32
) -1;
619 tif
->tif_curtile
= (ttile_t
) -1;
620 tif
->tif_tilesize
= TIFFTileSize(tif
);
621 tif
->tif_scanlinesize
= TIFFScanlineSize(tif
);
623 if (!tif
->tif_tilesize
) {
624 TIFFError(module, "%s: cannot handle zero tile size",
628 if (!tif
->tif_scanlinesize
) {
629 TIFFError(module, "%s: cannot handle zero scanline size",
641 EstimateStripByteCounts(TIFF
* tif
, TIFFDirEntry
* dir
, uint16 dircount
)
643 static const char module[] = "EstimateStripByteCounts";
645 register TIFFDirEntry
*dp
;
646 register TIFFDirectory
*td
= &tif
->tif_dir
;
649 if (td
->td_stripbytecount
)
650 _TIFFfree(td
->td_stripbytecount
);
651 td
->td_stripbytecount
= (uint32
*)
652 CheckMalloc(tif
, td
->td_nstrips
, sizeof (uint32
),
653 "for \"StripByteCounts\" array");
654 if (td
->td_compression
!= COMPRESSION_NONE
) {
655 uint32 space
= (uint32
)(sizeof (TIFFHeader
)
657 + (dircount
* sizeof (TIFFDirEntry
))
659 toff_t filesize
= TIFFGetFileSize(tif
);
662 /* calculate amount of space used by indirect values */
663 for (dp
= dir
, n
= dircount
; n
> 0; n
--, dp
++)
665 uint32 cc
= TIFFDataWidth((TIFFDataType
) dp
->tdir_type
);
668 "%.1000s: Cannot determine size of unknown tag type %d",
669 tif
->tif_name
, dp
->tdir_type
);
672 cc
= cc
* dp
->tdir_count
;
673 if (cc
> sizeof (uint32
))
676 space
= filesize
- space
;
677 if (td
->td_planarconfig
== PLANARCONFIG_SEPARATE
)
678 space
/= td
->td_samplesperpixel
;
679 for (i
= 0; i
< td
->td_nstrips
; i
++)
680 td
->td_stripbytecount
[i
] = space
;
682 * This gross hack handles the case were the offset to
683 * the last strip is past the place where we think the strip
684 * should begin. Since a strip of data must be contiguous,
685 * it's safe to assume that we've overestimated the amount
686 * of data in the strip and trim this number back accordingly.
689 if (((toff_t
)(td
->td_stripoffset
[i
]+td
->td_stripbytecount
[i
]))
691 td
->td_stripbytecount
[i
] =
692 filesize
- td
->td_stripoffset
[i
];
694 uint32 rowbytes
= TIFFScanlineSize(tif
);
695 uint32 rowsperstrip
= td
->td_imagelength
/td
->td_stripsperimage
;
696 for (i
= 0; i
< td
->td_nstrips
; i
++)
697 td
->td_stripbytecount
[i
] = rowbytes
*rowsperstrip
;
699 TIFFSetFieldBit(tif
, FIELD_STRIPBYTECOUNTS
);
700 if (!TIFFFieldSet(tif
, FIELD_ROWSPERSTRIP
))
701 td
->td_rowsperstrip
= td
->td_imagelength
;
706 MissingRequired(TIFF
* tif
, const char* tagname
)
708 static const char module[] = "MissingRequired";
711 "%.1000s: TIFF directory is missing required \"%s\" field",
712 tif
->tif_name
, tagname
);
716 * Check the count field of a directory
717 * entry against a known value. The caller
718 * is expected to skip/ignore the tag if
719 * there is a mismatch.
722 CheckDirCount(TIFF
* tif
, TIFFDirEntry
* dir
, uint32 count
)
724 if (count
!= dir
->tdir_count
) {
725 TIFFWarning(tif
->tif_name
,
726 "incorrect count for field \"%s\" (%lu, expecting %lu); tag ignored",
727 _TIFFFieldWithTag(tif
, dir
->tdir_tag
)->field_name
,
728 dir
->tdir_count
, count
);
735 * Fetch a contiguous directory item.
738 TIFFFetchData(TIFF
* tif
, TIFFDirEntry
* dir
, char* cp
)
740 int w
= TIFFDataWidth((TIFFDataType
) dir
->tdir_type
);
741 tsize_t cc
= dir
->tdir_count
* w
;
743 if (!isMapped(tif
)) {
744 if (!SeekOK(tif
, dir
->tdir_offset
))
746 if (!ReadOK(tif
, cp
, cc
))
749 if (dir
->tdir_offset
+ cc
> tif
->tif_size
)
751 _TIFFmemcpy(cp
, tif
->tif_base
+ dir
->tdir_offset
, cc
);
753 if (tif
->tif_flags
& TIFF_SWAB
) {
754 switch (dir
->tdir_type
) {
757 TIFFSwabArrayOfShort((uint16
*) cp
, dir
->tdir_count
);
762 TIFFSwabArrayOfLong((uint32
*) cp
, dir
->tdir_count
);
766 TIFFSwabArrayOfLong((uint32
*) cp
, 2*dir
->tdir_count
);
769 TIFFSwabArrayOfDouble((double*) cp
, dir
->tdir_count
);
775 TIFFError(tif
->tif_name
, "Error fetching data for field \"%s\"",
776 _TIFFFieldWithTag(tif
, dir
->tdir_tag
)->field_name
);
777 return ((tsize_t
) 0);
781 * Fetch an ASCII item from the file.
784 TIFFFetchString(TIFF
* tif
, TIFFDirEntry
* dir
, char* cp
)
786 if (dir
->tdir_count
<= 4) {
787 uint32 l
= dir
->tdir_offset
;
788 if (tif
->tif_flags
& TIFF_SWAB
)
790 _TIFFmemcpy(cp
, &l
, dir
->tdir_count
);
793 return (TIFFFetchData(tif
, dir
, cp
));
797 * Convert numerator+denominator to float.
800 cvtRational(TIFF
* tif
, TIFFDirEntry
* dir
, uint32 num
, uint32 denom
, float* rv
)
803 TIFFError(tif
->tif_name
,
804 "%s: Rational with zero denominator (num = %lu)",
805 _TIFFFieldWithTag(tif
, dir
->tdir_tag
)->field_name
, num
);
808 if (dir
->tdir_type
== TIFF_RATIONAL
)
809 *rv
= ((float)num
/ (float)denom
);
811 *rv
= ((float)(int32
)num
/ (float)(int32
)denom
);
817 * Fetch a rational item from the file
818 * at offset off and return the value
819 * as a floating point number.
822 TIFFFetchRational(TIFF
* tif
, TIFFDirEntry
* dir
)
827 return (!TIFFFetchData(tif
, dir
, (char *)l
) ||
828 !cvtRational(tif
, dir
, l
[0], l
[1], &v
) ? 1.0f
: v
);
832 * Fetch a single floating point value
833 * from the offset field and return it
837 TIFFFetchFloat(TIFF
* tif
, TIFFDirEntry
* dir
)
839 long l
= TIFFExtractData(tif
, dir
->tdir_type
, dir
->tdir_offset
);
840 float v
= *(float*) &l
;
841 TIFFCvtIEEEFloatToNative(tif
, 1, &v
);
846 * Fetch an array of BYTE or SBYTE values.
849 TIFFFetchByteArray(TIFF
* tif
, TIFFDirEntry
* dir
, uint16
* v
)
851 if (dir
->tdir_count
<= 4) {
853 * Extract data from offset field.
855 if (tif
->tif_header
.tiff_magic
== TIFF_BIGENDIAN
) {
856 if (dir
->tdir_type
== TIFF_SBYTE
)
857 switch (dir
->tdir_count
) {
858 case 4: v
[3] = (signed char)(dir
->tdir_offset
& 0xff);
859 case 3: v
[2] = (signed char)((dir
->tdir_offset
>> 8) & 0xff);
860 case 2: v
[1] = (signed char)((dir
->tdir_offset
>> 16) & 0xff);
861 case 1: v
[0] = (signed char)(dir
->tdir_offset
>> 24);
864 switch (dir
->tdir_count
) {
865 case 4: v
[3] = (uint16
)(dir
->tdir_offset
& 0xff);
866 case 3: v
[2] = (uint16
)((dir
->tdir_offset
>> 8) & 0xff);
867 case 2: v
[1] = (uint16
)((dir
->tdir_offset
>> 16) & 0xff);
868 case 1: v
[0] = (uint16
)(dir
->tdir_offset
>> 24);
871 if (dir
->tdir_type
== TIFF_SBYTE
)
872 switch (dir
->tdir_count
) {
873 case 4: v
[3] = (signed char)(dir
->tdir_offset
>> 24);
874 case 3: v
[2] = (signed char)((dir
->tdir_offset
>> 16) & 0xff);
875 case 2: v
[1] = (signed char)((dir
->tdir_offset
>> 8) & 0xff);
876 case 1: v
[0] = (signed char)(dir
->tdir_offset
& 0xff);
879 switch (dir
->tdir_count
) {
880 case 4: v
[3] = (uint16
)(dir
->tdir_offset
>> 24);
881 case 3: v
[2] = (uint16
)((dir
->tdir_offset
>> 16) & 0xff);
882 case 2: v
[1] = (uint16
)((dir
->tdir_offset
>> 8) & 0xff);
883 case 1: v
[0] = (uint16
)(dir
->tdir_offset
& 0xff);
888 return (TIFFFetchData(tif
, dir
, (char*) v
) != 0); /* XXX */
892 * Fetch an array of SHORT or SSHORT values.
895 TIFFFetchShortArray(TIFF
* tif
, TIFFDirEntry
* dir
, uint16
* v
)
897 if (dir
->tdir_count
<= 2) {
898 if (tif
->tif_header
.tiff_magic
== TIFF_BIGENDIAN
) {
899 switch (dir
->tdir_count
) {
900 case 2: v
[1] = (uint16
) (dir
->tdir_offset
& 0xffff);
901 case 1: v
[0] = (uint16
) (dir
->tdir_offset
>> 16);
904 switch (dir
->tdir_count
) {
905 case 2: v
[1] = (uint16
) (dir
->tdir_offset
>> 16);
906 case 1: v
[0] = (uint16
) (dir
->tdir_offset
& 0xffff);
911 return (TIFFFetchData(tif
, dir
, (char *)v
) != 0);
915 * Fetch a pair of SHORT or BYTE values.
918 TIFFFetchShortPair(TIFF
* tif
, TIFFDirEntry
* dir
)
923 switch (dir
->tdir_type
) {
926 ok
= TIFFFetchShortArray(tif
, dir
, v
);
930 ok
= TIFFFetchByteArray(tif
, dir
, v
);
934 TIFFSetField(tif
, dir
->tdir_tag
, v
[0], v
[1]);
939 * Fetch an array of LONG or SLONG values.
942 TIFFFetchLongArray(TIFF
* tif
, TIFFDirEntry
* dir
, uint32
* v
)
944 if (dir
->tdir_count
== 1) {
945 v
[0] = dir
->tdir_offset
;
948 return (TIFFFetchData(tif
, dir
, (char*) v
) != 0);
952 * Fetch an array of RATIONAL or SRATIONAL values.
955 TIFFFetchRationalArray(TIFF
* tif
, TIFFDirEntry
* dir
, float* v
)
960 l
= (uint32
*)CheckMalloc(tif
,
961 dir
->tdir_count
, TIFFDataWidth((TIFFDataType
) dir
->tdir_type
),
962 "to fetch array of rationals");
964 if (TIFFFetchData(tif
, dir
, (char *)l
)) {
966 for (i
= 0; i
< dir
->tdir_count
; i
++) {
967 ok
= cvtRational(tif
, dir
,
968 l
[2*i
+0], l
[2*i
+1], &v
[i
]);
973 _TIFFfree((char *)l
);
979 * Fetch an array of FLOAT values.
982 TIFFFetchFloatArray(TIFF
* tif
, TIFFDirEntry
* dir
, float* v
)
985 if (dir
->tdir_count
== 1) {
986 v
[0] = *(float*) &dir
->tdir_offset
;
987 TIFFCvtIEEEFloatToNative(tif
, dir
->tdir_count
, v
);
989 } else if (TIFFFetchData(tif
, dir
, (char*) v
)) {
990 TIFFCvtIEEEFloatToNative(tif
, dir
->tdir_count
, v
);
997 * Fetch an array of DOUBLE values.
1000 TIFFFetchDoubleArray(TIFF
* tif
, TIFFDirEntry
* dir
, double* v
)
1002 if (TIFFFetchData(tif
, dir
, (char*) v
)) {
1003 TIFFCvtIEEEDoubleToNative(tif
, dir
->tdir_count
, v
);
1010 * Fetch an array of ANY values. The actual values are
1011 * returned as doubles which should be able hold all the
1012 * types. Yes, there really should be an tany_t to avoid
1013 * this potential non-portability ... Note in particular
1014 * that we assume that the double return value vector is
1015 * large enough to read in any fundamental type. We use
1016 * that vector as a buffer to read in the base type vector
1017 * and then convert it in place to double (from end
1018 * to front of course).
1021 TIFFFetchAnyArray(TIFF
* tif
, TIFFDirEntry
* dir
, double* v
)
1025 switch (dir
->tdir_type
) {
1028 if (!TIFFFetchByteArray(tif
, dir
, (uint16
*) v
))
1030 if (dir
->tdir_type
== TIFF_BYTE
) {
1031 uint16
* vp
= (uint16
*) v
;
1032 for (i
= dir
->tdir_count
-1; i
>= 0; i
--)
1035 int16
* vp
= (int16
*) v
;
1036 for (i
= dir
->tdir_count
-1; i
>= 0; i
--)
1042 if (!TIFFFetchShortArray(tif
, dir
, (uint16
*) v
))
1044 if (dir
->tdir_type
== TIFF_SHORT
) {
1045 uint16
* vp
= (uint16
*) v
;
1046 for (i
= dir
->tdir_count
-1; i
>= 0; i
--)
1049 int16
* vp
= (int16
*) v
;
1050 for (i
= dir
->tdir_count
-1; i
>= 0; i
--)
1056 if (!TIFFFetchLongArray(tif
, dir
, (uint32
*) v
))
1058 if (dir
->tdir_type
== TIFF_LONG
) {
1059 uint32
* vp
= (uint32
*) v
;
1060 for (i
= dir
->tdir_count
-1; i
>= 0; i
--)
1063 int32
* vp
= (int32
*) v
;
1064 for (i
= dir
->tdir_count
-1; i
>= 0; i
--)
1069 case TIFF_SRATIONAL
:
1070 if (!TIFFFetchRationalArray(tif
, dir
, (float*) v
))
1072 { float* vp
= (float*) v
;
1073 for (i
= dir
->tdir_count
-1; i
>= 0; i
--)
1078 if (!TIFFFetchFloatArray(tif
, dir
, (float*) v
))
1080 { float* vp
= (float*) v
;
1081 for (i
= dir
->tdir_count
-1; i
>= 0; i
--)
1086 return (TIFFFetchDoubleArray(tif
, dir
, (double*) v
));
1090 /* TIFF_UNDEFINED */
1091 TIFFError(tif
->tif_name
,
1092 "cannot read TIFF_ANY type %d for field \"%s\"",
1093 _TIFFFieldWithTag(tif
, dir
->tdir_tag
)->field_name
);
1100 * Fetch a tag that is not handled by special case code.
1103 TIFFFetchNormalTag(TIFF
* tif
, TIFFDirEntry
* dp
)
1105 static const char mesg
[] = "to fetch tag value";
1107 const TIFFFieldInfo
* fip
= _TIFFFieldWithTag(tif
, dp
->tdir_tag
);
1109 if (dp
->tdir_count
> 1) { /* array of values */
1112 switch (dp
->tdir_type
) {
1115 /* NB: always expand BYTE values to shorts */
1116 cp
= CheckMalloc(tif
,
1117 dp
->tdir_count
, sizeof (uint16
), mesg
);
1118 ok
= cp
&& TIFFFetchByteArray(tif
, dp
, (uint16
*) cp
);
1122 cp
= CheckMalloc(tif
,
1123 dp
->tdir_count
, sizeof (uint16
), mesg
);
1124 ok
= cp
&& TIFFFetchShortArray(tif
, dp
, (uint16
*) cp
);
1128 cp
= CheckMalloc(tif
,
1129 dp
->tdir_count
, sizeof (uint32
), mesg
);
1130 ok
= cp
&& TIFFFetchLongArray(tif
, dp
, (uint32
*) cp
);
1133 case TIFF_SRATIONAL
:
1134 cp
= CheckMalloc(tif
,
1135 dp
->tdir_count
, sizeof (float), mesg
);
1136 ok
= cp
&& TIFFFetchRationalArray(tif
, dp
, (float*) cp
);
1139 cp
= CheckMalloc(tif
,
1140 dp
->tdir_count
, sizeof (float), mesg
);
1141 ok
= cp
&& TIFFFetchFloatArray(tif
, dp
, (float*) cp
);
1144 cp
= CheckMalloc(tif
,
1145 dp
->tdir_count
, sizeof (double), mesg
);
1146 ok
= cp
&& TIFFFetchDoubleArray(tif
, dp
, (double*) cp
);
1149 case TIFF_UNDEFINED
: /* bit of a cheat... */
1151 * Some vendors write strings w/o the trailing
1152 * NULL byte, so always append one just in case.
1154 cp
= CheckMalloc(tif
, dp
->tdir_count
+1, 1, mesg
);
1155 if( (ok
= (cp
&& TIFFFetchString(tif
, dp
, cp
))) != 0 )
1156 cp
[dp
->tdir_count
] = '\0'; /* XXX */
1160 ok
= (fip
->field_passcount
?
1161 TIFFSetField(tif
, dp
->tdir_tag
, dp
->tdir_count
, cp
)
1162 : TIFFSetField(tif
, dp
->tdir_tag
, cp
));
1166 } else if (CheckDirCount(tif
, dp
, 1)) { /* singleton value */
1167 switch (dp
->tdir_type
) {
1173 * If the tag is also acceptable as a LONG or SLONG
1174 * then TIFFSetField will expect an uint32 parameter
1175 * passed to it (through varargs). Thus, for machines
1176 * where sizeof (int) != sizeof (uint32) we must do
1177 * a careful check here. It's hard to say if this
1178 * is worth optimizing.
1180 * NB: We use TIFFFieldWithTag here knowing that
1181 * it returns us the first entry in the table
1182 * for the tag and that that entry is for the
1183 * widest potential data type the tag may have.
1185 { TIFFDataType type
= fip
->field_type
;
1186 if (type
!= TIFF_LONG
&& type
!= TIFF_SLONG
) {
1188 TIFFExtractData(tif
, dp
->tdir_type
, dp
->tdir_offset
);
1189 ok
= (fip
->field_passcount
?
1190 TIFFSetField(tif
, dp
->tdir_tag
, 1, &v
)
1191 : TIFFSetField(tif
, dp
->tdir_tag
, v
));
1199 TIFFExtractData(tif
, dp
->tdir_type
, dp
->tdir_offset
);
1200 ok
= (fip
->field_passcount
?
1201 TIFFSetField(tif
, dp
->tdir_tag
, 1, &v32
)
1202 : TIFFSetField(tif
, dp
->tdir_tag
, v32
));
1206 case TIFF_SRATIONAL
:
1208 { float v
= (dp
->tdir_type
== TIFF_FLOAT
?
1209 TIFFFetchFloat(tif
, dp
)
1210 : TIFFFetchRational(tif
, dp
));
1211 ok
= (fip
->field_passcount
?
1212 TIFFSetField(tif
, dp
->tdir_tag
, 1, &v
)
1213 : TIFFSetField(tif
, dp
->tdir_tag
, v
));
1218 ok
= (TIFFFetchDoubleArray(tif
, dp
, &v
) &&
1219 (fip
->field_passcount
?
1220 TIFFSetField(tif
, dp
->tdir_tag
, 1, &v
)
1221 : TIFFSetField(tif
, dp
->tdir_tag
, v
))
1226 case TIFF_UNDEFINED
: /* bit of a cheat... */
1228 if( (ok
= (TIFFFetchString(tif
, dp
, c
) != 0)) != 0 ){
1229 c
[1] = '\0'; /* XXX paranoid */
1230 ok
= TIFFSetField(tif
, dp
->tdir_tag
, c
);
1239 #define NITEMS(x) (sizeof (x) / sizeof (x[0]))
1241 * Fetch samples/pixel short values for
1242 * the specified tag and verify that
1243 * all values are the same.
1246 TIFFFetchPerSampleShorts(TIFF
* tif
, TIFFDirEntry
* dir
, int* pl
)
1248 int samples
= tif
->tif_dir
.td_samplesperpixel
;
1251 if (CheckDirCount(tif
, dir
, (uint32
) samples
)) {
1255 if (samples
> NITEMS(buf
))
1256 v
= (uint16
*) CheckMalloc(tif
, samples
, sizeof (uint16
),
1257 "to fetch per-sample values");
1258 if (v
&& TIFFFetchShortArray(tif
, dir
, v
)) {
1260 for (i
= 1; i
< samples
; i
++)
1262 TIFFError(tif
->tif_name
,
1263 "Cannot handle different per-sample values for field \"%s\"",
1264 _TIFFFieldWithTag(tif
, dir
->tdir_tag
)->field_name
);
1272 _TIFFfree((char*) v
);
1278 * Fetch samples/pixel ANY values for
1279 * the specified tag and verify that
1280 * all values are the same.
1283 TIFFFetchPerSampleAnys(TIFF
* tif
, TIFFDirEntry
* dir
, double* pl
)
1285 int samples
= (int) tif
->tif_dir
.td_samplesperpixel
;
1288 if (CheckDirCount(tif
, dir
, (uint32
) samples
)) {
1292 if (samples
> NITEMS(buf
))
1293 v
= (double*) CheckMalloc(tif
, samples
, sizeof (double),
1294 "to fetch per-sample values");
1295 if (v
&& TIFFFetchAnyArray(tif
, dir
, v
)) {
1297 for (i
= 1; i
< samples
; i
++)
1299 TIFFError(tif
->tif_name
,
1300 "Cannot handle different per-sample values for field \"%s\"",
1301 _TIFFFieldWithTag(tif
, dir
->tdir_tag
)->field_name
);
1316 * Fetch a set of offsets or lengths.
1317 * While this routine says "strips",
1318 * in fact it's also used for tiles.
1321 TIFFFetchStripThing(TIFF
* tif
, TIFFDirEntry
* dir
, long nstrips
, uint32
** lpp
)
1323 register uint32
* lp
;
1326 CheckDirCount(tif
, dir
, (uint32
) nstrips
);
1329 * Allocate space for strip information.
1332 (*lpp
= (uint32
*)CheckMalloc(tif
,
1333 nstrips
, sizeof (uint32
), "for strip array")) == NULL
)
1336 memset( lp
, 0, sizeof(uint32
) * nstrips
);
1338 if (dir
->tdir_type
== (int)TIFF_SHORT
) {
1340 * Handle uint16->uint32 expansion.
1342 uint16
* dp
= (uint16
*) CheckMalloc(tif
,
1343 dir
->tdir_count
, sizeof (uint16
), "to fetch strip tag");
1346 if( (status
= TIFFFetchShortArray(tif
, dir
, dp
)) != 0 ) {
1349 for( i
= 0; i
< nstrips
&& i
< (int) dir
->tdir_count
; i
++ )
1354 _TIFFfree((char*) dp
);
1356 } else if( nstrips
!= (int) dir
->tdir_count
) {
1357 /* Special case to correct length */
1359 uint32
* dp
= (uint32
*) CheckMalloc(tif
,
1360 dir
->tdir_count
, sizeof (uint32
), "to fetch strip tag");
1364 status
= TIFFFetchLongArray(tif
, dir
, dp
);
1368 for( i
= 0; i
< nstrips
&& i
< (int) dir
->tdir_count
; i
++ )
1374 _TIFFfree( (char *) dp
);
1376 status
= TIFFFetchLongArray(tif
, dir
, lp
);
1381 #define NITEMS(x) (sizeof (x) / sizeof (x[0]))
1383 * Fetch and set the ExtraSamples tag.
1386 TIFFFetchExtraSamples(TIFF
* tif
, TIFFDirEntry
* dir
)
1392 if (dir
->tdir_count
> NITEMS(buf
)) {
1393 v
= (uint16
*) CheckMalloc(tif
, dir
->tdir_count
, sizeof (uint16
),
1394 "to fetch extra samples");
1398 if (dir
->tdir_type
== TIFF_BYTE
)
1399 status
= TIFFFetchByteArray(tif
, dir
, v
);
1401 status
= TIFFFetchShortArray(tif
, dir
, v
);
1403 status
= TIFFSetField(tif
, dir
->tdir_tag
, dir
->tdir_count
, v
);
1405 _TIFFfree((char*) v
);
1410 #ifdef COLORIMETRY_SUPPORT
1412 * Fetch and set the RefBlackWhite tag.
1415 TIFFFetchRefBlackWhite(TIFF
* tif
, TIFFDirEntry
* dir
)
1417 static const char mesg
[] = "for \"ReferenceBlackWhite\" array";
1421 if (dir
->tdir_type
== TIFF_RATIONAL
)
1422 return (TIFFFetchNormalTag(tif
, dir
));
1424 * Handle LONG's for backward compatibility.
1426 cp
= CheckMalloc(tif
, dir
->tdir_count
, sizeof (uint32
), mesg
);
1427 if( (ok
= (cp
&& TIFFFetchLongArray(tif
, dir
, (uint32
*) cp
))) != 0) {
1428 float* fp
= (float*)
1429 CheckMalloc(tif
, dir
->tdir_count
, sizeof (float), mesg
);
1430 if( (ok
= (fp
!= NULL
)) != 0 ) {
1432 for (i
= 0; i
< dir
->tdir_count
; i
++)
1433 fp
[i
] = (float)((uint32
*) cp
)[i
];
1434 ok
= TIFFSetField(tif
, dir
->tdir_tag
, fp
);
1435 _TIFFfree((char*) fp
);
1445 * Replace a single strip (tile) of uncompressed data by
1446 * multiple strips (tiles), each approximately 8Kbytes.
1447 * This is useful for dealing with large images or
1448 * for dealing with machines with a limited amount
1452 ChopUpSingleUncompressedStrip(TIFF
* tif
)
1454 register TIFFDirectory
*td
= &tif
->tif_dir
;
1455 uint32 bytecount
= td
->td_stripbytecount
[0];
1456 uint32 offset
= td
->td_stripoffset
[0];
1457 tsize_t rowbytes
= TIFFVTileSize(tif
, 1), stripbytes
;
1458 tstrip_t strip
, nstrips
, rowsperstrip
;
1463 * Make the rows hold at least one
1464 * scanline, but fill 8k if possible.
1466 if (rowbytes
> 8192) {
1467 stripbytes
= rowbytes
;
1469 } else if (rowbytes
> 0 ) {
1470 rowsperstrip
= 8192 / rowbytes
;
1471 stripbytes
= rowbytes
* rowsperstrip
;
1476 /* never increase the number of strips in an image */
1477 if (rowsperstrip
>= td
->td_rowsperstrip
)
1479 nstrips
= (tstrip_t
) TIFFhowmany(bytecount
, stripbytes
);
1480 newcounts
= (uint32
*) CheckMalloc(tif
, nstrips
, sizeof (uint32
),
1481 "for chopped \"StripByteCounts\" array");
1482 newoffsets
= (uint32
*) CheckMalloc(tif
, nstrips
, sizeof (uint32
),
1483 "for chopped \"StripOffsets\" array");
1484 if (newcounts
== NULL
|| newoffsets
== NULL
) {
1486 * Unable to allocate new strip information, give
1487 * up and use the original one strip information.
1489 if (newcounts
!= NULL
)
1490 _TIFFfree(newcounts
);
1491 if (newoffsets
!= NULL
)
1492 _TIFFfree(newoffsets
);
1496 * Fill the strip information arrays with
1497 * new bytecounts and offsets that reflect
1498 * the broken-up format.
1500 for (strip
= 0; strip
< nstrips
; strip
++) {
1501 if (stripbytes
> (tsize_t
) bytecount
)
1502 stripbytes
= bytecount
;
1503 newcounts
[strip
] = stripbytes
;
1504 newoffsets
[strip
] = offset
;
1505 offset
+= stripbytes
;
1506 bytecount
-= stripbytes
;
1509 * Replace old single strip info with multi-strip info.
1511 td
->td_stripsperimage
= td
->td_nstrips
= nstrips
;
1512 TIFFSetField(tif
, TIFFTAG_ROWSPERSTRIP
, rowsperstrip
);
1514 _TIFFfree(td
->td_stripbytecount
);
1515 _TIFFfree(td
->td_stripoffset
);
1516 td
->td_stripbytecount
= newcounts
;
1517 td
->td_stripoffset
= newoffsets
;