[Liblas-commits] r1321 - branches/1.2/src

liblas-commits at liblas.org liblas-commits at liblas.org
Tue Jul 28 12:44:06 EDT 2009


Author: hobu
Date: Tue Jul 28 12:44:06 2009
New Revision: 1321
URL: http://liblas.org/changeset/1321

Log:
One more attempt to fix #140

Added:
   branches/1.2/src/tifvsi.cpp
Modified:
   branches/1.2/src/Makefile.am

Modified: branches/1.2/src/Makefile.am
==============================================================================
--- branches/1.2/src/Makefile.am	(original)
+++ branches/1.2/src/Makefile.am	Tue Jul 28 12:44:06 2009
@@ -35,7 +35,7 @@
     detail/file.cpp
 
 if GDAL_IS_CONFIG
-liblas_la_SOURCES += gt_wkt_srs.cpp gt_citation.cpp
+liblas_la_SOURCES += gt_wkt_srs.cpp gt_citation.cpp tifvsi.cpp
 endif
             
 liblas_la_LDFLAGS = -version-info 1:0:0

Added: branches/1.2/src/tifvsi.cpp
==============================================================================
--- (empty file)
+++ branches/1.2/src/tifvsi.cpp	Tue Jul 28 12:44:06 2009
@@ -0,0 +1,151 @@
+/******************************************************************************
+ * $Id: tifvsi.cpp 10645 2007-01-18 02:22:39Z warmerdam $
+ *
+ * Project:  GeoTIFF Driver
+ * Purpose:  Implement system hook functions for libtiff on top of CPL/VSI,
+ *           including > 2GB support.  Based on tif_unix.c from libtiff
+ *           distribution.
+ * Author:   Frank Warmerdam, warmerdam at pobox.com
+ *
+ ******************************************************************************
+ * Copyright (c) 2005, Frank Warmerdam, warmerdam at pobox.com
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ****************************************************************************/
+
+/*
+ * TIFF Library UNIX-specific Routines.
+ */
+#include "tiffio.h"
+#include "cpl_vsi.h"
+
+// We avoid including xtiffio.h since it drags in the libgeotiff version
+// of the VSI functions.
+
+CPL_C_START
+extern TIFF CPL_DLL * XTIFFClientOpen(const char* name, const char* mode, 
+                                      thandle_t thehandle,
+                                      TIFFReadWriteProc, TIFFReadWriteProc,
+                                      TIFFSeekProc, TIFFCloseProc,
+                                      TIFFSizeProc,
+                                      TIFFMapFileProc, TIFFUnmapFileProc);
+CPL_C_END
+
+static tsize_t
+_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size)
+{
+    return VSIFReadL( buf, 1, size, (FILE *) fd );
+}
+
+static tsize_t
+_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size)
+{
+    return VSIFWriteL( buf, 1, size, (FILE *) fd );
+}
+
+static toff_t
+_tiffSeekProc(thandle_t fd, toff_t off, int whence)
+{
+    if( VSIFSeekL( (FILE *) fd, off, whence ) == 0 )
+        return (toff_t) VSIFTellL( (FILE *) fd );
+    else
+        return (toff_t) -1;
+}
+
+static int
+_tiffCloseProc(thandle_t fd)
+{
+    return VSIFCloseL( (FILE *) fd );
+}
+
+static toff_t
+_tiffSizeProc(thandle_t fd)
+{
+    vsi_l_offset  old_off;
+    toff_t        file_size;
+
+    old_off = VSIFTellL( (FILE *) fd );
+    VSIFSeekL( (FILE *) fd, 0, SEEK_END );
+    
+    file_size = (toff_t) VSIFTellL( (FILE *) fd );
+    VSIFSeekL( (FILE *) fd, old_off, SEEK_SET );
+
+    return file_size;
+}
+
+static int
+_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
+{
+	(void) fd; (void) pbase; (void) psize;
+	return (0);
+}
+
+static void
+_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
+{
+	(void) fd; (void) base; (void) size;
+}
+
+/*
+ * Open a TIFF file for read/writing.
+ */
+TIFF* VSI_TIFFOpen(const char* name, const char* mode)
+{
+    static const char module[] = "TIFFOpen";
+    int           i, a_out;
+    char          access[32];
+    FILE          *fp;
+    TIFF          *tif;
+
+    a_out = 0;
+    access[0] = '\0';
+    for( i = 0; mode[i] != '\0'; i++ )
+    {
+        if( mode[i] == 'r'
+            || mode[i] == 'w'
+            || mode[i] == '+'
+            || mode[i] == 'a' )
+        {
+            access[a_out++] = mode[i];
+            access[a_out] = '\0';
+        }
+    }
+
+    strcat( access, "b" );
+                    
+    fp = VSIFOpenL( name, access );
+    if (fp == NULL) {
+        if( errno >= 0 )
+            TIFFError(module,"%s: %s", name, VSIStrerror( errno ) );
+        else
+            TIFFError(module, "%s: Cannot open", name);
+        return ((TIFF *)0);
+    }
+
+    tif = XTIFFClientOpen(name, mode,
+                          (thandle_t) fp,
+                          _tiffReadProc, _tiffWriteProc,
+                          _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
+                          _tiffMapProc, _tiffUnmapProc);
+
+    if( tif == NULL )
+        VSIFCloseL( fp );
+        
+    return tif;
+}


More information about the Liblas-commits mailing list