107{
108
109 QImage originalImage( filename );
110
111
112 if( originalImage.depth() < 32 ) { originalImage = originalImage.convertDepth( 32, Qt::AutoColor ); }
113
114
115 bool useBusyIndicators = false;
117 if( options != NULL && options->
getStatus() != NULL )
118 {
119 useBusyIndicators = true;
121 }
122
123
124 if(useBusyIndicators)
125 {
126 QString statusMessage = qApp->translate( "oilPaintingEffect", "Applying Oil Painting Effect:" );
128 qApp->processEvents();
129 }
130
131
132 const int updateIncrement = (int) ( 0.01 * originalImage.width() * originalImage.height() );
134
135
137
138
140 {
142 editedImage =
new QImage( tmp->convertDepth( 32, Qt::AutoColor ) );
143 delete tmp; tmp=NULL;
144 }
145
146
148 const int RADIUS = (int)
MAX( 2, (sqrt(minDimen)/4) );
149
150
151 int originalImageX, originalImageY;
152 int editedImageX, editedImageY;
153 int clampedX, clampedY;
154 int trailingEdgeY, leadingEdgeY;
155
156 QRgb* rgb;
157 uchar* scanLine;
158 uchar* trailingScanLine;
159 uchar* leadingScanLine;
160
161
162 for( editedImageX=0; editedImageX <
editedImage->width(); editedImageX++)
163 {
164
165
167
168
169 for(originalImageY = 0 - 1 - RADIUS;
170 originalImageY <= 0 - 1 + RADIUS;
171 originalImageY++)
172 {
173 clampedY =
MAX(
MIN( originalImageY, originalImage.height() - 1 ), 0 );
174 scanLine = originalImage.scanLine( clampedY );
175
176 for(originalImageX = editedImageX - RADIUS;
177 originalImageX <= editedImageX + RADIUS;
178 originalImageX++)
179 {
180 clampedX =
MAX(
MIN( originalImageX, originalImage.width() - 1 ), 0 );
181
182
183 rgb = ((QRgb*)scanLine+clampedX);
184
185
189 }
190 }
191
192
193
194 for( editedImageY=0; editedImageY <
editedImage->height(); editedImageY++)
195 {
196 trailingEdgeY =
MAX(
MIN( editedImageY-1-RADIUS, originalImage.height() - 1 ), 0 );
197 leadingEdgeY =
MAX(
MIN( editedImageY+RADIUS, originalImage.height() - 1 ), 0 );
198
199 trailingScanLine = originalImage.scanLine( trailingEdgeY );
200 leadingScanLine = originalImage.scanLine( leadingEdgeY );
201
202 for(originalImageX = editedImageX - RADIUS;
203 originalImageX <= editedImageX + RADIUS;
204 originalImageX++)
205 {
206 clampedX =
MAX(
MIN( originalImageX, originalImage.width() - 1 ), 0 );
207
208
209 rgb = ((QRgb*)trailingScanLine+clampedX);
213
214
215 rgb = ((QRgb*)leadingScanLine+clampedX);
219 }
220
221
223
224
225
227 rgb = ((QRgb*)scanLine+editedImageX);
231
232
233
234 if(useBusyIndicators)
235 {
238 {
241 qApp->processEvents();
242 }
243 }
244
245 }
246 }
247
248
250}
StatusWidget * getStatus()
Triplet highestCountIndex