24 const tools::Long nHeight = aBitmap.GetSizePixel().Height();
27 int aNumberOfContributions;
29 std::vector<double> aWeights;
30 std::vector<int> aPixels;
31 std::vector<int> aCounts;
34 blurContributions(nWidth, aNumberOfContributions, aBlurVector, aWeights, aPixels, aCounts);
41 bool bResult =
convolutionPass(aBitmap, aNewBitmap, pReadAcc.
get(), aNumberOfContributions,
42 aWeights.data(), aPixels.data(), aCounts.data());
57 aBitmap.ReassignWithSize(aNewBitmap);
60 blurContributions(nHeight, aNumberOfContributions, aBlurVector, aWeights, aPixels, aCounts);
63 aNewBitmap =
Bitmap(
Size(nWidth, nHeight), 24);
65 aWeights.data(), aPixels.data(), aCounts.data());
75 aBitmap.ReassignWithSize(aNewBitmap);
86 int aNumberOfContributions,
87 const double* pWeights,
int const* pPixels,
103 double aValueRed, aValueGreen, aValueBlue;
104 double aSum, aWeight;
107 for (
int nSourceY = 0; nSourceY < nHeight; ++nSourceY)
109 for (
int nSourceX = 0; nSourceX < nWidth; ++nSourceX)
111 aBaseIndex = nSourceX * aNumberOfContributions;
112 aSum = aValueRed = aValueGreen = aValueBlue = 0.0;
114 for (
int j = 0; j < pCount[nSourceX]; ++j)
116 aIndex = aBaseIndex + j;
117 aWeight = pWeights[aIndex];
120 aColor = pReadAcc->
GetColor(nSourceY, pPixels[aIndex]);
122 aValueRed += aWeight * aColor.
GetRed();
123 aValueGreen += aWeight * aColor.GetGreen();
124 aValueBlue += aWeight * aColor.GetBlue();
127 BitmapColor aResultColor(static_cast<sal_uInt8>(
MinMax(aValueRed / aSum, 0, 255)),
128 static_cast<sal_uInt8>(
MinMax(aValueGreen / aSum, 0, 255)),
129 static_cast<sal_uInt8>(
MinMax(aValueBlue / aSum, 0, 255)));
131 int nDestX = nSourceY;
132 int nDestY = nSourceX;
134 pWriteAcc->
SetPixel(nDestY, nDestX, aResultColor);
143 int intRadius =
static_cast<int>(radius + 1.0);
144 rows = intRadius * 2 + 1;
145 std::vector<double> matrix(rows);
147 double sigma = radius / 3;
148 double radius2 = radius * radius;
150 for (
int row = -intRadius; row <= intRadius; row++)
153 if (distance > radius2)
159 matrix[index] = exp(-distance / (2.0 * sigma * sigma)) / sqrt(2.0 * M_PI * sigma);
167 const int aSize,
const int aNumberOfContributions,
const std::vector<double>& rBlurVector,
168 std::vector<double>& rWeights, std::vector<int>& rPixels, std::vector<int>& rCounts)
170 rWeights.resize(aSize * aNumberOfContributions);
171 rPixels.resize(aSize * aNumberOfContributions);
172 rCounts.resize(aSize);
174 int aLeft, aRight, aCurrentCount, aPixelIndex;
177 for (
int i = 0;
i < aSize;
i++)
179 aLeft =
i - aNumberOfContributions / 2;
180 aRight =
i + aNumberOfContributions / 2;
182 for (
int j = aLeft; j <= aRight; j++)
184 aWeight = rBlurVector[aCurrentCount];
193 aPixelIndex = (aSize - j) + aSize - 1;
201 if (aPixelIndex < 0 || aPixelIndex >= aSize)
206 rWeights[
i * aNumberOfContributions + aCurrentCount] = aWeight;
207 rPixels[
i * aNumberOfContributions + aCurrentCount] = aPixelIndex;
211 rCounts[
i] = aCurrentCount;
static std::vector< double > makeBlurKernel(const double radius, int &rows)
std::enable_if< std::is_signed< T >::value||std::is_floating_point< T >::value, long >::type MinMax(T nVal, tools::Long nMin, tools::Long nMax)
static bool convolutionPass(const Bitmap &rBitmap, Bitmap &aNewBitmap, BitmapReadAccess const *pReadAcc, int aNumberOfContributions, const double *pWeights, int const *pPixels, const int *pCount)
Size GetSizePixel() const
static void blurContributions(const int aSize, const int aNumberOfContributions, const std::vector< double > &rBlurVector, std::vector< double > &rWeights, std::vector< int > &rPixels, std::vector< int > &rCounts)
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
void SetPixel(tools::Long nY, tools::Long nX, const BitmapColor &rBitmapColor)
vcl::ScopedBitmapAccess< BitmapReadAccess, Bitmap,&Bitmap::AcquireReadAccess > ScopedReadAccess
BitmapColor GetColor(tools::Long nY, tools::Long nX) const
tools::Long Width() const
virtual BitmapEx execute(BitmapEx const &rBitmapEx) const override
Separable Gaussian Blur filter and accepts a blur radius as a parameter so the user can change the st...
Bitmap GetBitmap(Color aTransparentReplaceColor) const
std::deque< AttacherIndex_Impl > aIndex
tools::Long Height() const