LCOV - code coverage report
Current view: directory - gcore - gdalnodatamaskband.cpp (source / functions) Found Hit Coverage
Test: gdal_filtered.info Lines: 82 67 81.7 %
Date: 2011-12-18 Functions: 6 3 50.0 %

       1                 : /******************************************************************************
       2                 :  * $Id: gdalnodatamaskband.cpp 22857 2011-08-02 18:17:45Z rouault $
       3                 :  *
       4                 :  * Project:  GDAL Core
       5                 :  * Purpose:  Implementation of GDALNoDataMaskBand, a class implementing all
       6                 :  *           a default band mask based on nodata values.
       7                 :  * Author:   Frank Warmerdam, warmerdam@pobox.com
       8                 :  *
       9                 :  ******************************************************************************
      10                 :  * Copyright (c) 2007, Frank Warmerdam
      11                 :  *
      12                 :  * Permission is hereby granted, free of charge, to any person obtaining a
      13                 :  * copy of this software and associated documentation files (the "Software"),
      14                 :  * to deal in the Software without restriction, including without limitation
      15                 :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      16                 :  * and/or sell copies of the Software, and to permit persons to whom the
      17                 :  * Software is furnished to do so, subject to the following conditions:
      18                 :  *
      19                 :  * The above copyright notice and this permission notice shall be included
      20                 :  * in all copies or substantial portions of the Software.
      21                 :  *
      22                 :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
      23                 :  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      24                 :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
      25                 :  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      26                 :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      27                 :  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
      28                 :  * DEALINGS IN THE SOFTWARE.
      29                 :  ****************************************************************************/
      30                 : 
      31                 : #include "gdal_priv.h"
      32                 : 
      33                 : CPL_CVSID("$Id: gdalnodatamaskband.cpp 22857 2011-08-02 18:17:45Z rouault $");
      34                 : 
      35                 : /************************************************************************/
      36                 : /*                        GDALNoDataMaskBand()                          */
      37                 : /************************************************************************/
      38                 : 
      39              89 : GDALNoDataMaskBand::GDALNoDataMaskBand( GDALRasterBand *poParent )
      40                 : 
      41                 : {
      42              89 :     poDS = NULL;
      43              89 :     nBand = 0;
      44                 : 
      45              89 :     nRasterXSize = poParent->GetXSize();
      46              89 :     nRasterYSize = poParent->GetYSize();
      47                 : 
      48              89 :     eDataType = GDT_Byte;
      49              89 :     poParent->GetBlockSize( &nBlockXSize, &nBlockYSize );
      50                 : 
      51              89 :     this->poParent = poParent;
      52              89 :     dfNoDataValue = poParent->GetNoDataValue();
      53              89 : }
      54                 : 
      55                 : /************************************************************************/
      56                 : /*                       ~GDALNoDataMaskBand()                          */
      57                 : /************************************************************************/
      58                 : 
      59              89 : GDALNoDataMaskBand::~GDALNoDataMaskBand()
      60                 : 
      61                 : {
      62              89 : }
      63                 : 
      64                 : /************************************************************************/
      65                 : /*                             IReadBlock()                             */
      66                 : /************************************************************************/
      67                 : 
      68              29 : CPLErr GDALNoDataMaskBand::IReadBlock( int nXBlockOff, int nYBlockOff,
      69                 :                                          void * pImage )
      70                 : 
      71                 : {
      72                 :     GDALDataType eWrkDT;
      73                 :   
      74                 : /* -------------------------------------------------------------------- */
      75                 : /*      Decide on a working type.                                       */
      76                 : /* -------------------------------------------------------------------- */
      77              29 :     switch( poParent->GetRasterDataType() ) 
      78                 :     {
      79                 :       case GDT_Byte:
      80               7 :         eWrkDT = GDT_Byte;
      81               7 :         break;
      82                 : 
      83                 :       case GDT_UInt16:
      84                 :       case GDT_UInt32:
      85               2 :         eWrkDT = GDT_UInt32;
      86               2 :         break;
      87                 : 
      88                 :       case GDT_Int16:
      89                 :       case GDT_Int32:
      90                 :       case GDT_CInt16:
      91                 :       case GDT_CInt32:
      92              16 :         eWrkDT = GDT_Int32;
      93              16 :         break;
      94                 : 
      95                 :       case GDT_Float32:
      96                 :       case GDT_CFloat32:
      97               2 :         eWrkDT = GDT_Float32;
      98               2 :         break;
      99                 :     
     100                 :       case GDT_Float64:
     101                 :       case GDT_CFloat64:
     102               2 :         eWrkDT = GDT_Float64;
     103               2 :         break;
     104                 :     
     105                 :       default:
     106               0 :         CPLAssert( FALSE );
     107               0 :         eWrkDT = GDT_Float64;
     108                 :         break;
     109                 :     }
     110                 : 
     111                 : /* -------------------------------------------------------------------- */
     112                 : /*      Read the image data.                                            */
     113                 : /* -------------------------------------------------------------------- */
     114                 :     GByte *pabySrc;
     115                 :     CPLErr eErr;
     116                 : 
     117              29 :     pabySrc = (GByte *) VSIMalloc3( GDALGetDataTypeSize(eWrkDT)/8, nBlockXSize, nBlockYSize );
     118              29 :     if (pabySrc == NULL)
     119                 :     {
     120                 :         CPLError( CE_Failure, CPLE_OutOfMemory,
     121               0 :                   "GDALNoDataMaskBand::IReadBlock: Out of memory for buffer." );
     122               0 :         return CE_Failure;
     123                 :     }
     124                 : 
     125                 : 
     126              29 :     int nXSizeRequest = nBlockXSize;
     127              29 :     if (nXBlockOff * nBlockXSize + nBlockXSize > nRasterXSize)
     128               0 :         nXSizeRequest = nRasterXSize - nXBlockOff * nBlockXSize;
     129              29 :     int nYSizeRequest = nBlockYSize;
     130              29 :     if (nYBlockOff * nBlockYSize + nBlockYSize > nRasterYSize)
     131               0 :         nYSizeRequest = nRasterYSize - nYBlockOff * nBlockYSize;
     132                 : 
     133              29 :     if (nXSizeRequest != nBlockXSize || nYSizeRequest != nBlockYSize)
     134                 :     {
     135                 :         /* memset the whole buffer to avoid Valgrind warnings in case we can't */
     136                 :         /* fetch a full block */
     137               0 :         memset(pabySrc, 0, GDALGetDataTypeSize(eWrkDT)/8 * nBlockXSize * nBlockYSize );
     138                 :     }
     139                 : 
     140                 :     eErr = poParent->RasterIO( GF_Read,
     141                 :                                nXBlockOff * nBlockXSize, nYBlockOff * nBlockYSize,
     142                 :                                nXSizeRequest, nYSizeRequest,
     143                 :                                pabySrc, nXSizeRequest, nYSizeRequest,
     144              29 :                                eWrkDT, 0, nBlockXSize * (GDALGetDataTypeSize(eWrkDT)/8) );
     145              29 :     if( eErr != CE_None )
     146                 :     {
     147               0 :         CPLFree(pabySrc);
     148               0 :         return eErr;
     149                 :     }
     150                 : 
     151              29 :     int bIsNoDataNan = CPLIsNan(dfNoDataValue);
     152                 : 
     153                 : /* -------------------------------------------------------------------- */
     154                 : /*      Process different cases.                                        */
     155                 : /* -------------------------------------------------------------------- */
     156                 :     int i;
     157              29 :     switch( eWrkDT )
     158                 :     {
     159                 :       case GDT_Byte:
     160                 :       {
     161               7 :           GByte byNoData = (GByte) dfNoDataValue;
     162                 : 
     163            2408 :           for( i = nBlockXSize * nBlockYSize - 1; i >= 0; i-- )
     164                 :           {
     165            2401 :               if( pabySrc[i] == byNoData )
     166             158 :                   ((GByte *) pImage)[i] = 0;
     167                 :               else
     168            2243 :                   ((GByte *) pImage)[i] = 255;
     169                 :           }
     170                 :       }
     171               7 :       break;
     172                 : 
     173                 :       case GDT_UInt32:
     174                 :       {
     175               2 :           GUInt32 nNoData = (GUInt32) dfNoDataValue;
     176                 : 
     177               4 :           for( i = nBlockXSize * nBlockYSize - 1; i >= 0; i-- )
     178                 :           {
     179               2 :               if( ((GUInt32 *)pabySrc)[i] == nNoData )
     180               2 :                   ((GByte *) pImage)[i] = 0;
     181                 :               else
     182               0 :                   ((GByte *) pImage)[i] = 255;
     183                 :           }
     184                 :       }
     185               2 :       break;
     186                 : 
     187                 :       case GDT_Int32:
     188                 :       {
     189              16 :           GInt32 nNoData = (GInt32) dfNoDataValue;
     190                 : 
     191              88 :           for( i = nBlockXSize * nBlockYSize - 1; i >= 0; i-- )
     192                 :           {
     193              72 :               if( ((GInt32 *)pabySrc)[i] == nNoData )
     194              18 :                   ((GByte *) pImage)[i] = 0;
     195                 :               else
     196              54 :                   ((GByte *) pImage)[i] = 255;
     197                 :           }
     198                 :       }
     199              16 :       break;
     200                 : 
     201                 :       case GDT_Float32:
     202                 :       {
     203               2 :           float fNoData = (float) dfNoDataValue;
     204                 : 
     205               4 :           for( i = nBlockXSize * nBlockYSize - 1; i >= 0; i-- )
     206                 :           {
     207               2 :               float fVal =((float *)pabySrc)[i];
     208               2 :               if( bIsNoDataNan && CPLIsNan(fVal))
     209               0 :                   ((GByte *) pImage)[i] = 0;
     210               4 :               else if( ARE_REAL_EQUAL(fVal, fNoData) )
     211               2 :                   ((GByte *) pImage)[i] = 0;
     212                 :               else
     213               0 :                   ((GByte *) pImage)[i] = 255;
     214                 :           }
     215                 :       }
     216               2 :       break;
     217                 : 
     218                 :       case GDT_Float64:
     219                 :       {
     220               4 :           for( i = nBlockXSize * nBlockYSize - 1; i >= 0; i-- )
     221                 :           {
     222               2 :               double dfVal =((double *)pabySrc)[i];
     223               2 :               if( bIsNoDataNan && CPLIsNan(dfVal))
     224               0 :                   ((GByte *) pImage)[i] = 0;
     225               4 :               else if( ARE_REAL_EQUAL(dfVal, dfNoDataValue) )
     226               2 :                   ((GByte *) pImage)[i] = 0;
     227                 :               else
     228               0 :                   ((GByte *) pImage)[i] = 255;
     229                 :           }
     230                 :       }
     231               2 :       break;
     232                 : 
     233                 :       default:
     234               0 :         CPLAssert( FALSE );
     235                 :         break;
     236                 :     }
     237                 : 
     238              29 :     CPLFree( pabySrc );
     239                 : 
     240              29 :     return CE_None;
     241                 : }

Generated by: LCOV version 1.7