138
141
long kernelWidth, i;
139
142
double red, green, blue, alpha, normalize=0.0;
141
Digikam::DColor color;
143
145
kernelWidth = order;
145
147
if ((kernelWidth % 2) == 0)
147
kWarning(imagePluginsAreaCode) << "Kernel width must be an odd number!";
149
kWarning() << "Kernel width must be an odd number!";
151
double *normal_kernel = new double[kernelWidth*kernelWidth];
153
double *normal_kernel = new double[kernelWidth * kernelWidth];
153
155
if (!normal_kernel)
155
kWarning(imagePluginsAreaCode) << "Unable to allocate memory!";
157
kWarning() << "Unable to allocate memory!";
159
for(i=0 ; i < (kernelWidth*kernelWidth) ; ++i)
161
for (i = 0; i < (kernelWidth * kernelWidth); ++i)
160
163
normalize += kernel[i];
162
166
if (fabs(normalize) <= Epsilon)
165
171
normalize = 1.0/normalize;
167
for(i=0 ; i < (kernelWidth*kernelWidth) ; ++i)
168
normal_kernel[i] = normalize*kernel[i];
173
for (i = 0; i < (kernelWidth * kernelWidth); ++i)
175
normal_kernel[i] = normalize * kernel[i];
178
// --------------------------------------------------------
181
uint height = m_destImage.height();
182
uint width = m_destImage.width();
183
bool sixteenBit = m_destImage.sixteenBit();
184
uchar *ddata = m_destImage.bits();
185
int ddepth = m_destImage.bytesDepth();
187
uchar *sdata = m_orgImage.bits();
188
int sdepth = m_orgImage.bytesDepth();
170
190
double maxClamp = m_destImage.sixteenBit() ? 16777215.0 : 65535.0;
172
for(y=0 ; !m_cancel && (y < m_destImage.height()) ; ++y)
192
// --------------------------------------------------------
194
for (y = 0; !m_cancel && (y < height); ++y)
174
sy = y-(kernelWidth/2);
196
sy = y - (kernelWidth / 2);
176
for(x=0 ; !m_cancel && (x < m_destImage.width()) ; ++x)
198
for (x = 0; !m_cancel && (x < width); ++x)
179
201
red = green = blue = alpha = 0;
180
sy = y-(kernelWidth/2);
202
sy = y - (kernelWidth / 2);
182
for(mcy=0 ; !m_cancel && (mcy < kernelWidth) ; ++mcy, ++sy)
204
for (mcy = 0; !m_cancel && (mcy < kernelWidth); ++mcy, ++sy)
184
my = sy < 0 ? 0 : sy > (int)m_destImage.height()-1 ? m_destImage.height()-1 : sy;
185
sx = x+(-kernelWidth/2);
206
my = sy < 0 ? 0 : sy > (int) height - 1 ? height - 1 : sy;
207
sx = x + (-kernelWidth / 2);
187
for(mcx=0 ; !m_cancel && (mcx < kernelWidth) ; ++mcx, ++sx)
209
for (mcx = 0; !m_cancel && (mcx < kernelWidth); ++mcx, ++sx)
189
mx = sx < 0 ? 0 : sx > (int)m_destImage.width()-1 ? m_destImage.width()-1 : sx;
190
color = m_orgImage.getPixelColor(mx, my);
191
red += (*k)*(color.red() * 257.0);
192
green += (*k)*(color.green() * 257.0);
193
blue += (*k)*(color.blue() * 257.0);
194
alpha += (*k)*(color.alpha() * 257.0);
211
mx = sx < 0 ? 0 : sx > (int) width - 1 ? width - 1 : sx;
212
Digikam::DColor color(sdata + mx * sdepth + (width * my * sdepth), sixteenBit);
213
red += (*k) * (color.red() * 257.0);
214
green += (*k) * (color.green() * 257.0);
215
blue += (*k) * (color.blue() * 257.0);
216
alpha += (*k) * (color.alpha() * 257.0);
201
223
blue = blue < 0.0 ? 0.0 : blue > maxClamp ? maxClamp : blue+0.5;
202
224
alpha = alpha < 0.0 ? 0.0 : alpha > maxClamp ? maxClamp : alpha+0.5;
204
m_destImage.setPixelColor(x, y, Digikam::DColor((int)(red / 257UL), (int)(green / 257UL),
205
(int)(blue / 257UL), (int)(alpha / 257UL),
206
m_destImage.sixteenBit()));
226
Digikam::DColor color((int)(red / 257UL), (int)(green / 257UL),
227
(int)(blue / 257UL), (int)(alpha / 257UL), sixteenBit);
228
color.setPixel((ddata + x * ddepth + (width * y * ddepth)));
209
progress = (int)(((double)y * 50.0) / m_destImage.height());
210
if ( progress%5 == 0 )
211
postProgress( progress );
231
progress = (int) (((double) y * 80.0) / height);
232
if (progress % 5 == 0)
234
postProgress(progress);
214
238
delete [] normal_kernel;