Skip to content

Instantly share code, notes, and snippets.

@schwehr
Created July 7, 2016 18:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save schwehr/80cc125706666a4201f4834ac7a703ec to your computer and use it in GitHub Desktop.
Save schwehr/80cc125706666a4201f4834ac7a703ec to your computer and use it in GitHub Desktop.
Cleanup of pixelfunctions now that it is C++ code.
/******************************************************************************
*
* Project: GDAL
* Purpose: Implementation of a set of GDALDerivedPixelFunc(s) to be used
* with source raster band of virtual GDAL datasets.
* Author: Antonio Valentino <antonio.valentino@tiscali.it>
*
******************************************************************************
* Copyright (c) 2008-2014 Antonio Valentino <antonio.valentino@tiscali.it>
*
* 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 <cmath>
#include "gdal.h"
#include "gdal_vrt.h"
static CPLErr RealPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr ImagPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr ComplexPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr ModulePixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr PhasePixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr ConjPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr SumPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr DiffPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr MulPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr CMulPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr InvPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr IntensityPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr SqrtPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr Log10PixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr dB2AmpPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr dB2PowPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace );
static CPLErr PowPixelFuncHelper( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace,
double base, double fact );
static CPLErr RealPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace )
{
/* ---- Init ---- */
if( nSources != 1 ) return CE_Failure;
const int nPixelSpaceSrc = GDALGetDataTypeSizeBytes( eSrcType );
const int nLineSpaceSrc = nPixelSpaceSrc * nXSize;
/* ---- Set pixels ---- */
for( int iLine = 0; iLine < nYSize; ++iLine ) {
GDALCopyWords(
static_cast<GByte *>(papoSources[0]) + nLineSpaceSrc * iLine,
eSrcType, nPixelSpaceSrc,
static_cast<GByte *>(pData) + nLineSpace * iLine,
eBufType, nPixelSpace, nXSize );
}
/* ---- Return success ---- */
return CE_None;
} // RealPixelFunc
static CPLErr ImagPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace )
{
/* ---- Init ---- */
if( nSources != 1 ) return CE_Failure;
if( GDALDataTypeIsComplex( eSrcType ) )
{
const int nPixelSpaceSrc = GDALGetDataTypeSizeBytes( eSrcType );
const int nLineSpaceSrc = nPixelSpaceSrc * nXSize;
void* pImag = static_cast<GByte *>(papoSources[0])
+ GDALGetDataTypeSizeBytes( eSrcType ) / 2;
/* ---- Set pixels ---- */
for( int iLine = 0; iLine < nYSize; ++iLine )
{
GDALCopyWords(
static_cast<GByte *>(pImag) + nLineSpaceSrc * iLine,
eSrcType, nPixelSpaceSrc,
static_cast<GByte *>(pData) + nLineSpace * iLine,
eBufType, nPixelSpace, nXSize );
}
}
else
{
const double dfImag = 0;
/* ---- Set pixels ---- */
for( int iLine = 0; iLine < nYSize; ++iLine )
{
// Always copy from the same location.
GDALCopyWords(
&dfImag, eSrcType, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine,
eBufType, nPixelSpace, nXSize);
}
}
/* ---- Return success ---- */
return CE_None;
} // ImagPixelFunc
static CPLErr ComplexPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace )
{
void *pReal = papoSources[0];
void *pImag = papoSources[1];
/* ---- Init ---- */
if( nSources != 2 ) return CE_Failure;
/* ---- Set pixels ---- */
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
const double adfPixVal[2] = {
SRCVAL(pReal, eSrcType, ii), // re
SRCVAL(pImag, eSrcType, ii) // im
};
GDALCopyWords(adfPixVal, GDT_CFloat64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1);
}
}
/* ---- Return success ---- */
return CE_None;
} // MakeComplexPixelFunc
static CPLErr ModulePixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace )
{
/* ---- Init ---- */
if( nSources != 1 ) return CE_Failure;
if( GDALDataTypeIsComplex( eSrcType ) )
{
double dfReal, dfImag;
void *pReal = papoSources[0];
void *pImag = static_cast<GByte *>(papoSources[0])
+ GDALGetDataTypeSizeBytes( eSrcType ) / 2;
/* ---- Set pixels ---- */
for( int iLine = 0, ii = 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
dfReal = SRCVAL(pReal, eSrcType, ii);
dfImag = SRCVAL(pImag, eSrcType, ii);
const double dfPixVal =
sqrt( dfReal * dfReal + dfImag * dfImag );
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1 );
}
}
}
else
{
/* ---- Set pixels ---- */
for( int iLine = 0, ii = 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
const double dfPixVal =
fabs(SRCVAL(papoSources[0], eSrcType, ii));
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1 );
}
}
}
/* ---- Return success ---- */
return CE_None;
} // ModulePixelFunc
static CPLErr PhasePixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace )
{
/* ---- Init ---- */
if( nSources != 1 ) return CE_Failure;
if( GDALDataTypeIsComplex( eSrcType ) )
{
const void * const pReal = papoSources[0];
const void * const pImag = static_cast<GByte *>(papoSources[0])
+ GDALGetDataTypeSizeBytes( eSrcType ) / 2;
/* ---- Set pixels ---- */
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
const double dfReal = SRCVAL(pReal, eSrcType, ii);
const double dfImag = SRCVAL(pImag, eSrcType, ii);
const double dfPixVal = atan2(dfImag, dfReal);
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1 );
}
}
}
else
{
/* ---- Set pixels ---- */
const double pi = atan2(0, -1); // TODO(schwehr): Replace with const.
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
const void * const pReal = papoSources[0];
// Source raster pixels may be obtained with SRCVAL macro.
const double dfReal = SRCVAL(pReal, eSrcType, ii);
const double dfPixVal = (dfReal < 0) ? pi : 0;
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1 );
}
}
}
/* ---- Return success ---- */
return CE_None;
} // PhasePixelFunc
static CPLErr ConjPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace )
{
/* ---- Init ---- */
if( nSources != 1 ) return CE_Failure;
if( GDALDataTypeIsComplex( eSrcType ) && GDALDataTypeIsComplex( eBufType ) )
{
const int nOffset = GDALGetDataTypeSizeBytes( eSrcType ) / 2;
const void * const pReal = papoSources[0];
const void * const pImag =
static_cast<GByte *>(papoSources[0]) + nOffset;
/* ---- Set pixels ---- */
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
const double adfPixVal[2] = {
+SRCVAL(pReal, eSrcType, ii), // re
-SRCVAL(pImag, eSrcType, ii) // im
};
GDALCopyWords(
adfPixVal, GDT_CFloat64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1 );
}
}
}
else
{
// No complex data type.
return RealPixelFunc(papoSources, nSources, pData, nXSize, nYSize,
eSrcType, eBufType, nPixelSpace, nLineSpace);
}
/* ---- Return success ---- */
return CE_None;
} // ConjPixelFunc
static CPLErr SumPixelFunc(void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace)
{
/* ---- Init ---- */
if( nSources < 2 ) return CE_Failure;
/* ---- Set pixels ---- */
if( GDALDataTypeIsComplex( eSrcType ) )
{
const int nOffset = GDALGetDataTypeSizeBytes( eSrcType ) / 2;
/* ---- Set pixels ---- */
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
double adfSum[2] = { 0.0, 0.0 };
for( int iSrc = 0; iSrc < nSources; ++iSrc ) {
const void * const pReal = papoSources[iSrc];
const void * const pImag =
static_cast<const GByte *>(pReal) + nOffset;
// Source raster pixels may be obtained with SRCVAL macro.
adfSum[0] += SRCVAL(pReal, eSrcType, ii);
adfSum[1] += SRCVAL(pImag, eSrcType, ii);
}
GDALCopyWords(
adfSum, GDT_CFloat64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1);
}
}
}
else
{
/* ---- Set pixels ---- */
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
double dfSum = 0; // Not complex.
for( int iSrc = 0; iSrc < nSources; ++iSrc ) {
// Source raster pixels may be obtained with SRCVAL macro.
dfSum += SRCVAL(papoSources[iSrc], eSrcType, ii);
}
GDALCopyWords(
&dfSum, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1);
}
}
}
/* ---- Return success ---- */
return CE_None;
} /* SumPixelFunc */
static CPLErr DiffPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace)
{
/* ---- Init ---- */
if( nSources != 2 ) return CE_Failure;
if( GDALDataTypeIsComplex( eSrcType ) )
{
int nOffset = GDALGetDataTypeSizeBytes( eSrcType ) / 2;
void *pReal0 = papoSources[0];
void *pImag0 = static_cast<GByte *>(papoSources[0]) + nOffset;
void *pReal1 = papoSources[1];
void *pImag1 = static_cast<GByte *>(papoSources[1]) + nOffset;
/* ---- Set pixels ---- */
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
double adfPixVal[2] = {
SRCVAL(pReal0, eSrcType, ii)
- SRCVAL(pReal1, eSrcType, ii),
SRCVAL(pImag0, eSrcType, ii)
- SRCVAL(pImag1, eSrcType, ii)
};
GDALCopyWords(
adfPixVal, GDT_CFloat64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1 );
}
}
}
else
{
/* ---- Set pixels ---- */
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
// Not complex.
const double dfPixVal = SRCVAL(papoSources[0], eSrcType, ii)
- SRCVAL(papoSources[1], eSrcType, ii);
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1);
}
}
}
/* ---- Return success ---- */
return CE_None;
} // DiffPixelFunc
static CPLErr MulPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace)
{
/* ---- Init ---- */
if( nSources < 2 ) return CE_Failure;
/* ---- Set pixels ---- */
if( GDALDataTypeIsComplex( eSrcType ) )
{
const int nOffset = GDALGetDataTypeSizeBytes( eSrcType ) / 2;
/* ---- Set pixels ---- */
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
double adfPixVal[2] = { 1.0, 0.0 };
for( int iSrc = 0; iSrc < nSources; ++iSrc ) {
const void * const pReal = papoSources[iSrc];
const void * const pImag =
static_cast<const GByte *>(pReal) + nOffset;
const double dfOldR = adfPixVal[0];
const double dfOldI = adfPixVal[1];
// Source raster pixels may be obtained with SRCVAL macro.
const double dfNewR = SRCVAL(pReal, eSrcType, ii);
const double dfNewI = SRCVAL(pImag, eSrcType, ii);
adfPixVal[0] = dfOldR * dfNewR - dfOldI * dfNewI;
adfPixVal[1] = dfOldR * dfNewI + dfOldI * dfNewR;
}
GDALCopyWords(
adfPixVal, GDT_CFloat64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1);
}
}
}
else
{
/* ---- Set pixels ---- */
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
double dfPixVal = 1.0; // Not complex.
for( int iSrc = 0; iSrc < nSources; ++iSrc ) {
// Source raster pixels may be obtained with SRCVAL macro.
dfPixVal *= SRCVAL(papoSources[iSrc], eSrcType, ii);
}
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1);
}
}
}
/* ---- Return success ---- */
return CE_None;
} // MulPixelFunc
static CPLErr CMulPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace )
{
/* ---- Init ---- */
if( nSources != 2 ) return CE_Failure;
/* ---- Set pixels ---- */
if( GDALDataTypeIsComplex( eSrcType ) )
{
const int nOffset = GDALGetDataTypeSizeBytes( eSrcType ) / 2;
const void * const pReal0 = papoSources[0];
const void * const pImag0 =
static_cast<GByte *>(papoSources[0]) + nOffset;
const void * const pReal1 = papoSources[1];
const void * const pImag1 =
static_cast<GByte *>(papoSources[1]) + nOffset;
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
const double dfReal0 = SRCVAL(pReal0, eSrcType, ii);
const double dfReal1 = SRCVAL(pReal1, eSrcType, ii);
const double dfImag0 = SRCVAL(pImag0, eSrcType, ii);
const double dfImag1 = SRCVAL(pImag1, eSrcType, ii);
const double adfPixVal[2] = {
dfReal0 * dfReal1 + dfImag0 * dfImag1,
dfReal1 * dfImag0 - dfReal0 * dfImag1
};
GDALCopyWords(
adfPixVal, GDT_CFloat64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1 );
}
}
}
else
{
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
// Not complex.
const double adfPixVal[2] = {
SRCVAL(papoSources[0], eSrcType, ii)
* SRCVAL(papoSources[1], eSrcType, ii),
0.0
};
GDALCopyWords(
adfPixVal, GDT_CFloat64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1 );
}
}
}
/* ---- Return success ---- */
return CE_None;
} // CMulPixelFunc
static CPLErr InvPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace )
{
/* ---- Init ---- */
if( nSources != 1 ) return CE_Failure;
/* ---- Set pixels ---- */
if( GDALDataTypeIsComplex( eSrcType ) )
{
const int nOffset = GDALGetDataTypeSizeBytes( eSrcType ) / 2;
const void * const pReal = papoSources[0];
const void * const pImag =
static_cast<GByte *>(papoSources[0]) + nOffset;
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
const double dfReal = SRCVAL(pReal, eSrcType, ii);
const double dfImag = SRCVAL(pImag, eSrcType, ii);
const double dfAux = dfReal * dfReal + dfImag * dfImag;
const double adfPixVal[2] = { dfReal / dfAux, -dfImag / dfAux };
GDALCopyWords(
adfPixVal, GDT_CFloat64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1);
}
}
}
else
{
/* ---- Set pixels ---- */
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
// Not complex.
const double dfPixVal =
1.0 / SRCVAL(papoSources[0], eSrcType, ii);
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1 );
}
}
}
/* ---- Return success ---- */
return CE_None;
} // InvPixelFunc
static CPLErr IntensityPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace )
{
/* ---- Init ---- */
if( nSources != 1 ) return CE_Failure;
if( GDALDataTypeIsComplex( eSrcType ) )
{
const int nOffset = GDALGetDataTypeSizeBytes( eSrcType ) / 2;
const void * const pReal = papoSources[0];
const void * const pImag =
static_cast<GByte *>(papoSources[0]) + nOffset;
/* ---- Set pixels ---- */
for( int iLine = 0, ii = 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
const double dfReal = SRCVAL(pReal, eSrcType, ii);
const double dfImag = SRCVAL(pImag, eSrcType, ii);
const double dfPixVal = dfReal * dfReal + dfImag * dfImag;
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1);
}
}
}
else
{
/* ---- Set pixels ---- */
for( int iLine = 0, ii = 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
double dfPixVal = SRCVAL(papoSources[0], eSrcType, ii);
dfPixVal *= dfPixVal;
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1);
}
}
}
/* ---- Return success ---- */
return CE_None;
} // IntensityPixelFunc
static CPLErr SqrtPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace )
{
/* ---- Init ---- */
if( nSources != 1 ) return CE_Failure;
if( GDALDataTypeIsComplex( eSrcType ) ) return CE_Failure;
/* ---- Set pixels ---- */
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
const double dfPixVal =
sqrt( SRCVAL(papoSources[0], eSrcType, ii) );
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1);
}
}
/* ---- Return success ---- */
return CE_None;
} // SqrtPixelFunc
static CPLErr Log10PixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace)
{
/* ---- Init ---- */
if( nSources != 1 ) return CE_Failure;
if( GDALDataTypeIsComplex( eSrcType ) )
{
// Complex input datatype.
const int nOffset = GDALGetDataTypeSizeBytes( eSrcType ) / 2;
const void * const pReal = papoSources[0];
const void * const pImag =
static_cast<GByte *>(papoSources[0]) + nOffset;
/* ---- Set pixels ---- */
for( int iLine = 0, ii = 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
const double dfReal = SRCVAL(pReal, eSrcType, ii);
const double dfImag = SRCVAL(pImag, eSrcType, ii);
const double dfPixVal =
log10( dfReal * dfReal + dfImag * dfImag );
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1 );
}
}
}
else
{
/* ---- Set pixels ---- */
for( int iLine = 0, ii = 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
const double dfPixVal =
log10( fabs( SRCVAL(papoSources[0], eSrcType, ii) ) );
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1 );
}
}
}
/* ---- Return success ---- */
return CE_None;
} // Log10PixelFunc
static CPLErr PowPixelFuncHelper( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace,
double base, double fact )
{
/* ---- Init ---- */
if( nSources != 1 ) return CE_Failure;
if( GDALDataTypeIsComplex( eSrcType ) ) return CE_Failure;
/* ---- Set pixels ---- */
for( int iLine = 0, ii= 0; iLine < nYSize; ++iLine ) {
for( int iCol = 0; iCol < nXSize; ++iCol, ++ii ) {
// Source raster pixels may be obtained with SRCVAL macro.
const double dfPixVal =
pow(base, SRCVAL(papoSources[0], eSrcType, ii) / fact);
GDALCopyWords(
&dfPixVal, GDT_Float64, 0,
static_cast<GByte *>(pData) + nLineSpace * iLine +
iCol * nPixelSpace, eBufType, nPixelSpace, 1);
}
}
/* ---- Return success ---- */
return CE_None;
} // PowPixelFuncHelper
static CPLErr dB2AmpPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace )
{
return PowPixelFuncHelper(papoSources, nSources, pData,
nXSize, nYSize, eSrcType, eBufType,
nPixelSpace, nLineSpace, 10.0, 20.0);
} // dB2AmpPixelFunc
static CPLErr dB2PowPixelFunc( void **papoSources, int nSources, void *pData,
int nXSize, int nYSize,
GDALDataType eSrcType, GDALDataType eBufType,
int nPixelSpace, int nLineSpace )
{
return PowPixelFuncHelper(papoSources, nSources, pData,
nXSize, nYSize, eSrcType, eBufType,
nPixelSpace, nLineSpace, 10.0, 10.0);
} // dB2PowPixelFunc
/************************************************************************/
/* GDALRegisterDefaultPixelFunc() */
/************************************************************************/
/**
* This adds a default set of pixel functions to the global list of
* available pixel functions for derived bands:
*
* - "real": extract real part from a single raster band (just a copy if the
* input is non-complex)
* - "imag": extract imaginary part from a single raster band (0 for
* non-complex)
* - "complex": make a complex band merging two bands used as real and
* imag values
* - "mod": extract module from a single raster band (real or complex)
* - "phase": extract phase from a single raster band (0 for non-complex)
* - "conj": computes the complex conjugate of a single raster band (just a
* copy if the input is non-complex)
* - "sum": sum 2 or more raster bands
* - "diff": computes the difference between 2 raster bands (b1 - b2)
* - "mul": multiply 2 or more raster bands
* - "cmul": multiply the first band for the complex conjugate of the second
* - "inv": inverse (1./x). Note: no check is performed on zero division
* - "intensity": computes the intensity Re(x*conj(x)) of a single raster band
* (real or complex)
* - "sqrt": perform the square root of a single raster band (real only)
* - "log10": compute the logarithm (base 10) of the abs of a single raster
* band (real or complex): log10( abs( x ) )
* - "dB2amp": perform scale conversion from logarithmic to linear
* (amplitude) (i.e. 10 ^ ( x / 20 ) ) of a single raster
* band (real only)
* - "dB2pow": perform scale conversion from logarithmic to linear
* (power) (i.e. 10 ^ ( x / 10 ) ) of a single raster
* band (real only)
*
* @see GDALAddDerivedBandPixelFunc
*
* @return CE_None, invalid (NULL) parameters are currently ignored.
*/
CPLErr CPL_STDCALL GDALRegisterDefaultPixelFunc( void )
{
GDALAddDerivedBandPixelFunc("real", RealPixelFunc);
GDALAddDerivedBandPixelFunc("imag", ImagPixelFunc);
GDALAddDerivedBandPixelFunc("complex", ComplexPixelFunc);
GDALAddDerivedBandPixelFunc("mod", ModulePixelFunc);
GDALAddDerivedBandPixelFunc("phase", PhasePixelFunc);
GDALAddDerivedBandPixelFunc("conj", ConjPixelFunc);
GDALAddDerivedBandPixelFunc("sum", SumPixelFunc);
GDALAddDerivedBandPixelFunc("diff", DiffPixelFunc);
GDALAddDerivedBandPixelFunc("mul", MulPixelFunc);
GDALAddDerivedBandPixelFunc("cmul", CMulPixelFunc);
GDALAddDerivedBandPixelFunc("inv", InvPixelFunc);
GDALAddDerivedBandPixelFunc("intensity", IntensityPixelFunc);
GDALAddDerivedBandPixelFunc("sqrt", SqrtPixelFunc);
GDALAddDerivedBandPixelFunc("log10", Log10PixelFunc);
GDALAddDerivedBandPixelFunc("dB2amp", dB2AmpPixelFunc);
GDALAddDerivedBandPixelFunc("dB2pow", dB2PowPixelFunc);
return CE_None;
}
@schwehr
Copy link
Author

schwehr commented Jul 7, 2016

Changes:

  • Sort includes
  • #include <math.h> -> #include
  • Format fixes
  • Fit to 80 cols
  • Localize variables
  • Combine definition and initialization
  • Add const where possible
  • Deprecated GDALGetDataTypeSize( eSrcType ) / 8 -> GDALGetDataTypeSizeBytes()
  • Define loop variables in for
  • /* */ -> // for non --- comments
  • C casts -> C++ casts
  • Spelling: multilpy -> multiply

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment