1 /*
2 * Copyright (c) 1988-1997 Sam Leffler
3 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
4 *
5 * Permission to use, copy, modify, distribute, and sell this software and
6 * its documentation for any purpose is hereby granted without fee, provided
7 * that (i) the above copyright notices and this permission notice appear in
8 * all copies of the software and related documentation, and (ii) the names of
9 * Sam Leffler and Silicon Graphics may not be used in any advertising or
10 * publicity relating to the software without the specific, prior written
11 * permission of Sam Leffler and Silicon Graphics.
12 *
13 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
14 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16 *
17 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
18 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22 * OF THIS SOFTWARE.
23 */
24
25 /*
26 * TIFF Library.
27 */
28 #include "tiffiop.h"
29
30 int
TIFFFlush(TIFF * tif)31 TIFFFlush(TIFF* tif)
32 {
33 if( tif->tif_mode == O_RDONLY )
34 return 1;
35
36 if (!TIFFFlushData(tif))
37 return (0);
38
39 /* In update (r+) mode we try to detect the case where
40 only the strip/tile map has been altered, and we try to
41 rewrite only that portion of the directory without
42 making any other changes */
43
44 if( (tif->tif_flags & TIFF_DIRTYSTRIP)
45 && !(tif->tif_flags & TIFF_DIRTYDIRECT)
46 && tif->tif_mode == O_RDWR )
47 {
48 uint64 *offsets=NULL, *sizes=NULL;
49
50 if( TIFFIsTiled(tif) )
51 {
52 if( TIFFGetField( tif, TIFFTAG_TILEOFFSETS, &offsets )
53 && TIFFGetField( tif, TIFFTAG_TILEBYTECOUNTS, &sizes )
54 && _TIFFRewriteField( tif, TIFFTAG_TILEOFFSETS, TIFF_LONG8,
55 tif->tif_dir.td_nstrips, offsets )
56 && _TIFFRewriteField( tif, TIFFTAG_TILEBYTECOUNTS, TIFF_LONG8,
57 tif->tif_dir.td_nstrips, sizes ) )
58 {
59 tif->tif_flags &= ~TIFF_DIRTYSTRIP;
60 tif->tif_flags &= ~TIFF_BEENWRITING;
61 return 1;
62 }
63 }
64 else
65 {
66 if( TIFFGetField( tif, TIFFTAG_STRIPOFFSETS, &offsets )
67 && TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &sizes )
68 && _TIFFRewriteField( tif, TIFFTAG_STRIPOFFSETS, TIFF_LONG8,
69 tif->tif_dir.td_nstrips, offsets )
70 && _TIFFRewriteField( tif, TIFFTAG_STRIPBYTECOUNTS, TIFF_LONG8,
71 tif->tif_dir.td_nstrips, sizes ) )
72 {
73 tif->tif_flags &= ~TIFF_DIRTYSTRIP;
74 tif->tif_flags &= ~TIFF_BEENWRITING;
75 return 1;
76 }
77 }
78 }
79
80 if ((tif->tif_flags & (TIFF_DIRTYDIRECT|TIFF_DIRTYSTRIP))
81 && !TIFFRewriteDirectory(tif))
82 return (0);
83
84 return (1);
85 }
86
87 /*
88 * Flush buffered data to the file.
89 *
90 * Frank Warmerdam'2000: I modified this to return 1 if TIFF_BEENWRITING
91 * is not set, so that TIFFFlush() will proceed to write out the directory.
92 * The documentation says returning 1 is an error indicator, but not having
93 * been writing isn't exactly a an error. Hopefully this doesn't cause
94 * problems for other people.
95 */
96 int
TIFFFlushData(TIFF * tif)97 TIFFFlushData(TIFF* tif)
98 {
99 if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
100 return (1);
101 if (tif->tif_flags & TIFF_POSTENCODE) {
102 tif->tif_flags &= ~TIFF_POSTENCODE;
103 if (!(*tif->tif_postencode)(tif))
104 return (0);
105 }
106 return (TIFFFlushData1(tif));
107 }
108
109 /* vim: set ts=8 sts=8 sw=8 noet: */
110 /*
111 * Local Variables:
112 * mode: c
113 * c-basic-offset: 8
114 * fill-column: 78
115 * End:
116 */
117