Skip to content

Commit

Permalink
Consider alpha channel for bilinear and cubic resampling
Browse files Browse the repository at this point in the history
  • Loading branch information
mhugent committed Jan 1, 2012
1 parent cc9bc52 commit be97ca4
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 47 deletions.
32 changes: 18 additions & 14 deletions src/core/raster/qgsbilinearrasterresampler.cpp
Expand Up @@ -51,47 +51,47 @@ void QgsBilinearRasterResampler::resample( const QImage& srcImage, QImage& dstIm
u = currentSrcCol - currentSrcColInt;

//handle eight edge-cases
if( currentSrcRowInt < 0 || currentSrcRowInt >= (srcImage.height() - 1) || currentSrcColInt < 0 || currentSrcColInt >= (srcImage.width() - 1) )
if ( currentSrcRowInt < 0 || currentSrcRowInt >= ( srcImage.height() - 1 ) || currentSrcColInt < 0 || currentSrcColInt >= ( srcImage.width() - 1 ) )
{
//pixels at the border of the source image needs to be handled in a special way
if( currentSrcRowInt < 0 && currentSrcColInt < 0 )
if ( currentSrcRowInt < 0 && currentSrcColInt < 0 )
{
dstImage.setPixel( j, i, srcImage.pixel(0, 0) );
dstImage.setPixel( j, i, srcImage.pixel( 0, 0 ) );
}
else if( currentSrcRowInt < 0 && currentSrcColInt >= ( srcImage.width() - 1 ) )
else if ( currentSrcRowInt < 0 && currentSrcColInt >= ( srcImage.width() - 1 ) )
{
dstImage.setPixel( j, i, srcImage.pixel( srcImage.width() - 1, 0 ) );
}
else if( currentSrcRowInt >= (srcImage.height() - 1) && currentSrcColInt >= ( srcImage.width() - 1 ) )
else if ( currentSrcRowInt >= ( srcImage.height() - 1 ) && currentSrcColInt >= ( srcImage.width() - 1 ) )
{
dstImage.setPixel( j, i, srcImage.pixel( srcImage.width() - 1, srcImage.height() - 1 ) );
}
else if( currentSrcRowInt >= (srcImage.height() - 1) && currentSrcColInt < 0 )
else if ( currentSrcRowInt >= ( srcImage.height() - 1 ) && currentSrcColInt < 0 )
{
dstImage.setPixel( j, i, srcImage.pixel( 0, srcImage.height() - 1 ) );
}
else if( currentSrcRowInt < 0 )
else if ( currentSrcRowInt < 0 )
{
px1 = srcImage.pixel( currentSrcColInt, 0 );
px2 = srcImage.pixel( currentSrcColInt + 1, 0 );
dstImage.setPixel( j, i, resampleColorValue( u, px1, px2 ) );
}
else if( currentSrcRowInt >= (srcImage.height() - 1) )
else if ( currentSrcRowInt >= ( srcImage.height() - 1 ) )
{
px1 = srcImage.pixel( currentSrcColInt, srcImage.height() - 1 );
px2 = srcImage.pixel( currentSrcColInt + 1, srcImage.height() - 1 );
dstImage.setPixel( j, i, resampleColorValue( u, px1, px2 ) );
}
else if( currentSrcColInt < 0 )
else if ( currentSrcColInt < 0 )
{
px1 = srcImage.pixel( 0, currentSrcRowInt );
px2 = srcImage.pixel( 0, currentSrcRowInt + 1);
px2 = srcImage.pixel( 0, currentSrcRowInt + 1 );
dstImage.setPixel( j, i, resampleColorValue( v, px1, px2 ) );
}
else if( currentSrcColInt >= ( srcImage.width() - 1 ) )
else if ( currentSrcColInt >= ( srcImage.width() - 1 ) )
{
px1 = srcImage.pixel( srcImage.width() - 1, currentSrcRowInt );
px2 = srcImage.pixel( srcImage.width() - 1, currentSrcRowInt + 1);
px2 = srcImage.pixel( srcImage.width() - 1, currentSrcRowInt + 1 );
dstImage.setPixel( j, i, resampleColorValue( v, px1, px2 ) );
}
currentSrcCol += nSrcPerDstX;
Expand All @@ -114,10 +114,14 @@ QRgb QgsBilinearRasterResampler::resampleColorValue( double u, double v, QRgb co
int red = bilinearInterpolation( u, v, qRed( col1 ), qRed( col2 ), qRed( col3 ), qRed( col4 ) );
int green = bilinearInterpolation( u, v, qGreen( col1 ), qGreen( col2 ), qGreen( col3 ), qGreen( col4 ) );
int blue = bilinearInterpolation( u, v, qBlue( col1 ), qBlue( col2 ), qBlue( col3 ), qBlue( col4 ) );
return qRgb( red, green, blue );
int alpha = bilinearInterpolation( u, v, qAlpha( col1 ), qAlpha( col2 ), qAlpha( col3 ), qAlpha( col4 ) );
return qRgba( red, green, blue, alpha );
}

QRgb QgsBilinearRasterResampler::resampleColorValue( double u, QRgb col1, QRgb col2 ) const
{
return qRgb( qRed( col1 ) * ( 1 - u ) + qRed( col2 ) * u, qGreen( col1 ) * ( 1 - u ) + qGreen( col2 ) * u, qBlue( col1 ) * ( 1 - u ) + qBlue( col2 ) * u );
return qRgba( qRed( col1 ) * ( 1 - u ) + qRed( col2 ) * u,
qGreen( col1 ) * ( 1 - u ) + qGreen( col2 ) * u,
qBlue( col1 ) * ( 1 - u ) + qBlue( col2 ) * u,
qAlpha( col1 ) * ( 1 - u ) + qAlpha( col2 ) * u );
}
101 changes: 71 additions & 30 deletions src/core/raster/qgscubicrasterresampler.cpp
Expand Up @@ -37,6 +37,7 @@ void QgsCubicRasterResampler::resample( const QImage& srcImage, QImage& dstImage
int* redMatrix = new int[ nCols * nRows ];
int* greenMatrix = new int[ nCols * nRows ];
int* blueMatrix = new int[ nCols * nRows ];
int* alphaMatrix = new int[ nCols * nRows ];

for ( int i = 0; i < nRows; ++i )
{
Expand All @@ -46,6 +47,7 @@ void QgsCubicRasterResampler::resample( const QImage& srcImage, QImage& dstImage
redMatrix[pos] = qRed( px );
greenMatrix[pos] = qGreen( px );
blueMatrix[pos] = qBlue( px );
alphaMatrix[pos] = qAlpha( px );
++pos;
}
}
Expand All @@ -57,6 +59,8 @@ void QgsCubicRasterResampler::resample( const QImage& srcImage, QImage& dstImage
xDerivativeMatrix( nCols, nRows, xDerivativeMatrixGreen, greenMatrix );
double* xDerivativeMatrixBlue = new double[ nCols * nRows ];
xDerivativeMatrix( nCols, nRows, xDerivativeMatrixBlue, blueMatrix );
double* xDerivativeMatrixAlpha = new double[ nCols * nRows ];
xDerivativeMatrix( nCols, nRows, xDerivativeMatrixAlpha, alphaMatrix );

//derivative y
double* yDerivativeMatrixRed = new double[ nCols * nRows ];
Expand All @@ -65,6 +69,8 @@ void QgsCubicRasterResampler::resample( const QImage& srcImage, QImage& dstImage
yDerivativeMatrix( nCols, nRows, yDerivativeMatrixGreen, greenMatrix );
double* yDerivativeMatrixBlue = new double[ nCols * nRows ];
yDerivativeMatrix( nCols, nRows, yDerivativeMatrixBlue, blueMatrix );
double* yDerivativeMatrixAlpha = new double[ nCols * nRows ];
yDerivativeMatrix( nCols, nRows, yDerivativeMatrixAlpha, alphaMatrix );

//compute output
double nSrcPerDstX = ( double ) srcImage.width() / ( double ) dstImage.width();
Expand All @@ -77,7 +83,7 @@ void QgsCubicRasterResampler::resample( const QImage& srcImage, QImage& dstImage
int lastSrcColInt = -1;
int lastSrcRowInt = -1;

int r, g, b;
int r, g, b, a;
//bernstein polynomials
double bp0u, bp1u, bp2u, bp3u, bp0v, bp1v, bp2v, bp3v;
double u, v;
Expand Down Expand Up @@ -119,16 +125,17 @@ void QgsCubicRasterResampler::resample( const QImage& srcImage, QImage& dstImage
px1 = srcImage.pixel( currentSrcColInt, 0 );
px2 = srcImage.pixel( currentSrcColInt + 1, 0 );
dstImage.setPixel( j, i, curveInterpolation( px1, px2, u, xDerivativeMatrixRed[ currentSrcColInt ], xDerivativeMatrixGreen[ currentSrcColInt ],
xDerivativeMatrixBlue[ currentSrcColInt ], xDerivativeMatrixRed[ currentSrcColInt + 1 ], xDerivativeMatrixGreen[ currentSrcColInt + 1 ],
xDerivativeMatrixBlue[ currentSrcColInt + 1 ] ) );
xDerivativeMatrixBlue[ currentSrcColInt ], xDerivativeMatrixAlpha[ currentSrcColInt ], xDerivativeMatrixRed[ currentSrcColInt + 1 ], xDerivativeMatrixGreen[ currentSrcColInt + 1 ],
xDerivativeMatrixBlue[ currentSrcColInt + 1 ], xDerivativeMatrixAlpha[ currentSrcColInt + 1 ] ) );
}
else if ( currentSrcRowInt >= ( srcImage.height() - 1 ) )
{
int idx = ( srcImage.height() - 1 ) * srcImage.width() + currentSrcColInt;
px1 = srcImage.pixel( currentSrcColInt, srcImage.height() - 1 );
px2 = srcImage.pixel( currentSrcColInt + 1, srcImage.height() - 1 );
dstImage.setPixel( j, i, curveInterpolation( px1, px2, u, xDerivativeMatrixRed[ idx ], xDerivativeMatrixGreen[ idx ], xDerivativeMatrixBlue[idx],
xDerivativeMatrixRed[ idx + 1 ], xDerivativeMatrixGreen[ idx + 1 ], xDerivativeMatrixBlue[idx + 1] ) );
xDerivativeMatrixAlpha[idx], xDerivativeMatrixRed[ idx + 1 ], xDerivativeMatrixGreen[ idx + 1 ], xDerivativeMatrixBlue[idx + 1],
xDerivativeMatrixAlpha[idx + 1] ) );
}
else if ( currentSrcColInt < 0 )
{
Expand All @@ -137,7 +144,8 @@ void QgsCubicRasterResampler::resample( const QImage& srcImage, QImage& dstImage
px1 = srcImage.pixel( 0, currentSrcRowInt );
px2 = srcImage.pixel( 0, currentSrcRowInt + 1 );
dstImage.setPixel( j, i, curveInterpolation( px1, px2, v, yDerivativeMatrixRed[ idx1 ], yDerivativeMatrixGreen[ idx1 ], yDerivativeMatrixBlue[ idx1],
yDerivativeMatrixRed[ idx2 ], yDerivativeMatrixGreen[ idx2 ], yDerivativeMatrixBlue[ idx2] ) );
yDerivativeMatrixAlpha[ idx1], yDerivativeMatrixRed[ idx2 ], yDerivativeMatrixGreen[ idx2 ], yDerivativeMatrixBlue[ idx2],
yDerivativeMatrixAlpha[ idx2] ) );
}
else if ( currentSrcColInt >= ( srcImage.width() - 1 ) )
{
Expand All @@ -146,7 +154,8 @@ void QgsCubicRasterResampler::resample( const QImage& srcImage, QImage& dstImage
px1 = srcImage.pixel( srcImage.width() - 1, currentSrcRowInt );
px2 = srcImage.pixel( srcImage.width() - 1, currentSrcRowInt + 1 );
dstImage.setPixel( j, i, curveInterpolation( px1, px2, v, yDerivativeMatrixRed[ idx1 ], yDerivativeMatrixGreen[ idx1 ], yDerivativeMatrixBlue[ idx1],
yDerivativeMatrixRed[ idx2 ], yDerivativeMatrixGreen[ idx2 ], yDerivativeMatrixBlue[ idx2] ) );
yDerivativeMatrixAlpha[ idx1], yDerivativeMatrixRed[ idx2 ], yDerivativeMatrixGreen[ idx2 ], yDerivativeMatrixBlue[ idx2],
yDerivativeMatrixAlpha[ idx2] ) );
}
currentSrcCol += nSrcPerDstX;
continue;
Expand All @@ -155,9 +164,9 @@ void QgsCubicRasterResampler::resample( const QImage& srcImage, QImage& dstImage
//first update the control points if necessary
if ( currentSrcColInt != lastSrcColInt || currentSrcRowInt != lastSrcRowInt )
{
calculateControlPoints( nCols, nRows, currentSrcRowInt, currentSrcColInt, redMatrix, greenMatrix, blueMatrix,
xDerivativeMatrixRed, xDerivativeMatrixGreen, xDerivativeMatrixBlue,
yDerivativeMatrixRed, yDerivativeMatrixGreen, yDerivativeMatrixBlue );
calculateControlPoints( nCols, nRows, currentSrcRowInt, currentSrcColInt, redMatrix, greenMatrix, blueMatrix, alphaMatrix,
xDerivativeMatrixRed, xDerivativeMatrixGreen, xDerivativeMatrixBlue, xDerivativeMatrixAlpha,
yDerivativeMatrixRed, yDerivativeMatrixGreen, yDerivativeMatrixBlue, yDerivativeMatrixAlpha );
}

//bernstein polynomials
Expand Down Expand Up @@ -219,7 +228,24 @@ void QgsCubicRasterResampler::resample( const QImage& srcImage, QImage& dstImage
bp2u * bp3v * cBlue23 +
bp3u * bp3v * cBlue33;

dstImage.setPixel( j, i, qRgb( r, g, b ) );
a = bp0u * bp0v * cAlpha00 +
bp1u * bp0v * cAlpha10 +
bp2u * bp0v * cAlpha20 +
bp3u * bp0v * cAlpha30 +
bp0u * bp1v * cAlpha01 +
bp1u * bp1v * cAlpha11 +
bp2u * bp1v * cAlpha21 +
bp3u * bp1v * cAlpha31 +
bp0u * bp2v * cAlpha02 +
bp1u * bp2v * cAlpha12 +
bp2u * bp2v * cAlpha22 +
bp3u * bp2v * cAlpha32 +
bp0u * bp3v * cAlpha03 +
bp1u * bp3v * cAlpha13 +
bp2u * bp3v * cAlpha23 +
bp3u * bp3v * cAlpha33;

dstImage.setPixel( j, i, qRgba( r, g, b, a ) );
lastSrcColInt = currentSrcColInt;
currentSrcCol += nSrcPerDstX;
}
Expand Down Expand Up @@ -295,47 +321,61 @@ void QgsCubicRasterResampler::yDerivativeMatrix( int nCols, int nRows, double* m
}

void QgsCubicRasterResampler::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 )
int* alphaMatrix, double* xDerivativeMatrixRed, double* xDerivativeMatrixGreen, double* xDerivativeMatrixBlue, double* xDerivativeMatrixAlpha,
double* yDerivativeMatrixRed, double* yDerivativeMatrixGreen, double* yDerivativeMatrixBlue, double* yDerivativeMatrixAlpha )
{
int idx00 = currentRow * nCols + currentCol;
int idx10 = idx00 + 1;
int idx01 = idx00 + nCols;
int idx11 = idx01 + 1;

//corner points
cRed00 = redMatrix[idx00]; cGreen00 = greenMatrix[idx00]; cBlue00 = blueMatrix[idx00];
cRed30 = redMatrix[idx10]; cGreen30 = greenMatrix[idx10]; cBlue30 = blueMatrix[idx10];
cRed03 = redMatrix[idx01]; cGreen03 = greenMatrix[idx01]; cBlue03 = blueMatrix[idx01];
cRed33 = redMatrix[idx11]; cGreen33 = greenMatrix[idx11]; cBlue33 = blueMatrix[idx11];
cRed00 = redMatrix[idx00]; cGreen00 = greenMatrix[idx00]; cBlue00 = blueMatrix[idx00]; cAlpha00 = alphaMatrix[idx00];
cRed30 = redMatrix[idx10]; cGreen30 = greenMatrix[idx10]; cBlue30 = blueMatrix[idx10]; cAlpha30 = alphaMatrix[idx10];
cRed03 = redMatrix[idx01]; cGreen03 = greenMatrix[idx01]; cBlue03 = blueMatrix[idx01]; cAlpha03 = alphaMatrix[idx01];
cRed33 = redMatrix[idx11]; cGreen33 = greenMatrix[idx11]; cBlue33 = blueMatrix[idx11]; cAlpha33 = alphaMatrix[idx11];

//control points near c00
cRed10 = cRed00 + 0.333 * xDerivativeMatrixRed[idx00]; cGreen10 = cGreen00 + 0.333 * xDerivativeMatrixGreen[idx00]; cBlue10 = cBlue00 + 0.333 * xDerivativeMatrixBlue[idx00];
cRed01 = cRed00 + 0.333 * yDerivativeMatrixRed[idx00]; cGreen01 = cGreen00 + 0.333 * yDerivativeMatrixGreen[idx00]; cBlue01 = cBlue00 + 0.333 * yDerivativeMatrixBlue[idx00];
cRed11 = cRed10 + 0.333 * yDerivativeMatrixRed[idx00]; cGreen11 = cGreen10 + 0.333 * yDerivativeMatrixGreen[idx00]; cBlue11 = cBlue10 + 0.333 * yDerivativeMatrixBlue[idx00];
cRed10 = cRed00 + 0.333 * xDerivativeMatrixRed[idx00]; cGreen10 = cGreen00 + 0.333 * xDerivativeMatrixGreen[idx00];
cBlue10 = cBlue00 + 0.333 * xDerivativeMatrixBlue[idx00];cAlpha10 = cAlpha00 + 0.333 * xDerivativeMatrixAlpha[idx00];
cRed01 = cRed00 + 0.333 * yDerivativeMatrixRed[idx00]; cGreen01 = cGreen00 + 0.333 * yDerivativeMatrixGreen[idx00];
cBlue01 = cBlue00 + 0.333 * yDerivativeMatrixBlue[idx00];cAlpha01 = cAlpha00 + 0.333 * yDerivativeMatrixAlpha[idx00];
cRed11 = cRed10 + 0.333 * yDerivativeMatrixRed[idx00]; cGreen11 = cGreen10 + 0.333 * yDerivativeMatrixGreen[idx00];
cBlue11 = cBlue10 + 0.333 * yDerivativeMatrixBlue[idx00];cAlpha11 = cAlpha10 + 0.333 * yDerivativeMatrixAlpha[idx00];

//control points near c30
cRed20 = cRed30 - 0.333 * xDerivativeMatrixRed[idx10]; cGreen20 = cGreen30 - 0.333 * xDerivativeMatrixGreen[idx10]; cBlue20 = cBlue30 - 0.333 * xDerivativeMatrixBlue[idx10];
cRed31 = cRed30 + 0.333 * yDerivativeMatrixRed[idx10]; cGreen31 = cGreen30 + 0.333 * yDerivativeMatrixGreen[idx10]; cBlue31 = cBlue30 + 0.333 * yDerivativeMatrixBlue[idx10];
cRed21 = cRed20 + 0.333 * yDerivativeMatrixRed[idx10]; cGreen21 = cGreen20 + 0.333 * yDerivativeMatrixGreen[idx10]; cBlue21 = cBlue20 + 0.333 * yDerivativeMatrixBlue[idx10];
cRed20 = cRed30 - 0.333 * xDerivativeMatrixRed[idx10]; cGreen20 = cGreen30 - 0.333 * xDerivativeMatrixGreen[idx10];
cBlue20 = cBlue30 - 0.333 * xDerivativeMatrixBlue[idx10]; cAlpha20 = cAlpha30 - 0.333 * xDerivativeMatrixAlpha[idx10];
cRed31 = cRed30 + 0.333 * yDerivativeMatrixRed[idx10]; cGreen31 = cGreen30 + 0.333 * yDerivativeMatrixGreen[idx10];
cBlue31 = cBlue30 + 0.333 * yDerivativeMatrixBlue[idx10]; cAlpha31 = cAlpha30 + 0.333 * yDerivativeMatrixAlpha[idx10];
cRed21 = cRed20 + 0.333 * yDerivativeMatrixRed[idx10]; cGreen21 = cGreen20 + 0.333 * yDerivativeMatrixGreen[idx10];
cBlue21 = cBlue20 + 0.333 * yDerivativeMatrixBlue[idx10]; cAlpha21 = cAlpha20 + 0.333 * yDerivativeMatrixAlpha[idx10];

//control points near c03
cRed13 = cRed03 + 0.333 * xDerivativeMatrixRed[idx01]; cGreen13 = cGreen03 + 0.333 * xDerivativeMatrixGreen[idx01]; cBlue13 = cBlue03 + 0.333 * xDerivativeMatrixBlue[idx01];
cRed02 = cRed03 - 0.333 * yDerivativeMatrixRed[idx01]; cGreen02 = cGreen03 - 0.333 * yDerivativeMatrixGreen[idx01]; cBlue02 = cBlue03 - 0.333 * yDerivativeMatrixBlue[idx01];
cRed12 = cRed02 + 0.333 * xDerivativeMatrixRed[idx01]; cGreen12 = cGreen02 + 0.333 * xDerivativeMatrixGreen[idx01]; cBlue12 = cBlue02 + 0.333 * xDerivativeMatrixBlue[idx01];
cRed13 = cRed03 + 0.333 * xDerivativeMatrixRed[idx01]; cGreen13 = cGreen03 + 0.333 * xDerivativeMatrixGreen[idx01];
cBlue13 = cBlue03 + 0.333 * xDerivativeMatrixBlue[idx01]; cAlpha13 = cAlpha03 + 0.333 * xDerivativeMatrixAlpha[idx01];
cRed02 = cRed03 - 0.333 * yDerivativeMatrixRed[idx01]; cGreen02 = cGreen03 - 0.333 * yDerivativeMatrixGreen[idx01];
cBlue02 = cBlue03 - 0.333 * yDerivativeMatrixBlue[idx01]; cAlpha02 = cAlpha03 - 0.333 * yDerivativeMatrixAlpha[idx01];
cRed12 = cRed02 + 0.333 * xDerivativeMatrixRed[idx01]; cGreen12 = cGreen02 + 0.333 * xDerivativeMatrixGreen[idx01];
cBlue12 = cBlue02 + 0.333 * xDerivativeMatrixBlue[idx01]; cAlpha12 = cAlpha02 + 0.333 * xDerivativeMatrixAlpha[idx01];

//control points near c33
cRed23 = cRed33 - 0.333 * xDerivativeMatrixRed[idx11]; cGreen23 = cGreen33 - 0.333 * xDerivativeMatrixGreen[idx11]; cBlue23 = cBlue33 - 0.333 * xDerivativeMatrixBlue[idx11];
cRed32 = cRed33 - 0.333 * yDerivativeMatrixRed[idx11]; cGreen32 = cGreen33 - 0.333 * yDerivativeMatrixGreen[idx11]; cBlue32 = cBlue33 - 0.333 * yDerivativeMatrixBlue[idx11];
cRed22 = cRed32 - 0.333 * xDerivativeMatrixRed[idx11]; cGreen22 = cGreen32 - 0.333 * xDerivativeMatrixGreen[idx11]; cBlue22 = cBlue32 - 0.333 * xDerivativeMatrixBlue[idx11];
cRed23 = cRed33 - 0.333 * xDerivativeMatrixRed[idx11]; cGreen23 = cGreen33 - 0.333 * xDerivativeMatrixGreen[idx11];
cBlue23 = cBlue33 - 0.333 * xDerivativeMatrixBlue[idx11]; cAlpha23 = cAlpha33 - 0.333 * xDerivativeMatrixAlpha[idx11];
cRed32 = cRed33 - 0.333 * yDerivativeMatrixRed[idx11]; cGreen32 = cGreen33 - 0.333 * yDerivativeMatrixGreen[idx11];
cBlue32 = cBlue33 - 0.333 * yDerivativeMatrixBlue[idx11]; cAlpha32 = cAlpha33 - 0.333 * yDerivativeMatrixAlpha[idx11];
cRed22 = cRed32 - 0.333 * xDerivativeMatrixRed[idx11]; cGreen22 = cGreen32 - 0.333 * xDerivativeMatrixGreen[idx11];
cBlue22 = cBlue32 - 0.333 * xDerivativeMatrixBlue[idx11]; cAlpha22 = cAlpha32 - 0.333 * xDerivativeMatrixAlpha[idx11];
}

