24     : cRed00( 0.0 ), cRed10( 0.0 ), cRed20( 0.0 ), cRed30( 0.0 ), cRed01( 0.0 ), cRed11( 0.0 ), cRed21( 0.0 ), cRed31( 0.0 )
    25     , cRed02( 0.0 ), cRed12( 0.0 ), cRed22( 0.0 ), cRed32( 0.0 ), cRed03( 0.0 ), cRed13( 0.0 ), cRed23( 0.0 ), cRed33( 0.0 )
    27     , cGreen00( 0.0 ), cGreen10( 0.0 ), cGreen20( 0.0 ), cGreen30( 0.0 ), cGreen01( 0.0 ), cGreen11( 0.0 ), cGreen21( 0.0 ), cGreen31( 0.0 )
    28     , cGreen02( 0.0 ), cGreen12( 0.0 ), cGreen22( 0.0 ), cGreen32( 0.0 ), cGreen03( 0.0 ), cGreen13( 0.0 ), cGreen23( 0.0 ), cGreen33( 0.0 )
    30     , cBlue00( 0.0 ), cBlue10( 0.0 ), cBlue20( 0.0 ), cBlue30( 0.0 ), cBlue01( 0.0 ), cBlue11( 0.0 ), cBlue21( 0.0 ), cBlue31( 0.0 )
    31     , cBlue02( 0.0 ), cBlue12( 0.0 ), cBlue22( 0.0 ), cBlue32( 0.0 ), cBlue03( 0.0 ), cBlue13( 0.0 ), cBlue23( 0.0 ), cBlue33( 0.0 )
    33     , cAlpha00( 0.0 ), cAlpha10( 0.0 ), cAlpha20( 0.0 ), cAlpha30( 0.0 ), cAlpha01( 0.0 ), cAlpha11( 0.0 ), cAlpha21( 0.0 ), cAlpha31( 0.0 )
    34     , cAlpha02( 0.0 ), cAlpha12( 0.0 ), cAlpha22( 0.0 ), cAlpha32( 0.0 ), cAlpha03( 0.0 ), cAlpha13( 0.0 ), cAlpha23( 0.0 ), cAlpha33( 0.0 )
    49   int nCols = srcImage.
width();
    50   int nRows = srcImage.
height();
    54   int *redMatrix = 
new int[ nCols * nRows ];
    55   int *greenMatrix = 
new int[ nCols * nRows ];
    56   int *blueMatrix = 
new int[ nCols * nRows ];
    57   int *alphaMatrix = 
new int[ nCols * nRows ];
    59   for ( 
int heightIndex = 0; heightIndex < nRows; ++heightIndex )
    61     QRgb* scanLine = ( QRgb* )srcImage.
constScanLine( heightIndex );
    62     for ( 
int widthIndex = 0; widthIndex < nCols; ++widthIndex )
    64       px = scanLine[widthIndex];
    65       int alpha = qAlpha( px );
    66       alphaMatrix[pos] = alpha;
    67       redMatrix[pos] = qRed( px );
    68       greenMatrix[pos] = qGreen( px );
    69       blueMatrix[pos] = qBlue( px );
    76   double* xDerivativeMatrixRed = 
new double[ nCols * nRows ];
    77   xDerivativeMatrix( nCols, nRows, xDerivativeMatrixRed, redMatrix );
    78   double* xDerivativeMatrixGreen = 
new double[ nCols * nRows ];
    79   xDerivativeMatrix( nCols, nRows, xDerivativeMatrixGreen, greenMatrix );
    80   double* xDerivativeMatrixBlue = 
new double[ nCols * nRows ];
    81   xDerivativeMatrix( nCols, nRows, xDerivativeMatrixBlue, blueMatrix );
    82   double* xDerivativeMatrixAlpha = 
new double[ nCols * nRows ];
    83   xDerivativeMatrix( nCols, nRows, xDerivativeMatrixAlpha, alphaMatrix );
    86   double* yDerivativeMatrixRed = 
new double[ nCols * nRows ];
    87   yDerivativeMatrix( nCols, nRows, yDerivativeMatrixRed, redMatrix );
    88   double* yDerivativeMatrixGreen = 
new double[ nCols * nRows ];
    89   yDerivativeMatrix( nCols, nRows, yDerivativeMatrixGreen, greenMatrix );
    90   double* yDerivativeMatrixBlue = 
new double[ nCols * nRows ];
    91   yDerivativeMatrix( nCols, nRows, yDerivativeMatrixBlue, blueMatrix );
    92   double* yDerivativeMatrixAlpha = 
