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