LCOV - code coverage report
Current view: directory - gcore - gdalnodatamaskband.cpp (source / functions) Found Hit Coverage
Test: gdal_filtered.info Lines: 71 61 85.9 %
Date: 2010-01-09 Functions: 4 4 100.0 %

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

Generated by: LCOV version 1.7