LCOV - code coverage report
Current view: directory - frmts/gtiff/libtiff - tif_flush.c (source / functions) Found Hit Coverage
Test: gdal_filtered.info Lines: 40 37 92.5 %
Date: 2010-01-09 Functions: 2 2 100.0 %

       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: */

Generated by: LCOV version 1.7