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