[DebianGIS-dev] r2612 - packages/gdal/trunk/debian/patches

frankie at alioth.debian.org frankie at alioth.debian.org
Tue Dec 1 18:36:28 UTC 2009


Author: frankie
Date: 2009-12-01 18:36:27 +0000 (Tue, 01 Dec 2009)
New Revision: 2612

Modified:
   packages/gdal/trunk/debian/patches/ecw-plugin.dpatch
Log:
Fixed ecw patch by removing a superfluous file.


Modified: packages/gdal/trunk/debian/patches/ecw-plugin.dpatch
===================================================================
--- packages/gdal/trunk/debian/patches/ecw-plugin.dpatch	2009-12-01 14:17:22 UTC (rev 2611)
+++ packages/gdal/trunk/debian/patches/ecw-plugin.dpatch	2009-12-01 18:36:27 UTC (rev 2612)
@@ -7,7 +7,7 @@
 @DPATCH@
 diff -urNad gdal-1.6.3~/frmts/ecw/GNUmakefile gdal-1.6.3/frmts/ecw/GNUmakefile
 --- gdal-1.6.3~/frmts/ecw/GNUmakefile	2009-05-08 06:52:49.000000000 +0200
-+++ gdal-1.6.3/frmts/ecw/GNUmakefile	2009-12-01 00:25:53.000000000 +0100
++++ gdal-1.6.3/frmts/ecw/GNUmakefile	2009-12-01 19:35:41.000000000 +0100
 @@ -18,3 +18,12 @@
  $(PLUGIN_SO):	$(OBJ)
  	$(LD_SHARED) $(LNK_FLAGS) $(OBJ) $(CONFIG_LIBS) $(EXTRA_LIBS) \
@@ -23,7 +23,7 @@
 + 
 diff -urNad gdal-1.6.3~/frmts/ecw/ecwdataset.cpp gdal-1.6.3/frmts/ecw/ecwdataset.cpp
 --- gdal-1.6.3~/frmts/ecw/ecwdataset.cpp	2009-09-09 20:29:39.000000000 +0200
-+++ gdal-1.6.3/frmts/ecw/ecwdataset.cpp	2009-12-01 00:24:42.000000000 +0100
++++ gdal-1.6.3/frmts/ecw/ecwdataset.cpp	2009-12-01 19:35:41.000000000 +0100
 @@ -1616,6 +1616,15 @@
  #endif /* def FRMT_ecw */
  }
@@ -40,1634 +40,9 @@
  
  
  
