Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / core / src / fxcodec / fx_tiff / tiff_v403 / tif_flush.c
1 /* $Id: tif_flush.c,v 1.9 2010-03-31 06:40:10 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 #if (!defined(_FPDFAPI_MINI_) || defined(_TIFF_DECODER_)) && !defined(_USE_ADDIN_) && !defined _FX_NO_ANSIC_ && !defined(_FX_EMB_NOUSE_DECODER_)
31 #include "tiffiop.h"
32
33 int
34 TIFFFlush(TIFF* tif)
35 {
36     if( tif->tif_mode == O_RDONLY )
37         return 1;
38
39     if (!TIFFFlushData(tif))
40         return (0);
41                 
42     /* In update (r+) mode we try to detect the case where 
43        only the strip/tile map has been altered, and we try to 
44        rewrite only that portion of the directory without 
45        making any other changes */
46                 
47     if( (tif->tif_flags & TIFF_DIRTYSTRIP)
48         && !(tif->tif_flags & TIFF_DIRTYDIRECT) 
49         && tif->tif_mode == O_RDWR )
50     {
51         uint64  *offsets=NULL, *sizes=NULL;
52
53         if( TIFFIsTiled(tif) )
54         {
55             if( TIFFGetField( tif, TIFFTAG_TILEOFFSETS, &offsets ) 
56                 && TIFFGetField( tif, TIFFTAG_TILEBYTECOUNTS, &sizes ) 
57                 && _TIFFRewriteField( tif, TIFFTAG_TILEOFFSETS, TIFF_LONG8, 
58                                       tif->tif_dir.td_nstrips, offsets )
59                 && _TIFFRewriteField( tif, TIFFTAG_TILEBYTECOUNTS, TIFF_LONG8, 
60                                       tif->tif_dir.td_nstrips, sizes ) )
61             {
62                 tif->tif_flags &= ~TIFF_DIRTYSTRIP;
63                 tif->tif_flags &= ~TIFF_BEENWRITING;
64                 return 1;
65             }
66         }
67         else
68         {
69             if( TIFFGetField( tif, TIFFTAG_STRIPOFFSETS, &offsets ) 
70                 && TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &sizes ) 
71                 && _TIFFRewriteField( tif, TIFFTAG_STRIPOFFSETS, TIFF_LONG8, 
72                                       tif->tif_dir.td_nstrips, offsets )
73                 && _TIFFRewriteField( tif, TIFFTAG_STRIPBYTECOUNTS, TIFF_LONG8, 
74                                       tif->tif_dir.td_nstrips, sizes ) )
75             {
76                 tif->tif_flags &= ~TIFF_DIRTYSTRIP;
77                 tif->tif_flags &= ~TIFF_BEENWRITING;
78                 return 1;
79             }
80         }
81     }
82
83     if ((tif->tif_flags & (TIFF_DIRTYDIRECT|TIFF_DIRTYSTRIP)) 
84         && !TIFFRewriteDirectory(tif))
85         return (0);
86
87     return (1);
88 }
89
90 /*
91  * Flush buffered data to the file.
92  *
93  * Frank Warmerdam'2000: I modified this to return 1 if TIFF_BEENWRITING
94  * is not set, so that TIFFFlush() will proceed to write out the directory.
95  * The documentation says returning 1 is an error indicator, but not having
96  * been writing isn't exactly a an error.  Hopefully this doesn't cause
97  * problems for other people. 
98  */
99 int
100 TIFFFlushData(TIFF* tif)
101 {
102         if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
103                 return (1);
104         if (tif->tif_flags & TIFF_POSTENCODE) {
105                 tif->tif_flags &= ~TIFF_POSTENCODE;
106                 if (!(*tif->tif_postencode)(tif))
107                         return (0);
108         }
109         return (TIFFFlushData1(tif));
110 }
111
112 /* vim: set ts=8 sts=8 sw=8 noet: */
113 /*
114  * Local Variables:
115  * mode: c
116  * c-basic-offset: 8
117  * fill-column: 78
118  * End:
119  */
120 #endif
121