diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-04-27 09:43:28 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-04-29 08:30:07 +0200 |
commit | beacd77aa985ed90532cd5fdd7b56314c0a7b0eb (patch) | |
tree | 5ea23343cc56ee730d6daa5fdb55af1e03e802b4 | |
parent | 24503d5ddfc0a83ac88aa23d03b69ed47f989e8e (diff) |
optimise ImplScaleConvolutionVer a little
cache the reading of the source scan line, and use sal_Int32 for pixels
and counts (long is 64-bit on 64-bit linux)
Change-Id: Iaa0abc3ed3316d3137184b0c051612874885ddf4
Reviewed-on: https://gerrit.libreoffice.org/71462
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | vcl/source/bitmap/BitmapScaleConvolutionFilter.cxx | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/vcl/source/bitmap/BitmapScaleConvolutionFilter.cxx b/vcl/source/bitmap/BitmapScaleConvolutionFilter.cxx index 7375d0260dfb..389b2a3b11b3 100644 --- a/vcl/source/bitmap/BitmapScaleConvolutionFilter.cxx +++ b/vcl/source/bitmap/BitmapScaleConvolutionFilter.cxx @@ -39,8 +39,8 @@ void ImplCalculateContributions( const long aDestinationSize, long& aNumberOfContributions, std::vector<double>& rWeights, - std::vector<long>& rPixels, - std::vector<long>& rCounts, + std::vector<sal_Int32>& rPixels, + std::vector<sal_Int32>& rCounts, const Kernel& aKernel) { const double fSamplingRadius(aKernel.GetWidth()); @@ -103,8 +103,8 @@ bool ImplScaleConvolutionHor(Bitmap& rSource, Bitmap& rTarget, const double& rSc if(pReadAcc) { std::vector<double> aWeights; - std::vector<long> aPixels; - std::vector<long> aCounts; + std::vector<sal_Int32> aPixels; + std::vector<sal_Int32> aCounts; long aNumberOfContributions(0); const long nHeight(rSource.GetSizePixel().Height()); @@ -191,8 +191,8 @@ bool ImplScaleConvolutionVer(Bitmap& rSource, Bitmap& rTarget, const double& rSc if(pReadAcc) { std::vector<double> aWeights; - std::vector<long> aPixels; - std::vector<long> aCounts; + std::vector<sal_Int32> aPixels; + std::vector<sal_Int32> aCounts; long aNumberOfContributions(0); const long nWidth(rSource.GetSizePixel().Width()); @@ -203,8 +203,14 @@ bool ImplScaleConvolutionVer(Bitmap& rSource, Bitmap& rTarget, const double& rSc if(pWriteAcc) { + std::vector<BitmapColor> aScanline(nHeight); for(long x(0); x < nWidth; x++) { + for(long y(0); y < nHeight; y++) + if(pReadAcc->HasPalette()) + aScanline[y] = pReadAcc->GetPaletteColor(pReadAcc->GetPixelIndex(y, x)); + else + aScanline[y] = pReadAcc->GetPixel(y, x); for(long y(0); y < nNewHeight; y++) { const long aBaseIndex(y * aNumberOfContributions); @@ -217,19 +223,8 @@ bool ImplScaleConvolutionVer(Bitmap& rSource, Bitmap& rTarget, const double& rSc { const long aIndex(aBaseIndex + j); const double aWeight(aWeights[aIndex]); - BitmapColor aColor; - aSum += aWeight; - - if(pReadAcc->HasPalette()) - { - aColor = pReadAcc->GetPaletteColor(pReadAcc->GetPixelIndex(aPixels[aIndex], x)); - } - else - { - aColor = pReadAcc->GetPixel(aPixels[aIndex], x); - } - + const BitmapColor & aColor = aScanline[aPixels[aIndex]]; aValueRed += aWeight * aColor.GetRed(); aValueGreen += aWeight * aColor.GetGreen(); aValueBlue += aWeight * aColor.GetBlue(); |