-diff -urNad gdal-1.6.3~/frmts/ecw/ecwdataset.cpp.orig gdal-1.6.3/frmts/ecw/ecwdataset.cpp.orig
---- gdal-1.6.3~/frmts/ecw/ecwdataset.cpp.orig	1970-01-01 01:00:00.000000000 +0100
-+++ gdal-1.6.3/frmts/ecw/ecwdataset.cpp.orig	2009-12-01 00:24:42.000000000 +0100
-@@ -0,0 +1,1621 @@
-+/******************************************************************************
-+ * $Id: ecwdataset.cpp 17628 2009-09-09 18:29:39Z rouault $
-+ *
-+ * Project:  GDAL 
-+ * Purpose:  ECW (ERMapper Wavelet Compression Format) Driver
-+ * Author:   Frank Warmerdam, warmerdam at pobox.com
-+ *
-+ ******************************************************************************
-+ * Copyright (c) 2001, 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.
-+ ****************************************************************************/
-+
-+#include "gdal_pam.h"
-+#include "gdaljp2metadata.h"
-+#include "ogr_spatialref.h"
-+#include "cpl_string.h"
-+#include "cpl_conv.h"
-+#include "vsiiostream.h"
-+#include "cpl_multiproc.h"
-+#include "cpl_minixml.h"
-+#include "ogr_api.h"
-+#include "ogr_geometry.h"
-+
-+CPL_CVSID("$Id: ecwdataset.cpp 17628 2009-09-09 18:29:39Z rouault $");
-+
-+#ifdef FRMT_ecw
-+
-+static const unsigned char jpc_header[] = {0xff,0x4f};
-+static const unsigned char jp2_header[] = 
-+    {0x00,0x00,0x00,0x0c,0x6a,0x50,0x20,0x20,0x0d,0x0a,0x87,0x0a};
-+
-+static void *hECWDatasetMutex = NULL;
-+static int    bNCSInitialized = FALSE;
-+
-+CPL_C_START
-+CPLErr CPL_DLL GTIFMemBufFromWkt( const char *pszWKT, 
-+                                  const double *padfGeoTransform,
-+                                  int nGCPCount, const GDAL_GCP *pasGCPList,
-+                                  int *pnSize, unsigned char **ppabyBuffer );
-+CPLErr CPL_DLL GTIFWktFromMemBuf( int nSize, unsigned char *pabyBuffer, 
-+                          char **ppszWKT, double *padfGeoTransform,
-+                          int *pnGCPCount, GDAL_GCP **ppasGCPList );
-+CPL_C_END
-+
-+void ECWInitialize( void );
-+
-+/************************************************************************/
-+/* ==================================================================== */
-+/*				ECWDataset				*/
-+/* ==================================================================== */
-+/************************************************************************/
-+
-+class ECWRasterBand;
-+
-+class CPL_DLL ECWDataset : public GDALPamDataset
-+{
-+    friend class ECWRasterBand;
-+
-+    CNCSJP2FileView *poFileView;
-+    NCSFileViewFileInfoEx *psFileInfo;
-+
-+    GDALDataType eRasterDataType;
-+    NCSEcwCellType eNCSRequestDataType;
-+
-+    int         bUsingCustomStream;
-+
-+    // Current view window. 
-+    int         bWinActive;
-+    int         nWinXOff, nWinYOff, nWinXSize, nWinYSize;
-+    int         nWinBufXSize, nWinBufYSize;
-+    int         nWinBandCount;
-+    int         *panWinBandList;
-+    int         nWinBufLoaded;
-+    void        **papCurLineBuf;
-+
-+    int         bGeoTransformValid;
-+    double      adfGeoTransform[6];
-+    char        *pszProjection;
-+    int         nGCPCount;
-+    GDAL_GCP    *pasGCPList;
-+
-+    char        **papszGMLMetadata;
-+
-+    void        ECW2WKTProjection();
-+
-+    void        CleanupWindow();
-+    int         TryWinRasterIO( GDALRWFlag, int, int, int, int,
-+                                GByte *, int, int, GDALDataType,
-+                                int, int *, int, int, int );
-+    CPLErr      LoadNextLine();
-+
-+  public:
-+		ECWDataset();
-+		~ECWDataset();
-+                
-+    static GDALDataset *Open( GDALOpenInfo * );
-+    static GDALDataset *OpenJPEG2000( GDALOpenInfo * );
-+    static GDALDataset *OpenECW( GDALOpenInfo * );
-+
-+    virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int,
-+                              void *, int, int, GDALDataType,
-+                              int, int *, int, int, int );
-+
-+    virtual CPLErr GetGeoTransform( double * );
-+    virtual const char *GetProjectionRef();
-+
-+    virtual int    GetGCPCount();
-+    virtual const char *GetGCPProjection();
-+    virtual const GDAL_GCP *GetGCPs();
-+
-+    virtual char      **GetMetadata( const char * pszDomain = "" );
-+
-+    virtual CPLErr AdviseRead( int nXOff, int nYOff, int nXSize, int nYSize,
-+                               int nBufXSize, int nBufYSize, 
-+                               GDALDataType eDT, 
-+                               int nBandCount, int *panBandList,
-+                               char **papszOptions );
-+};
-+
-+/************************************************************************/
-+/* ==================================================================== */
-+/*                            ECWRasterBand                             */
-+/* ==================================================================== */
-+/************************************************************************/
-+
-+class ECWRasterBand : public GDALPamRasterBand
-+{
-+    friend class ECWDataset;
-+    
-+    // NOTE: poDS may be altered for NITF/JPEG2000 files!
-+    ECWDataset     *poGDS;
-+
-+    GDALColorInterp         eBandInterp;
-+
-+    virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int,
-+                              void *, int, int, GDALDataType,
-+                              int, int );
-+
-+  public:
-+
-+                   ECWRasterBand( ECWDataset *, int );
-+                   ~ECWRasterBand();
-+
-+    virtual CPLErr IReadBlock( int, int, void * );
-+    virtual int    HasArbitraryOverviews() { return TRUE; }
-+    virtual GDALColorInterp GetColorInterpretation();
-+    virtual CPLErr SetColorInterpretation( GDALColorInterp );
-+
-+    virtual CPLErr AdviseRead( int nXOff, int nYOff, int nXSize, int nYSize,
-+                               int nBufXSize, int nBufYSize, 
-+                               GDALDataType eDT, char **papszOptions );
-+};
-+
-+/************************************************************************/
-+/*                           ECWRasterBand()                            */
-+/************************************************************************/
-+
-+ECWRasterBand::ECWRasterBand( ECWDataset *poDS, int nBand )
-+
-+{
-+    this->poDS = poDS;
-+    poGDS = poDS;
-+
-+    this->nBand = nBand;
-+    eDataType = poDS->eRasterDataType;
-+    nBlockXSize = poDS->GetRasterXSize();
-+    nBlockYSize = 1;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Work out band color interpretation.                             */
-+/* -------------------------------------------------------------------- */
-+    if( poDS->psFileInfo->eColorSpace == NCSCS_NONE )
-+        eBandInterp = GCI_Undefined;
-+    else if( poDS->psFileInfo->eColorSpace == NCSCS_GREYSCALE )
-+        eBandInterp = GCI_GrayIndex;
-+    else if( poDS->psFileInfo->eColorSpace == NCSCS_MULTIBAND )
-+        eBandInterp = GCI_Undefined;
-+    else if( poDS->psFileInfo->eColorSpace == NCSCS_sRGB )
-+    {
-+        if( nBand == 1 )
-+            eBandInterp = GCI_RedBand;
-+        else if( nBand == 2 )
-+            eBandInterp = GCI_GreenBand;
-+        else if( nBand == 3 )
-+            eBandInterp = GCI_BlueBand;
-+        else
-+            eBandInterp = GCI_Undefined;
-+    }
-+    else if( poDS->psFileInfo->eColorSpace == NCSCS_YCbCr )
-+    {
-+        if( CSLTestBoolean( CPLGetConfigOption("CONVERT_YCBCR_TO_RGB","YES") ))
-+        {
-+            if( nBand == 1 )
-+                eBandInterp = GCI_RedBand;
-+            else if( nBand == 2 )
-+                eBandInterp = GCI_GreenBand;
-+            else if( nBand == 3 )
-+                eBandInterp = GCI_BlueBand;
-+            else
-+                eBandInterp = GCI_Undefined;
-+        }
-+        else
-+        {
-+            if( nBand == 1 )
-+                eBandInterp = GCI_YCbCr_YBand;
-+            else if( nBand == 2 )
-+                eBandInterp = GCI_YCbCr_CbBand;
-+            else if( nBand == 3 )
-+                eBandInterp = GCI_YCbCr_CrBand;
-+            else
-+                eBandInterp = GCI_Undefined;
-+        }
-+    }
-+    else
-+        eBandInterp = GCI_Undefined;
-+}
-+
-+/************************************************************************/
-+/*                          ~ECWRasterBand()                           */
-+/************************************************************************/
-+
-+ECWRasterBand::~ECWRasterBand()
-+
-+{
-+    FlushCache();
-+}
-+
-+/************************************************************************/
-+/*                       GetColorInterpretation()                       */
-+/************************************************************************/
-+
-+GDALColorInterp ECWRasterBand::GetColorInterpretation()
-+
-+{
-+    return eBandInterp;
-+}
-+
-+/************************************************************************/
-+/*                       SetColorInterpretation()                       */
-+/*                                                                      */
-+/*      This would normally just be used by folks using the ECW code    */
-+/*      to read JP2 streams in other formats (such as NITF) and         */
-+/*      providing their own color interpretation regardless of what     */
-+/*      ECW might think the stream itself says.                         */
-+/************************************************************************/
-+
-+CPLErr ECWRasterBand::SetColorInterpretation( GDALColorInterp eNewInterp )
-+
-+{
-+    eBandInterp = eNewInterp;
-+
-+    return CE_None;
-+}
-+
-+/************************************************************************/
-+/*                             AdviseRead()                             */
-+/************************************************************************/
-+
-+CPLErr ECWRasterBand::AdviseRead( int nXOff, int nYOff, int nXSize, int nYSize,
-+                                  int nBufXSize, int nBufYSize, 
-+                                  GDALDataType eDT, 
-+                                  char **papszOptions )
-+{
-+    return poGDS->AdviseRead( nXOff, nYOff, nXSize, nYSize, 
-+                              nBufXSize, nBufYSize, eDT, 
-+                              1, &nBand, papszOptions );
-+}
-+
-+/************************************************************************/
-+/*                             IRasterIO()                              */
-+/************************************************************************/
-+
-+CPLErr ECWRasterBand::IRasterIO( GDALRWFlag eRWFlag,
-+                                 int nXOff, int nYOff, int nXSize, int nYSize,
-+                                 void * pData, int nBufXSize, int nBufYSize,
-+                                 GDALDataType eBufType,
-+                                 int nPixelSpace, int nLineSpace )
-+    
-+{
-+    int          iBand, bDirect;
-+    int          nNewXSize = nBufXSize, nNewYSize = nBufYSize;
-+    GByte        *pabyWorkBuffer = NULL;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Try to do it based on existing "advised" access.                */
-+/* -------------------------------------------------------------------- */
-+    if( poGDS->TryWinRasterIO( eRWFlag, nXOff, nYOff, nXSize, nYSize, 
-+                               (GByte *) pData, nBufXSize, nBufYSize, 
-+                               eBufType, 1, &nBand, 
-+                               nPixelSpace, nLineSpace, 0 ) )
-+        return CE_None;
-+
-+/* -------------------------------------------------------------------- */
-+/*      We will drop down to the block oriented API if only a single    */
-+/*      scanline was requested. This is based on the assumption that    */
-+/*      doing lots of single scanline windows is expensive.             */
-+/* -------------------------------------------------------------------- */
-+    if( nYSize == 1 )
-+    {
-+#ifdef notdef
-+        CPLDebug( "ECWRasterBand", 
-+                  "RasterIO(%d,%d,%d,%d -> %dx%d) - redirected.", 
-+                  nXOff, nYOff, nXSize, nYSize, nBufXSize, nBufYSize );
-+#endif
-+        return GDALRasterBand::IRasterIO(eRWFlag, nXOff, nYOff, nXSize, nYSize,
-+                                         pData, nBufXSize, nBufYSize, 
-+                                         eBufType, nPixelSpace, nLineSpace );
-+    }
-+
-+    CPLDebug( "ECWRasterBand", 
-+              "RasterIO(nXOff=%d,nYOff=%d,nXSize=%d,nYSize=%d -> %dx%d)", 
-+              nXOff, nYOff, nXSize, nYSize, nBufXSize, nBufYSize );
-+
-+
-+    if ( nXSize < nBufXSize )
-+            nNewXSize = nXSize;
-+
-+    if ( nYSize < nBufYSize )
-+            nNewYSize = nYSize;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Default line and pixel spacing if needed.                       */
-+/* -------------------------------------------------------------------- */
-+    if ( nPixelSpace == 0 )
-+        nPixelSpace = GDALGetDataTypeSize( eBufType ) / 8;
-+
-+    if ( nLineSpace == 0 )
-+        nLineSpace = nPixelSpace * nBufXSize;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Can we perform direct loads, or must we load into a working     */
-+/*      buffer, and transform?                                          */
-+/* -------------------------------------------------------------------- */
-+    int	    nRawPixelSize = GDALGetDataTypeSize(poGDS->eRasterDataType) / 8;
-+
-+    bDirect = nPixelSpace == 1 && eBufType == GDT_Byte
-+	    && nNewXSize == nBufXSize && nNewYSize == nBufYSize;
-+    if( !bDirect )
-+        pabyWorkBuffer = (GByte *) CPLMalloc(nNewXSize * nRawPixelSize);
-+
-+/* -------------------------------------------------------------------- */
-+/*      Establish access at the desired resolution.                     */
-+/* -------------------------------------------------------------------- */
-+    CNCSError oErr;
-+
-+    poGDS->CleanupWindow();
-+
-+    iBand = nBand-1;
-+    oErr = poGDS->poFileView->SetView( 1, (unsigned int *) (&iBand),
-+                                       nXOff, nYOff, 
-+                                       nXOff + nXSize - 1, 
-+                                       nYOff + nYSize - 1,
-+                                       nNewXSize, nNewYSize );
-+    if( oErr.GetErrorNumber() != NCS_SUCCESS )
-+    {
-+        CPLFree( pabyWorkBuffer );
-+        char* pszErrorMessage = oErr.GetErrorMessage();
-+        CPLError( CE_Failure, CPLE_AppDefined, 
-+                  "%s", pszErrorMessage );
-+        NCSFree(pszErrorMessage);
-+        
-+        return CE_Failure;
-+    }
-+
-+/* -------------------------------------------------------------------- */
-+/*      Read back one scanline at a time, till request is satisfied.    */
-+/*      Supersampling is not supported by the ECW API, so we will do    */
-+/*      it ourselves.                                                   */
-+/* -------------------------------------------------------------------- */
-+    double	dfSrcYInc = (double)nNewYSize / nBufYSize;
-+    double	dfSrcXInc = (double)nNewXSize / nBufXSize;
-+    int	        iSrcLine, iDstLine;
-+
-+    for( iSrcLine = 0, iDstLine = 0; iDstLine < nBufYSize; iDstLine++ )
-+    {
-+        NCSEcwReadStatus eRStatus;
-+        int	        iDstLineOff = iDstLine * nLineSpace;
-+        unsigned char	*pabySrcBuf;
-+
-+        if( bDirect )
-+            pabySrcBuf = ((GByte *)pData) + iDstLineOff;
-+        else
-+            pabySrcBuf = pabyWorkBuffer;
-+
-+	if ( nNewYSize == nBufYSize || iSrcLine == (int)(iDstLine * dfSrcYInc) )
-+	{
-+            eRStatus = poGDS->poFileView->ReadLineBIL( 
-+                poGDS->eNCSRequestDataType, 1, (void **) &pabySrcBuf );
-+
-+	    if( eRStatus != NCSECW_READ_OK )
-+	    {
-+	        CPLFree( pabyWorkBuffer );
-+	        CPLError( CE_Failure, CPLE_AppDefined,
-+			  "NCScbmReadViewLineBIL failed." );
-+		return CE_Failure;
-+	    }
-+
-+            if( !bDirect )
-+            {
-+                if ( nNewXSize == nBufXSize )
-+                {
-+                    GDALCopyWords( pabyWorkBuffer, poGDS->eRasterDataType, 
-+                                   nRawPixelSize, 
-+                                   ((GByte *)pData) + iDstLine * nLineSpace, 
-+                                   eBufType, nPixelSpace, nBufXSize );
-+                }
-+		else
-+		{
-+	            int	iPixel;
-+
-+                    for ( iPixel = 0; iPixel < nBufXSize; iPixel++ )
-+                    {
-+                        GDALCopyWords( pabyWorkBuffer 
-+                                       + nRawPixelSize*((int)(iPixel*dfSrcXInc)),
-+                                       poGDS->eRasterDataType, nRawPixelSize,
-+                                       (GByte *)pData + iDstLineOff
-+				       + iPixel * nPixelSpace,
-+                                       eBufType, nPixelSpace, 1 );
-+                    }
-+		}
-+            }
-+
-+            iSrcLine++;
-+	}
-+	else
-+	{
-+	    // Just copy the previous line in this case
-+            GDALCopyWords( (GByte *)pData + (iDstLineOff - nLineSpace),
-+                            eBufType, nPixelSpace,
-+                            (GByte *)pData + iDstLineOff,
-+                            eBufType, nPixelSpace, nBufXSize );
-+	}
-+    }
-+
-+    CPLFree( pabyWorkBuffer );
-+
-+    return CE_None;
-+}
-+
-+/************************************************************************/
-+/*                             IReadBlock()                             */
-+/************************************************************************/
-+
-+CPLErr ECWRasterBand::IReadBlock( int, int nBlockYOff, void * pImage )
-+
-+{
-+    CPLErr eErr = CE_None;
-+
-+    if( poGDS->TryWinRasterIO( GF_Read, 0, nBlockYOff, nBlockXSize, 1, 
-+                               (GByte *) pImage, nBlockXSize, 1, 
-+                               eDataType, 1, &nBand, 0, 0, 0 ) )
-+        return CE_None;
-+
-+    eErr = AdviseRead( 0, nBlockYOff, nRasterXSize, nRasterYSize - nBlockYOff,
-+                       nRasterXSize, nRasterYSize - nBlockYOff, 
-+                       eDataType, NULL );
-+    if( eErr != CE_None )
-+        return eErr;
-+
-+    if( poGDS->TryWinRasterIO( GF_Read, 0, nBlockYOff, nBlockXSize, 1, 
-+                               (GByte *) pImage, nBlockXSize, 1, 
-+                               eDataType, 1, &nBand, 0, 0, 0 ) )
-+        return CE_None;
-+
-+    CPLError( CE_Failure, CPLE_AppDefined, 
-+              "TryWinRasterIO() failed for blocked scanline %d of band %d.",
-+              nBlockYOff, nBand );
-+    return CE_Failure;
-+}
-+
-+/************************************************************************/
-+/* ==================================================================== */
-+/*                            ECWDataset                               */
-+/* ==================================================================== */
-+/************************************************************************/
-+
-+
-+/************************************************************************/
-+/*                            ECWDataset()                              */
-+/************************************************************************/
-+
-+ECWDataset::ECWDataset()
-+
-+{
-+    bUsingCustomStream = FALSE;
-+    pszProjection = NULL;
-+    poFileView = NULL;
-+    bWinActive = FALSE;
-+    panWinBandList = NULL;
-+    eRasterDataType = GDT_Byte;
-+    nGCPCount = 0;
-+    pasGCPList = NULL;
-+    papszGMLMetadata = NULL;
-+    
-+    bGeoTransformValid = FALSE;
-+    adfGeoTransform[0] = 0.0;
-+    adfGeoTransform[1] = 1.0;
-+    adfGeoTransform[2] = 0.0;
-+    adfGeoTransform[3] = 0.0;
-+    adfGeoTransform[4] = 0.0;
-+    adfGeoTransform[5] = 1.0;
-+}
-+
-+/************************************************************************/
-+/*                           ~ECWDataset()                              */
-+/************************************************************************/
-+
-+ECWDataset::~ECWDataset()
-+
-+{
-+    FlushCache();
-+    CleanupWindow();
-+    CPLFree( pszProjection );
-+    CSLDestroy( papszGMLMetadata );
-+
-+    if( nGCPCount > 0 )
-+    {
-+        GDALDeinitGCPs( nGCPCount, pasGCPList );
-+        CPLFree( pasGCPList );
-+    }
-+
-+/* -------------------------------------------------------------------- */
-+/*      Release / dereference iostream.                                 */
-+/* -------------------------------------------------------------------- */
-+    // The underlying iostream of the CNCSJP2FileView (poFileView) object may 
-+    // also be the underlying iostream of other CNCSJP2FileView (poFileView) 
-+    // objects.  Consequently, when we delete the CNCSJP2FileView (poFileView) 
-+    // object, we must decrement the nFileViewCount attribute of the underlying
-+    // VSIIOStream object, and only delete the VSIIOStream object when 
-+    // nFileViewCount is equal to zero.
-+
-+    CPLMutexHolder oHolder( &hECWDatasetMutex );
-+
-+    if( poFileView != NULL )
-+    {
-+        VSIIOStream *poUnderlyingIOStream = (VSIIOStream *)NULL;
-+
-+        poUnderlyingIOStream = ((VSIIOStream *)(poFileView->GetStream()));
-+        delete poFileView;
-+
-+        if( bUsingCustomStream )
-+        {
-+            if( --poUnderlyingIOStream->nFileViewCount == 0 )
-+                delete poUnderlyingIOStream;
-+        }
-+    }
-+}
-+
-+/************************************************************************/
-+/*                             AdviseRead()                             */
-+/************************************************************************/
-+
-+CPLErr ECWDataset::AdviseRead( int nXOff, int nYOff, int nXSize, int nYSize,
-+                               int nBufXSize, int nBufYSize, 
-+                               GDALDataType eDT, 
-+                               int nBandCount, int *panBandList,
-+                               char **papszOptions )
-+
-+{
-+    int *panAdjustedBandList = NULL;
-+
-+    CPLDebug( "ECW",
-+              "ECWDataset::AdviseRead(%d,%d,%d,%d->%d,%d)",
-+              nXOff, nYOff, nXSize, nYSize, nBufXSize, nBufYSize );
-+
-+    if( nBufXSize > nXSize || nBufYSize > nYSize )
-+    {
-+        CPLError( CE_Warning, CPLE_AppDefined, 
-+                  "Supersampling not directly supported by ECW toolkit,\n"
-+                  "ignoring AdviseRead() request." );
-+        return CE_Warning; 
-+    }
-+
-+/* -------------------------------------------------------------------- */
-+/*      Adjust band numbers to be zero based.                           */
-+/* -------------------------------------------------------------------- */
-+    panAdjustedBandList = (int *) 
-+        CPLMalloc(sizeof(int) * nBandCount );
-+    for( int ii= 0; ii < nBandCount; ii++ )
-+        panAdjustedBandList[ii] = panBandList[ii] - 1;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Cleanup old window cache information.                           */
-+/* -------------------------------------------------------------------- */
-+    CleanupWindow();
-+
-+/* -------------------------------------------------------------------- */
-+/*      Set the new requested window.                                   */
-+/* -------------------------------------------------------------------- */
-+    CNCSError oErr;
-+    
-+    oErr = poFileView->SetView( nBandCount, (UINT32 *) panAdjustedBandList, 
-+                                nXOff, nYOff, 
-+                                nXOff + nXSize-1, nYOff + nYSize-1,
-+                                nBufXSize, nBufYSize );
-+
-+    CPLFree( panAdjustedBandList );
-+    if( oErr.GetErrorNumber() != NCS_SUCCESS )
-+    {
-+        char* pszErrorMessage = oErr.GetErrorMessage();
-+        CPLError( CE_Failure, CPLE_AppDefined, 
-+                  "%s", pszErrorMessage );
-+        NCSFree(pszErrorMessage);
-+        bWinActive = FALSE;
-+        return CE_Failure;
-+    }
-+
-+    bWinActive = TRUE;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Record selected window.                                         */
-+/* -------------------------------------------------------------------- */
-+    nWinXOff = nXOff;
-+    nWinYOff = nYOff;
-+    nWinXSize = nXSize;
-+    nWinYSize = nYSize;
-+    nWinBufXSize = nBufXSize;
-+    nWinBufYSize = nBufYSize;
-+
-+    panWinBandList = (int *) CPLMalloc(sizeof(int)*nBandCount);
-+    memcpy( panWinBandList, panBandList, sizeof(int)* nBandCount);
-+    nWinBandCount = nBandCount;
-+
-+    nWinBufLoaded = -1;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Allocate current scanline buffer.                               */
-+/* -------------------------------------------------------------------- */
-+    papCurLineBuf = (void **) CPLMalloc(sizeof(void*) * nWinBandCount );
-+    for( int iBand = 0; iBand < nWinBandCount; iBand++ )
-+        papCurLineBuf[iBand] = 
-+            CPLMalloc(nBufXSize * (GDALGetDataTypeSize(eRasterDataType)/8) );
-+        
-+    return CE_None;
-+}
-+
-+/************************************************************************/
-+/*                           TryWinRasterIO()                           */
-+/*                                                                      */
-+/*      Try to satisfy the given request based on the currently         */
-+/*      defined window.  Return TRUE on success or FALSE on             */
-+/*      failure.  On failure, the caller should satisfy the request     */
-+/*      another way (not report an error).                              */
-+/************************************************************************/
-+
-+int ECWDataset::TryWinRasterIO( GDALRWFlag eFlag, 
-+                                int nXOff, int nYOff, int nXSize, int nYSize,
-+                                GByte *pabyData, int nBufXSize, int nBufYSize, 
-+                                GDALDataType eDT,
-+                                int nBandCount, int *panBandList, 
-+                                int nPixelSpace, int nLineSpace, 
-+                                int nBandSpace )
-+
-+{
-+    int iBand, i;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Provide default buffer organization.                            */
-+/* -------------------------------------------------------------------- */
-+    if( nPixelSpace == 0 )
-+        nPixelSpace = GDALGetDataTypeSize( eDT ) / 8;
-+    if( nLineSpace == 0 )
-+        nLineSpace = nPixelSpace * nBufXSize;
-+    if( nBandSpace == 0 )
-+        nBandSpace = nLineSpace * nBufYSize;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Do some simple tests to see if the current window can           */
-+/*      satisfy our requirement.                                        */
-+/* -------------------------------------------------------------------- */
-+    if( !bWinActive )
-+        return FALSE;
-+    
-+    if( nXOff != nWinXOff || nXSize != nWinXSize )
-+        return FALSE;
-+
-+    if( nBufXSize != nWinBufXSize )
-+        return FALSE;
-+
-+    for( iBand = 0; iBand < nBandCount; iBand++ )
-+    {
-+        for( i = 0; i < nWinBandCount; i++ )
-+        {
-+            if( panWinBandList[iBand] == panBandList[iBand] )
-+                break;
-+        }
-+
-+        if( i == nWinBandCount )
-+            return FALSE;
-+    }
-+
-+    if( nYOff < nWinYOff || nYOff + nYSize > nWinYOff + nWinYSize )
-+        return FALSE;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Now we try more subtle tests.                                   */
-+/* -------------------------------------------------------------------- */
-+    {
-+        static int nDebugCount = 0;
-+
-+        if( nDebugCount < 30 )
-+            CPLDebug( "ECWDataset", 
-+                      "TryWinRasterIO(%d,%d,%d,%d -> %dx%d) - doing advised read.", 
-+                      nXOff, nYOff, nXSize, nYSize, nBufXSize, nBufYSize );
-+
-+        if( nDebugCount == 29 )
-+            CPLDebug( "ECWDataset", "No more TryWinRasterIO messages will be reported" );
-+        
-+        nDebugCount++;
-+    }
-+
-+/* -------------------------------------------------------------------- */
-+/*      Actually load data one buffer line at a time.                   */
-+/* -------------------------------------------------------------------- */
-+    int iBufLine;
-+
-+    for( iBufLine = 0; iBufLine < nBufYSize; iBufLine++ )
-+    {
-+        float fFileLine = ((iBufLine+0.5) / nBufYSize) * nYSize + nYOff;
-+        int iWinLine = 
-+            (int) (((fFileLine - nWinYOff) / nWinYSize) * nWinBufYSize);
-+        
-+        if( iWinLine == nWinBufLoaded + 1 )
-+            LoadNextLine();
-+
-+        if( iWinLine != nWinBufLoaded )
-+            return FALSE;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Copy out all our target bands.                                  */
-+/* -------------------------------------------------------------------- */
-+        int iWinBand;
-+        for( iBand = 0; iBand < nBandCount; iBand++ )
-+        {
-+            for( iWinBand = 0; iWinBand < nWinBandCount; iWinBand++ )
-+            {
-+                if( panWinBandList[iWinBand] == panBandList[iBand] )
-+                    break;
-+            }
-+
-+            GDALCopyWords( papCurLineBuf[iWinBand], eRasterDataType,
-+                           GDALGetDataTypeSize( eRasterDataType ) / 8, 
-+                           pabyData + nBandSpace * iBand 
-+                           + iBufLine * nLineSpace, eDT, nPixelSpace,
-+                           nBufXSize );
-+        }
-+    }
-+
-+    return TRUE;
-+}
-+
-+/************************************************************************/
-+/*                            LoadNextLine()                            */
-+/************************************************************************/
-+
-+CPLErr ECWDataset::LoadNextLine()
-+
-+{
-+    if( !bWinActive )
-+        return CE_Failure;
-+
-+    if( nWinBufLoaded == nWinBufYSize-1 )
-+    {
-+        CleanupWindow();
-+        return CE_Failure;
-+    }
-+
-+    NCSEcwReadStatus  eRStatus;
-+    eRStatus = poFileView->ReadLineBIL( eNCSRequestDataType, nWinBandCount,
-+                                        papCurLineBuf );
-+    if( eRStatus != NCSECW_READ_OK )
-+        return CE_Failure;
-+
-+    nWinBufLoaded++;
-+
-+    return CE_None;
-+}
-+
-+/************************************************************************/
-+/*                           CleanupWindow()                            */
-+/************************************************************************/
-+
-+void ECWDataset::CleanupWindow()
-+
-+{
-+    if( !bWinActive )
-+        return;
-+
-+    bWinActive = FALSE;
-+    CPLFree( panWinBandList );
-+    panWinBandList = NULL;
-+
-+    for( int iBand = 0; iBand < nWinBandCount; iBand++ )
-+        CPLFree( papCurLineBuf[iBand] );
-+    CPLFree( papCurLineBuf );
-+    papCurLineBuf = NULL;
-+}
-+
-+/************************************************************************/
-+/*                             IRasterIO()                              */
-+/************************************************************************/
-+
-+CPLErr ECWDataset::IRasterIO( GDALRWFlag eRWFlag,
-+                              int nXOff, int nYOff, int nXSize, int nYSize,
-+                              void * pData, int nBufXSize, int nBufYSize,
-+                              GDALDataType eBufType, 
-+                              int nBandCount, int *panBandMap,
-+                              int nPixelSpace, int nLineSpace, int nBandSpace)
-+    
-+{
-+/* -------------------------------------------------------------------- */
-+/*      Try to do it based on existing "advised" access.                */
-+/* -------------------------------------------------------------------- */
-+    if( TryWinRasterIO( eRWFlag, nXOff, nYOff, nXSize, nYSize, 
-+                        (GByte *) pData, nBufXSize, nBufYSize, 
-+                        eBufType, nBandCount, panBandMap,
-+                        nPixelSpace, nLineSpace, nBandSpace ) )
-+        return CE_None;
-+
-+/* -------------------------------------------------------------------- */
-+/*      If we are requesting a single line at 1:1, we do a multi-band   */
-+/*      AdviseRead() and then TryWinRasterIO() again.                   */
-+/* -------------------------------------------------------------------- */
-+    if( nYSize == 1 && nBufYSize == 1 && nBandCount > 1 )
-+    {
-+        CPLErr eErr;
-+
-+        eErr = AdviseRead( nXOff, nYOff, nXSize, GetRasterYSize() - nYOff,
-+                           nBufXSize, GetRasterYSize() - nYOff, eBufType, 
-+                           nBandCount, panBandMap, NULL );
-+        if( eErr == CE_None 
-+            && TryWinRasterIO( eRWFlag, nXOff, nYOff, nXSize, nYSize, 
-+                               (GByte *) pData, nBufXSize, nBufYSize, 
-+                               eBufType, nBandCount, panBandMap,
-+                               nPixelSpace, nLineSpace, nBandSpace ) )
-+            return CE_None;
-+    }
-+
-+/* -------------------------------------------------------------------- */
-+/*      If we are supersampling we need to fall into the general        */
-+/*      purpose logic.  We also use the general logic if we are in      */
-+/*      some cases unlikely to benefit from interleaved access.         */
-+/*                                                                      */
-+/*      The one case we would like to handle better here is the         */
-+/*      nBufYSize == 1 case (requesting a scanline at a time).  We      */
-+/*      should eventually have some logic similiar to the band by       */
-+/*      band case where we post a big window for the view, and allow    */
-+/*      sequential reads.                                               */
-+/* -------------------------------------------------------------------- */
-+    if( nXSize < nBufXSize || nYSize < nBufYSize || nYSize == 1 
-+        || nBandCount > 100 || nBandCount == 1 || nBufYSize == 1 
-+        || nBandCount > GetRasterCount() )
-+    {
-+        return 
-+            GDALDataset::IRasterIO( eRWFlag, nXOff, nYOff, nXSize, nYSize,
-+                                    pData, nBufXSize, nBufYSize,
-+                                    eBufType, 
-+                                    nBandCount, panBandMap,
-+                                    nPixelSpace, nLineSpace, nBandSpace);
-+    }
-+
-+    CPLDebug( "ECWDataset", 
-+              "RasterIO(%d,%d,%d,%d -> %dx%d) - doing interleaved read.", 
-+              nXOff, nYOff, nXSize, nYSize, nBufXSize, nBufYSize );
-+
-+/* -------------------------------------------------------------------- */
-+/*      Setup view.                                                     */
-+/* -------------------------------------------------------------------- */
-+    UINT32 anBandIndices[100];
-+    int    i;
-+    NCSError     eNCSErr;
-+    CNCSError    oErr;
-+    
-+    for( i = 0; i < nBandCount; i++ )
-+        anBandIndices[i] = panBandMap[i] - 1;
-+
-+    CleanupWindow();
-+
-+    oErr = poFileView->SetView( nBandCount, anBandIndices,
-+                                nXOff, nYOff, 
-+                                nXOff + nXSize - 1, 
-+                                nYOff + nYSize - 1,
-+                                nBufXSize, nBufYSize );
-+    eNCSErr = oErr.GetErrorNumber();
-+    
-+    if( eNCSErr != NCS_SUCCESS )
-+    {
-+        CPLError( CE_Failure, CPLE_AppDefined, 
-+                  "%s", NCSGetErrorText(eNCSErr) );
-+        
-+        return CE_Failure;
-+    }
-+
-+/* -------------------------------------------------------------------- */
-+/*      Setup working scanline, and the pointers into it.               */
-+/* -------------------------------------------------------------------- */
-+    int nDataTypeSize = (GDALGetDataTypeSize(eRasterDataType) / 8);
-+    GByte *pabyBILScanline = (GByte *) CPLMalloc(nBufXSize * nDataTypeSize *
-+                                                 nBandCount);
-+    GByte **papabyBIL = (GByte **) CPLMalloc(nBandCount * sizeof(void*));
-+
-+    for( i = 0; i < nBandCount; i++ )
-+        papabyBIL[i] = pabyBILScanline + i * nBufXSize * nDataTypeSize;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Read back all the data for the requested view.                  */
-+/* -------------------------------------------------------------------- */
-+    for( int iScanline = 0; iScanline < nBufYSize; iScanline++ )
-+    {
-+        NCSEcwReadStatus  eRStatus;
-+
-+        eRStatus = poFileView->ReadLineBIL( eNCSRequestDataType, nBandCount,
-+                                            (void **) papabyBIL );
-+        if( eRStatus != NCSECW_READ_OK )
-+        {
-+            CPLFree( papabyBIL );
-+            CPLFree( pabyBILScanline );
-+            CPLError( CE_Failure, CPLE_AppDefined,
-+                      "NCScbmReadViewLineBIL failed." );
-+            return CE_Failure;
-+        }
-+
-+        for( i = 0; i < nBandCount; i++ )
-+        {
-+            GDALCopyWords( 
-+                pabyBILScanline + i * nDataTypeSize * nBufXSize,
-+                eRasterDataType, nDataTypeSize, 
-+                ((GByte *) pData) + nLineSpace * iScanline + nBandSpace * i, 
-+                eBufType, nPixelSpace, 
-+                nBufXSize );
-+        }
-+    }
-+
-+    CPLFree( pabyBILScanline );
-+    CPLFree( papabyBIL );
-+
-+    return CE_None;
-+}
-+
-+/************************************************************************/
-+/*                            OpenJPEG2000()                            */
-+/************************************************************************/
-+
-+GDALDataset *ECWDataset::OpenJPEG2000( GDALOpenInfo * poOpenInfo )
-+
-+{
-+    if( EQUALN(poOpenInfo->pszFilename,"J2K_SUBFILE:",12) )
-+        return Open( poOpenInfo );
-+
-+    else if( poOpenInfo->nHeaderBytes >= 16 
-+        && (memcmp( poOpenInfo->pabyHeader, jpc_header, 
-+                    sizeof(jpc_header) ) == 0
-+            || memcmp( poOpenInfo->pabyHeader, jp2_header, 
-+                    sizeof(jp2_header) ) == 0) )
-+        return Open( poOpenInfo );
-+    
-+    else
-+        return NULL;
-+}
-+    
-+/************************************************************************/
-+/*                              OpenECW()                               */
-+/*                                                                      */
-+/*      Open method that only supports ECW files.                       */
-+/************************************************************************/
-+
-+GDALDataset *ECWDataset::OpenECW( GDALOpenInfo * poOpenInfo )
-+
-+{
-+/* -------------------------------------------------------------------- */
-+/*      This has to either be a file on disk ending in .ecw or a        */
-+/*      ecwp: protocol url.                                             */
-+/* -------------------------------------------------------------------- */
-+    if( (!EQUAL(CPLGetExtension(poOpenInfo->pszFilename),"ecw")
-+         || poOpenInfo->nHeaderBytes == 0)
-+        && !EQUALN(poOpenInfo->pszFilename,"ecwp:",5) )
-+        return( NULL );
-+
-+    return Open( poOpenInfo );
-+}
-+    
-+/************************************************************************/
-+/*                                Open()                                */
-+/************************************************************************/
-+
-+GDALDataset *ECWDataset::Open( GDALOpenInfo * poOpenInfo )
-+
-+{
-+    CNCSJP2FileView *poFileView = NULL;
-+    NCSError         eErr;
-+    CNCSError        oErr;
-+    int              i;
-+    FILE            *fpVSIL = NULL;
-+    VSIIOStream *poIOStream = NULL;
-+    int              bUsingCustomStream = FALSE;
-+
-+    ECWInitialize();
-+
-+/* -------------------------------------------------------------------- */
-+/*      This will disable automatic conversion of YCbCr to RGB by       */
-+/*      the toolkit.                                                    */
-+/* -------------------------------------------------------------------- */
-+    if( !CSLTestBoolean( CPLGetConfigOption("CONVERT_YCBCR_TO_RGB","YES") ) )
-+        NCSecwSetConfig(NCSCFG_JP2_MANAGE_ICC, FALSE);
-+
-+/* -------------------------------------------------------------------- */
-+/*      Handle special case of a JPEG2000 data stream in another file.  */
-+/* -------------------------------------------------------------------- */
-+    if( EQUALN(poOpenInfo->pszFilename,"J2K_SUBFILE:",12) )
-+    {
-+        int            subfile_offset=-1, subfile_size=-1;
-+        char *real_filename = NULL;
-+
-+        if( sscanf( poOpenInfo->pszFilename, "J2K_SUBFILE:%d,%d", 
-+                    &subfile_offset, &subfile_size ) != 2 )
-+          {
-+              CPLError( CE_Failure, CPLE_OpenFailed, 
-+                        "Failed to parse J2K_SUBFILE specification." );
-+              return NULL;
-+          }
-+
-+          real_filename = (char *) strstr(poOpenInfo->pszFilename,",");
-+          if( real_filename != NULL )
-+              real_filename = (char *) strstr(real_filename+1,",");
-+          if( real_filename != NULL )
-+              real_filename++;
-+          else
-+          {
-+              CPLError( CE_Failure, CPLE_OpenFailed, 
-+                        "Failed to parse J2K_SUBFILE specification." );
-+              return NULL;
-+          }
-+
-+          fpVSIL = VSIFOpenL( real_filename, "rb" );
-+          if( fpVSIL == NULL )
-+          {
-+              CPLError( CE_Failure, CPLE_OpenFailed, 
-+                        "Failed to open %s.",  real_filename );
-+              return NULL;
-+          }
-+
-+          if( hECWDatasetMutex == NULL )
-+          {
-+              hECWDatasetMutex = CPLCreateMutex();
-+          }
-+          else if( !CPLAcquireMutex( hECWDatasetMutex, 60.0 ) )
-+          {
-+              CPLDebug( "ECW", "Failed to acquire mutex in 60s." );
-+          }
-+          else
-+          {
-+              CPLDebug( "ECW", "Got mutex." );
-+          }
-+          poIOStream = new VSIIOStream();
-+          poIOStream->Access( fpVSIL, FALSE, real_filename,
-+                              subfile_offset, subfile_size );
-+
-+          poFileView = new CNCSJP2FileView();
-+          oErr = poFileView->Open( poIOStream, false );
-+
-+          // The CNCSJP2FileView (poFileView) object may not use the iostream 
-+          // (poIOStream) passed to the CNCSJP2FileView::Open() method if an 
-+          // iostream is already available to the ECW JPEG 2000 SDK for a given
-+          // file.  Consequently, if the iostream passed to 
-+          // CNCSJP2FileView::Open() does not become the underlying iostream 
-+          // of the CNCSJP2FileView object, then it should be deleted.
-+          //
-+          // In addition, the underlying iostream of the CNCSJP2FileView object
-+          // should not be deleted until all CNCSJP2FileView objects using the 
-+          // underlying iostream are deleted. Consequently, each time a 
-+          // CNCSJP2FileView object is created, the nFileViewCount attribute 
-+          // of the underlying VSIIOStream object must be incremented for use 
-+          // in the ECWDataset destructor.
-+		  
-+          VSIIOStream * poUnderlyingIOStream = 
-+              ((VSIIOStream *)(poFileView->GetStream()));
-+
-+          if ( poUnderlyingIOStream )
-+              poUnderlyingIOStream->nFileViewCount++;
-+
-+          if ( poIOStream != poUnderlyingIOStream ) 
-+          {
-+              delete poIOStream;
-+          }
-+          else
-+          {
-+              bUsingCustomStream = TRUE;
-+          }
-+
-+          CPLReleaseMutex( hECWDatasetMutex );
-+
-+          if( oErr.GetErrorNumber() != NCS_SUCCESS )
-+          {
-+              if (poFileView)
-+                  delete poFileView;
-+
-+              char* pszErrorMessage = oErr.GetErrorMessage();
-+              CPLError( CE_Failure, CPLE_AppDefined, 
-+                        "%s", pszErrorMessage );
-+              NCSFree(pszErrorMessage);
-+
-+              return NULL;
-+          }
-+    }
-+
-+/* -------------------------------------------------------------------- */
-+/*      This has to either be a file on disk ending in .ecw or a        */
-+/*      ecwp: protocol url.                                             */
-+/* -------------------------------------------------------------------- */
-+    else if( poOpenInfo->nHeaderBytes >= 16 
-+        && (memcmp( poOpenInfo->pabyHeader, jpc_header, 
-+                    sizeof(jpc_header) ) == 0
-+            || memcmp( poOpenInfo->pabyHeader, jp2_header, 
-+                    sizeof(jp2_header) ) == 0) )
-+        /* accept JPEG2000 files */;
-+    else if( (!EQUAL(CPLGetExtension(poOpenInfo->pszFilename),"ecw")
-+              || poOpenInfo->nHeaderBytes == 0)
-+             && !EQUALN(poOpenInfo->pszFilename,"ecwp:",5) )
-+        return( NULL );
-+    
-+/* -------------------------------------------------------------------- */
-+/*      Open the client interface.                                      */
-+/* -------------------------------------------------------------------- */
-+    if( poFileView == NULL )
-+    {
-+        poFileView = new CNCSFile();
-+        oErr = poFileView->Open( (char *) poOpenInfo->pszFilename, FALSE );
-+        eErr = oErr.GetErrorNumber();
-+        CPLDebug( "ECW", "NCScbmOpenFileView(%s): eErr = %d", 
-+                  poOpenInfo->pszFilename, (int) eErr );
-+        if( eErr != NCS_SUCCESS )
-+        {
-+            CPLError( CE_Failure, CPLE_AppDefined, 
-+                      "%s", NCSGetErrorText(eErr) );
-+            return NULL;
-+        }
-+    }
-+
-+/* -------------------------------------------------------------------- */
-+/*      Create a corresponding GDALDataset.                             */
-+/* -------------------------------------------------------------------- */
-+    ECWDataset  *poDS;
-+
-+    poDS = new ECWDataset();
-+
-+    poDS->poFileView = poFileView;
-+
-+    if( fpVSIL != NULL )
-+        poDS->nPamFlags |= GPF_DISABLED;
-+
-+    poDS->bUsingCustomStream = bUsingCustomStream;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Fetch general file information.                                 */
-+/* -------------------------------------------------------------------- */
-+    poDS->psFileInfo = poFileView->GetFileInfo();
-+
-+    CPLDebug( "ECW", "FileInfo: SizeXY=%d,%d Bands=%d\n"
-+              "       OriginXY=%g,%g  CellIncrementXY=%g,%g\n",
-+              poDS->psFileInfo->nSizeX,
-+              poDS->psFileInfo->nSizeY,
-+              poDS->psFileInfo->nBands,
-+              poDS->psFileInfo->fOriginX,
-+              poDS->psFileInfo->fOriginY,
-+              poDS->psFileInfo->fCellIncrementX,
-+              poDS->psFileInfo->fCellIncrementY );
-+
-+/* -------------------------------------------------------------------- */
-+/*      Establish raster info.                                          */
-+/* -------------------------------------------------------------------- */
-+    poDS->nRasterXSize = poDS->psFileInfo->nSizeX; 
-+    poDS->nRasterYSize = poDS->psFileInfo->nSizeY;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Establish the GDAL data type that corresponds.  A few NCS       */
-+/*      data types have no direct corresponding value in GDAL so we     */
-+/*      will coerce to something sufficiently similar.                  */
-+/* -------------------------------------------------------------------- */
-+    poDS->eNCSRequestDataType = poDS->psFileInfo->eCellType;
-+    switch( poDS->psFileInfo->eCellType )
-+    {
-+        case NCSCT_UINT8:
-+            poDS->eRasterDataType = GDT_Byte;
-+            break;
-+
-+        case NCSCT_UINT16:
-+            poDS->eRasterDataType = GDT_UInt16;
-+            break;
-+
-+        case NCSCT_UINT32:
-+        case NCSCT_UINT64:
-+            poDS->eRasterDataType = GDT_UInt32;
-+            poDS->eNCSRequestDataType = NCSCT_UINT32;
-+            break;
-+
-+        case NCSCT_INT8:
-+        case NCSCT_INT16:
-+            poDS->eRasterDataType = GDT_Int16;
-+            poDS->eNCSRequestDataType = NCSCT_INT16;
-+            break;
-+
-+        case NCSCT_INT32:
-+        case NCSCT_INT64:
-+            poDS->eRasterDataType = GDT_Int32;
-+            poDS->eNCSRequestDataType = NCSCT_INT32;
-+            break;
-+
-+        case NCSCT_IEEE4:
-+            poDS->eRasterDataType = GDT_Float32;
-+            break;
-+
-+        case NCSCT_IEEE8:
-+            poDS->eRasterDataType = GDT_Float64;
-+            break;
-+    }
-+
-+/* -------------------------------------------------------------------- */
-+/*      Create band information objects.                                */
-+/* -------------------------------------------------------------------- */
-+    for( i=0; i < poDS->psFileInfo->nBands; i++ )
-+        poDS->SetBand( i+1, new ECWRasterBand( poDS, i+1 ) );
-+
-+/* -------------------------------------------------------------------- */
-+/*      Look for supporting coordinate system information.              */
-+/* -------------------------------------------------------------------- */
-+    if( fpVSIL == NULL )
-+    {
-+        GDALJP2Metadata oJP2Geo;
-+
-+        if( oJP2Geo.ReadAndParse( poOpenInfo->pszFilename ) )
-+        {
-+            poDS->pszProjection = CPLStrdup(oJP2Geo.pszProjection);
-+            poDS->bGeoTransformValid = oJP2Geo.bHaveGeoTransform;
-+            memcpy( poDS->adfGeoTransform, oJP2Geo.adfGeoTransform, 
-+                    sizeof(double) * 6 );
-+            poDS->nGCPCount = oJP2Geo.nGCPCount;
-+            poDS->pasGCPList = oJP2Geo.pasGCPList;
-+            oJP2Geo.pasGCPList = NULL;
-+            oJP2Geo.nGCPCount = 0;
-+        }
-+        else
-+        {
-+            poDS->ECW2WKTProjection();
-+        }
-+    }
-+
-+/* -------------------------------------------------------------------- */
-+/*      Check for world file for ecw files.                             */
-+/* -------------------------------------------------------------------- */
-+    if( !poDS->bGeoTransformValid 
-+        && EQUAL(CPLGetExtension(poOpenInfo->pszFilename),"ecw") )
-+    {
-+        poDS->bGeoTransformValid |= 
-+            GDALReadWorldFile( poOpenInfo->pszFilename, ".eww", 
-+                               poDS->adfGeoTransform )
-+            || GDALReadWorldFile( poOpenInfo->pszFilename, ".ecww", 
-+                                  poDS->adfGeoTransform )
-+            || GDALReadWorldFile( poOpenInfo->pszFilename, ".wld", 
-+                                  poDS->adfGeoTransform );
-+    }
-+
-+/* -------------------------------------------------------------------- */
-+/*      Initialize any PAM information.                                 */
-+/* -------------------------------------------------------------------- */
-+    poDS->SetDescription( poOpenInfo->pszFilename );
-+    poDS->TryLoadXML();
-+
-+    return( poDS );
-+}
-+
-+/************************************************************************/
-+/*                            GetGCPCount()                             */
-+/************************************************************************/
-+
-+int ECWDataset::GetGCPCount()
-+
-+{
-+    if( nGCPCount != 0 )
-+        return nGCPCount;
-+    else
-+        return GDALPamDataset::GetGCPCount();
-+}
-+
-+/************************************************************************/
-+/*                          GetGCPProjection()                          */
-+/************************************************************************/
-+
-+const char *ECWDataset::GetGCPProjection()
-+
-+{
-+    if( nGCPCount > 0 )
-+        return pszProjection;
-+    else
-+        return GDALPamDataset::GetGCPProjection();
-+}
-+
-+/************************************************************************/
-+/*                               GetGCP()                               */
-+/************************************************************************/
-+
-+const GDAL_GCP *ECWDataset::GetGCPs()
-+
-+{
-+    if( nGCPCount != 0 )
-+        return pasGCPList;
-+    else
-+        return GDALPamDataset::GetGCPs();
-+}
-+
-+/************************************************************************/
-+/*                          GetProjectionRef()                          */
-+/************************************************************************/
-+
-+const char *ECWDataset::GetProjectionRef() 
-+
-+{
-+    if( pszProjection == NULL )
-+        return GDALPamDataset::GetProjectionRef();
-+    else
-+        return pszProjection;
-+}
-+
-+/************************************************************************/
-+/*                          GetGeoTransform()                           */
-+/************************************************************************/
-+
-+CPLErr ECWDataset::GetGeoTransform( double * padfTransform )
-+
-+{
-+    if( bGeoTransformValid )
-+    {
-+        memcpy( padfTransform, adfGeoTransform, sizeof(double) * 6 );
-+        return( CE_None );
-+    }
-+    else
-+        return GDALPamDataset::GetGeoTransform( padfTransform );
-+}
-+
-+/************************************************************************/
-+/*                            GetMetadata()                             */
-+/************************************************************************/
-+
-+char **ECWDataset::GetMetadata( const char *pszDomain )
-+
-+{
-+    if( pszDomain == NULL || !EQUAL(pszDomain,"GML") )
-+        return GDALPamDataset::GetMetadata( pszDomain );
-+    else
-+        return papszGMLMetadata;
-+}
-+
-+/************************************************************************/
-+/*                         ECW2WKTProjection()                          */
-+/*                                                                      */
-+/*      Set the dataset pszProjection string in OGC WKT format by       */
-+/*      looking up the ECW (GDT) coordinate system info in              */
-+/*      ecw_cs.dat support data file.                                   */
-+/*                                                                      */
-+/*      This code is likely still broken in some circumstances.  For    */
-+/*      instance, I haven't been careful about changing the linear      */
-+/*      projection parameters (false easting/northing) if the units     */
-+/*      is feet.  Lots of cases missing here, and in ecw_cs.dat.        */
-+/************************************************************************/
-+
-+void ECWDataset::ECW2WKTProjection()
-+
-+{
-+    if( psFileInfo == NULL )
-+        return;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Capture Geotransform.                                           */
-+/*                                                                      */
-+/*      We will try to ignore the provided file information if it is    */
-+/*      origin (0,0) and pixel size (1,1).  I think sometimes I have    */
-+/*      also seen pixel increments of 0 on invalid datasets.            */
-+/* -------------------------------------------------------------------- */
-+    if( psFileInfo->fOriginX != 0.0 
-+        || psFileInfo->fOriginY != 0.0 
-+        || (psFileInfo->fCellIncrementX != 0.0 
-+            && psFileInfo->fCellIncrementX != 1.0)
-+        || (psFileInfo->fCellIncrementY != 0.0 
-+            && psFileInfo->fCellIncrementY != 1.0) )
-+    {
-+        bGeoTransformValid = TRUE;
-+        
-+        adfGeoTransform[0] = psFileInfo->fOriginX;
-+        adfGeoTransform[1] = psFileInfo->fCellIncrementX;
-+        adfGeoTransform[2] = 0.0;
-+        
-+        adfGeoTransform[3] = psFileInfo->fOriginY;
-+        adfGeoTransform[4] = 0.0;
-+        adfGeoTransform[5] = psFileInfo->fCellIncrementY;
-+    }
-+
-+/* -------------------------------------------------------------------- */
-+/*      do we have projection and datum?                                */
-+/* -------------------------------------------------------------------- */
-+    CPLDebug( "ECW", "projection=%s, datum=%s",
-+              psFileInfo->szProjection, psFileInfo->szDatum );
-+
-+    if( EQUAL(psFileInfo->szProjection,"RAW") )
-+        return;
-+
-+/* -------------------------------------------------------------------- */
-+/*      Set projection if we have it.                                   */
-+/* -------------------------------------------------------------------- */
-+    OGRSpatialReference oSRS;
-+    CPLString osUnits = "METERS";
-+
-+    if( psFileInfo->eCellSizeUnits == ECW_CELL_UNITS_FEET )
-+        osUnits = "FEET";
-+
-+    if( oSRS.importFromERM( psFileInfo->szProjection, 
-+                            psFileInfo->szDatum, 
-+                            osUnits ) != OGRERR_NONE )
-+        return;
-+
-+    oSRS.exportToWkt( &pszProjection );
-+}
-+
-+#endif /* def FRMT_ecw */
-+
-+/************************************************************************/
-+/*                           ECWInitialize()                            */
-+/*                                                                      */
-+/*      Initialize NCS library.  We try to defer this as late as        */
-+/*      possible since de-initializing it seems to be expensive/slow    */
-+/*      on some system.                                                 */
-+/************************************************************************/
-+
-+void ECWInitialize()
-+
-+{
-+    CPLMutexHolder oHolder( &hECWDatasetMutex );
-+
-+    if( bNCSInitialized )
-+        return;
-+
-+    NCSecwInit();
-+    bNCSInitialized = TRUE;
-+
-+    const char *pszEcwCacheSize = 
-+        CPLGetConfigOption("GDAL_ECW_CACHE_MAXMEM",NULL);
-+
-+    if( pszEcwCacheSize != NULL )
-+        NCSecwSetConfig(NCSCFG_CACHE_MAXMEM, atoi(pszEcwCacheSize) );
-+}
-+
-+/************************************************************************/
-+/*                         GDALDeregister_ECW()                         */
-+/************************************************************************/
-+
-+void GDALDeregister_ECW( GDALDriver * )
-+
-+{
-+    /* For unknown reason, this cleanup can take up to 3 seconds (see #3134). */
-+    /* Not worth it */
-+#ifdef notdef
-+    if( bNCSInitialized )
-+    {
-+        bNCSInitialized = FALSE;
-+        NCSecwShutdown();
-+    }
-+
-+    if( hECWDatasetMutex != NULL )
-+    {
-+        CPLDestroyMutex( hECWDatasetMutex );
-+        hECWDatasetMutex = NULL;
-+    }
-+#endif
-+}
-+
-+/************************************************************************/
-+/*                          GDALRegister_ECW()                        */
-+/************************************************************************/
-+
-+void GDALRegister_ECW()
-+
-+{
-+#ifdef FRMT_ecw 
-+    GDALDriver	*poDriver;
-+
-+    if (! GDAL_CHECK_VERSION("ECW driver"))
-+        return;
-+
-+    if( GDALGetDriverByName( "ECW" ) == NULL )
-+    {
-+        poDriver = new GDALDriver();
-+        
-+        poDriver->SetDescription( "ECW" );
-+        poDriver->SetMetadataItem( GDAL_DMD_LONGNAME, 
-+                                   "ERMapper Compressed Wavelets" );
-+        poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC, 
-+                                   "frmt_ecw.html" );
-+        poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "ecw" );
-+        
-+        poDriver->pfnOpen = ECWDataset::OpenECW;
-+        poDriver->pfnUnloadDriver = GDALDeregister_ECW;
-+#ifdef HAVE_COMPRESS
-+// The create method seems not to work properly.
-+//        poDriver->pfnCreate = ECWCreateECW;  
-+        poDriver->pfnCreateCopy = ECWCreateCopyECW;
-+        poDriver->SetMetadataItem( GDAL_DMD_CREATIONDATATYPES, 
-+                                   "Byte" );
-+        poDriver->SetMetadataItem( GDAL_DMD_CREATIONOPTIONLIST, 
-+"<CreationOptionList>"
-+"   <Option name='TARGET' type='float' description='Compression Percentage' />"
-+"   <Option name='PROJ' type='string' description='ERMapper Projection Name'/>"
-+"   <Option name='DATUM' type='string' description='ERMapper Datum Name' />"
-+"   <Option name='LARGE_OK' type='boolean' description='Enable compressing 500+MB files'/>"
-+"</CreationOptionList>" );
-+#endif
-+
-+        GetGDALDriverManager()->RegisterDriver( poDriver );
-+    }
-+#endif /* def FRMT_ecw */
-+}
-+
-+/************************************************************************/
-+/*                      GDALRegister_ECW_JP2ECW()                       */
-+/*                                                                      */
-+/*      This function exists so that when built as a plugin, there      */
-+/*      is a function that will register both drivers.                  */
-+/************************************************************************/
-+
-+void GDALRegister_ECW_JP2ECW()
-+
-+{
-+    GDALRegister_ECW();
-+    GDALRegister_JP2ECW();
-+}
-+
-+/************************************************************************/
-+/*                        GDALRegister_JP2ECW()                         */
-+/************************************************************************/
-+void GDALRegister_JP2ECW()
-+
-+{
-+#ifdef FRMT_ecw 
-+    GDALDriver	*poDriver;
-+
-+    if (! GDAL_CHECK_VERSION("JP2ECW driver"))
-+        return;
-+
-+    if( GDALGetDriverByName( "JP2ECW" ) == NULL )
-+    {
-+        poDriver = new GDALDriver();
-+        
-+        poDriver->SetDescription( "JP2ECW" );
-+        poDriver->SetMetadataItem( GDAL_DMD_LONGNAME, 
-+                                   "ERMapper JPEG2000" );
-+        poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC, 
-+                                   "frmt_jp2ecw.html" );
-+        poDriver->SetMetadataItem( GDAL_DMD_EXTENSION, "jp2" );
-+        
-+        poDriver->pfnOpen = ECWDataset::OpenJPEG2000;
-+#ifdef HAVE_COMPRESS
-+        poDriver->pfnCreate = ECWCreateJPEG2000;
-+        poDriver->pfnCreateCopy = ECWCreateCopyJPEG2000;
-+        poDriver->SetMetadataItem( GDAL_DMD_CREATIONDATATYPES, 
-+                                   "Byte UInt16 Int16 UInt32 Int32 Float32 Float64" );
-+        poDriver->SetMetadataItem( GDAL_DMD_CREATIONOPTIONLIST, 
-+"<CreationOptionList>"
-+"   <Option name='TARGET' type='float' description='Compression Percentage' />"
-+"   <Option name='PROJ' type='string' description='ERMapper Projection Name'/>"
-+"   <Option name='DATUM' type='string' description='ERMapper Datum Name' />"
-+"   <Option name='LARGE_OK' type='boolean' description='Enable compressing 500+MB files'/>"
-+"   <Option name='GeoJP2' type='boolean' description='defaults to ON'/>"
-+"   <Option name='GMLJP2' type='boolean' description='defaults to ON'/>"
-+"   <Option name='PROFILE' type='string-select'>"
-+"       <Value>BASELINE_0</Value>"
-+"       <Value>BASELINE_1</Value>"
-+"       <Value>BASELINE_2</Value>"
-+"       <Value>NPJE</Value>"
-+"       <Value>EPJE</Value>"
-+"   </Option>"
-+"   <Option name='PROGRESSION' type='string-select'>"
-+"       <Value>LRCP</Value>"
-+"       <Value>RLCP</Value>"
-+"       <Value>RPCL</Value>"
-+"   </Option>"
-+"   <Option name='CODESTREAM_ONLY' type='boolean' description='No JP2 wrapper'/>"
-+"   <Option name='LEVELS' type='int'/>"
-+"   <Option name='LAYERS' type='int'/>"
-+"   <Option name='PRECINCT_WIDTH' type='int'/>"
-+"   <Option name='PRECINCT_HEIGHT' type='int'/>"
-+"   <Option name='TILE_WIDTH' type='int'/>"
-+"   <Option name='TILE_HEIGHT' type='int'/>"
-+"   <Option name='INCLUDE_SOP' type='boolean'/>"
-+"   <Option name='INCLUDE_EPH' type='boolean'/>"
-+"   <Option name='DECOMPRESS_LAYERS' type='int'/>"
-+"   <Option name='DECOMPRESS_RECONSTRUCTION_PARAMETER' type='float'/>"
-+"</CreationOptionList>" );
-+#endif
-+
-+        GetGDALDriverManager()->RegisterDriver( poDriver );
-+    }
-+#endif /* def FRMT_ecw */
-+}
-+
-+
-+
-+
 diff -urNad gdal-1.6.3~/frmts/ecw/pkg/Makefile.in gdal-1.6.3/frmts/ecw/pkg/Makefile.in
 --- gdal-1.6.3~/frmts/ecw/pkg/Makefile.in	1970-01-01 01:00:00.000000000 +0100
