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

打印编程

开发平台:

Visual C++

  1. /* $Id: tif_dirwrite.c,v 1.34 2006/02/23 16:07:45 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 Write Support Routines.
  29.  */
  30. #include "tiffiop.h"
  31. #ifdef HAVE_IEEEFP
  32. # define TIFFCvtNativeToIEEEFloat(tif, n, fp)
  33. # define TIFFCvtNativeToIEEEDouble(tif, n, dp)
  34. #else
  35. extern void TIFFCvtNativeToIEEEFloat(TIFF*, uint32, float*);
  36. extern void TIFFCvtNativeToIEEEDouble(TIFF*, uint32, double*);
  37. #endif
  38. static int TIFFWriteNormalTag(TIFF*, TIFFDirEntry*, const TIFFFieldInfo*);
  39. static void TIFFSetupShortLong(TIFF*, ttag_t, TIFFDirEntry*, uint32);
  40. static void TIFFSetupShort(TIFF*, ttag_t, TIFFDirEntry*, uint16);
  41. static int TIFFSetupShortPair(TIFF*, ttag_t, TIFFDirEntry*);
  42. static int TIFFWritePerSampleShorts(TIFF*, ttag_t, TIFFDirEntry*);
  43. static int TIFFWritePerSampleAnys(TIFF*, TIFFDataType, ttag_t, TIFFDirEntry*);
  44. static int TIFFWriteShortTable(TIFF*, ttag_t, TIFFDirEntry*, uint32, uint16**);
  45. static int TIFFWriteShortArray(TIFF*, TIFFDirEntry*, uint16*);
  46. static int TIFFWriteLongArray(TIFF *, TIFFDirEntry*, uint32*);
  47. static int TIFFWriteRationalArray(TIFF *, TIFFDirEntry*, float*);
  48. static int TIFFWriteFloatArray(TIFF *, TIFFDirEntry*, float*);
  49. static int TIFFWriteDoubleArray(TIFF *, TIFFDirEntry*, double*);
  50. static int TIFFWriteByteArray(TIFF*, TIFFDirEntry*, char*);
  51. static int TIFFWriteAnyArray(TIFF*,
  52.     TIFFDataType, ttag_t, TIFFDirEntry*, uint32, double*);
  53. static int TIFFWriteTransferFunction(TIFF*, TIFFDirEntry*);
  54. static int TIFFWriteInkNames(TIFF*, TIFFDirEntry*);
  55. static int TIFFWriteData(TIFF*, TIFFDirEntry*, char*);
  56. static int TIFFLinkDirectory(TIFF*);
  57. #define WriteRationalPair(type, tag1, v1, tag2, v2) {
  58. TIFFWriteRational((tif), (type), (tag1), (dir), (v1))
  59. TIFFWriteRational((tif), (type), (tag2), (dir)+1, (v2))
  60. (dir)++;
  61. }
  62. #define TIFFWriteRational(tif, type, tag, dir, v)
  63. (dir)->tdir_tag = (tag);
  64. (dir)->tdir_type = (type);
  65. (dir)->tdir_count = 1;
  66. if (!TIFFWriteRationalArray((tif), (dir), &(v)))
  67. goto bad;
  68. /*
  69.  * Write the contents of the current directory
  70.  * to the specified file.  This routine doesn't
  71.  * handle overwriting a directory with auxiliary
  72.  * storage that's been changed.
  73.  */
  74. static int
  75. _TIFFWriteDirectory(TIFF* tif, int done)
  76. {
  77. uint16 dircount;
  78. toff_t diroff;
  79. ttag_t tag;
  80. uint32 nfields;
  81. tsize_t dirsize;
  82. char* data;
  83. TIFFDirEntry* dir;
  84. TIFFDirectory* td;
  85. unsigned long b, fields[FIELD_SETLONGS];
  86. int fi, nfi;
  87. if (tif->tif_mode == O_RDONLY)
  88. return (1);
  89. /*
  90.  * Clear write state so that subsequent images with
  91.  * different characteristics get the right buffers
  92.  * setup for them.
  93.  */
  94. if (done)
  95. {
  96.     if (tif->tif_flags & TIFF_POSTENCODE) {
  97.     tif->tif_flags &= ~TIFF_POSTENCODE;
  98.     if (!(*tif->tif_postencode)(tif)) {
  99. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  100. "Error post-encoding before directory write");
  101.     return (0);
  102.     }
  103.     }
  104.     (*tif->tif_close)(tif); /* shutdown encoder */
  105.     /*
  106.      * Flush any data that might have been written
  107.      * by the compression close+cleanup routines.
  108.      */
  109.     if (tif->tif_rawcc > 0 && !TIFFFlushData1(tif)) {
  110. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  111. "Error flushing data before directory write");
  112.     return (0);
  113.     }
  114.     if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) {
  115.     _TIFFfree(tif->tif_rawdata);
  116.     tif->tif_rawdata = NULL;
  117.     tif->tif_rawcc = 0;
  118.     tif->tif_rawdatasize = 0;
  119.     }
  120.     tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP);
  121. }
  122. td = &tif->tif_dir;
  123. /*
  124.  * Size the directory so that we can calculate
  125.  * offsets for the data items that aren't kept
  126.  * in-place in each field.
  127.  */
  128. nfields = 0;
  129. for (b = 0; b <= FIELD_LAST; b++)
  130. if (TIFFFieldSet(tif, b) && b != FIELD_CUSTOM)
  131. nfields += (b < FIELD_SUBFILETYPE ? 2 : 1);
  132.         nfields += td->td_customValueCount;
  133. dirsize = nfields * sizeof (TIFFDirEntry);
  134. data = (char*) _TIFFmalloc(dirsize);
  135. if (data == NULL) {
  136. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  137.     "Cannot write directory, out of space");
  138. return (0);
  139. }
  140. /*
  141.  * Directory hasn't been placed yet, put
  142.  * it at the end of the file and link it
  143.  * into the existing directory structure.
  144.  */
  145. if (tif->tif_diroff == 0 && !TIFFLinkDirectory(tif))
  146. goto bad;
  147. tif->tif_dataoff = (toff_t)(
  148.     tif->tif_diroff + sizeof (uint16) + dirsize + sizeof (toff_t));
  149. if (tif->tif_dataoff & 1)
  150. tif->tif_dataoff++;
  151. (void) TIFFSeekFile(tif, tif->tif_dataoff, SEEK_SET);
  152. tif->tif_curdir++;
  153. dir = (TIFFDirEntry*) data;
  154. /*
  155.  * Setup external form of directory
  156.  * entries and write data items.
  157.  */
  158. _TIFFmemcpy(fields, td->td_fieldsset, sizeof (fields));
  159. /*
  160.  * Write out ExtraSamples tag only if
  161.  * extra samples are present in the data.
  162.  */
  163. if (FieldSet(fields, FIELD_EXTRASAMPLES) && !td->td_extrasamples) {
  164. ResetFieldBit(fields, FIELD_EXTRASAMPLES);
  165. nfields--;
  166. dirsize -= sizeof (TIFFDirEntry);
  167. } /*XXX*/
  168. for (fi = 0, nfi = tif->tif_nfields; nfi > 0; nfi--, fi++) {
  169. const TIFFFieldInfo* fip = tif->tif_fieldinfo[fi];
  170.                 /*
  171.                 ** For custom fields, we test to see if the custom field
  172.                 ** is set or not.  For normal fields, we just use the
  173.                 ** FieldSet test. 
  174.                 */
  175.                 if( fip->field_bit == FIELD_CUSTOM )
  176.                 {
  177.                     int ci, is_set = FALSE;
  178.                     for( ci = 0; ci < td->td_customValueCount; ci++ )
  179.                         is_set |= (td->td_customValues[ci].info == fip);
  180.                     if( !is_set )
  181.                         continue;
  182.                 }
  183. else if (!FieldSet(fields, fip->field_bit))
  184.                     continue;
  185.                 /*
  186.                 ** Handle other fields.
  187.                 */
  188. switch (fip->field_bit)
  189.                 {
  190. case FIELD_STRIPOFFSETS:
  191. /*
  192.  * We use one field bit for both strip and tile
  193.  * offsets, and so must be careful in selecting
  194.  * the appropriate field descriptor (so that tags
  195.  * are written in sorted order).
  196.  */
  197. tag = isTiled(tif) ?
  198.     TIFFTAG_TILEOFFSETS : TIFFTAG_STRIPOFFSETS;
  199. if (tag != fip->field_tag)
  200. continue;
  201. dir->tdir_tag = (uint16) tag;
  202. dir->tdir_type = (uint16) TIFF_LONG;
  203. dir->tdir_count = (uint32) td->td_nstrips;
  204. if (!TIFFWriteLongArray(tif, dir, td->td_stripoffset))
  205. goto bad;
  206. break;
  207. case FIELD_STRIPBYTECOUNTS:
  208. /*
  209.  * We use one field bit for both strip and tile
  210.  * byte counts, and so must be careful in selecting
  211.  * the appropriate field descriptor (so that tags
  212.  * are written in sorted order).
  213.  */
  214. tag = isTiled(tif) ?
  215.     TIFFTAG_TILEBYTECOUNTS : TIFFTAG_STRIPBYTECOUNTS;
  216. if (tag != fip->field_tag)
  217. continue;
  218. dir->tdir_tag = (uint16) tag;
  219. dir->tdir_type = (uint16) TIFF_LONG;
  220. dir->tdir_count = (uint32) td->td_nstrips;
  221. if (!TIFFWriteLongArray(tif, dir,
  222. td->td_stripbytecount))
  223. goto bad;
  224. break;
  225. case FIELD_ROWSPERSTRIP:
  226. TIFFSetupShortLong(tif, TIFFTAG_ROWSPERSTRIP,
  227.     dir, td->td_rowsperstrip);
  228. break;
  229. case FIELD_COLORMAP:
  230. if (!TIFFWriteShortTable(tif, TIFFTAG_COLORMAP, dir,
  231.     3, td->td_colormap))
  232. goto bad;
  233. break;
  234. case FIELD_IMAGEDIMENSIONS:
  235. TIFFSetupShortLong(tif, TIFFTAG_IMAGEWIDTH,
  236.     dir++, td->td_imagewidth);
  237. TIFFSetupShortLong(tif, TIFFTAG_IMAGELENGTH,
  238.     dir, td->td_imagelength);
  239. break;
  240. case FIELD_TILEDIMENSIONS:
  241. TIFFSetupShortLong(tif, TIFFTAG_TILEWIDTH,
  242.     dir++, td->td_tilewidth);
  243. TIFFSetupShortLong(tif, TIFFTAG_TILELENGTH,
  244.     dir, td->td_tilelength);
  245. break;
  246. case FIELD_COMPRESSION:
  247. TIFFSetupShort(tif, TIFFTAG_COMPRESSION,
  248.     dir, td->td_compression);
  249. break;
  250. case FIELD_PHOTOMETRIC:
  251. TIFFSetupShort(tif, TIFFTAG_PHOTOMETRIC,
  252.     dir, td->td_photometric);
  253. break;
  254. case FIELD_POSITION:
  255. WriteRationalPair(TIFF_RATIONAL,
  256.     TIFFTAG_XPOSITION, td->td_xposition,
  257.     TIFFTAG_YPOSITION, td->td_yposition);
  258. break;
  259. case FIELD_RESOLUTION:
  260. WriteRationalPair(TIFF_RATIONAL,
  261.     TIFFTAG_XRESOLUTION, td->td_xresolution,
  262.     TIFFTAG_YRESOLUTION, td->td_yresolution);
  263. break;
  264. case FIELD_BITSPERSAMPLE:
  265. case FIELD_MINSAMPLEVALUE:
  266. case FIELD_MAXSAMPLEVALUE:
  267. case FIELD_SAMPLEFORMAT:
  268. if (!TIFFWritePerSampleShorts(tif, fip->field_tag, dir))
  269. goto bad;
  270. break;
  271. case FIELD_SMINSAMPLEVALUE:
  272. case FIELD_SMAXSAMPLEVALUE:
  273. if (!TIFFWritePerSampleAnys(tif,
  274.     _TIFFSampleToTagType(tif), fip->field_tag, dir))
  275. goto bad;
  276. break;
  277. case FIELD_PAGENUMBER:
  278. case FIELD_HALFTONEHINTS:
  279. case FIELD_YCBCRSUBSAMPLING:
  280. if (!TIFFSetupShortPair(tif, fip->field_tag, dir))
  281. goto bad;
  282. break;
  283. case FIELD_INKNAMES:
  284. if (!TIFFWriteInkNames(tif, dir))
  285. goto bad;
  286. break;
  287. case FIELD_TRANSFERFUNCTION:
  288. if (!TIFFWriteTransferFunction(tif, dir))
  289. goto bad;
  290. break;
  291. case FIELD_SUBIFD:
  292. /*
  293.  * XXX: Always write this field using LONG type
  294.  * for backward compatibility.
  295.  */
  296. dir->tdir_tag = (uint16) fip->field_tag;
  297. dir->tdir_type = (uint16) TIFF_LONG;
  298. dir->tdir_count = (uint32) td->td_nsubifd;
  299. if (!TIFFWriteLongArray(tif, dir, td->td_subifd))
  300. goto bad;
  301. /*
  302.  * Total hack: if this directory includes a SubIFD
  303.  * tag then force the next <n> directories to be
  304.  * written as ``sub directories'' of this one.  This
  305.  * is used to write things like thumbnails and
  306.  * image masks that one wants to keep out of the
  307.  * normal directory linkage access mechanism.
  308.  */
  309. if (dir->tdir_count > 0) {
  310. tif->tif_flags |= TIFF_INSUBIFD;
  311. tif->tif_nsubifd = (uint16) dir->tdir_count;
  312. if (dir->tdir_count > 1)
  313. tif->tif_subifdoff = dir->tdir_offset;
  314. else
  315. tif->tif_subifdoff = (uint32)(
  316.       tif->tif_diroff
  317.     + sizeof (uint16)
  318.     + ((char*)&dir->tdir_offset-data));
  319. }
  320. break;
  321. default:
  322. /* XXX: Should be fixed and removed. */
  323. if (fip->field_tag == TIFFTAG_DOTRANGE) {
  324. if (!TIFFSetupShortPair(tif, fip->field_tag, dir))
  325. goto bad;
  326. }
  327. else if (!TIFFWriteNormalTag(tif, dir, fip))
  328. goto bad;
  329. break;
  330. }
  331. dir++;
  332.                 
  333.                 if( fip->field_bit != FIELD_CUSTOM )
  334.                     ResetFieldBit(fields, fip->field_bit);
  335. }
  336. /*
  337.  * Write directory.
  338.  */
  339. dircount = (uint16) nfields;
  340. diroff = (uint32) tif->tif_nextdiroff;
  341. if (tif->tif_flags & TIFF_SWAB) {
  342. /*
  343.  * The file's byte order is opposite to the
  344.  * native machine architecture.  We overwrite
  345.  * the directory information with impunity
  346.  * because it'll be released below after we
  347.  * write it to the file.  Note that all the
  348.  * other tag construction routines assume that
  349.  * we do this byte-swapping; i.e. they only
  350.  * byte-swap indirect data.
  351.  */
  352. for (dir = (TIFFDirEntry*) data; dircount; dir++, dircount--) {
  353. TIFFSwabArrayOfShort(&dir->tdir_tag, 2);
  354. TIFFSwabArrayOfLong(&dir->tdir_count, 2);
  355. }
  356. dircount = (uint16) nfields;
  357. TIFFSwabShort(&dircount);
  358. TIFFSwabLong(&diroff);
  359. }
  360. (void) TIFFSeekFile(tif, tif->tif_diroff, SEEK_SET);
  361. if (!WriteOK(tif, &dircount, sizeof (dircount))) {
  362. TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error writing directory count");
  363. goto bad;
  364. }
  365. if (!WriteOK(tif, data, dirsize)) {
  366. TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error writing directory contents");
  367. goto bad;
  368. }
  369. if (!WriteOK(tif, &diroff, sizeof (diroff))) {
  370. TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error writing directory link");
  371. goto bad;
  372. }
  373. if (done) {
  374. TIFFFreeDirectory(tif);
  375. tif->tif_flags &= ~TIFF_DIRTYDIRECT;
  376. (*tif->tif_cleanup)(tif);
  377. /*
  378. * Reset directory-related state for subsequent
  379. * directories.
  380. */
  381. TIFFCreateDirectory(tif);
  382. }
  383. _TIFFfree(data);
  384. return (1);
  385. bad:
  386. _TIFFfree(data);
  387. return (0);
  388. }
  389. #undef WriteRationalPair
  390. int
  391. TIFFWriteDirectory(TIFF* tif)
  392. {
  393. return _TIFFWriteDirectory(tif, TRUE);
  394. }
  395. /*
  396.  * Similar to TIFFWriteDirectory(), writes the directory out
  397.  * but leaves all data structures in memory so that it can be
  398.  * written again.  This will make a partially written TIFF file
  399.  * readable before it is successfully completed/closed.
  400.  */ 
  401. int
  402. TIFFCheckpointDirectory(TIFF* tif)
  403. {
  404. int rc;
  405. /* Setup the strips arrays, if they haven't already been. */
  406. if (tif->tif_dir.td_stripoffset == NULL)
  407.     (void) TIFFSetupStrips(tif);
  408. rc = _TIFFWriteDirectory(tif, FALSE);
  409. (void) TIFFSetWriteOffset(tif, TIFFSeekFile(tif, 0, SEEK_END));
  410. return rc;
  411. }
  412. /*
  413.  * Process tags that are not special cased.
  414.  */
  415. static int
  416. TIFFWriteNormalTag(TIFF* tif, TIFFDirEntry* dir, const TIFFFieldInfo* fip)
  417. {
  418. uint16 wc = (uint16) fip->field_writecount;
  419. uint32 wc2;
  420. dir->tdir_tag = (uint16) fip->field_tag;
  421. dir->tdir_type = (uint16) fip->field_type;
  422. dir->tdir_count = wc;
  423. switch (fip->field_type) {
  424. case TIFF_SHORT:
  425. case TIFF_SSHORT:
  426. if (fip->field_passcount) {
  427. uint16* wp;
  428. if (wc == (uint16) TIFF_VARIABLE2) {
  429. TIFFGetField(tif, fip->field_tag, &wc2, &wp);
  430. dir->tdir_count = wc2;
  431. } else { /* Assume TIFF_VARIABLE */
  432. TIFFGetField(tif, fip->field_tag, &wc, &wp);
  433. dir->tdir_count = wc;
  434. }
  435. if (!TIFFWriteShortArray(tif, dir, wp))
  436. return 0;
  437. } else {
  438. if (wc == 1) {
  439. uint16 sv;
  440. TIFFGetField(tif, fip->field_tag, &sv);
  441. dir->tdir_offset =
  442. TIFFInsertData(tif, dir->tdir_type, sv);
  443. } else {
  444. uint16* wp;
  445. TIFFGetField(tif, fip->field_tag, &wp);
  446. if (!TIFFWriteShortArray(tif, dir, wp))
  447. return 0;
  448. }
  449. }
  450. break;
  451. case TIFF_LONG:
  452. case TIFF_SLONG:
  453. case TIFF_IFD:
  454. if (fip->field_passcount) {
  455. uint32* lp;
  456. if (wc == (uint16) TIFF_VARIABLE2) {
  457. TIFFGetField(tif, fip->field_tag, &wc2, &lp);
  458. dir->tdir_count = wc2;
  459. } else { /* Assume TIFF_VARIABLE */
  460. TIFFGetField(tif, fip->field_tag, &wc, &lp);
  461. dir->tdir_count = wc;
  462. }
  463. if (!TIFFWriteLongArray(tif, dir, lp))
  464. return 0;
  465. } else {
  466. if (wc == 1) {
  467. /* XXX handle LONG->SHORT conversion */
  468. TIFFGetField(tif, fip->field_tag,
  469.      &dir->tdir_offset);
  470. } else {
  471. uint32* lp;
  472. TIFFGetField(tif, fip->field_tag, &lp);
  473. if (!TIFFWriteLongArray(tif, dir, lp))
  474. return 0;
  475. }
  476. }
  477. break;
  478. case TIFF_RATIONAL:
  479. case TIFF_SRATIONAL:
  480. if (fip->field_passcount) {
  481. float* fp;
  482. if (wc == (uint16) TIFF_VARIABLE2) {
  483. TIFFGetField(tif, fip->field_tag, &wc2, &fp);
  484. dir->tdir_count = wc2;
  485. } else { /* Assume TIFF_VARIABLE */
  486. TIFFGetField(tif, fip->field_tag, &wc, &fp);
  487. dir->tdir_count = wc;
  488. }
  489. if (!TIFFWriteRationalArray(tif, dir, fp))
  490. return 0;
  491. } else {
  492. if (wc == 1) {
  493. float fv;
  494. TIFFGetField(tif, fip->field_tag, &fv);
  495. if (!TIFFWriteRationalArray(tif, dir, &fv))
  496. return 0;
  497. } else {
  498. float* fp;
  499. TIFFGetField(tif, fip->field_tag, &fp);
  500. if (!TIFFWriteRationalArray(tif, dir, fp))
  501. return 0;
  502. }
  503. }
  504. break;
  505. case TIFF_FLOAT:
  506. if (fip->field_passcount) {
  507. float* fp;
  508. if (wc == (uint16) TIFF_VARIABLE2) {
  509. TIFFGetField(tif, fip->field_tag, &wc2, &fp);
  510. dir->tdir_count = wc2;
  511. } else { /* Assume TIFF_VARIABLE */
  512. TIFFGetField(tif, fip->field_tag, &wc, &fp);
  513. dir->tdir_count = wc;
  514. }
  515. if (!TIFFWriteFloatArray(tif, dir, fp))
  516. return 0;
  517. } else {
  518. if (wc == 1) {
  519. float fv;
  520. TIFFGetField(tif, fip->field_tag, &fv);
  521. if (!TIFFWriteFloatArray(tif, dir, &fv))
  522. return 0;
  523. } else {
  524. float* fp;
  525. TIFFGetField(tif, fip->field_tag, &fp);
  526. if (!TIFFWriteFloatArray(tif, dir, fp))
  527. return 0;
  528. }
  529. }
  530. break;
  531. case TIFF_DOUBLE:
  532. if (fip->field_passcount) {
  533. double* dp;
  534. if (wc == (uint16) TIFF_VARIABLE2) {
  535. TIFFGetField(tif, fip->field_tag, &wc2, &dp);
  536. dir->tdir_count = wc2;
  537. } else { /* Assume TIFF_VARIABLE */
  538. TIFFGetField(tif, fip->field_tag, &wc, &dp);
  539. dir->tdir_count = wc;
  540. }
  541. if (!TIFFWriteDoubleArray(tif, dir, dp))
  542. return 0;
  543. } else {
  544. if (wc == 1) {
  545. double dv;
  546. TIFFGetField(tif, fip->field_tag, &dv);
  547. if (!TIFFWriteDoubleArray(tif, dir, &dv))
  548. return 0;
  549. } else {
  550. double* dp;
  551. TIFFGetField(tif, fip->field_tag, &dp);
  552. if (!TIFFWriteDoubleArray(tif, dir, dp))
  553. return 0;
  554. }
  555. }
  556. break;
  557. case TIFF_ASCII:
  558.                     char* cp;
  559.                     if (fip->field_passcount)
  560.                         TIFFGetField(tif, fip->field_tag, &wc, &cp);
  561.                     else
  562.                         TIFFGetField(tif, fip->field_tag, &cp);
  563.                     dir->tdir_count = (uint32) (strlen(cp) + 1);
  564.                     if (!TIFFWriteByteArray(tif, dir, cp))
  565.                         return (0);
  566. }
  567. break;
  568.         case TIFF_BYTE:
  569.         case TIFF_SBYTE:          
  570. if (fip->field_passcount) {
  571. char* cp;
  572. if (wc == (uint16) TIFF_VARIABLE2) {
  573. TIFFGetField(tif, fip->field_tag, &wc2, &cp);
  574. dir->tdir_count = wc2;
  575. } else { /* Assume TIFF_VARIABLE */
  576. TIFFGetField(tif, fip->field_tag, &wc, &cp);
  577. dir->tdir_count = wc;
  578. }
  579. if (!TIFFWriteByteArray(tif, dir, cp))
  580. return 0;
  581. } else {
  582. if (wc == 1) {
  583. char cv;
  584. TIFFGetField(tif, fip->field_tag, &cv);
  585. if (!TIFFWriteByteArray(tif, dir, &cv))
  586. return 0;
  587. } else {
  588. char* cp;
  589. TIFFGetField(tif, fip->field_tag, &cp);
  590. if (!TIFFWriteByteArray(tif, dir, cp))
  591. return 0;
  592. }
  593. }
  594.                 break;
  595. case TIFF_UNDEFINED:
  596. { char* cp;
  597.   if (wc == (unsigned short) TIFF_VARIABLE) {
  598. TIFFGetField(tif, fip->field_tag, &wc, &cp);
  599. dir->tdir_count = wc;
  600.   } else if (wc == (unsigned short) TIFF_VARIABLE2) {
  601. TIFFGetField(tif, fip->field_tag, &wc2, &cp);
  602. dir->tdir_count = wc2;
  603.   } else 
  604. TIFFGetField(tif, fip->field_tag, &cp);
  605.   if (!TIFFWriteByteArray(tif, dir, cp))
  606. return (0);
  607. }
  608. break;
  609.         case TIFF_NOTYPE:
  610.                 break;
  611. }
  612. return (1);
  613. }
  614. /*
  615.  * Setup a directory entry with either a SHORT
  616.  * or LONG type according to the value.
  617.  */
  618. static void
  619. TIFFSetupShortLong(TIFF* tif, ttag_t tag, TIFFDirEntry* dir, uint32 v)
  620. {
  621. dir->tdir_tag = (uint16) tag;
  622. dir->tdir_count = 1;
  623. if (v > 0xffffL) {
  624. dir->tdir_type = (short) TIFF_LONG;
  625. dir->tdir_offset = v;
  626. } else {
  627. dir->tdir_type = (short) TIFF_SHORT;
  628. dir->tdir_offset = TIFFInsertData(tif, (int) TIFF_SHORT, v);
  629. }
  630. }
  631. /*
  632.  * Setup a SHORT directory entry
  633.  */
  634. static void
  635. TIFFSetupShort(TIFF* tif, ttag_t tag, TIFFDirEntry* dir, uint16 v)
  636. {
  637. dir->tdir_tag = (uint16) tag;
  638. dir->tdir_count = 1;
  639. dir->tdir_type = (short) TIFF_SHORT;
  640. dir->tdir_offset = TIFFInsertData(tif, (int) TIFF_SHORT, v);
  641. }
  642. #undef MakeShortDirent
  643. #define NITEMS(x) (sizeof (x) / sizeof (x[0]))
  644. /*
  645.  * Setup a directory entry that references a
  646.  * samples/pixel array of SHORT values and
  647.  * (potentially) write the associated indirect
  648.  * values.
  649.  */
  650. static int
  651. TIFFWritePerSampleShorts(TIFF* tif, ttag_t tag, TIFFDirEntry* dir)
  652. {
  653. uint16 buf[10], v;
  654. uint16* w = buf;
  655. uint16 i, samples = tif->tif_dir.td_samplesperpixel;
  656. int status;
  657. if (samples > NITEMS(buf)) {
  658. w = (uint16*) _TIFFmalloc(samples * sizeof (uint16));
  659. if (w == NULL) {
  660. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  661.     "No space to write per-sample shorts");
  662. return (0);
  663. }
  664. }
  665. TIFFGetField(tif, tag, &v);
  666. for (i = 0; i < samples; i++)
  667. w[i] = v;
  668. dir->tdir_tag = (uint16) tag;
  669. dir->tdir_type = (uint16) TIFF_SHORT;
  670. dir->tdir_count = samples;
  671. status = TIFFWriteShortArray(tif, dir, w);
  672. if (w != buf)
  673. _TIFFfree((char*) w);
  674. return (status);
  675. }
  676. /*
  677.  * Setup a directory entry that references a samples/pixel array of ``type''
  678.  * values and (potentially) write the associated indirect values.  The source
  679.  * data from TIFFGetField() for the specified tag must be returned as double.
  680.  */
  681. static int
  682. TIFFWritePerSampleAnys(TIFF* tif,
  683.     TIFFDataType type, ttag_t tag, TIFFDirEntry* dir)
  684. {
  685. double buf[10], v;
  686. double* w = buf;
  687. uint16 i, samples = tif->tif_dir.td_samplesperpixel;
  688. int status;
  689. if (samples > NITEMS(buf)) {
  690. w = (double*) _TIFFmalloc(samples * sizeof (double));
  691. if (w == NULL) {
  692. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  693.     "No space to write per-sample values");
  694. return (0);
  695. }
  696. }
  697. TIFFGetField(tif, tag, &v);
  698. for (i = 0; i < samples; i++)
  699. w[i] = v;
  700. status = TIFFWriteAnyArray(tif, type, tag, dir, samples, w);
  701. if (w != buf)
  702. _TIFFfree(w);
  703. return (status);
  704. }
  705. #undef NITEMS
  706. /*
  707.  * Setup a pair of shorts that are returned by
  708.  * value, rather than as a reference to an array.
  709.  */
  710. static int
  711. TIFFSetupShortPair(TIFF* tif, ttag_t tag, TIFFDirEntry* dir)
  712. {
  713. uint16 v[2];
  714. TIFFGetField(tif, tag, &v[0], &v[1]);
  715. dir->tdir_tag = (uint16) tag;
  716. dir->tdir_type = (uint16) TIFF_SHORT;
  717. dir->tdir_count = 2;
  718. return (TIFFWriteShortArray(tif, dir, v));
  719. }
  720. /*
  721.  * Setup a directory entry for an NxM table of shorts,
  722.  * where M is known to be 2**bitspersample, and write
  723.  * the associated indirect data.
  724.  */
  725. static int
  726. TIFFWriteShortTable(TIFF* tif,
  727.     ttag_t tag, TIFFDirEntry* dir, uint32 n, uint16** table)
  728. {
  729. uint32 i, off;
  730. dir->tdir_tag = (uint16) tag;
  731. dir->tdir_type = (short) TIFF_SHORT;
  732. /* XXX -- yech, fool TIFFWriteData */
  733. dir->tdir_count = (uint32) (1L<<tif->tif_dir.td_bitspersample);
  734. off = tif->tif_dataoff;
  735. for (i = 0; i < n; i++)
  736. if (!TIFFWriteData(tif, dir, (char *)table[i]))
  737. return (0);
  738. dir->tdir_count *= n;
  739. dir->tdir_offset = off;
  740. return (1);
  741. }
  742. /*
  743.  * Write/copy data associated with an ASCII or opaque tag value.
  744.  */
  745. static int
  746. TIFFWriteByteArray(TIFF* tif, TIFFDirEntry* dir, char* cp)
  747. {
  748. if (dir->tdir_count > 4) {
  749. if (!TIFFWriteData(tif, dir, cp))
  750. return (0);
  751. } else
  752. _TIFFmemcpy(&dir->tdir_offset, cp, dir->tdir_count);
  753. return (1);
  754. }
  755. /*
  756.  * Setup a directory entry of an array of SHORT
  757.  * or SSHORT and write the associated indirect values.
  758.  */
  759. static int
  760. TIFFWriteShortArray(TIFF* tif, TIFFDirEntry* dir, uint16* v)
  761. {
  762. if (dir->tdir_count <= 2) {
  763. if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) {
  764. dir->tdir_offset = (uint32) ((long) v[0] << 16);
  765. if (dir->tdir_count == 2)
  766. dir->tdir_offset |= v[1] & 0xffff;
  767. } else {
  768. dir->tdir_offset = v[0] & 0xffff;
  769. if (dir->tdir_count == 2)
  770. dir->tdir_offset |= (long) v[1] << 16;
  771. }
  772. return (1);
  773. } else
  774. return (TIFFWriteData(tif, dir, (char*) v));
  775. }
  776. /*
  777.  * Setup a directory entry of an array of LONG
  778.  * or SLONG and write the associated indirect values.
  779.  */
  780. static int
  781. TIFFWriteLongArray(TIFF* tif, TIFFDirEntry* dir, uint32* v)
  782. {
  783. if (dir->tdir_count == 1) {
  784. dir->tdir_offset = v[0];
  785. return (1);
  786. } else
  787. return (TIFFWriteData(tif, dir, (char*) v));
  788. }
  789. /*
  790.  * Setup a directory entry of an array of RATIONAL
  791.  * or SRATIONAL and write the associated indirect values.
  792.  */
  793. static int
  794. TIFFWriteRationalArray(TIFF* tif, TIFFDirEntry* dir, float* v)
  795. {
  796. uint32 i;
  797. uint32* t;
  798. int status;
  799. t = (uint32*) _TIFFmalloc(2 * dir->tdir_count * sizeof (uint32));
  800. if (t == NULL) {
  801. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  802.     "No space to write RATIONAL array");
  803. return (0);
  804. }
  805. for (i = 0; i < dir->tdir_count; i++) {
  806. float fv = v[i];
  807. int sign = 1;
  808. uint32 den;
  809. if (fv < 0) {
  810. if (dir->tdir_type == TIFF_RATIONAL) {
  811. TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
  812. ""%s": Information lost writing value (%g) as (unsigned) RATIONAL",
  813. _TIFFFieldWithTag(tif,dir->tdir_tag)->field_name,
  814. fv);
  815. fv = 0;
  816. } else
  817. fv = -fv, sign = -1;
  818. }
  819. den = 1L;
  820. if (fv > 0) {
  821. while (fv < 1L<<(31-3) && den < 1L<<(31-3))
  822. fv *= 1<<3, den *= 1L<<3;
  823. }
  824. t[2*i+0] = (uint32) (sign * (fv + 0.5));
  825. t[2*i+1] = den;
  826. }
  827. status = TIFFWriteData(tif, dir, (char *)t);
  828. _TIFFfree((char*) t);
  829. return (status);
  830. }
  831. static int
  832. TIFFWriteFloatArray(TIFF* tif, TIFFDirEntry* dir, float* v)
  833. {
  834. TIFFCvtNativeToIEEEFloat(tif, dir->tdir_count, v);
  835. if (dir->tdir_count == 1) {
  836. dir->tdir_offset = *(uint32*) &v[0];
  837. return (1);
  838. } else
  839. return (TIFFWriteData(tif, dir, (char*) v));
  840. }
  841. static int
  842. TIFFWriteDoubleArray(TIFF* tif, TIFFDirEntry* dir, double* v)
  843. {
  844. TIFFCvtNativeToIEEEDouble(tif, dir->tdir_count, v);
  845. return (TIFFWriteData(tif, dir, (char*) v));
  846. }
  847. /*
  848.  * Write an array of ``type'' values for a specified tag (i.e. this is a tag
  849.  * which is allowed to have different types, e.g. SMaxSampleType).
  850.  * Internally the data values are represented as double since a double can
  851.  * hold any of the TIFF tag types (yes, this should really be an abstract
  852.  * type tany_t for portability).  The data is converted into the specified
  853.  * type in a temporary buffer and then handed off to the appropriate array
  854.  * writer.
  855.  */
  856. static int
  857. TIFFWriteAnyArray(TIFF* tif,
  858.     TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, double* v)
  859. {
  860. char buf[10 * sizeof(double)];
  861. char* w = buf;
  862. int i, status = 0;
  863. if (n * TIFFDataWidth(type) > sizeof buf) {
  864. w = (char*) _TIFFmalloc(n * TIFFDataWidth(type));
  865. if (w == NULL) {
  866. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  867.     "No space to write array");
  868. return (0);
  869. }
  870. }
  871. dir->tdir_tag = (uint16) tag;
  872. dir->tdir_type = (uint16) type;
  873. dir->tdir_count = n;
  874. switch (type) {
  875. case TIFF_BYTE:
  876. uint8* bp = (uint8*) w;
  877. for (i = 0; i < (int) n; i++)
  878. bp[i] = (uint8) v[i];
  879. if (!TIFFWriteByteArray(tif, dir, (char*) bp))
  880. goto out;
  881. }
  882. break;
  883. case TIFF_SBYTE:
  884. int8* bp = (int8*) w;
  885. for (i = 0; i < (int) n; i++)
  886. bp[i] = (int8) v[i];
  887. if (!TIFFWriteByteArray(tif, dir, (char*) bp))
  888. goto out;
  889. }
  890. break;
  891. case TIFF_SHORT:
  892. {
  893. uint16* bp = (uint16*) w;
  894. for (i = 0; i < (int) n; i++)
  895. bp[i] = (uint16) v[i];
  896. if (!TIFFWriteShortArray(tif, dir, (uint16*)bp))
  897. goto out;
  898. }
  899. break;
  900. case TIFF_SSHORT:
  901. int16* bp = (int16*) w;
  902. for (i = 0; i < (int) n; i++)
  903. bp[i] = (int16) v[i];
  904. if (!TIFFWriteShortArray(tif, dir, (uint16*)bp))
  905. goto out;
  906. }
  907. break;
  908. case TIFF_LONG:
  909. {
  910. uint32* bp = (uint32*) w;
  911. for (i = 0; i < (int) n; i++)
  912. bp[i] = (uint32) v[i];
  913. if (!TIFFWriteLongArray(tif, dir, bp))
  914. goto out;
  915. }
  916. break;
  917. case TIFF_SLONG:
  918. {
  919. int32* bp = (int32*) w;
  920. for (i = 0; i < (int) n; i++)
  921. bp[i] = (int32) v[i];
  922. if (!TIFFWriteLongArray(tif, dir, (uint32*) bp))
  923. goto out;
  924. }
  925. break;
  926. case TIFF_FLOAT:
  927. float* bp = (float*) w;
  928. for (i = 0; i < (int) n; i++)
  929. bp[i] = (float) v[i];
  930. if (!TIFFWriteFloatArray(tif, dir, bp))
  931. goto out;
  932. }
  933. break;
  934. case TIFF_DOUBLE:
  935. return (TIFFWriteDoubleArray(tif, dir, v));
  936. default:
  937. /* TIFF_NOTYPE */
  938. /* TIFF_ASCII */
  939. /* TIFF_UNDEFINED */
  940. /* TIFF_RATIONAL */
  941. /* TIFF_SRATIONAL */
  942. goto out;
  943. }
  944. status = 1;
  945.  out:
  946. if (w != buf)
  947. _TIFFfree(w);
  948. return (status);
  949. }
  950. static int
  951. TIFFWriteTransferFunction(TIFF* tif, TIFFDirEntry* dir)
  952. {
  953. TIFFDirectory* td = &tif->tif_dir;
  954. tsize_t n = (1L<<td->td_bitspersample) * sizeof (uint16);
  955. uint16** tf = td->td_transferfunction;
  956. int ncols;
  957. /*
  958.  * Check if the table can be written as a single column,
  959.  * or if it must be written as 3 columns.  Note that we
  960.  * write a 3-column tag if there are 2 samples/pixel and
  961.  * a single column of data won't suffice--hmm.
  962.  */
  963. switch (td->td_samplesperpixel - td->td_extrasamples) {
  964. default: if (_TIFFmemcmp(tf[0], tf[2], n)) { ncols = 3; break; }
  965. case 2: if (_TIFFmemcmp(tf[0], tf[1], n)) { ncols = 3; break; }
  966. case 1: case 0: ncols = 1;
  967. }
  968. return (TIFFWriteShortTable(tif,
  969.     TIFFTAG_TRANSFERFUNCTION, dir, ncols, tf));
  970. }
  971. static int
  972. TIFFWriteInkNames(TIFF* tif, TIFFDirEntry* dir)
  973. {
  974. TIFFDirectory* td = &tif->tif_dir;
  975. dir->tdir_tag = TIFFTAG_INKNAMES;
  976. dir->tdir_type = (short) TIFF_ASCII;
  977. dir->tdir_count = td->td_inknameslen;
  978. return (TIFFWriteByteArray(tif, dir, td->td_inknames));
  979. }
  980. /*
  981.  * Write a contiguous directory item.
  982.  */
  983. static int
  984. TIFFWriteData(TIFF* tif, TIFFDirEntry* dir, char* cp)
  985. {
  986. tsize_t cc;
  987. if (tif->tif_flags & TIFF_SWAB) {
  988. switch (dir->tdir_type) {
  989. case TIFF_SHORT:
  990. case TIFF_SSHORT:
  991. TIFFSwabArrayOfShort((uint16*) cp, dir->tdir_count);
  992. break;
  993. case TIFF_LONG:
  994. case TIFF_SLONG:
  995. case TIFF_FLOAT:
  996. TIFFSwabArrayOfLong((uint32*) cp, dir->tdir_count);
  997. break;
  998. case TIFF_RATIONAL:
  999. case TIFF_SRATIONAL:
  1000. TIFFSwabArrayOfLong((uint32*) cp, 2*dir->tdir_count);
  1001. break;
  1002. case TIFF_DOUBLE:
  1003. TIFFSwabArrayOfDouble((double*) cp, dir->tdir_count);
  1004. break;
  1005. }
  1006. }
  1007. dir->tdir_offset = tif->tif_dataoff;
  1008. cc = dir->tdir_count * TIFFDataWidth((TIFFDataType) dir->tdir_type);
  1009. if (SeekOK(tif, dir->tdir_offset) &&
  1010.     WriteOK(tif, cp, cc)) {
  1011. tif->tif_dataoff += (cc + 1) & ~1;
  1012. return (1);
  1013. }
  1014. TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error writing data for field "%s"",
  1015.     _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
  1016. return (0);
  1017. }
  1018. /*
  1019.  * Similar to TIFFWriteDirectory(), but if the directory has already
  1020.  * been written once, it is relocated to the end of the file, in case it
  1021.  * has changed in size.  Note that this will result in the loss of the 
  1022.  * previously used directory space. 
  1023.  */ 
  1024. int 
  1025. TIFFRewriteDirectory( TIFF *tif )
  1026. {
  1027.     static const char module[] = "TIFFRewriteDirectory";
  1028.     /* We don't need to do anything special if it hasn't been written. */
  1029.     if( tif->tif_diroff == 0 )
  1030.         return TIFFWriteDirectory( tif );
  1031.     /*
  1032.     ** Find and zero the pointer to this directory, so that TIFFLinkDirectory
  1033.     ** will cause it to be added after this directories current pre-link.
  1034.     */
  1035.     
  1036.     /* Is it the first directory in the file? */
  1037.     if (tif->tif_header.tiff_diroff == tif->tif_diroff) 
  1038.     {
  1039.         tif->tif_header.tiff_diroff = 0;
  1040.         tif->tif_diroff = 0;
  1041.         TIFFSeekFile(tif, (toff_t)(TIFF_MAGIC_SIZE+TIFF_VERSION_SIZE),
  1042.      SEEK_SET);
  1043.         if (!WriteOK(tif, &(tif->tif_header.tiff_diroff), 
  1044.                      sizeof (tif->tif_diroff))) 
  1045.         {
  1046. TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error updating TIFF header");
  1047.             return (0);
  1048.         }
  1049.     }
  1050.     else
  1051.     {
  1052.         toff_t  nextdir, off;
  1053. nextdir = tif->tif_header.tiff_diroff;
  1054. do {
  1055. uint16 dircount;
  1056. if (!SeekOK(tif, nextdir) ||
  1057.     !ReadOK(tif, &dircount, sizeof (dircount))) {
  1058. TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory count");
  1059. return (0);
  1060. }
  1061. if (tif->tif_flags & TIFF_SWAB)
  1062. TIFFSwabShort(&dircount);
  1063. (void) TIFFSeekFile(tif,
  1064.     dircount * sizeof (TIFFDirEntry), SEEK_CUR);
  1065. if (!ReadOK(tif, &nextdir, sizeof (nextdir))) {
  1066. TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory link");
  1067. return (0);
  1068. }
  1069. if (tif->tif_flags & TIFF_SWAB)
  1070. TIFFSwabLong(&nextdir);
  1071. } while (nextdir != tif->tif_diroff && nextdir != 0);
  1072.         off = TIFFSeekFile(tif, 0, SEEK_CUR); /* get current offset */
  1073.         (void) TIFFSeekFile(tif, off - (toff_t)sizeof(nextdir), SEEK_SET);
  1074.         tif->tif_diroff = 0;
  1075. if (!WriteOK(tif, &(tif->tif_diroff), sizeof (nextdir))) {
  1076. TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link");
  1077. return (0);
  1078. }
  1079.     }
  1080.     /*
  1081.     ** Now use TIFFWriteDirectory() normally.
  1082.     */
  1083.     return TIFFWriteDirectory( tif );
  1084. }
  1085. /*
  1086.  * Link the current directory into the
  1087.  * directory chain for the file.
  1088.  */
  1089. static int
  1090. TIFFLinkDirectory(TIFF* tif)
  1091. {
  1092. static const char module[] = "TIFFLinkDirectory";
  1093. toff_t nextdir;
  1094. toff_t diroff, off;
  1095. tif->tif_diroff = (TIFFSeekFile(tif, (toff_t) 0, SEEK_END)+1) &~ 1;
  1096. diroff = tif->tif_diroff;
  1097. if (tif->tif_flags & TIFF_SWAB)
  1098. TIFFSwabLong(&diroff);
  1099. /*
  1100.  * Handle SubIFDs
  1101.  */
  1102.         if (tif->tif_flags & TIFF_INSUBIFD) {
  1103. (void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
  1104. if (!WriteOK(tif, &diroff, sizeof (diroff))) {
  1105. TIFFErrorExt(tif->tif_clientdata, module,
  1106.     "%s: Error writing SubIFD directory link",
  1107.     tif->tif_name);
  1108. return (0);
  1109. }
  1110. /*
  1111.  * Advance to the next SubIFD or, if this is
  1112.  * the last one configured, revert back to the
  1113.  * normal directory linkage.
  1114.  */
  1115. if (--tif->tif_nsubifd)
  1116. tif->tif_subifdoff += sizeof (diroff);
  1117. else
  1118. tif->tif_flags &= ~TIFF_INSUBIFD;
  1119. return (1);
  1120. }
  1121. if (tif->tif_header.tiff_diroff == 0) {
  1122. /*
  1123.  * First directory, overwrite offset in header.
  1124.  */
  1125. tif->tif_header.tiff_diroff = tif->tif_diroff;
  1126. (void) TIFFSeekFile(tif,
  1127.     (toff_t)(TIFF_MAGIC_SIZE+TIFF_VERSION_SIZE),
  1128.                                     SEEK_SET);
  1129. if (!WriteOK(tif, &diroff, sizeof (diroff))) {
  1130. TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Error writing TIFF header");
  1131. return (0);
  1132. }
  1133. return (1);
  1134. }
  1135. /*
  1136.  * Not the first directory, search to the last and append.
  1137.  */
  1138. nextdir = tif->tif_header.tiff_diroff;
  1139. do {
  1140. uint16 dircount;
  1141. if (!SeekOK(tif, nextdir) ||
  1142.     !ReadOK(tif, &dircount, sizeof (dircount))) {
  1143. TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory count");
  1144. return (0);
  1145. }
  1146. if (tif->tif_flags & TIFF_SWAB)
  1147. TIFFSwabShort(&dircount);
  1148. (void) TIFFSeekFile(tif,
  1149.     dircount * sizeof (TIFFDirEntry), SEEK_CUR);
  1150. if (!ReadOK(tif, &nextdir, sizeof (nextdir))) {
  1151. TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory link");
  1152. return (0);
  1153. }
  1154. if (tif->tif_flags & TIFF_SWAB)
  1155. TIFFSwabLong(&nextdir);
  1156. } while (nextdir != 0);
  1157.         off = TIFFSeekFile(tif, 0, SEEK_CUR); /* get current offset */
  1158.         (void) TIFFSeekFile(tif, off - (toff_t)sizeof(nextdir), SEEK_SET);
  1159. if (!WriteOK(tif, &diroff, sizeof (diroff))) {
  1160. TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link");
  1161. return (0);
  1162. }
  1163. return (1);
  1164. }
  1165. /* vim: set ts=8 sts=8 sw=8 noet: */