LTP GCOV extension - code coverage report
Current view: directory - gcore - gdalnodatamaskband.cpp
Test: gdal_filtered.info
Date: 2010-07-12 Instrumented lines: 81
Code covered: 82.7 % Executed lines: 67

       1                 : /******************************************************************************
       2                 :  * $Id: gdalnodatamaskband.cpp 19692 2010-05-13 17:16:55Z 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 19692 2010-05-13 17:16:55Z rouault $");
      34                 : 
      35                 : /************************************************************************/
      36                 : /*                        GDALNoDataMaskBand()                          */
      37                 : /************************************************************************/
      38                 : 
      39              76 : GDALNoDataMaskBand::GDALNoDataMaskBand( GDALRasterBand *poParent )
      40                 : 
      41                 : {
      42              76 :     poDS = NULL;
      43              76 :     nBand = 0;
      44                 : 
      45              76 :     nRasterXSize = poParent->GetXSize();
      46              76 :     nRasterYSize = poParent->GetYSize();
      47                 : 
      48              76 :     eDataType = GDT_Byte;
      49              76 :     poParent->GetBlockSize( &nBlockXSize, &nBlockYSize );
      50                 : 
      51              76 :     this->poParent = poParent;
      52              76 :     dfNoDataValue = poParent->GetNoDataValue();
      53              76 : }
      54                 : 
      55                 : /************************************************************************/
      56                 : /*                       ~GDALNoDataMaskBand()                          */
      57                 : /************************************************************************/
      58                 : 
      59              76 : GDALNoDataMaskBand::~GDALNoDataMaskBand()
      60                 : 
      61                 : {
      62              76 : }
      63                 : 
      64                 : /************************************************************************/
      65                 : /*                             IReadBlock()                             */
      66                 : /************************************************************************/
      67                 : 
      68                 : CPLErr GDALNoDataMaskBand::IReadBlock( int nXBlockOff, int nYBlockOff,
      69              29 :                                          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               0 :         return eErr;
     147                 : 
     148              29 :     int bIsNoDataNan = CPLIsNan(dfNoDataValue);
     149                 : 
     150                 : /* -------------------------------------------------------------------- */
     151                 : /*      Process different cases.                                        */
     152                 : /* -------------------------------------------------------------------- */
     153                 :     int i;
     154              29 :     switch( eWrkDT )
     155                 :     {
     156                 :       case GDT_Byte:
     157                 :       {
     158               7 :           GByte byNoData = (GByte) dfNoDataValue;
     159                 : 
     160            2408 :           for( i = nBlockXSize * nBlockYSize - 1; i >= 0; i-- )
     161                 :           {
     162            2401 :               if( pabySrc[i] == byNoData )
     163             158 :                   ((GByte *) pImage)[i] = 0;
     164                 :               else
     165            2243 :                   ((GByte *) pImage)[i] = 255;
     166                 :           }
     167                 :       }
     168               7 :       break;
     169                 : 
     170                 :       case GDT_UInt32:
     171                 :       {
     172               2 :           GUInt32 nNoData = (GUInt32) dfNoDataValue;
     173                 : 
     174               4 :           for( i = nBlockXSize * nBlockYSize - 1; i >= 0; i-- )
     175                 :           {
     176               2 :               if( ((GUInt32 *)pabySrc)[i] == nNoData )
     177               2 :                   ((GByte *) pImage)[i] = 0;
     178                 :               else
     179               0 :                   ((GByte *) pImage)[i] = 255;
     180                 :           }
     181                 :       }
     182               2 :       break;
     183                 : 
     184                 :       case GDT_Int32:
     185                 :       {
     186              16 :           GInt32 nNoData = (GInt32) dfNoDataValue;
     187                 : 
     188              88 :           for( i = nBlockXSize * nBlockYSize - 1; i >= 0; i-- )
     189                 :           {
     190              72 :               if( ((GInt32 *)pabySrc)[i] == nNoData )
     191              18 :                   ((GByte *) pImage)[i] = 0;
     192                 :               else
     193              54 :                   ((GByte *) pImage)[i] = 255;
     194                 :           }
     195                 :       }
     196              16 :       break;
     197                 : 
     198                 :       case GDT_Float32:
     199                 :       {
     200               2 :           float fNoData = (float) dfNoDataValue;
     201                 : 
     202               4 :           for( i = nBlockXSize * nBlockYSize - 1; i >= 0; i-- )
     203                 :           {
     204               2 :               float fVal =((float *)pabySrc)[i];
     205               2 :               if( bIsNoDataNan && CPLIsNan(fVal))
     206               0 :                   ((GByte *) pImage)[i] = 0;
     207               4 :               else if( EQUAL_TO_NODATA(fVal, fNoData) )
     208               2 :                   ((GByte *) pImage)[i] = 0;
     209                 :               else
     210               0 :                   ((GByte *) pImage)[i] = 255;
     211                 :           }
     212                 :       }
     213               2 :       break;
     214                 : 
     215                 :       case GDT_Float64:
     216                 :       {
     217               4 :           for( i = nBlockXSize * nBlockYSize - 1; i >= 0; i-- )
     218                 :           {
     219               2 :               double dfVal =((double *)pabySrc)[i];
     220               2 :               if( bIsNoDataNan && CPLIsNan(dfVal))
     221               0 :                   ((GByte *) pImage)[i] = 0;
     222               4 :               else if( EQUAL_TO_NODATA(dfVal, dfNoDataValue) )
     223               2 :                   ((GByte *) pImage)[i] = 0;
     224                 :               else
     225               0 :                   ((GByte *) pImage)[i] = 255;
     226                 :           }
     227                 :       }
     228               2 :       break;
     229                 : 
     230                 :       default:
     231               0 :         CPLAssert( FALSE );
     232                 :         break;
     233                 :     }
     234                 : 
     235              29 :     CPLFree( pabySrc );
     236                 : 
     237              29 :     return CE_None;
     238                 : }

Generated by: LTP GCOV extension version 1.5