131 splitRectIntoPatches(
m_d->boundingRect, optimalPatchSize());
133 if (!
m_d->filteredSourceValid) {
138 struct PrefilterSharedState {
142 QScopedPointer<KisTransaction> activeTransaction;
147 state->boundingRect =
m_d->boundingRect;
148 state->filteredMainDev = filteredMainDev;
149 state->filteringOptions =
m_d->filteringOptions;
151 if (
m_d->filteringOptions.useEdgeDetection &&
152 m_d->filteringOptions.edgeDetectionSize > 0.0) {
154 addJobSequential(jobs, [state] () {
155 state->activeTransaction.reset(
new KisTransaction(state->filteredMainDev));
158 Q_FOREACH (
const QRect &rc, patchRects) {
159 addJobConcurrent(jobs, [state, rc] () {
163 t.
scale(0.5 * state->filteringOptions.edgeDetectionSize),
169 addJobSequential(jobs, [state] () {
170 state->activeTransaction.reset();
172 state->activeTransaction.reset(
new KisTransaction(state->filteredMainDev));
175 Q_FOREACH (
const QRect &rc, patchRects) {
176 addJobConcurrent(jobs, [state, rc] () {
180 t.
scale(state->filteringOptions.edgeDetectionSize),
181 t.
scale(state->filteringOptions.edgeDetectionSize),
186 addJobSequential(jobs, [state] () {
187 state->activeTransaction.reset();
191 if (
m_d->filteringOptions.fuzzyRadius > 0) {
193 addJobSequential(jobs, [state] () {
194 state->filteredMainDevSavedCopy =
new KisPaintDevice(*state->filteredMainDev);
195 state->activeTransaction.reset(
new KisTransaction(state->filteredMainDev));
198 Q_FOREACH (
const QRect &rc, patchRects) {
199 addJobConcurrent(jobs, [state, rc] () {
203 t.
scale(state->filteringOptions.fuzzyRadius),
204 t.
scale(state->filteringOptions.fuzzyRadius),
207 gc.
bitBlt(rc.topLeft(), state->filteredMainDevSavedCopy, rc);
211 addJobSequential(jobs, [state] () {
212 state->activeTransaction.reset();
216 addJobSequential(jobs, [
this, state] () {
220 m_d->filteredSource->makeCloneFrom(state->filteredMainDev,
m_d->boundingRect);
221 m_d->filteredSource->setDefaultBounds(oldBounds);
222 m_d->filteredSourceValid =
true;
226 if (!
m_d->prefilterOnly) {
227 addJobSequential(jobs, [
this] () {
231 Q_FOREACH (
const QRect &rc, patchRects) {
232 addJobConcurrent(jobs, [
this, rc] () {
235 return quint8(255 - pixel);
240 addJobSequential(jobs, [
this] () {
251 worker.
run(
m_d->filteringOptions.cleanUpAmount);
252 m_d->progressHelper.reset();
256 addJobSequential(jobs, [
this] () {
static void applyGaussian(KisPaintDeviceSP device, const QRect &rect, qreal xRadius, qreal yRadius, const QBitArray &channelFlags, KoUpdater *updater, bool createTransaction=false, KisConvolutionBorderOp borderOp=BORDER_REPEAT)
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)