new double[ nCols * nRows ];
    93   yDerivativeMatrix( nCols, nRows, yDerivativeMatrixAlpha, alphaMatrix );
    96   double nSrcPerDstX = ( double ) srcImage.
width() / ( double ) dstImage.
width();
    97   double nSrcPerDstY = ( double ) srcImage.
height() / ( double ) dstImage.
height();
    99   double currentSrcRow = nSrcPerDstY / 2.0 - 0.5;
   100   double currentSrcCol;
   101   int currentSrcColInt;
   102   int currentSrcRowInt;
   103   int lastSrcColInt = -100;
   104   int lastSrcRowInt = -100;
   107   double bp0u, bp1u, bp2u, bp3u, bp0v, bp1v, bp2v, bp3v;
   110   for ( 
int y = 0; y < dstImage.
height(); ++y )
   112     currentSrcRowInt = floor( currentSrcRow );
   113     v = currentSrcRow - currentSrcRowInt;
   115     currentSrcCol = nSrcPerDstX / 2.0 - 0.5;
   117     QRgb* scanLine = ( QRgb* )dstImage.
scanLine( y );
   118     for ( 
int x = 0; x < dstImage.
width(); ++x )
   120       currentSrcColInt = floor( currentSrcCol );
   121       u = currentSrcCol - currentSrcColInt;
   124       if (( currentSrcRowInt < 0 || currentSrcRowInt >= ( srcImage.
height() - 1 ) || currentSrcColInt < 0 || currentSrcColInt >= ( srcImage.
width() - 1 ) ) )
   128         if ( currentSrcRowInt < 0 && currentSrcColInt < 0 )
   130           scanLine[x] = srcImage.
pixel( 0, 0 );
   132         else if ( currentSrcRowInt < 0 && currentSrcColInt >= ( srcImage.
width() - 1 ) )
   134           scanLine[x] = srcImage.
pixel( srcImage.
width() - 1, 0 );
   136         else if ( currentSrcRowInt >= ( srcImage.
height() - 1 ) && currentSrcColInt >= ( srcImage.
width() - 1 ) )
   138           scanLine[x] = srcImage.
pixel( srcImage.
width() - 1, srcImage.
height() - 1 );
   140         else if ( currentSrcRowInt >= ( srcImage.
height() - 1 ) && currentSrcColInt < 0 )
   142           scanLine[x] = srcImage.
pixel( 0, srcImage.
height() - 1 );
   144         else if ( currentSrcRowInt < 0 )
   146           px1 = srcImage.
pixel( currentSrcColInt, 0 );
   147           px2 = srcImage.
pixel( currentSrcColInt + 1, 0 );
   148           scanLine[x] = curveInterpolation( px1, px2, u, xDerivativeMatrixRed[ currentSrcColInt ], xDerivativeMatrixGreen[ currentSrcColInt ],
   149                                             xDerivativeMatrixBlue[ currentSrcColInt ], xDerivativeMatrixAlpha[ currentSrcColInt ], xDerivativeMatrixRed[ currentSrcColInt + 1 ], xDerivativeMatrixGreen[ currentSrcColInt + 1 ],
   150                                             xDerivativeMatrixBlue[ currentSrcColInt + 1 ], xDerivativeMatrixAlpha[ currentSrcColInt + 1 ] );
   152         else if ( currentSrcRowInt >= ( srcImage.
height() - 1 ) )
   154           int idx = ( srcImage.
height() - 1 ) * srcImage.
width() + currentSrcColInt;
   155           px1 = srcImage.
pixel( currentSrcColInt, srcImage.
height() - 1 );
   156           px2 = srcImage.
pixel( currentSrcColInt + 1, srcImage.
height() - 1 );
   157           scanLine[x] = curveInterpolation( px1, px2, u, xDerivativeMatrixRed[ idx ], xDerivativeMatrixGreen[ idx ], xDerivativeMatrixBlue[idx],
   158                                             xDerivativeMatrixAlpha[idx], xDerivativeMatrixRed[ idx + 1 ], xDerivativeMatrixGreen[ idx + 1 ], xDerivativeMatrixBlue[idx + 1],
   159                                             xDerivativeMatrixAlpha[idx + 1] );
   161         else if ( currentSrcColInt < 0 )
   163           int idx1 = currentSrcRowInt * srcImage.
width();
   164           int idx2 = idx1 + srcImage.
width();
   165           px1 = srcImage.