-+++ gdal-1.6.3/frmts/ecw/pkg/Makefile.in	2009-12-01 00:24:42.000000000 +0100
++++ gdal-1.6.3/frmts/ecw/pkg/Makefile.in	2009-12-01 19:35:41.000000000 +0100
 @@ -0,0 +1,36 @@
 +CC	=	@CC@
 +CXX	=	@CXX@
@@ -1707,7 +82,7 @@
 +
 diff -urNad gdal-1.6.3~/frmts/ecw/pkg/README gdal-1.6.3/frmts/ecw/pkg/README
 --- gdal-1.6.3~/frmts/ecw/pkg/README	1970-01-01 01:00:00.000000000 +0100
-+++ gdal-1.6.3/frmts/ecw/pkg/README	2009-12-01 00:24:42.000000000 +0100
++++ gdal-1.6.3/frmts/ecw/pkg/README	2009-12-01 19:35:41.000000000 +0100
 @@ -0,0 +1,30 @@
 +	Standalone ECW 3.3 Drivers for GDAL
 +	===================================
@@ -1741,7 +116,7 @@
 +
 diff -urNad gdal-1.6.3~/frmts/ecw/pkg/aclocal.m4 gdal-1.6.3/frmts/ecw/pkg/aclocal.m4
 --- gdal-1.6.3~/frmts/ecw/pkg/aclocal.m4	1970-01-01 01:00:00.000000000 +0100
