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

打印编程

开发平台:

Visual C++

  1. /* $Id: tif_dirread.c,v 1.82 2006/03/16 12:24:53 dron Exp $ */
  2. /*
  3.  * Copyright (c) 1988-1997 Sam Leffler
  4.  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and 
  7.  * its documentation for any purpose is hereby granted without fee, provided
  8.  * that (i) the above copyright notices and this permission notice appear in
  9.  * all copies of the software and related documentation, and (ii) the names of
  10.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  11.  * publicity relating to the software without the specific, prior written
  12.  * permission of Sam Leffler and Silicon Graphics.
  13.  * 
  14.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  15.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  16.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  17.  * 
  18.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  19.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  20.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  21.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  22.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  23.  * OF THIS SOFTWARE.
  24.  */
  25. /*
  26.  * TIFF Library.
  27.  *
  28.  * Directory Read Support Routines.
  29.  */
  30. #include "tiffiop.h"
  31. #define IGNORE 0 /* tag placeholder used below */
  32. #ifdef HAVE_IEEEFP
  33. # define TIFFCvtIEEEFloatToNative(tif, n, fp)
  34. # define TIFFCvtIEEEDoubleToNative(tif, n, dp)
  35. #else
  36. extern void TIFFCvtIEEEFloatToNative(TIFF*, uint32, float*);
  37. extern void TIFFCvtIEEEDoubleToNative(TIFF*, uint32, double*);
  38. #endif
  39. static int EstimateStripByteCounts(TIFF*, TIFFDirEntry*, uint16);
  40. static void MissingRequired(TIFF*, const char*);
  41. static int CheckDirCount(TIFF*, TIFFDirEntry*, uint32);
  42. static tsize_t TIFFFetchData(TIFF*, TIFFDirEntry*, char*);
  43. static tsize_t TIFFFetchString(TIFF*, TIFFDirEntry*, char*);
  44. static float TIFFFetchRational(TIFF*, TIFFDirEntry*);
  45. static int TIFFFetchNormalTag(TIFF*, TIFFDirEntry*);
  46. static int TIFFFetchPerSampleShorts(TIFF*, TIFFDirEntry*, uint16*);
  47. static int TIFFFetchPerSampleLongs(TIFF*, TIFFDirEntry*, uint32*);
  48. static int TIFFFetchPerSampleAnys(TIFF*, TIFFDirEntry*, double*);
  49. static int TIFFFetchShortArray(TIFF*, TIFFDirEntry*, uint16*);
  50. static int TIFFFetchStripThing(TIFF*, TIFFDirEntry*, long, uint32**);
  51. static int TIFFFetchRefBlackWhite(TIFF*, TIFFDirEntry*);
  52. static float TIFFFetchFloat(TIFF*, TIFFDirEntry*);
  53. static int TIFFFetchFloatArray(TIFF*, TIFFDirEntry*, float*);
  54. static int TIFFFetchDoubleArray(TIFF*, TIFFDirEntry*, double*);
  55. static int TIFFFetchAnyArray(TIFF*, TIFFDirEntry*, double*);
  56. static int TIFFFetchShortPair(TIFF*, TIFFDirEntry*);
  57. static void ChopUpSingleUncompressedStrip(TIFF*);
  58. /*
  59.  * Read the next TIFF directory from a file
  60.  * and convert it to the internal format.
  61.  * We read directories sequentially.
  62.  */
  63. int
  64. TIFFReadDirectory(TIFF* tif)
  65. {
  66. static const char module[] = "TIFFReadDirectory";
  67. int n;
  68. TIFFDirectory* td;
  69. TIFFDirEntry *dp, *dir = NULL;
  70. uint16 iv;
  71. uint32 v;
  72. const TIFFFieldInfo* fip;
  73. size_t fix;
  74. uint16 dircount;
  75. toff_t nextdiroff;
  76. int diroutoforderwarning = 0;
  77. toff_t* new_dirlist;
  78. tif->tif_diroff = tif->tif_nextdiroff;
  79. if (tif->tif_diroff == 0) /* no more directories */
  80. return (0);
  81. /*
  82.  * XXX: Trick to prevent IFD looping. The one can create TIFF file
  83.  * with looped directory pointers. We will maintain a list of already
  84.  * seen directories and check every IFD offset against this list.
  85.  */
  86. for (n = 0; n < tif->tif_dirnumber; n++) {
  87. if (tif->tif_dirlist[n] == tif->tif_diroff)
  88. return (0);
  89. }
  90. tif->tif_dirnumber++;
  91. new_dirlist = (toff_t *)_TIFFrealloc(tif->tif_dirlist,
  92. tif->tif_dirnumber * sizeof(toff_t));
  93. if (!new_dirlist) {
  94. TIFFErrorExt(tif->tif_clientdata, module,
  95.   "%s: Failed to allocate space for IFD list",
  96.   tif->tif_name);
  97. return (0);
  98. }
  99. tif->tif_dirlist = new_dirlist;
  100. tif->tif_dirlist[tif->tif_dirnumber - 1] = tif->tif_diroff;
  101. /*
  102.  * Cleanup any previous compression state.
  103.  */
  104. (*tif->tif_cleanup)(tif);
  105. tif->tif_curdir++;
  106. nextdiroff = 0;
  107. if (!isMapped(tif)) {
  108. if (!SeekOK(tif, tif->tif_diroff)) {
  109. TIFFErrorExt(tif->tif_clientdata, module,
  110.     "%s: Seek error accessing TIFF directory",
  111.                             tif->tif_name);
  112. return (0);
  113. }
  114. if (!ReadOK(tif, &dircount, sizeof (uint16))) {
  115. TIFFErrorExt(tif->tif_clientdata, module,
  116.     "%s: Can not read TIFF directory count",
  117.                             tif->tif_name);
  118. return (0);
  119. }
  120. if (tif->tif_flags & TIFF_SWAB)
  121. TIFFSwabShort(&dircount);
  122. dir = (TIFFDirEntry *)_TIFFCheckMalloc(tif, dircount,
  123.        sizeof (TIFFDirEntry),
  124. "to read TIFF directory");
  125. if (dir == NULL)
  126. return (0);
  127. if (!ReadOK(tif, dir, dircount*sizeof (TIFFDirEntry))) {
  128. TIFFErrorExt(tif->tif_clientdata, module,
  129.                                   "%.100s: Can not read TIFF directory",
  130.                                   tif->tif_name);
  131. goto bad;
  132. }
  133. /*
  134.  * Read offset to next directory for sequential scans.
  135.  */
  136. (void) ReadOK(tif, &nextdiroff, sizeof (uint32));
  137. } else {
  138. toff_t off = tif->tif_diroff;
  139. if (off + sizeof (uint16) > tif->tif_size) {
  140. TIFFErrorExt(tif->tif_clientdata, module,
  141.     "%s: Can not read TIFF directory count",
  142.                             tif->tif_name);
  143. return (0);
  144. } else
  145. _TIFFmemcpy(&dircount, tif->tif_base + off, sizeof (uint16));
  146. off += sizeof (uint16);
  147. if (tif->tif_flags & TIFF_SWAB)
  148. TIFFSwabShort(&dircount);
  149. dir = (TIFFDirEntry *)_TIFFCheckMalloc(tif, dircount,
  150.        sizeof (TIFFDirEntry),
  151. "to read TIFF directory");
  152. if (dir == NULL)
  153. return (0);
  154. if (off + dircount*sizeof (TIFFDirEntry) > tif->tif_size) {
  155. TIFFErrorExt(tif->tif_clientdata, module,
  156.                                   "%s: Can not read TIFF directory",
  157.                                   tif->tif_name);
  158. goto bad;
  159. } else {
  160. _TIFFmemcpy(dir, tif->tif_base + off,
  161.     dircount*sizeof (TIFFDirEntry));
  162. }
  163. off += dircount* sizeof (TIFFDirEntry);
  164. if (off + sizeof (uint32) <= tif->tif_size)
  165. _TIFFmemcpy(&nextdiroff, tif->tif_base+off, sizeof (uint32));
  166. }
  167. if (tif->tif_flags & TIFF_SWAB)
  168. TIFFSwabLong(&nextdiroff);
  169. tif->tif_nextdiroff = nextdiroff;
  170. tif->tif_flags &= ~TIFF_BEENWRITING; /* reset before new dir */
  171. /*
  172.  * Setup default value and then make a pass over
  173.  * the fields to check type and tag information,
  174.  * and to extract info required to size data
  175.  * structures.  A second pass is made afterwards
  176.  * to read in everthing not taken in the first pass.
  177.  */
  178. td = &tif->tif_dir;
  179. /* free any old stuff and reinit */
  180. TIFFFreeDirectory(tif);
  181. TIFFDefaultDirectory(tif);
  182. /*
  183.  * Electronic Arts writes gray-scale TIFF files
  184.  * without a PlanarConfiguration directory entry.
  185.  * Thus we setup a default value here, even though
  186.  * the TIFF spec says there is no default value.
  187.  */
  188. TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
  189. /*
  190.  * Sigh, we must make a separate pass through the
  191.  * directory for the following reason:
  192.  *
  193.  * We must process the Compression tag in the first pass
  194.  * in order to merge in codec-private tag definitions (otherwise
  195.  * we may get complaints about unknown tags).  However, the
  196.  * Compression tag may be dependent on the SamplesPerPixel
  197.  * tag value because older TIFF specs permited Compression
  198.  * to be written as a SamplesPerPixel-count tag entry.
  199.  * Thus if we don't first figure out the correct SamplesPerPixel
  200.  * tag value then we may end up ignoring the Compression tag
  201.  * value because it has an incorrect count value (if the
  202.  * true value of SamplesPerPixel is not 1).
  203.  *
  204.  * It sure would have been nice if Aldus had really thought
  205.  * this stuff through carefully.
  206.  */ 
  207. for (dp = dir, n = dircount; n > 0; n--, dp++) {
  208. if (tif->tif_flags & TIFF_SWAB) {
  209. TIFFSwabArrayOfShort(&dp->tdir_tag, 2);
  210. TIFFSwabArrayOfLong(&dp->tdir_count, 2);
  211. }
  212. if (dp->tdir_tag == TIFFTAG_SAMPLESPERPIXEL) {
  213. if (!TIFFFetchNormalTag(tif, dp))
  214. goto bad;
  215. dp->tdir_tag = IGNORE;
  216. }
  217. }
  218. /*
  219.  * First real pass over the directory.
  220.  */
  221. fix = 0;
  222. for (dp = dir, n = dircount; n > 0; n--, dp++) {
  223. if (fix >= tif->tif_nfields || dp->tdir_tag == IGNORE)
  224. continue;
  225.                
  226. /*
  227.  * Silicon Beach (at least) writes unordered
  228.  * directory tags (violating the spec).  Handle
  229.  * it here, but be obnoxious (maybe they'll fix it?).
  230.  */
  231. if (dp->tdir_tag < tif->tif_fieldinfo[fix]->field_tag) {
  232. if (!diroutoforderwarning) {
  233. TIFFWarningExt(tif->tif_clientdata, module,
  234. "%s: invalid TIFF directory; tags are not sorted in ascending order",
  235.        tif->tif_name);
  236. diroutoforderwarning = 1;
  237. }
  238. fix = 0; /* O(n^2) */
  239. }
  240. while (fix < tif->tif_nfields &&
  241.        tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag)
  242. fix++;
  243. if (fix >= tif->tif_nfields ||
  244.     tif->tif_fieldinfo[fix]->field_tag != dp->tdir_tag) {
  245. TIFFWarningExt(tif->tif_clientdata,
  246.        module,
  247.                         "%s: unknown field with tag %d (0x%x) encountered",
  248.        tif->tif_name,
  249.        dp->tdir_tag,
  250.        dp->tdir_tag,
  251.        dp->tdir_type);
  252.                     TIFFMergeFieldInfo(tif,
  253.                                        _TIFFCreateAnonFieldInfo(tif,
  254. dp->tdir_tag,
  255. (TIFFDataType) dp->tdir_type),
  256.        1 );
  257.                     fix = 0;
  258.                     while (fix < tif->tif_nfields &&
  259.                            tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag)
  260. fix++;
  261. }
  262. /*
  263.  * Null out old tags that we ignore.
  264.  */
  265. if (tif->tif_fieldinfo[fix]->field_bit == FIELD_IGNORE) {
  266. ignore:
  267. dp->tdir_tag = IGNORE;
  268. continue;
  269. }
  270. /*
  271.  * Check data type.
  272.  */
  273. fip = tif->tif_fieldinfo[fix];
  274. while (dp->tdir_type != (unsigned short) fip->field_type
  275.                        && fix < tif->tif_nfields) {
  276. if (fip->field_type == TIFF_ANY) /* wildcard */
  277. break;
  278.                         fip = tif->tif_fieldinfo[++fix];
  279. if (fix >= tif->tif_nfields ||
  280.     fip->field_tag != dp->tdir_tag) {
  281. TIFFWarningExt(tif->tif_clientdata, module,
  282. "%s: wrong data type %d for "%s"; tag ignored",
  283.     tif->tif_name, dp->tdir_type,
  284.     tif->tif_fieldinfo[fix-1]->field_name);
  285. goto ignore;
  286. }
  287. }
  288. /*
  289.  * Check count if known in advance.
  290.  */
  291. if (fip->field_readcount != TIFF_VARIABLE
  292.     && fip->field_readcount != TIFF_VARIABLE2) {
  293. uint32 expected = (fip->field_readcount == TIFF_SPP) ?
  294.     (uint32) td->td_samplesperpixel :
  295.     (uint32) fip->field_readcount;
  296. if (!CheckDirCount(tif, dp, expected))
  297. goto ignore;
  298. }
  299. switch (dp->tdir_tag) {
  300. case TIFFTAG_COMPRESSION:
  301. /*
  302.  * The 5.0 spec says the Compression tag has
  303.  * one value, while earlier specs say it has
  304.  * one value per sample.  Because of this, we
  305.  * accept the tag if one value is supplied.
  306.  */
  307. if (dp->tdir_count == 1) {
  308. v = TIFFExtractData(tif,
  309.     dp->tdir_type, dp->tdir_offset);
  310. if (!TIFFSetField(tif, dp->tdir_tag, (uint16)v))
  311. goto bad;
  312. break;
  313. /* XXX: workaround for broken TIFFs */
  314. } else if (dp->tdir_type == TIFF_LONG) {
  315. if (!TIFFFetchPerSampleLongs(tif, dp, &v) ||
  316.     !TIFFSetField(tif, dp->tdir_tag, (uint16)v))
  317. goto bad;
  318. } else {
  319. if (!TIFFFetchPerSampleShorts(tif, dp, &iv)
  320.     || !TIFFSetField(tif, dp->tdir_tag, iv))
  321. goto bad;
  322. }
  323. dp->tdir_tag = IGNORE;
  324. break;
  325. case TIFFTAG_STRIPOFFSETS:
  326. case TIFFTAG_STRIPBYTECOUNTS:
  327. case TIFFTAG_TILEOFFSETS:
  328. case TIFFTAG_TILEBYTECOUNTS:
  329. TIFFSetFieldBit(tif, fip->field_bit);
  330. break;
  331. case TIFFTAG_IMAGEWIDTH:
  332. case TIFFTAG_IMAGELENGTH:
  333. case TIFFTAG_IMAGEDEPTH:
  334. case TIFFTAG_TILELENGTH:
  335. case TIFFTAG_TILEWIDTH:
  336. case TIFFTAG_TILEDEPTH:
  337. case TIFFTAG_PLANARCONFIG:
  338. case TIFFTAG_ROWSPERSTRIP:
  339. case TIFFTAG_EXTRASAMPLES:
  340. if (!TIFFFetchNormalTag(tif, dp))
  341. goto bad;
  342. dp->tdir_tag = IGNORE;
  343. break;
  344. }
  345. }
  346. /*
  347.  * Allocate directory structure and setup defaults.
  348.  */
  349. if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) {
  350. MissingRequired(tif, "ImageLength");
  351. goto bad;
  352. }
  353. /* 
  354.    * Setup appropriate structures (by strip or by tile)
  355.  */
  356. if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) {
  357. td->td_nstrips = TIFFNumberOfStrips(tif);
  358. td->td_tilewidth = td->td_imagewidth;
  359. td->td_tilelength = td->td_rowsperstrip;
  360. td->td_tiledepth = td->td_imagedepth;
  361. tif->tif_flags &= ~TIFF_ISTILED;
  362. } else {
  363. td->td_nstrips = TIFFNumberOfTiles(tif);
  364. tif->tif_flags |= TIFF_ISTILED;
  365. }
  366. if (!td->td_nstrips) {
  367. TIFFErrorExt(tif->tif_clientdata, module,
  368.      "%s: cannot handle zero number of %s",
  369.      tif->tif_name, isTiled(tif) ? "tiles" : "strips");
  370. goto bad;
  371. }
  372. td->td_stripsperimage = td->td_nstrips;
  373. if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
  374. td->td_stripsperimage /= td->td_samplesperpixel;
  375. if (!TIFFFieldSet(tif, FIELD_STRIPOFFSETS)) {
  376. MissingRequired(tif,
  377. isTiled(tif) ? "TileOffsets" : "StripOffsets");
  378. goto bad;
  379. }
  380. /*
  381.  * Second pass: extract other information.
  382.  */
  383. for (dp = dir, n = dircount; n > 0; n--, dp++) {
  384. if (dp->tdir_tag == IGNORE)
  385. continue;
  386. switch (dp->tdir_tag) {
  387. case TIFFTAG_MINSAMPLEVALUE:
  388. case TIFFTAG_MAXSAMPLEVALUE:
  389. case TIFFTAG_BITSPERSAMPLE:
  390. case TIFFTAG_DATATYPE:
  391. case TIFFTAG_SAMPLEFORMAT:
  392. /*
  393.  * The 5.0 spec says the Compression tag has
  394.  * one value, while earlier specs say it has
  395.  * one value per sample.  Because of this, we
  396.  * accept the tag if one value is supplied.
  397.  *
  398.                          * The MinSampleValue, MaxSampleValue, BitsPerSample
  399.                          * DataType and SampleFormat tags are supposed to be
  400.                          * written as one value/sample, but some vendors
  401.                          * incorrectly write one value only -- so we accept
  402.                          * that as well (yech). Other vendors write correct
  403.  * value for NumberOfSamples, but incorrect one for
  404.  * BitsPerSample and friends, and we will read this
  405.  * too.
  406.  */
  407. if (dp->tdir_count == 1) {
  408. v = TIFFExtractData(tif,
  409.     dp->tdir_type, dp->tdir_offset);
  410. if (!TIFFSetField(tif, dp->tdir_tag, (uint16)v))
  411. goto bad;
  412. /* XXX: workaround for broken TIFFs */
  413. } else if (dp->tdir_tag == TIFFTAG_BITSPERSAMPLE
  414.    && dp->tdir_type == TIFF_LONG) {
  415. if (!TIFFFetchPerSampleLongs(tif, dp, &v) ||
  416.     !TIFFSetField(tif, dp->tdir_tag, (uint16)v))
  417. goto bad;
  418. } else {
  419. if (!TIFFFetchPerSampleShorts(tif, dp, &iv) ||
  420.     !TIFFSetField(tif, dp->tdir_tag, iv))
  421. goto bad;
  422. }
  423. break;
  424. case TIFFTAG_SMINSAMPLEVALUE:
  425. case TIFFTAG_SMAXSAMPLEVALUE:
  426. {
  427. double dv = 0.0;
  428. if (!TIFFFetchPerSampleAnys(tif, dp, &dv) ||
  429.     !TIFFSetField(tif, dp->tdir_tag, dv))
  430. goto bad;
  431. }
  432. break;
  433. case TIFFTAG_STRIPOFFSETS:
  434. case TIFFTAG_TILEOFFSETS:
  435. if (!TIFFFetchStripThing(tif, dp,
  436.     td->td_nstrips, &td->td_stripoffset))
  437. goto bad;
  438. break;
  439. case TIFFTAG_STRIPBYTECOUNTS:
  440. case TIFFTAG_TILEBYTECOUNTS:
  441. if (!TIFFFetchStripThing(tif, dp,
  442.     td->td_nstrips, &td->td_stripbytecount))
  443. goto bad;
  444. break;
  445. case TIFFTAG_COLORMAP:
  446. case TIFFTAG_TRANSFERFUNCTION:
  447. {
  448. char* cp;
  449. /*
  450.  * TransferFunction can have either 1x or 3x
  451.  * data values; Colormap can have only 3x
  452.  * items.
  453.  */
  454. v = 1L<<td->td_bitspersample;
  455. if (dp->tdir_tag == TIFFTAG_COLORMAP ||
  456.     dp->tdir_count != v) {
  457. if (!CheckDirCount(tif, dp, 3 * v))
  458. break;
  459. }
  460. v *= sizeof(uint16);
  461. cp = (char *)_TIFFCheckMalloc(tif,
  462.       dp->tdir_count,
  463.       sizeof (uint16),
  464. "to read "TransferFunction" tag");
  465. if (cp != NULL) {
  466. if (TIFFFetchData(tif, dp, cp)) {
  467. /*
  468.  * This deals with there being
  469.  * only one array to apply to
  470.  * all samples.
  471.  */
  472. uint32 c = 1L << td->td_bitspersample;
  473. if (dp->tdir_count == c)
  474. v = 0L;
  475. TIFFSetField(tif, dp->tdir_tag,
  476.     cp, cp+v, cp+2*v);
  477. }
  478. _TIFFfree(cp);
  479. }
  480. break;
  481. }
  482. case TIFFTAG_PAGENUMBER:
  483. case TIFFTAG_HALFTONEHINTS:
  484. case TIFFTAG_YCBCRSUBSAMPLING:
  485. case TIFFTAG_DOTRANGE:
  486. (void) TIFFFetchShortPair(tif, dp);
  487. break;
  488. case TIFFTAG_REFERENCEBLACKWHITE:
  489. (void) TIFFFetchRefBlackWhite(tif, dp);
  490. break;
  491. /* BEGIN REV 4.0 COMPATIBILITY */
  492. case TIFFTAG_OSUBFILETYPE:
  493. v = 0L;
  494. switch (TIFFExtractData(tif, dp->tdir_type,
  495.     dp->tdir_offset)) {
  496. case OFILETYPE_REDUCEDIMAGE:
  497. v = FILETYPE_REDUCEDIMAGE;
  498. break;
  499. case OFILETYPE_PAGE:
  500. v = FILETYPE_PAGE;
  501. break;
  502. }
  503. if (v)
  504. TIFFSetField(tif, TIFFTAG_SUBFILETYPE, v);
  505. break;
  506. /* END REV 4.0 COMPATIBILITY */
  507. default:
  508. (void) TIFFFetchNormalTag(tif, dp);
  509. break;
  510. }
  511. }
  512. /*
  513.  * Verify Palette image has a Colormap.
  514.  */
  515. if (td->td_photometric == PHOTOMETRIC_PALETTE &&
  516.     !TIFFFieldSet(tif, FIELD_COLORMAP)) {
  517. MissingRequired(tif, "Colormap");
  518. goto bad;
  519. }
  520. /*
  521.  * Attempt to deal with a missing StripByteCounts tag.
  522.  */
  523. if (!TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS)) {
  524. /*
  525.  * Some manufacturers violate the spec by not giving
  526.  * the size of the strips.  In this case, assume there
  527.  * is one uncompressed strip of data.
  528.  */
  529. if ((td->td_planarconfig == PLANARCONFIG_CONTIG &&
  530.     td->td_nstrips > 1) ||
  531.     (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
  532.      td->td_nstrips != td->td_samplesperpixel)) {
  533.     MissingRequired(tif, "StripByteCounts");
  534.     goto bad;
  535. }
  536. TIFFWarningExt(tif->tif_clientdata, module,
  537. "%s: TIFF directory is missing required "
  538. ""%s" field, calculating from imagelength",
  539. tif->tif_name,
  540.         _TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name);
  541. if (EstimateStripByteCounts(tif, dir, dircount) < 0)
  542.     goto bad;
  543. /* 
  544.  * Assume we have wrong StripByteCount value (in case of single strip) in
  545.  * following cases:
  546.  *   - it is equal to zero along with StripOffset;
  547.  *   - it is larger than file itself (in case of uncompressed image);
  548.  *   - it is smaller than the size of the bytes per row multiplied on the
  549.  *     number of rows.  The last case should not be checked in the case of
  550.  *     writing new image, because we may do not know the exact strip size
  551.  *     until the whole image will be written and directory dumped out.
  552.  */
  553. #define BYTECOUNTLOOKSBAD 
  554.     ( (td->td_stripbytecount[0] == 0 && td->td_stripoffset[0] != 0) || 
  555.       (td->td_compression == COMPRESSION_NONE && 
  556.        td->td_stripbytecount[0] > TIFFGetFileSize(tif) - td->td_stripoffset[0]) || 
  557.       (tif->tif_mode == O_RDONLY && 
  558.        td->td_compression == COMPRESSION_NONE && 
  559.        td->td_stripbytecount[0] < TIFFScanlineSize(tif) * td->td_imagelength) )
  560. } else if (td->td_nstrips == 1 
  561.                    && td->td_stripoffset[0] != 0 
  562.                    && BYTECOUNTLOOKSBAD) {
  563. /*
  564.  * XXX: Plexus (and others) sometimes give a value of zero for
  565.  * a tag when they don't know what the correct value is!  Try
  566.  * and handle the simple case of estimating the size of a one
  567.  * strip image.
  568.  */
  569. TIFFWarningExt(tif->tif_clientdata, module,
  570. "%s: Bogus "%s" field, ignoring and calculating from imagelength",
  571.                             tif->tif_name,
  572.             _TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name);
  573. if(EstimateStripByteCounts(tif, dir, dircount) < 0)
  574.     goto bad;
  575. } else if (td->td_planarconfig == PLANARCONFIG_CONTIG
  576.    && td->td_nstrips > 2
  577.    && td->td_compression == COMPRESSION_NONE
  578.    && td->td_stripbytecount[0] != td->td_stripbytecount[1]) {
  579. /*
  580.  * XXX: Some vendors fill StripByteCount array with absolutely
  581.  * wrong values (it can be equal to StripOffset array, for
  582.  * example). Catch this case here.
  583.  */
  584. TIFFWarningExt(tif->tif_clientdata, module,
  585. "%s: Wrong "%s" field, ignoring and calculating from imagelength",
  586.                             tif->tif_name,
  587.             _TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name);
  588. if (EstimateStripByteCounts(tif, dir, dircount) < 0)
  589.     goto bad;
  590. }
  591. if (dir) {
  592. _TIFFfree((char *)dir);
  593. dir = NULL;
  594. }
  595. if (!TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
  596. td->td_maxsamplevalue = (uint16)((1L<<td->td_bitspersample)-1);
  597. /*
  598.  * Setup default compression scheme.
  599.  */
  600. /*
  601.  * XXX: We can optimize checking for the strip bounds using the sorted
  602.  * bytecounts array. See also comments for TIFFAppendToStrip()
  603.  * function in tif_write.c.
  604.  */
  605. if (td->td_nstrips > 1) {
  606. tstrip_t strip;
  607. td->td_stripbytecountsorted = 1;
  608. for (strip = 1; strip < td->td_nstrips; strip++) {
  609. if (td->td_stripoffset[strip - 1] >
  610.     td->td_stripoffset[strip]) {
  611. td->td_stripbytecountsorted = 0;
  612. break;
  613. }
  614. }
  615. }
  616. if (!TIFFFieldSet(tif, FIELD_COMPRESSION))
  617. TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
  618.         /*
  619.          * Some manufacturers make life difficult by writing
  620.  * large amounts of uncompressed data as a single strip.
  621.  * This is contrary to the recommendations of the spec.
  622.          * The following makes an attempt at breaking such images
  623.  * into strips closer to the recommended 8k bytes.  A
  624.  * side effect, however, is that the RowsPerStrip tag
  625.  * value may be changed.
  626.          */
  627. if (td->td_nstrips == 1 && td->td_compression == COMPRESSION_NONE &&
  628.     (tif->tif_flags & (TIFF_STRIPCHOP|TIFF_ISTILED)) == TIFF_STRIPCHOP)
  629. ChopUpSingleUncompressedStrip(tif);
  630. /*
  631.  * Reinitialize i/o since we are starting on a new directory.
  632.  */
  633. tif->tif_row = (uint32) -1;
  634. tif->tif_curstrip = (tstrip_t) -1;
  635. tif->tif_col = (uint32) -1;
  636. tif->tif_curtile = (ttile_t) -1;
  637. tif->tif_tilesize = (tsize_t) -1;
  638. tif->tif_scanlinesize = TIFFScanlineSize(tif);
  639. if (!tif->tif_scanlinesize) {
  640. TIFFErrorExt(tif->tif_clientdata, module, "%s: cannot handle zero scanline size",
  641.   tif->tif_name);
  642. return (0);
  643. }
  644. if (isTiled(tif)) {
  645. tif->tif_tilesize = TIFFTileSize(tif);
  646. if (!tif->tif_tilesize) {
  647. TIFFErrorExt(tif->tif_clientdata, module, "%s: cannot handle zero tile size",
  648.   tif->tif_name);
  649. return (0);
  650. }
  651. } else {
  652. if (!TIFFStripSize(tif)) {
  653. TIFFErrorExt(tif->tif_clientdata, module, "%s: cannot handle zero strip size",
  654.   tif->tif_name);
  655. return (0);
  656. }
  657. }
  658. return (1);
  659. bad:
  660. if (dir)
  661. _TIFFfree(dir);
  662. return (0);
  663. }
  664. /* 
  665.  * Read custom directory from the arbitarry offset.
  666.  * The code is very similar to TIFFReadDirectory().
  667.  */
  668. int
  669. TIFFReadCustomDirectory(TIFF* tif, toff_t diroff,
  670. const TIFFFieldInfo info[], size_t n)
  671. {
  672. static const char module[] = "TIFFReadCustomDirectory";
  673. TIFFDirectory* td = &tif->tif_dir;
  674. TIFFDirEntry *dp, *dir = NULL;
  675. const TIFFFieldInfo* fip;
  676. size_t fix;
  677. uint16 i, dircount;
  678. _TIFFSetupFieldInfo(tif, info, n);
  679. tif->tif_diroff = diroff;
  680. if (!isMapped(tif)) {
  681. if (!SeekOK(tif, diroff)) {
  682. TIFFErrorExt(tif->tif_clientdata, module,
  683.     "%s: Seek error accessing TIFF directory",
  684.                             tif->tif_name);
  685. return (0);
  686. }
  687. if (!ReadOK(tif, &dircount, sizeof (uint16))) {
  688. TIFFErrorExt(tif->tif_clientdata, module,
  689.     "%s: Can not read TIFF directory count",
  690.                             tif->tif_name);
  691. return (0);
  692. }
  693. if (tif->tif_flags & TIFF_SWAB)
  694. TIFFSwabShort(&dircount);
  695. dir = (TIFFDirEntry *)_TIFFCheckMalloc(tif, dircount,
  696.        sizeof (TIFFDirEntry),
  697. "to read TIFF custom directory");
  698. if (dir == NULL)
  699. return (0);
  700. if (!ReadOK(tif, dir, dircount * sizeof (TIFFDirEntry))) {
  701. TIFFErrorExt(tif->tif_clientdata, module,
  702.                                   "%.100s: Can not read TIFF directory",
  703.                                   tif->tif_name);
  704. goto bad;
  705. }
  706. } else {
  707. toff_t off = diroff;
  708. if (off + sizeof (uint16) > tif->tif_size) {
  709. TIFFErrorExt(tif->tif_clientdata, module,
  710.     "%s: Can not read TIFF directory count",
  711.                             tif->tif_name);
  712. return (0);
  713. } else
  714. _TIFFmemcpy(&dircount, tif->tif_base + off, sizeof (uint16));
  715. off += sizeof (uint16);
  716. if (tif->tif_flags & TIFF_SWAB)
  717. TIFFSwabShort(&dircount);
  718. dir = (TIFFDirEntry *)_TIFFCheckMalloc(tif, dircount,
  719.        sizeof (TIFFDirEntry),
  720. "to read TIFF custom directory");
  721. if (dir == NULL)
  722. return (0);
  723. if (off + dircount * sizeof (TIFFDirEntry) > tif->tif_size) {
  724. TIFFErrorExt(tif->tif_clientdata, module,
  725.                                   "%s: Can not read TIFF directory",
  726.                                   tif->tif_name);
  727. goto bad;
  728. } else {
  729. _TIFFmemcpy(dir, tif->tif_base + off,
  730.     dircount * sizeof (TIFFDirEntry));
  731. }
  732. }
  733. TIFFFreeDirectory(tif);
  734. fix = 0;
  735. for (dp = dir, i = dircount; i > 0; i--, dp++) {
  736. if (tif->tif_flags & TIFF_SWAB) {
  737. TIFFSwabArrayOfShort(&dp->tdir_tag, 2);
  738. TIFFSwabArrayOfLong(&dp->tdir_count, 2);
  739. }
  740. if (fix >= tif->tif_nfields || dp->tdir_tag == IGNORE)
  741. continue;
  742. while (fix < tif->tif_nfields &&
  743.        tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag)
  744. fix++;
  745. if (fix >= tif->tif_nfields ||
  746.     tif->tif_fieldinfo[fix]->field_tag != dp->tdir_tag) {
  747. TIFFWarningExt(tif->tif_clientdata, module,
  748.                         "%s: unknown field with tag %d (0x%x) encountered",
  749.     tif->tif_name, dp->tdir_tag, dp->tdir_tag,
  750.     dp->tdir_type);
  751. TIFFMergeFieldInfo(tif,
  752.    _TIFFCreateAnonFieldInfo(tif,
  753. dp->tdir_tag,
  754. (TIFFDataType)dp->tdir_type),
  755.    1);
  756. fix = 0;
  757. while (fix < tif->tif_nfields &&
  758.        tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag)
  759. fix++;
  760. }
  761. /*
  762.  * Null out old tags that we ignore.
  763.  */
  764. if (tif->tif_fieldinfo[fix]->field_bit == FIELD_IGNORE) {
  765. ignore:
  766. dp->tdir_tag = IGNORE;
  767. continue;
  768. }
  769. /*
  770.  * Check data type.
  771.  */
  772. fip = tif->tif_fieldinfo[fix];
  773. while (dp->tdir_type != (unsigned short) fip->field_type
  774.                        && fix < tif->tif_nfields) {
  775. if (fip->field_type == TIFF_ANY) /* wildcard */
  776. break;
  777.                         fip = tif->tif_fieldinfo[++fix];
  778. if (fix >= tif->tif_nfields ||
  779.     fip->field_tag != dp->tdir_tag) {
  780. TIFFWarningExt(tif->tif_clientdata, module,
  781. "%s: wrong data type %d for "%s"; tag ignored",
  782.     tif->tif_name, dp->tdir_type,
  783.     tif->tif_fieldinfo[fix-1]->field_name);
  784. goto ignore;
  785. }
  786. }
  787. /*
  788.  * Check count if known in advance.
  789.  */
  790. if (fip->field_readcount != TIFF_VARIABLE
  791.     && fip->field_readcount != TIFF_VARIABLE2) {
  792. uint32 expected = (fip->field_readcount == TIFF_SPP) ?
  793.     (uint32) td->td_samplesperpixel :
  794.     (uint32) fip->field_readcount;
  795. if (!CheckDirCount(tif, dp, expected))
  796. goto ignore;
  797. }
  798. (void) TIFFFetchNormalTag(tif, dp);
  799. }
  800. if (dir)
  801. _TIFFfree(dir);
  802. return 1;
  803. bad:
  804. if (dir)
  805. _TIFFfree(dir);
  806. return 0;
  807. }
  808. /*
  809.  * EXIF is important special case of custom IFD, so we have a special
  810.  * function to read it.
  811.  */
  812. int
  813. TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff)
  814. {
  815. size_t exifFieldInfoCount;
  816. const TIFFFieldInfo *exifFieldInfo =
  817. _TIFFGetExifFieldInfo(&exifFieldInfoCount);
  818. return TIFFReadCustomDirectory(tif, diroff, exifFieldInfo,
  819.        exifFieldInfoCount);
  820. }
  821. static int
  822. EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount)
  823. {
  824. static const char module[] = "EstimateStripByteCounts";
  825. register TIFFDirEntry *dp;
  826. register TIFFDirectory *td = &tif->tif_dir;
  827. uint16 i;
  828. if (td->td_stripbytecount)
  829. _TIFFfree(td->td_stripbytecount);
  830. td->td_stripbytecount = (uint32*)
  831.     _TIFFCheckMalloc(tif, td->td_nstrips, sizeof (uint32),
  832. "for "StripByteCounts" array");
  833. if (td->td_compression != COMPRESSION_NONE) {
  834. uint32 space = (uint32)(sizeof (TIFFHeader)
  835.     + sizeof (uint16)
  836.     + (dircount * sizeof (TIFFDirEntry))
  837.     + sizeof (uint32));
  838. toff_t filesize = TIFFGetFileSize(tif);
  839. uint16 n;
  840. /* calculate amount of space used by indirect values */
  841. for (dp = dir, n = dircount; n > 0; n--, dp++)
  842. {
  843. uint32 cc = TIFFDataWidth((TIFFDataType) dp->tdir_type);
  844. if (cc == 0) {
  845. TIFFErrorExt(tif->tif_clientdata, module,
  846. "%s: Cannot determine size of unknown tag type %d",
  847.   tif->tif_name, dp->tdir_type);
  848. return -1;
  849. }
  850. cc = cc * dp->tdir_count;
  851. if (cc > sizeof (uint32))
  852. space += cc;
  853. }
  854. space = filesize - space;
  855. if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
  856. space /= td->td_samplesperpixel;
  857. for (i = 0; i < td->td_nstrips; i++)
  858. td->td_stripbytecount[i] = space;
  859. /*
  860.  * This gross hack handles the case were the offset to
  861.  * the last strip is past the place where we think the strip
  862.  * should begin.  Since a strip of data must be contiguous,
  863.  * it's safe to assume that we've overestimated the amount
  864.  * of data in the strip and trim this number back accordingly.
  865.  */ 
  866. i--;
  867. if (((toff_t)(td->td_stripoffset[i]+td->td_stripbytecount[i]))
  868.                                                                > filesize)
  869. td->td_stripbytecount[i] =
  870.     filesize - td->td_stripoffset[i];
  871. } else {
  872. uint32 rowbytes = TIFFScanlineSize(tif);
  873. uint32 rowsperstrip = td->td_imagelength/td->td_stripsperimage;
  874. for (i = 0; i < td->td_nstrips; i++)
  875. td->td_stripbytecount[i] = rowbytes*rowsperstrip;
  876. }
  877. TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
  878. if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
  879. td->td_rowsperstrip = td->td_imagelength;
  880. return 1;
  881. }
  882. static void
  883. MissingRequired(TIFF* tif, const char* tagname)
  884. {
  885. static const char module[] = "MissingRequired";
  886. TIFFErrorExt(tif->tif_clientdata, module,
  887.   "%s: TIFF directory is missing required "%s" field",
  888.   tif->tif_name, tagname);
  889. }
  890. /*
  891.  * Check the count field of a directory
  892.  * entry against a known value.  The caller
  893.  * is expected to skip/ignore the tag if
  894.  * there is a mismatch.
  895.  */
  896. static int
  897. CheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count)
  898. {
  899. if (count > dir->tdir_count) {
  900. TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
  901. "incorrect count for field "%s" (%lu, expecting %lu); tag ignored",
  902.     _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name,
  903.     dir->tdir_count, count);
  904. return (0);
  905. } else if (count < dir->tdir_count) {
  906. TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
  907. "incorrect count for field "%s" (%lu, expecting %lu); tag trimmed",
  908.     _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name,
  909.     dir->tdir_count, count);
  910. return (1);
  911. }
  912. return (1);
  913. }
  914. /*
  915.  * Fetch a contiguous directory item.
  916.  */
  917. static tsize_t
  918. TIFFFetchData(TIFF* tif, TIFFDirEntry* dir, char* cp)
  919. {
  920. int w = TIFFDataWidth((TIFFDataType) dir->tdir_type);
  921. tsize_t cc = dir->tdir_count * w;
  922. /* Check for overflow. */
  923. if (!dir->tdir_count || !w || cc / w != (tsize_t)dir->tdir_count)
  924. goto bad;
  925. if (!isMapped(tif)) {
  926. if (!SeekOK(tif, dir->tdir_offset))
  927. goto bad;
  928. if (!ReadOK(tif, cp, cc))
  929. goto bad;
  930. } else {
  931. /* Check for overflow. */
  932. if ((tsize_t)dir->tdir_offset + cc < (tsize_t)dir->tdir_offset
  933.     || (tsize_t)dir->tdir_offset + cc < cc
  934.     || (tsize_t)dir->tdir_offset + cc > (tsize_t)tif->tif_size)
  935. goto bad;
  936. _TIFFmemcpy(cp, tif->tif_base + dir->tdir_offset, cc);
  937. }
  938. if (tif->tif_flags & TIFF_SWAB) {
  939. switch (dir->tdir_type) {
  940. case TIFF_SHORT:
  941. case TIFF_SSHORT:
  942. TIFFSwabArrayOfShort((uint16*) cp, dir->tdir_count);
  943. break;
  944. case TIFF_LONG:
  945. case TIFF_SLONG:
  946. case TIFF_FLOAT:
  947. TIFFSwabArrayOfLong((uint32*) cp, dir->tdir_count);
  948. break;
  949. case TIFF_RATIONAL:
  950. case TIFF_SRATIONAL:
  951. TIFFSwabArrayOfLong((uint32*) cp, 2*dir->tdir_count);
  952. break;
  953. case TIFF_DOUBLE:
  954. TIFFSwabArrayOfDouble((double*) cp, dir->tdir_count);
  955. break;
  956. }
  957. }
  958. return (cc);
  959. bad:
  960. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  961.      "Error fetching data for field "%s"",
  962.      _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
  963. return (tsize_t) 0;
  964. }
  965. /*
  966.  * Fetch an ASCII item from the file.
  967.  */
  968. static tsize_t
  969. TIFFFetchString(TIFF* tif, TIFFDirEntry* dir, char* cp)
  970. {
  971. if (dir->tdir_count <= 4) {
  972. uint32 l = dir->tdir_offset;
  973. if (tif->tif_flags & TIFF_SWAB)
  974. TIFFSwabLong(&l);
  975. _TIFFmemcpy(cp, &l, dir->tdir_count);
  976. return (1);
  977. }
  978. return (TIFFFetchData(tif, dir, cp));
  979. }
  980. /*
  981.  * Convert numerator+denominator to float.
  982.  */
  983. static int
  984. cvtRational(TIFF* tif, TIFFDirEntry* dir, uint32 num, uint32 denom, float* rv)
  985. {
  986. if (denom == 0) {
  987. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  988.     "%s: Rational with zero denominator (num = %lu)",
  989.     _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name, num);
  990. return (0);
  991. } else {
  992. if (dir->tdir_type == TIFF_RATIONAL)
  993. *rv = ((float)num / (float)denom);
  994. else
  995. *rv = ((float)(int32)num / (float)(int32)denom);
  996. return (1);
  997. }
  998. }
  999. /*
  1000.  * Fetch a rational item from the file
  1001.  * at offset off and return the value
  1002.  * as a floating point number.
  1003.  */
  1004. static float
  1005. TIFFFetchRational(TIFF* tif, TIFFDirEntry* dir)
  1006. {
  1007. uint32 l[2];
  1008. float v;
  1009. return (!TIFFFetchData(tif, dir, (char *)l) ||
  1010.     !cvtRational(tif, dir, l[0], l[1], &v) ? 1.0f : v);
  1011. }
  1012. /*
  1013.  * Fetch a single floating point value
  1014.  * from the offset field and return it
  1015.  * as a native float.
  1016.  */
  1017. static float
  1018. TIFFFetchFloat(TIFF* tif, TIFFDirEntry* dir)
  1019. {
  1020. float v;
  1021. int32 l = TIFFExtractData(tif, dir->tdir_type, dir->tdir_offset);
  1022.         _TIFFmemcpy(&v, &l, sizeof(float));
  1023. TIFFCvtIEEEFloatToNative(tif, 1, &v);
  1024. return (v);
  1025. }
  1026. /*
  1027.  * Fetch an array of BYTE or SBYTE values.
  1028.  */
  1029. static int
  1030. TIFFFetchByteArray(TIFF* tif, TIFFDirEntry* dir, uint8* v)
  1031. {
  1032.     if (dir->tdir_count <= 4) {
  1033.         /*
  1034.          * Extract data from offset field.
  1035.          */
  1036.         if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) {
  1037.     if (dir->tdir_type == TIFF_SBYTE)
  1038.                 switch (dir->tdir_count) {
  1039.                     case 4: v[3] = dir->tdir_offset & 0xff;
  1040.                     case 3: v[2] = (dir->tdir_offset >> 8) & 0xff;
  1041.                     case 2: v[1] = (dir->tdir_offset >> 16) & 0xff;
  1042.     case 1: v[0] = dir->tdir_offset >> 24;
  1043.                 }
  1044.     else
  1045.                 switch (dir->tdir_count) {
  1046.                     case 4: v[3] = dir->tdir_offset & 0xff;
  1047.                     case 3: v[2] = (dir->tdir_offset >> 8) & 0xff;
  1048.                     case 2: v[1] = (dir->tdir_offset >> 16) & 0xff;
  1049.     case 1: v[0] = dir->tdir_offset >> 24;
  1050.                 }
  1051. } else {
  1052.     if (dir->tdir_type == TIFF_SBYTE)
  1053.                 switch (dir->tdir_count) {
  1054.                     case 4: v[3] = dir->tdir_offset >> 24;
  1055.                     case 3: v[2] = (dir->tdir_offset >> 16) & 0xff;
  1056.                     case 2: v[1] = (dir->tdir_offset >> 8) & 0xff;
  1057.                     case 1: v[0] = dir->tdir_offset & 0xff;
  1058. }
  1059.     else
  1060.                 switch (dir->tdir_count) {
  1061.                     case 4: v[3] = dir->tdir_offset >> 24;
  1062.                     case 3: v[2] = (dir->tdir_offset >> 16) & 0xff;
  1063.                     case 2: v[1] = (dir->tdir_offset >> 8) & 0xff;
  1064.                     case 1: v[0] = dir->tdir_offset & 0xff;
  1065. }
  1066. }
  1067.         return (1);
  1068.     } else
  1069.         return (TIFFFetchData(tif, dir, (char*) v) != 0); /* XXX */
  1070. }
  1071. /*
  1072.  * Fetch an array of SHORT or SSHORT values.
  1073.  */
  1074. static int
  1075. TIFFFetchShortArray(TIFF* tif, TIFFDirEntry* dir, uint16* v)
  1076. {
  1077. if (dir->tdir_count <= 2) {
  1078. if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) {
  1079. switch (dir->tdir_count) {
  1080. case 2: v[1] = (uint16) (dir->tdir_offset & 0xffff);
  1081. case 1: v[0] = (uint16) (dir->tdir_offset >> 16);
  1082. }
  1083. } else {
  1084. switch (dir->tdir_count) {
  1085. case 2: v[1] = (uint16) (dir->tdir_offset >> 16);
  1086. case 1: v[0] = (uint16) (dir->tdir_offset & 0xffff);
  1087. }
  1088. }
  1089. return (1);
  1090. } else
  1091. return (TIFFFetchData(tif, dir, (char *)v) != 0);
  1092. }
  1093. /*
  1094.  * Fetch a pair of SHORT or BYTE values. Some tags may have either BYTE
  1095.  * or SHORT type and this function works with both ones.
  1096.  */
  1097. static int
  1098. TIFFFetchShortPair(TIFF* tif, TIFFDirEntry* dir)
  1099. {
  1100. switch (dir->tdir_type) {
  1101. case TIFF_BYTE:
  1102. case TIFF_SBYTE:
  1103. {
  1104. uint8 v[4];
  1105. return TIFFFetchByteArray(tif, dir, v)
  1106. && TIFFSetField(tif, dir->tdir_tag, v[0], v[1]);
  1107. }
  1108. case TIFF_SHORT:
  1109. case TIFF_SSHORT:
  1110. {
  1111. uint16 v[2];
  1112. return TIFFFetchShortArray(tif, dir, v)
  1113. && TIFFSetField(tif, dir->tdir_tag, v[0], v[1]);
  1114. }
  1115. default:
  1116. return 0;
  1117. }
  1118. }
  1119. /*
  1120.  * Fetch an array of LONG or SLONG values.
  1121.  */
  1122. static int
  1123. TIFFFetchLongArray(TIFF* tif, TIFFDirEntry* dir, uint32* v)
  1124. {
  1125. if (dir->tdir_count == 1) {
  1126. v[0] = dir->tdir_offset;
  1127. return (1);
  1128. } else
  1129. return (TIFFFetchData(tif, dir, (char*) v) != 0);
  1130. }
  1131. /*
  1132.  * Fetch an array of RATIONAL or SRATIONAL values.
  1133.  */
  1134. static int
  1135. TIFFFetchRationalArray(TIFF* tif, TIFFDirEntry* dir, float* v)
  1136. {
  1137. int ok = 0;
  1138. uint32* l;
  1139. l = (uint32*)_TIFFCheckMalloc(tif,
  1140.     dir->tdir_count, TIFFDataWidth((TIFFDataType) dir->tdir_type),
  1141.     "to fetch array of rationals");
  1142. if (l) {
  1143. if (TIFFFetchData(tif, dir, (char *)l)) {
  1144. uint32 i;
  1145. for (i = 0; i < dir->tdir_count; i++) {
  1146. ok = cvtRational(tif, dir,
  1147.     l[2*i+0], l[2*i+1], &v[i]);
  1148. if (!ok)
  1149. break;
  1150. }
  1151. }
  1152. _TIFFfree((char *)l);
  1153. }
  1154. return (ok);
  1155. }
  1156. /*
  1157.  * Fetch an array of FLOAT values.
  1158.  */
  1159. static int
  1160. TIFFFetchFloatArray(TIFF* tif, TIFFDirEntry* dir, float* v)
  1161. {
  1162. if (dir->tdir_count == 1) {
  1163. v[0] = *(float*) &dir->tdir_offset;
  1164. TIFFCvtIEEEFloatToNative(tif, dir->tdir_count, v);
  1165. return (1);
  1166. } else if (TIFFFetchData(tif, dir, (char*) v)) {
  1167. TIFFCvtIEEEFloatToNative(tif, dir->tdir_count, v);
  1168. return (1);
  1169. } else
  1170. return (0);
  1171. }
  1172. /*
  1173.  * Fetch an array of DOUBLE values.
  1174.  */
  1175. static int
  1176. TIFFFetchDoubleArray(TIFF* tif, TIFFDirEntry* dir, double* v)
  1177. {
  1178. if (TIFFFetchData(tif, dir, (char*) v)) {
  1179. TIFFCvtIEEEDoubleToNative(tif, dir->tdir_count, v);
  1180. return (1);
  1181. } else
  1182. return (0);
  1183. }
  1184. /*
  1185.  * Fetch an array of ANY values.  The actual values are
  1186.  * returned as doubles which should be able hold all the
  1187.  * types.  Yes, there really should be an tany_t to avoid
  1188.  * this potential non-portability ...  Note in particular
  1189.  * that we assume that the double return value vector is
  1190.  * large enough to read in any fundamental type.  We use
  1191.  * that vector as a buffer to read in the base type vector
  1192.  * and then convert it in place to double (from end
  1193.  * to front of course).
  1194.  */
  1195. static int
  1196. TIFFFetchAnyArray(TIFF* tif, TIFFDirEntry* dir, double* v)
  1197. {
  1198. int i;
  1199. switch (dir->tdir_type) {
  1200. case TIFF_BYTE:
  1201. case TIFF_SBYTE:
  1202. if (!TIFFFetchByteArray(tif, dir, (uint8*) v))
  1203. return (0);
  1204. if (dir->tdir_type == TIFF_BYTE) {
  1205. uint8* vp = (uint8*) v;
  1206. for (i = dir->tdir_count-1; i >= 0; i--)
  1207. v[i] = vp[i];
  1208. } else {
  1209. int8* vp = (int8*) v;
  1210. for (i = dir->tdir_count-1; i >= 0; i--)
  1211. v[i] = vp[i];
  1212. }
  1213. break;
  1214. case TIFF_SHORT:
  1215. case TIFF_SSHORT:
  1216. if (!TIFFFetchShortArray(tif, dir, (uint16*) v))
  1217. return (0);
  1218. if (dir->tdir_type == TIFF_SHORT) {
  1219. uint16* vp = (uint16*) v;
  1220. for (i = dir->tdir_count-1; i >= 0; i--)
  1221. v[i] = vp[i];
  1222. } else {
  1223. int16* vp = (int16*) v;
  1224. for (i = dir->tdir_count-1; i >= 0; i--)
  1225. v[i] = vp[i];
  1226. }
  1227. break;
  1228. case TIFF_LONG:
  1229. case TIFF_SLONG:
  1230. if (!TIFFFetchLongArray(tif, dir, (uint32*) v))
  1231. return (0);
  1232. if (dir->tdir_type == TIFF_LONG) {
  1233. uint32* vp = (uint32*) v;
  1234. for (i = dir->tdir_count-1; i >= 0; i--)
  1235. v[i] = vp[i];
  1236. } else {
  1237. int32* vp = (int32*) v;
  1238. for (i = dir->tdir_count-1; i >= 0; i--)
  1239. v[i] = vp[i];
  1240. }
  1241. break;
  1242. case TIFF_RATIONAL:
  1243. case TIFF_SRATIONAL:
  1244. if (!TIFFFetchRationalArray(tif, dir, (float*) v))
  1245. return (0);
  1246. { float* vp = (float*) v;
  1247.   for (i = dir->tdir_count-1; i >= 0; i--)
  1248. v[i] = vp[i];
  1249. }
  1250. break;
  1251. case TIFF_FLOAT:
  1252. if (!TIFFFetchFloatArray(tif, dir, (float*) v))
  1253. return (0);
  1254. { float* vp = (float*) v;
  1255.   for (i = dir->tdir_count-1; i >= 0; i--)
  1256. v[i] = vp[i];
  1257. }
  1258. break;
  1259. case TIFF_DOUBLE:
  1260. return (TIFFFetchDoubleArray(tif, dir, (double*) v));
  1261. default:
  1262. /* TIFF_NOTYPE */
  1263. /* TIFF_ASCII */
  1264. /* TIFF_UNDEFINED */
  1265. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  1266.      "cannot read TIFF_ANY type %d for field "%s"",
  1267.      dir->tdir_type,
  1268.      _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
  1269. return (0);
  1270. }
  1271. return (1);
  1272. }
  1273. /*
  1274.  * Fetch a tag that is not handled by special case code.
  1275.  */
  1276. static int
  1277. TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp)
  1278. {
  1279. static const char mesg[] = "to fetch tag value";
  1280. int ok = 0;
  1281. const TIFFFieldInfo* fip = _TIFFFieldWithTag(tif, dp->tdir_tag);
  1282. if (dp->tdir_count > 1) { /* array of values */
  1283. char* cp = NULL;
  1284. switch (dp->tdir_type) {
  1285. case TIFF_BYTE:
  1286. case TIFF_SBYTE:
  1287. cp = (char *)_TIFFCheckMalloc(tif,
  1288.     dp->tdir_count, sizeof (uint8), mesg);
  1289. ok = cp && TIFFFetchByteArray(tif, dp, (uint8*) cp);
  1290. break;
  1291. case TIFF_SHORT:
  1292. case TIFF_SSHORT:
  1293. cp = (char *)_TIFFCheckMalloc(tif,
  1294.     dp->tdir_count, sizeof (uint16), mesg);
  1295. ok = cp && TIFFFetchShortArray(tif, dp, (uint16*) cp);
  1296. break;
  1297. case TIFF_LONG:
  1298. case TIFF_SLONG:
  1299. cp = (char *)_TIFFCheckMalloc(tif,
  1300.     dp->tdir_count, sizeof (uint32), mesg);
  1301. ok = cp && TIFFFetchLongArray(tif, dp, (uint32*) cp);
  1302. break;
  1303. case TIFF_RATIONAL:
  1304. case TIFF_SRATIONAL:
  1305. cp = (char *)_TIFFCheckMalloc(tif,
  1306.     dp->tdir_count, sizeof (float), mesg);
  1307. ok = cp && TIFFFetchRationalArray(tif, dp, (float*) cp);
  1308. break;
  1309. case TIFF_FLOAT:
  1310. cp = (char *)_TIFFCheckMalloc(tif,
  1311.     dp->tdir_count, sizeof (float), mesg);
  1312. ok = cp && TIFFFetchFloatArray(tif, dp, (float*) cp);
  1313. break;
  1314. case TIFF_DOUBLE:
  1315. cp = (char *)_TIFFCheckMalloc(tif,
  1316.     dp->tdir_count, sizeof (double), mesg);
  1317. ok = cp && TIFFFetchDoubleArray(tif, dp, (double*) cp);
  1318. break;
  1319. case TIFF_ASCII:
  1320. case TIFF_UNDEFINED: /* bit of a cheat... */
  1321. /*
  1322.  * Some vendors write strings w/o the trailing
  1323.  * NULL byte, so always append one just in case.
  1324.  */
  1325. cp = (char *)_TIFFCheckMalloc(tif, dp->tdir_count + 1,
  1326.       1, mesg);
  1327. if( (ok = (cp && TIFFFetchString(tif, dp, cp))) != 0 )
  1328. cp[dp->tdir_count] = ''; /* XXX */
  1329. break;
  1330. }
  1331. if (ok) {
  1332. ok = (fip->field_passcount ?
  1333.     TIFFSetField(tif, dp->tdir_tag, dp->tdir_count, cp)
  1334.   : TIFFSetField(tif, dp->tdir_tag, cp));
  1335. }
  1336. if (cp != NULL)
  1337. _TIFFfree(cp);
  1338. } else if (CheckDirCount(tif, dp, 1)) { /* singleton value */
  1339. switch (dp->tdir_type) {
  1340. case TIFF_BYTE:
  1341. case TIFF_SBYTE:
  1342. case TIFF_SHORT:
  1343. case TIFF_SSHORT:
  1344. /*
  1345.  * If the tag is also acceptable as a LONG or SLONG
  1346.  * then TIFFSetField will expect an uint32 parameter
  1347.  * passed to it (through varargs).  Thus, for machines
  1348.  * where sizeof (int) != sizeof (uint32) we must do
  1349.  * a careful check here.  It's hard to say if this
  1350.  * is worth optimizing.
  1351.  *
  1352.  * NB: We use TIFFFieldWithTag here knowing that
  1353.  *     it returns us the first entry in the table
  1354.  *     for the tag and that that entry is for the
  1355.  *     widest potential data type the tag may have.
  1356.  */
  1357. { TIFFDataType type = fip->field_type;
  1358.   if (type != TIFF_LONG && type != TIFF_SLONG) {
  1359. uint16 v = (uint16)
  1360.    TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset);
  1361. ok = (fip->field_passcount ?
  1362.     TIFFSetField(tif, dp->tdir_tag, 1, &v)
  1363.   : TIFFSetField(tif, dp->tdir_tag, v));
  1364. break;
  1365.   }
  1366. }
  1367. /* fall thru... */
  1368. case TIFF_LONG:
  1369. case TIFF_SLONG:
  1370. { uint32 v32 =
  1371.     TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset);
  1372.   ok = (fip->field_passcount ? 
  1373.       TIFFSetField(tif, dp->tdir_tag, 1, &v32)
  1374.     : TIFFSetField(tif, dp->tdir_tag, v32));
  1375. }
  1376. break;
  1377. case TIFF_RATIONAL:
  1378. case TIFF_SRATIONAL:
  1379. case TIFF_FLOAT:
  1380. { float v = (dp->tdir_type == TIFF_FLOAT ? 
  1381.       TIFFFetchFloat(tif, dp)
  1382.     : TIFFFetchRational(tif, dp));
  1383.   ok = (fip->field_passcount ?
  1384.       TIFFSetField(tif, dp->tdir_tag, 1, &v)
  1385.     : TIFFSetField(tif, dp->tdir_tag, v));
  1386. }
  1387. break;
  1388. case TIFF_DOUBLE:
  1389. { double v;
  1390.   ok = (TIFFFetchDoubleArray(tif, dp, &v) &&
  1391.     (fip->field_passcount ?
  1392.       TIFFSetField(tif, dp->tdir_tag, 1, &v)
  1393.     : TIFFSetField(tif, dp->tdir_tag, v))
  1394.   );
  1395. }
  1396. break;
  1397. case TIFF_ASCII:
  1398. case TIFF_UNDEFINED: /* bit of a cheat... */
  1399. { char c[2];
  1400.   if( (ok = (TIFFFetchString(tif, dp, c) != 0)) != 0 ) {
  1401. c[1] = ''; /* XXX paranoid */
  1402. ok = (fip->field_passcount ?
  1403. TIFFSetField(tif, dp->tdir_tag, 1, c)
  1404.       : TIFFSetField(tif, dp->tdir_tag, c));
  1405.   }
  1406. }
  1407. break;
  1408. }
  1409. }
  1410. return (ok);
  1411. }
  1412. #define NITEMS(x) (sizeof (x) / sizeof (x[0]))
  1413. /*
  1414.  * Fetch samples/pixel short values for 
  1415.  * the specified tag and verify that
  1416.  * all values are the same.
  1417.  */
  1418. static int
  1419. TIFFFetchPerSampleShorts(TIFF* tif, TIFFDirEntry* dir, uint16* pl)
  1420. {
  1421.     uint16 samples = tif->tif_dir.td_samplesperpixel;
  1422.     int status = 0;
  1423.     if (CheckDirCount(tif, dir, (uint32) samples)) {
  1424.         uint16 buf[10];
  1425.         uint16* v = buf;
  1426.         if (dir->tdir_count > NITEMS(buf))
  1427.             v = (uint16*) _TIFFCheckMalloc(tif, dir->tdir_count, sizeof(uint16),
  1428.                                       "to fetch per-sample values");
  1429.         if (v && TIFFFetchShortArray(tif, dir, v)) {
  1430.             uint16 i;
  1431.             int check_count = dir->tdir_count;
  1432.             if( samples < check_count )
  1433.                 check_count = samples;
  1434.             for (i = 1; i < check_count; i++)
  1435.                 if (v[i] != v[0]) {
  1436. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  1437.                               "Cannot handle different per-sample values for field "%s"",
  1438.                               _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
  1439.                     goto bad;
  1440.                 }
  1441.             *pl = v[0];
  1442.             status = 1;
  1443.         }
  1444.       bad:
  1445.         if (v && v != buf)
  1446.             _TIFFfree(v);
  1447.     }
  1448.     return (status);
  1449. }
  1450. /*
  1451.  * Fetch samples/pixel long values for 
  1452.  * the specified tag and verify that
  1453.  * all values are the same.
  1454.  */
  1455. static int
  1456. TIFFFetchPerSampleLongs(TIFF* tif, TIFFDirEntry* dir, uint32* pl)
  1457. {
  1458.     uint16 samples = tif->tif_dir.td_samplesperpixel;
  1459.     int status = 0;
  1460.     if (CheckDirCount(tif, dir, (uint32) samples)) {
  1461.         uint32 buf[10];
  1462.         uint32* v = buf;
  1463.         if (dir->tdir_count > NITEMS(buf))
  1464.             v = (uint32*) _TIFFCheckMalloc(tif, dir->tdir_count, sizeof(uint32),
  1465.                                       "to fetch per-sample values");
  1466.         if (v && TIFFFetchLongArray(tif, dir, v)) {
  1467.             uint16 i;
  1468.             int check_count = dir->tdir_count;
  1469.             if( samples < check_count )
  1470.                 check_count = samples;
  1471.             for (i = 1; i < check_count; i++)
  1472.                 if (v[i] != v[0]) {
  1473. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  1474.                               "Cannot handle different per-sample values for field "%s"",
  1475.                               _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
  1476.                     goto bad;
  1477.                 }
  1478.             *pl = v[0];
  1479.             status = 1;
  1480.         }
  1481.       bad:
  1482.         if (v && v != buf)
  1483.             _TIFFfree(v);
  1484.     }
  1485.     return (status);
  1486. }
  1487. /*
  1488.  * Fetch samples/pixel ANY values for the specified tag and verify that all
  1489.  * values are the same.
  1490.  */
  1491. static int
  1492. TIFFFetchPerSampleAnys(TIFF* tif, TIFFDirEntry* dir, double* pl)
  1493. {
  1494.     uint16 samples = tif->tif_dir.td_samplesperpixel;
  1495.     int status = 0;
  1496.     if (CheckDirCount(tif, dir, (uint32) samples)) {
  1497.         double buf[10];
  1498.         double* v = buf;
  1499.         if (dir->tdir_count > NITEMS(buf))
  1500.             v = (double*) _TIFFCheckMalloc(tif, dir->tdir_count, sizeof (double),
  1501.                                       "to fetch per-sample values");
  1502.         if (v && TIFFFetchAnyArray(tif, dir, v)) {
  1503.             uint16 i;
  1504.             int check_count = dir->tdir_count;
  1505.             if( samples < check_count )
  1506.                 check_count = samples;
  1507.             for (i = 1; i < check_count; i++)
  1508.                 if (v[i] != v[0]) {
  1509.                     TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  1510.                               "Cannot handle different per-sample values for field "%s"",
  1511.                               _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
  1512.                     goto bad;
  1513.                 }
  1514.             *pl = v[0];
  1515.             status = 1;
  1516.         }
  1517.       bad:
  1518.         if (v && v != buf)
  1519.             _TIFFfree(v);
  1520.     }
  1521.     return (status);
  1522. }
  1523. #undef NITEMS
  1524. /*
  1525.  * Fetch a set of offsets or lengths.
  1526.  * While this routine says "strips", in fact it's also used for tiles.
  1527.  */
  1528. static int
  1529. TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, long nstrips, uint32** lpp)
  1530. {
  1531. register uint32* lp;
  1532. int status;
  1533.         CheckDirCount(tif, dir, (uint32) nstrips);
  1534. /*
  1535.  * Allocate space for strip information.
  1536.  */
  1537. if (*lpp == NULL &&
  1538.     (*lpp = (uint32 *)_TIFFCheckMalloc(tif,
  1539.       nstrips, sizeof (uint32), "for strip array")) == NULL)
  1540. return (0);
  1541. lp = *lpp;
  1542.         _TIFFmemset( lp, 0, sizeof(uint32) * nstrips );
  1543. if (dir->tdir_type == (int)TIFF_SHORT) {
  1544. /*
  1545.  * Handle uint16->uint32 expansion.
  1546.  */
  1547. uint16* dp = (uint16*) _TIFFCheckMalloc(tif,
  1548.     dir->tdir_count, sizeof (uint16), "to fetch strip tag");
  1549. if (dp == NULL)
  1550. return (0);
  1551. if( (status = TIFFFetchShortArray(tif, dir, dp)) != 0 ) {
  1552.                     int i;
  1553.                     
  1554.                     for( i = 0; i < nstrips && i < (int) dir->tdir_count; i++ )
  1555.                     {
  1556.                         lp[i] = dp[i];
  1557.                     }
  1558. }
  1559. _TIFFfree((char*) dp);
  1560.         } else if( nstrips != (int) dir->tdir_count ) {
  1561.             /* Special case to correct length */
  1562.             uint32* dp = (uint32*) _TIFFCheckMalloc(tif,
  1563.     dir->tdir_count, sizeof (uint32), "to fetch strip tag");
  1564.             if (dp == NULL)
  1565.                 return (0);
  1566.             status = TIFFFetchLongArray(tif, dir, dp);
  1567.             if( status != 0 ) {
  1568.                 int i;
  1569.                 for( i = 0; i < nstrips && i < (int) dir->tdir_count; i++ )
  1570.                 {
  1571.                     lp[i] = dp[i];
  1572.                 }
  1573.             }
  1574.             _TIFFfree( (char *) dp );
  1575. } else
  1576.             status = TIFFFetchLongArray(tif, dir, lp);
  1577.         
  1578. return (status);
  1579. }
  1580. /*
  1581.  * Fetch and set the RefBlackWhite tag.
  1582.  */
  1583. static int
  1584. TIFFFetchRefBlackWhite(TIFF* tif, TIFFDirEntry* dir)
  1585. {
  1586. static const char mesg[] = "for "ReferenceBlackWhite" array";
  1587. char* cp;
  1588. int ok;
  1589. if (dir->tdir_type == TIFF_RATIONAL)
  1590. return (TIFFFetchNormalTag(tif, dir));
  1591. /*
  1592.  * Handle LONG's for backward compatibility.
  1593.  */
  1594. cp = (char *)_TIFFCheckMalloc(tif, dir->tdir_count,
  1595.       sizeof (uint32), mesg);
  1596. if( (ok = (cp && TIFFFetchLongArray(tif, dir, (uint32*) cp))) != 0) {
  1597. float* fp = (float*)
  1598.     _TIFFCheckMalloc(tif, dir->tdir_count, sizeof (float), mesg);
  1599. if( (ok = (fp != NULL)) != 0 ) {
  1600. uint32 i;
  1601. for (i = 0; i < dir->tdir_count; i++)
  1602. fp[i] = (float)((uint32*) cp)[i];
  1603. ok = TIFFSetField(tif, dir->tdir_tag, fp);
  1604. _TIFFfree((char*) fp);
  1605. }
  1606. }
  1607. if (cp)
  1608. _TIFFfree(cp);
  1609. return (ok);
  1610. }
  1611. /*
  1612.  * Replace a single strip (tile) of uncompressed data by
  1613.  * multiple strips (tiles), each approximately 8Kbytes.
  1614.  * This is useful for dealing with large images or
  1615.  * for dealing with machines with a limited amount
  1616.  * memory.
  1617.  */
  1618. static void
  1619. ChopUpSingleUncompressedStrip(TIFF* tif)
  1620. {
  1621. register TIFFDirectory *td = &tif->tif_dir;
  1622. uint32 bytecount = td->td_stripbytecount[0];
  1623. uint32 offset = td->td_stripoffset[0];
  1624. tsize_t rowbytes = TIFFVTileSize(tif, 1), stripbytes;
  1625. tstrip_t strip, nstrips, rowsperstrip;
  1626. uint32* newcounts;
  1627. uint32* newoffsets;
  1628. /*
  1629.  * Make the rows hold at least one scanline, but fill specified amount
  1630.  * of data if possible.
  1631.  */
  1632. if (rowbytes > STRIP_SIZE_DEFAULT) {
  1633. stripbytes = rowbytes;
  1634. rowsperstrip = 1;
  1635. } else if (rowbytes > 0 ) {
  1636. rowsperstrip = STRIP_SIZE_DEFAULT / rowbytes;
  1637. stripbytes = rowbytes * rowsperstrip;
  1638. }
  1639.         else
  1640.             return;
  1641. /* 
  1642.  * never increase the number of strips in an image
  1643.  */
  1644. if (rowsperstrip >= td->td_rowsperstrip)
  1645. return;
  1646. nstrips = (tstrip_t) TIFFhowmany(bytecount, stripbytes);
  1647.         if( nstrips == 0 ) /* something is wonky, do nothing. */
  1648.             return;
  1649. newcounts = (uint32*) _TIFFCheckMalloc(tif, nstrips, sizeof (uint32),
  1650. "for chopped "StripByteCounts" array");
  1651. newoffsets = (uint32*) _TIFFCheckMalloc(tif, nstrips, sizeof (uint32),
  1652. "for chopped "StripOffsets" array");
  1653. if (newcounts == NULL || newoffsets == NULL) {
  1654.         /*
  1655.  * Unable to allocate new strip information, give
  1656.  * up and use the original one strip information.
  1657.  */
  1658. if (newcounts != NULL)
  1659. _TIFFfree(newcounts);
  1660. if (newoffsets != NULL)
  1661. _TIFFfree(newoffsets);
  1662. return;
  1663. }
  1664. /*
  1665.  * Fill the strip information arrays with new bytecounts and offsets
  1666.  * that reflect the broken-up format.
  1667.  */
  1668. for (strip = 0; strip < nstrips; strip++) {
  1669. if (stripbytes > (tsize_t) bytecount)
  1670. stripbytes = bytecount;
  1671. newcounts[strip] = stripbytes;
  1672. newoffsets[strip] = offset;
  1673. offset += stripbytes;
  1674. bytecount -= stripbytes;
  1675. }
  1676. /*
  1677.  * Replace old single strip info with multi-strip info.
  1678.  */
  1679. td->td_stripsperimage = td->td_nstrips = nstrips;
  1680. TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
  1681. _TIFFfree(td->td_stripbytecount);
  1682. _TIFFfree(td->td_stripoffset);
  1683. td->td_stripbytecount = newcounts;
  1684. td->td_stripoffset = newoffsets;
  1685. td->td_stripbytecountsorted = 1;
  1686. }
  1687. /* vim: set ts=8 sts=8 sw=8 noet: */