]> git.saurik.com Git - wxWidgets.git/blobdiff - src/tiff/libtiff/tif_flush.c
Merged libtiff 4.0.3 changes into the trunk.
[wxWidgets.git] / src / tiff / libtiff / tif_flush.c
index 5ff56e9a813483e04931ede1332b4f3f8df91f46..2ec7c76a597b6a1152b556690035b6700e429e0e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_flush.c,v 1.3 2000/09/15 20:52:42 warmerda Exp $ */
+/* $Id$ */
 
 /*
  * Copyright (c) 1988-1997 Sam Leffler
 
 /*
  * Copyright (c) 1988-1997 Sam Leffler
 int
 TIFFFlush(TIFF* tif)
 {
 int
 TIFFFlush(TIFF* tif)
 {
+    if( tif->tif_mode == O_RDONLY )
+        return 1;
 
 
-       if (tif->tif_mode != O_RDONLY) {
-               if (!TIFFFlushData(tif))
-                       return (0);
-               if ((tif->tif_flags & TIFF_DIRTYDIRECT) &&
-                   !TIFFWriteDirectory(tif))
-                       return (0);
-       }
-       return (1);
+    if (!TIFFFlushData(tif))
+        return (0);
+                
+    /* In update (r+) mode we try to detect the case where 
+       only the strip/tile map has been altered, and we try to 
+       rewrite only that portion of the directory without 
+       making any other changes */
+                
+    if( (tif->tif_flags & TIFF_DIRTYSTRIP)
+        && !(tif->tif_flags & TIFF_DIRTYDIRECT) 
+        && tif->tif_mode == O_RDWR )
+    {
+        uint64  *offsets=NULL, *sizes=NULL;
+
+        if( TIFFIsTiled(tif) )
+        {
+            if( TIFFGetField( tif, TIFFTAG_TILEOFFSETS, &offsets ) 
+                && TIFFGetField( tif, TIFFTAG_TILEBYTECOUNTS, &sizes ) 
+                && _TIFFRewriteField( tif, TIFFTAG_TILEOFFSETS, TIFF_LONG8, 
+                                      tif->tif_dir.td_nstrips, offsets )
+                && _TIFFRewriteField( tif, TIFFTAG_TILEBYTECOUNTS, TIFF_LONG8, 
+                                      tif->tif_dir.td_nstrips, sizes ) )
+            {
+                tif->tif_flags &= ~TIFF_DIRTYSTRIP;
+                tif->tif_flags &= ~TIFF_BEENWRITING;
+                return 1;
+            }
+        }
+        else
+        {
+            if( TIFFGetField( tif, TIFFTAG_STRIPOFFSETS, &offsets ) 
+                && TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &sizes ) 
+                && _TIFFRewriteField( tif, TIFFTAG_STRIPOFFSETS, TIFF_LONG8, 
+                                      tif->tif_dir.td_nstrips, offsets )
+                && _TIFFRewriteField( tif, TIFFTAG_STRIPBYTECOUNTS, TIFF_LONG8, 
+                                      tif->tif_dir.td_nstrips, sizes ) )
+            {
+                tif->tif_flags &= ~TIFF_DIRTYSTRIP;
+                tif->tif_flags &= ~TIFF_BEENWRITING;
+                return 1;
+            }
+        }
+    }
+
+    if ((tif->tif_flags & (TIFF_DIRTYDIRECT|TIFF_DIRTYSTRIP)) 
+        && !TIFFRewriteDirectory(tif))
+        return (0);
+
+    return (1);
 }
 
 /*
 }
 
 /*
@@ -56,7 +99,7 @@ int
 TIFFFlushData(TIFF* tif)
 {
        if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
 TIFFFlushData(TIFF* tif)
 {
        if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
-               return (0);
+               return (1);
        if (tif->tif_flags & TIFF_POSTENCODE) {
                tif->tif_flags &= ~TIFF_POSTENCODE;
                if (!(*tif->tif_postencode)(tif))
        if (tif->tif_flags & TIFF_POSTENCODE) {
                tif->tif_flags &= ~TIFF_POSTENCODE;
                if (!(*tif->tif_postencode)(tif))
@@ -65,3 +108,11 @@ TIFFFlushData(TIFF* tif)
        return (TIFFFlushData1(tif));
 }
 
        return (TIFFFlushData1(tif));
 }
 
+/* vim: set ts=8 sts=8 sw=8 noet: */
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 8
+ * fill-column: 78
+ * End:
+ */