-+++ gdal-1.6.3/frmts/ecw/pkg/aclocal.m4	2009-12-01 00:24:42.000000000 +0100
++++ gdal-1.6.3/frmts/ecw/pkg/aclocal.m4	2009-12-01 19:35:41.000000000 +0100
 @@ -0,0 +1,202 @@
 +AC_DEFUN(AC_COMPILER_LOCALHACK,
 +[
@@ -1947,7 +322,7 @@
 +])
 diff -urNad gdal-1.6.3~/frmts/ecw/pkg/configure gdal-1.6.3/frmts/ecw/pkg/configure
 --- gdal-1.6.3~/frmts/ecw/pkg/configure	1970-01-01 01:00:00.000000000 +0100
-+++ gdal-1.6.3/frmts/ecw/pkg/configure	2009-12-01 00:24:42.000000000 +0100
++++ gdal-1.6.3/frmts/ecw/pkg/configure	2009-12-01 19:35:41.000000000 +0100
 @@ -0,0 +1,4498 @@
 +#! /bin/sh
 +# Guess values for system-dependent variables and create Makefiles.
@@ -6449,7 +4824,7 @@
 +
 diff -urNad gdal-1.6.3~/frmts/ecw/pkg/configure.in gdal-1.6.3/frmts/ecw/pkg/configure.in
 --- gdal-1.6.3~/frmts/ecw/pkg/configure.in	1970-01-01 01:00:00.000000000 +0100
-+++ gdal-1.6.3/frmts/ecw/pkg/configure.in	2009-12-01 00:24:42.000000000 +0100
++++ gdal-1.6.3/frmts/ecw/pkg/configure.in	2009-12-01 19:35:41.000000000 +0100
 @@ -0,0 +1,186 @@
 +dnl ***************************************************************************
 +dnl $Id: configure.in 9971 2006-08-23 20:06:02Z fwarmerdam $




More information about the Pkg-grass-devel mailing list