LCOV - code coverage report
Current view: directory - frmts/gtiff/libtiff - tif_flush.c (source / functions) Found Hit Coverage
Test: gdal_filtered.info Lines: 40 36 90.0 %
Date: 2011-12-18 Functions: 2 2 100.0 %

       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                 : #include "tiffiop.h"
      31                 : 
      32                 : int
      33            5194 : TIFFFlush(TIFF* tif)
      34                 : {
      35            5194 :     if( tif->tif_mode == O_RDONLY )
      36               0 :         return 1;
      37                 : 
      38            5194 :     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            7888 :     if( (tif->tif_flags & TIFF_DIRTYSTRIP)
      47            1373 :         && !(tif->tif_flags & TIFF_DIRTYDIRECT) 
      48            1321 :         && tif->tif_mode == O_RDWR )
      49                 :     {
      50            1321 :         uint64  *offsets=NULL, *sizes=NULL;
      51                 : 
      52            1321 :         if( TIFFIsTiled(tif) )
      53                 :         {
      54            1028 :             if( TIFFGetField( tif, TIFFTAG_TILEOFFSETS, &offsets ) 
      55             257 :                 && TIFFGetField( tif, TIFFTAG_TILEBYTECOUNTS, &sizes ) 
      56             257 :                 && _TIFFRewriteField( tif, TIFFTAG_TILEOFFSETS, TIFF_LONG8, 
      57             257 :                                       tif->tif_dir.td_nstrips, offsets )
      58             514 :                 && _TIFFRewriteField( tif, TIFFTAG_TILEBYTECOUNTS, TIFF_LONG8, 
      59             257 :                                       tif->tif_dir.td_nstrips, sizes ) )
      60                 :             {
      61             257 :                 tif->tif_flags &= ~TIFF_DIRTYSTRIP;
      62             257 :                 tif->tif_flags &= ~TIFF_BEENWRITING;
      63             257 :                 return 1;
      64                 :             }
      65                 :         }
      66                 :         else
      67                 :         {
      68            4256 :             if( TIFFGetField( tif, TIFFTAG_STRIPOFFSETS, &offsets ) 
      69            1064 :                 && TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &sizes ) 
      70            1064 :                 && _TIFFRewriteField( tif, TIFFTAG_STRIPOFFSETS, TIFF_LONG8, 
      71            1064 :                                       tif->tif_dir.td_nstrips, offsets )
      72            2128 :                 && _TIFFRewriteField( tif, TIFFTAG_STRIPBYTECOUNTS, TIFF_LONG8, 
      73            1064 :                                       tif->tif_dir.td_nstrips, sizes ) )
      74                 :             {
      75            1064 :                 tif->tif_flags &= ~TIFF_DIRTYSTRIP;
      76            1064 :                 tif->tif_flags &= ~TIFF_BEENWRITING;
      77            1064 :                 return 1;
      78                 :             }
      79                 :         }
      80                 :     }
      81                 : 
      82            3926 :     if ((tif->tif_flags & (TIFF_DIRTYDIRECT|TIFF_DIRTYSTRIP)) 
      83              53 :         && !TIFFRewriteDirectory(tif))
      84               0 :         return (0);
      85                 : 
      86            3873 :     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            5202 : TIFFFlushData(TIFF* tif)
     100                 : {
     101            5202 :   if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
     102            3704 :     return (1);
     103            1498 :   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            1498 :   return (TIFFFlushData1(tif));
     109                 : }
     110                 : 
     111                 : /* vim: set ts=8 sts=8 sw=8 noet: */
     112                 : /*
     113                 :  * Local Variables:
     114                 :  * mode: c
     115                 :  * c-basic-offset: 8
     116                 :  * fill-column: 78
     117                 :  * End:
     118                 :  */

Generated by: LCOV version 1.7