54 changes: 23 additions & 31 deletions src/core/raster/qgscubicrasterresampler.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,40 +25,32 @@ class QgsCubicRasterResampler: public QgsRasterResampler
public:
QgsCubicRasterResampler();
~QgsCubicRasterResampler();
void resample( const QImage& srcImage, QImage& dstImage ) const;
void resample( const QImage& srcImage, QImage& dstImage );

private:
static void xDerivativeMatrix( int nCols, int nRows, double* matrix, const int* colorMatrix );
template <class T> void yDerivativeMatrix( int nCols, int nRows, double* dstMatrix, const T* srcMatrix ) const;
static int cubicInterpolation( double p1, double p2, double p3, double p4, double p1x, double p2x, double p3x, double p4x,
double p1y, double p2y, double p3y, double p4y, double p1xy, double p2xy, double p3xy, double p4xy );
static void yDerivativeMatrix( int nCols, int nRows, double* matrix, const int* colorMatrix );

void calculateControlPoints( int nCols, int nRows, int currentRow, int currentCol, int* redMatrix, int* greenMatrix, int* blueMatrix,
double* xDerivativeMatrixRed, double* xDerivativeMatrixGreen, double* xDerivativeMatrixBlue,
double* yDerivativeMatrixRed, double* yDerivativeMatrixGreen, double* yDerivativeMatrixBlue );

static double calcBernsteinPoly( int n, int i, double t );
static int lower( int n, int i );
static double power( double a, int b );//calculates a power b
static int faculty( int n );

//control points

//red
double cRed00; double cRed10; double cRed20; double cRed30; double cRed01; double cRed11; double cRed21; double cRed31;
double cRed02; double cRed12; double cRed22; double cRed32; double cRed03; double cRed13; double cRed23; double cRed33;
//green
double cGreen00; double cGreen10; double cGreen20; double cGreen30; double cGreen01; double cGreen11; double cGreen21; double cGreen31;
double cGreen02; double cGreen12; double cGreen22; double cGreen32; double cGreen03; double cGreen13; double cGreen23; double cGreen33;
//blue
double cBlue00; double cBlue10; double cBlue20; double cBlue30; double cBlue01; double cBlue11; double cBlue21; double cBlue31;
double cBlue02; double cBlue12; double cBlue22; double cBlue32; double cBlue03; double cBlue13; double cBlue23; double cBlue33;
};

template <class T> void QgsCubicRasterResampler::yDerivativeMatrix( int nCols, int nRows, double* dstMatrix, const T* srcMatrix ) const
{
double val;
int index = 0;

for( int i = 0; i < nRows; ++i )
{
for( int j = 0; j < nCols; ++j )
{
if( i == 0 )
{
val = srcMatrix[ index + nRows ] - srcMatrix[ index ];
}
else if( i == nRows - 1 )
{
val = srcMatrix[ index ] - srcMatrix[ index - nRows ];
}
else
{
val = ( srcMatrix[ index + nRows ] - srcMatrix[ index - nRows ] ) / 2.0;
}
dstMatrix[index] = val;
++index;
}
}
}

#endif // QGSCUBICRASTERRESAMPLER_H
3 changes: 2 additions & 1 deletion src/core/raster/qgsrasterlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -942,7 +942,8 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
int red = bandNumber( mRedBandName );
int green = bandNumber( mGreenBandName );
int blue = bandNumber( mBlueBandName );
QgsBilinearRasterResampler resampler;
//QgsBilinearRasterResampler resampler;
QgsCubicRasterResampler resampler;
QgsMultiBandColorRenderer r( mDataProvider, red, green, blue, &resampler );
r.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
#if 0
Expand Down
2 changes: 1 addition & 1 deletion src/core/raster/qgsrasterresampler.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class QImage;
class QgsRasterResampler
{
public:
virtual void resample( const QImage& srcImage, QImage& dstImage ) const = 0;
virtual void resample( const QImage& srcImage, QImage& dstImage ) = 0;
};

#endif // QGSRASTERRESAMPLER_H