pixel( 0, currentSrcRowInt );
   166           px2 = srcImage.
pixel( 0, currentSrcRowInt + 1 );
   167           scanLine[x] = curveInterpolation( px1, px2, v, yDerivativeMatrixRed[ idx1 ], yDerivativeMatrixGreen[ idx1 ], yDerivativeMatrixBlue[ idx1],
   168                                             yDerivativeMatrixAlpha[ idx1], yDerivativeMatrixRed[ idx2 ], yDerivativeMatrixGreen[ idx2 ], yDerivativeMatrixBlue[ idx2],
   169                                             yDerivativeMatrixAlpha[ idx2] );
   171         else if ( currentSrcColInt >= ( srcImage.
width() - 1 ) )
   173           int idx1 = currentSrcRowInt * srcImage.
width() + srcImage.
width() - 1;
   174           int idx2 = idx1 + srcImage.
width();
   175           px1 = srcImage.
pixel( srcImage.
width() - 1, currentSrcRowInt );
   176           px2 = srcImage.
pixel( srcImage.
width() - 1, currentSrcRowInt + 1 );
   177           scanLine[x] = curveInterpolation( px1, px2, v, yDerivativeMatrixRed[ idx1 ], yDerivativeMatrixGreen[ idx1 ], yDerivativeMatrixBlue[ idx1],
   178                                             yDerivativeMatrixAlpha[ idx1], yDerivativeMatrixRed[ idx2 ], yDerivativeMatrixGreen[ idx2 ], yDerivativeMatrixBlue[ idx2],
   179                                             yDerivativeMatrixAlpha[ idx2] );
   181         currentSrcCol += nSrcPerDstX;
   186       if ( currentSrcColInt != lastSrcColInt || currentSrcRowInt != lastSrcRowInt )
   188         calculateControlPoints( nCols, nRows, currentSrcRowInt, currentSrcColInt, redMatrix, greenMatrix, blueMatrix, alphaMatrix,
   189                                 xDerivativeMatrixRed, xDerivativeMatrixGreen, xDerivativeMatrixBlue, xDerivativeMatrixAlpha,
   190                                 yDerivativeMatrixRed, yDerivativeMatrixGreen, yDerivativeMatrixBlue, yDerivativeMatrixAlpha );
   194       bp0u = calcBernsteinPolyN3( 0, u );
   195       bp1u = calcBernsteinPolyN3( 1, u );
   196       bp2u = calcBernsteinPolyN3( 2, u );
   197       bp3u = calcBernsteinPolyN3( 3, u );
   198       bp0v = calcBernsteinPolyN3( 0, v );
   199       bp1v = calcBernsteinPolyN3( 1, v );
   200       bp2v = calcBernsteinPolyN3( 2, v );
   201       bp3v = calcBernsteinPolyN3( 3, v );
   205       int r = bp0u * bp0v * cRed00 +
   206               bp1u * bp0v * cRed10 +
   207               bp2u * bp0v * cRed20 +
   208               bp3u * bp0v * cRed30 +
   209               bp0u * bp1v * cRed01 +
   210               bp1u * bp1v * cRed11 +
   211               bp2u * bp1v * cRed21 +
   212               bp3u * bp1v * cRed31 +
   213               bp0u * bp2v * cRed02 +
   214               bp1u * bp2v * cRed12 +
   215               bp2u * bp2v * cRed22 +
   216               bp3u * bp2v * cRed32 +
   217               bp0u * bp3v * cRed03 +
   218               bp1u * bp3v * cRed13 +
   219               bp2u * bp3v * cRed23 +
   220               bp3u * bp3v * cRed33;
   222       int g = bp0u * bp0v * cGreen00 +
   223               bp1u * bp0v * cGreen10 +
   224               bp2u * bp0v * cGreen20 +
   225               bp3u * bp0v * cGreen30 +
   226               bp0u * bp1v * cGreen01 +
   227               bp1u * bp1v * cGreen11 +
   228               bp2u * bp1v * cGreen21 +
   229               bp3u * bp1v * cGreen31 +
   230               bp0u * bp2v * cGreen02 +
   231               bp1u * bp2v * cGreen12 +
   232               bp2u * bp2v * cGreen22 +
   233               bp3u * bp2v * cGreen32 +
   234               bp0u * bp3v * cGreen03 +
   235               bp1u * bp3v * cGreen13 +
   236               bp2u * bp3v * cGreen23 +
   237               bp3u * bp3v * cGreen33;
   239       int b = bp0u * bp0v * cBlue00 +
   240               bp1u * bp0v * cBlue10 +
   241               bp2u * bp0v * cBlue20 +
   242               bp3u * bp0v * cBlue30 +
   243               bp0u * bp1v * cBlue01 +
   244               bp1u * bp1v * cBlue11 +
   245               bp2u * bp1v * cBlue21 +
   246               bp3u * bp1v * cBlue31 +
   247               bp0u * bp2v * cBlue02 +
   248               bp1u * bp2v * cBlue12 +
   249               bp2u * bp2v * cBlue22 +
   250               bp3u * bp2v * cBlue32 +
   251               bp0u * bp3v * cBlue03 +
   252               bp1u * bp3v * cBlue13 +
   253               bp2u * bp3v * cBlue23 +
   254               bp3u * bp3v * cBlue33;
   256       int a = bp0u * bp0v * cAlpha00 +
   257               bp1u * bp0v * cAlpha10 +
   258               bp2u * bp0v * cAlpha20 +
   259               bp3u * bp0v * cAlpha30 +
   260               bp0u * bp1v * cAlpha01 +
   261               bp1u * bp1v * cAlpha11 +
   262               bp2u * bp1v * cAlpha21 +
   263               bp3u * bp1v * cAlpha31 +
   264               bp0u * bp2v * cAlpha02 +
   265               bp1u * bp2v * cAlpha12 +
   266               bp2u * bp2v * cAlpha22 +
   267               bp3u * bp2v * cAlpha32 +
   268               bp0u * bp3v * cAlpha03 +
   269               bp1u * bp3v * cAlpha13 +
   270               bp2u * bp3v * cAlpha23 +
   271               bp3u * bp3v * cAlpha33;
   273       scanLine[x] = createPremultipliedColor( r, g, b, a );
   275       lastSrcColInt = currentSrcColInt;
   276       currentSrcCol += nSrcPerDstX;
   278     lastSrcRowInt = currentSrcRowInt;
   279     currentSrcRow += nSrcPerDstY;
   285   delete[] greenMatrix;
   287   delete[] alphaMatrix;
   288   delete[] xDerivativeMatrixRed;
   289   delete[] xDerivativeMatrixGreen;
   290   delete[] xDerivativeMatrixBlue;
   291   delete[] xDerivativeMatrixAlpha;
   292   delete[] yDerivativeMatrixRed;
   293   delete[] yDerivativeMatrixGreen;
   294   delete[] yDerivativeMatrixBlue;
   295   delete[] yDerivativeMatrixAlpha;
   298 void QgsCubicRasterResampler::xDerivativeMatrix( 
int nCols, 
int nRows, 
double* matrix, 
const int* colorMatrix )
   303   for ( 
int y = 0; y < nRows; ++y )
   305     for ( 
int x = 0; x < nCols; ++x )
   309         val = colorMatrix[index + 1] - colorMatrix[
index];
   311       else if ( x == ( nCols - 1 ) )
   313         val = colorMatrix[
index] - colorMatrix[ index - 1 ];
   317         val = ( colorMatrix[index + 1] - colorMatrix[index - 1] ) / 2.0;
   325 void QgsCubicRasterResampler::yDerivativeMatrix( 
int nCols, 
int nRows, 
double* matrix, 
const int* colorMatrix )
   330   for ( 
int y = 0; y < nRows; ++y )
   332     for ( 
int x = 0; x < nCols; ++x )
   336         val = colorMatrix[ index + nCols ] - colorMatrix[ 
index ];
   338       else if ( y == ( nRows - 1 ) )
   340         val = colorMatrix[ 
index ] - colorMatrix[ index - nCols ];
   344         val = ( colorMatrix[ index + nCols ] - colorMatrix[ index - nCols ] ) / 2.0;
   352 void QgsCubicRasterResampler::calculateControlPoints( 
int nCols, 
int nRows, 
int currentRow, 
int currentCol, 
int* redMatrix, 
int* greenMatrix, 
int* blueMatrix,
   353     int* alphaMatrix, 
double* xDerivativeMatrixRed, 
double* xDerivativeMatrixGreen, 
double* xDerivativeMatrixBlue, 
double* xDerivativeMatrixAlpha,
   354     double* yDerivativeMatrixRed, 
double* yDerivativeMatrixGreen, 
double* yDerivativeMatrixBlue, 
double* yDerivativeMatrixAlpha )
   357   int idx00 = currentRow * nCols + currentCol;
   358   int idx10 = idx00 + 1;
   359   int idx01 = idx00 + nCols;
   360   int idx11 = idx01 + 1;
   363   cRed00 = redMatrix[idx00];
   364   cGreen00 = greenMatrix[idx00];
   365   cBlue00 = blueMatrix[idx00];
   366   cAlpha00 = alphaMatrix[idx00];
   367   cRed30 = redMatrix[idx10];
   368   cGreen30 = greenMatrix[idx10];
   369   cBlue30 = blueMatrix[idx10];
   370   cAlpha30 = alphaMatrix[idx10];
   371   cRed03 = redMatrix[idx01];
   372   cGreen03 = greenMatrix[idx01];
   373   cBlue03 = blueMatrix[idx01];
   374   cAlpha03 = alphaMatrix[idx01];
   375   cRed33 = redMatrix[idx11];
   376   cGreen33 = greenMatrix[idx11];
   377   cBlue33 = blueMatrix[idx11];
   378   cAlpha33 = alphaMatrix[idx11];
   381   cRed10 = cRed00 + 0.333 * xDerivativeMatrixRed[idx00];
   382   cGreen10 = cGreen00 + 0.333 * xDerivativeMatrixGreen[idx00];
   383   cBlue10 = cBlue00 + 0.333 * xDerivativeMatrixBlue[idx00];
   384   cAlpha10 = cAlpha00 + 0.333 * xDerivativeMatrixAlpha[idx00];
   385   cRed01 = cRed00 + 0.333 * yDerivativeMatrixRed[idx00];
   386   cGreen01 = cGreen00 + 0.333 * yDerivativeMatrixGreen[idx00];
   387   cBlue01 = cBlue00 + 0.333 * yDerivativeMatrixBlue[idx00];
   388   cAlpha01 = cAlpha00 + 0.333 * yDerivativeMatrixAlpha[idx00];
   389   cRed11 = cRed10 + 0.333 * yDerivativeMatrixRed[idx00];
   390   cGreen11 = cGreen10 + 0.333 * yDerivativeMatrixGreen[idx00];
   391   cBlue11 = cBlue10 + 0.333 * yDerivativeMatrixBlue[idx00];
   392   cAlpha11 = cAlpha10 + 0.333 * yDerivativeMatrixAlpha[idx00];
   395   cRed20 = cRed30 - 0.333 * xDerivativeMatrixRed[idx10];
   396   cGreen20 = cGreen30 - 0.333 * xDerivativeMatrixGreen[idx10];
   397   cBlue20 = cBlue30 - 0.333 * xDerivativeMatrixBlue[idx10];
   398   cAlpha20 = cAlpha30 - 0.333 * xDerivativeMatrixAlpha[idx10];
   399   cRed31 = cRed30 + 0.333 * yDerivativeMatrixRed[idx10];
   400   cGreen31 = cGreen30 + 0.333 * yDerivativeMatrixGreen[idx10];
   401   cBlue31 = cBlue30 + 0.333 * yDerivativeMatrixBlue[idx10];
   402   cAlpha31 = cAlpha30 + 0.333 * yDerivativeMatrixAlpha[idx10];
   403   cRed21 = cRed20 + 0.333 * yDerivativeMatrixRed[idx10];
   404   cGreen21 = cGreen20 + 0.333 * yDerivativeMatrixGreen[idx10];
   405   cBlue21 = cBlue20 + 0.333 * yDerivativeMatrixBlue[idx10];
   406   cAlpha21 = cAlpha20 + 0.333 * yDerivativeMatrixAlpha[idx10];
   409   cRed13 = cRed03 + 0.333 * xDerivativeMatrixRed[idx01];
   410   cGreen13 = cGreen03 + 0.333 * xDerivativeMatrixGreen[idx01];
   411   cBlue13 = cBlue03 + 0.333 * xDerivativeMatrixBlue[idx01];
   412   cAlpha13 = cAlpha03 + 0.333 * xDerivativeMatrixAlpha[idx01];
   413   cRed02 = cRed03 - 0.333 * yDerivativeMatrixRed[idx01];
   414   cGreen02 = cGreen03 - 0.333 * yDerivativeMatrixGreen[idx01];
   415   cBlue02 = cBlue03 - 0.333 * yDerivativeMatrixBlue[idx01];
   416   cAlpha02 = cAlpha03 - 0.333 * yDerivativeMatrixAlpha[idx01];
   417   cRed12 = cRed02 + 0.333 * xDerivativeMatrixRed[idx01];
   418   cGreen12 = cGreen02 + 0.333 * xDerivativeMatrixGreen[idx01];
   419   cBlue12 = cBlue02 + 0.333 * xDerivativeMatrixBlue[idx01];
   420   cAlpha12 = cAlpha02 + 0.333 * xDerivativeMatrixAlpha[idx01];
   423   cRed23 = cRed33 - 0.333 * xDerivativeMatrixRed[idx11];
   424   cGreen23 = cGreen33 - 0.333 * xDerivativeMatrixGreen[idx11];
   425   cBlue23 = cBlue33 - 0.333 * xDerivativeMatrixBlue[idx11];
   426   cAlpha23 = cAlpha33 - 0.333 * xDerivativeMatrixAlpha[idx11];
   427   cRed32 = cRed33 - 0.333 * yDerivativeMatrixRed[idx11];
   428   cGreen32 = cGreen33 - 0.333 * yDerivativeMatrixGreen[idx11];
   429   cBlue32 = cBlue33 - 0.333 * yDerivativeMatrixBlue[idx11];
   430   cAlpha32 = cAlpha33 - 0.333 * yDerivativeMatrixAlpha[idx11];
   431   cRed22 = cRed32 - 0.333 * xDerivativeMatrixRed[idx11];
   432   cGreen22 = cGreen32 - 0.333 * xDerivativeMatrixGreen[idx11];
   433   cBlue22 = cBlue32 - 0.333 * xDerivativeMatrixBlue[idx11];
   434   cAlpha22 = cAlpha32 - 0.333 * xDerivativeMatrixAlpha[idx11];
   437 QRgb QgsCubicRasterResampler::curveInterpolation( QRgb pt1, QRgb pt2, 
double t, 
double d1red, 
double d1green, 
double d1blue, 
double d1alpha,
   438     double d2red, 
double d2green, 
double d2blue, 
double d2alpha )
   441   double p0r = qRed( pt1 );
   442   double p1r = p0r + 0.333 * d1red;
   443   double p3r = qRed( pt2 );
   444   double p2r = p3r - 0.333 * d2red;
   445   double p0g = qGreen( pt1 );
   446   double p1g = p0g + 0.333 * d1green;
   447   double p3g = qGreen( pt2 );
   448   double p2g = p3g - 0.333 * d2green;
   449   double p0b = qBlue( pt1 );
   450   double p1b = p0b + 0.333 * d1blue;
   451   double p3b = qBlue( pt2 );
   452   double p2b = p3b - 0.333 * d2blue;
   453   double p0a = qAlpha( pt1 );
   454   double p1a = p0a + 0.333 * d1alpha;
   455   double p3a = qAlpha( pt2 );
   456   double p2a = p3a - 0.333 * d2alpha;
   459   double bp0 = calcBernsteinPolyN3( 0, t );
   460   double bp1 = calcBernsteinPolyN3( 1, t );
   461   double bp2 = calcBernsteinPolyN3( 2, t );
   462   double bp3 = calcBernsteinPolyN3( 3, t );
   464   int red = bp0 * p0r + bp1 * p1r + bp2 * p2r + bp3 * p3r;
   465   int green = bp0 * p0g + bp1 * p1g + bp2 * p2g + bp3 * p3g;
   466   int blue = bp0 * p0b + bp1 * p1b + bp2 * p2b + bp3 * p3b;
   467   int alpha = bp0 * p0a + bp1 * p1a + bp2 * p2a + bp3 * p3a;
   469   return createPremultipliedColor( red, green, blue, alpha );
   472 double QgsCubicRasterResampler::calcBernsteinPolyN3( 
int i, 
double t )
   479   return lowerN3( i ) * qPow( t, i ) * qPow(( 1 - t ), ( 3 - i ) );
   482 inline int QgsCubicRasterResampler::lowerN3( 
int i )
   497 QRgb QgsCubicRasterResampler::createPremultipliedColor( 
const int r, 
const int g, 
const int b, 
const int a )
   499   int maxComponentBounds = qBound( 0, a, 255 );
   500   return qRgba( qBound( 0, r, maxComponentBounds ),
   501                 qBound( 0, g, maxComponentBounds ),
   502                 qBound( 0, b, maxComponentBounds ),
 
const uchar * constScanLine(int i) const
 
QgsCubicRasterResampler * clone() const override
 
QRgb pixel(int x, int y) const
 
~QgsCubicRasterResampler()
 
void resample(const QImage &srcImage, QImage &dstImage) override
 
QgsCubicRasterResampler()