QRgb QgsCubicRasterResampler::curveInterpolation( QRgb pt1, QRgb pt2, double t, double d1red, double d1green, double d1blue , double d2red, double d2green, double d2blue )
QRgb QgsCubicRasterResampler::curveInterpolation( QRgb pt1, QRgb pt2, double t, double d1red, double d1green, double d1blue, double d1alpha,
double d2red, double d2green, double d2blue, double d2alpha )
{
//control points
double p0r = qRed( pt1 ); double p1r = p0r + 0.333 * d1red; double p3r = qRed( pt2 ); double p2r = p3r - 0.333 * d2red;
double p0g = qGreen( pt1 ); double p1g = p0g + 0.333 * d1green; double p3g = qGreen( pt2 ); double p2g = p3g - 0.333 * d2green;
double p0b = qBlue( pt1 ); double p1b = p0b + 0.333 * d1blue; double p3b = qBlue( pt2 ); double p2b = p3b - 0.333 * d2blue;
double p0a = qAlpha( pt1 ); double p1a = p0a + 0.333 * d1alpha; double p3a = qAlpha( pt2 ); double p2a = p3a - 0.333 * d2alpha;

//bernstein polynomials
double bp0 = calcBernsteinPoly( 3, 0, t );
Expand All @@ -346,8 +386,9 @@ QRgb QgsCubicRasterResampler::curveInterpolation( QRgb pt1, QRgb pt2, double t,
int red = bp0 * p0r + bp1 * p1r + bp2 * p2r + bp3 * p3r;
int green = bp0 * p0g + bp1 * p1g + bp2 * p2g + bp3 * p3g;
int blue = bp0 * p0b + bp1 * p1b + bp2 * p2b + bp3 * p3b;
int alpha = bp0 * p0a + bp1 * p1a + bp2 * p2a + bp3 * p3a;

return qRgb( red, green, blue );
return qRgba( red, green, blue, alpha );
}

double QgsCubicRasterResampler::calcBernsteinPoly( int n, int i, double t )
Expand Down

0 comments on commit be97ca4

Please sign in to comment.