Krita Source Code Documentation
Loading...
Searching...
No Matches
KisColorizeStrokeStrategy Class Reference

#include <kis_colorize_stroke_strategy.h>

+ Inheritance diagram for KisColorizeStrokeStrategy:

Classes

struct  Private
 

Signals

void sigCancelled ()
 
void sigFinished (bool prefilterOnly)
 

Public Member Functions

void addKeyStroke (KisPaintDeviceSP dev, const KoColor &color)
 
void cancelStrokeCallback () override
 
KisStrokeStrategycreateLodClone (int levelOfDetail) override
 
KisLazyFillTools::FilteringOptions filteringOptions () const
 
void initStrokeCallback () override
 
 KisColorizeStrokeStrategy (const KisColorizeStrokeStrategy &rhs, int levelOfDetail)
 
 KisColorizeStrokeStrategy (KisPaintDeviceSP src, KisPaintDeviceSP dst, KisPaintDeviceSP filteredSource, bool filteredSourceValid, const QRect &boundingRect, KisNodeSP progressNode, bool prefilterOnly=false)
 
void setFilteringOptions (const KisLazyFillTools::FilteringOptions &value)
 
void tryCancelCurrentStrokeJobAsync () override
 tryCancelCurrentStrokeJobAsync is called by the strokes queue when the stroke is being cancelled. The stroke strategy may or may not handle this request and cancel the currently running long action.
 
 ~KisColorizeStrokeStrategy () override
 
- Public Member Functions inherited from KisRunnableBasedStrokeStrategy
void doStrokeCallback (KisStrokeJobData *data) override
 
 KisRunnableBasedStrokeStrategy (const KisRunnableBasedStrokeStrategy &rhs)
 
 KisRunnableBasedStrokeStrategy (const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
 
KisRunnableStrokeJobsInterfacerunnableJobsInterface () const
 
 ~KisRunnableBasedStrokeStrategy ()
 
- Public Member Functions inherited from KisSimpleStrokeStrategy
KisStrokeJobDatacreateCancelData () override
 
KisStrokeJobStrategycreateCancelStrategy () override
 
KisStrokeJobStrategycreateDabStrategy () override
 
KisStrokeJobDatacreateFinishData () override
 
KisStrokeJobStrategycreateFinishStrategy () override
 
KisStrokeJobDatacreateInitData () override
 
KisStrokeJobStrategycreateInitStrategy () override
 
KisStrokeJobDatacreateResumeData () override
 
KisStrokeJobStrategycreateResumeStrategy () override
 
KisStrokeJobDatacreateSuspendData () override
 
KisStrokeJobStrategycreateSuspendStrategy () override
 
virtual void finishStrokeCallback ()
 
 KisSimpleStrokeStrategy (const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
 
virtual void resumeStrokeCallback ()
 
virtual void suspendStrokeCallback ()
 
- Public Member Functions inherited from KisStrokeStrategy
qreal balancingRatioOverride () const
 
bool canForgetAboutMe () const
 
bool clearsRedoOnStart () const
 
KisLodPreferences currentLodPreferences () const
 
bool forceLodModeIfPossible () const
 
QString id () const
 
bool isAsynchronouslyCancellable () const
 
bool isExclusive () const
 
 KisStrokeStrategy (const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
 
KUndo2MagicString name () const
 
bool needsExplicitCancel () const
 
virtual void notifyUserEndedStroke ()
 
virtual void notifyUserStartedStroke ()
 
bool requestsOtherStrokesToEnd () const
 
void setForceLodModeIfPossible (bool forceLodModeIfPossible)
 
void setMutatedJobsInterface (KisStrokesQueueMutatedJobInterface *mutatedJobsInterface, KisStrokeId strokeId)
 
bool supportsWrapAroundMode () const
 
virtual ~KisStrokeStrategy ()
 

Private Attributes

const QScopedPointer< Privatem_d
 

Additional Inherited Members

- Public Types inherited from KisSimpleStrokeStrategy
enum  JobType {
  JOB_INIT = 0 , JOB_CANCEL , JOB_FINISH , JOB_DOSTROKE ,
  JOB_SUSPEND , JOB_RESUME , NJOBS
}
 
- Static Public Member Functions inherited from KisSimpleStrokeStrategy
static QLatin1String jobTypeToString (JobType type)
 
- Protected Member Functions inherited from KisSimpleStrokeStrategy
void enableJob (JobType type, bool enable=true, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
 
 KisSimpleStrokeStrategy (const KisSimpleStrokeStrategy &rhs)
 
- Protected Member Functions inherited from KisStrokeStrategy
void addMutatedJob (KisStrokeJobData *data)
 
void addMutatedJobs (const QVector< KisStrokeJobData * > list)
 
 KisStrokeStrategy (const KisStrokeStrategy &rhs)
 
void setAsynchronouslyCancellable (bool value)
 
void setBalancingRatioOverride (qreal value)
 
void setCanForgetAboutMe (bool value)
 
void setClearsRedoOnStart (bool value)
 
void setExclusive (bool value)
 
void setNeedsExplicitCancel (bool value)
 
void setRequestsOtherStrokesToEnd (bool value)
 
void setSupportsWrapAroundMode (bool value)
 

Detailed Description

Definition at line 23 of file kis_colorize_stroke_strategy.h.

Constructor & Destructor Documentation

◆ KisColorizeStrokeStrategy() [1/2]

KisColorizeStrokeStrategy::KisColorizeStrokeStrategy ( KisPaintDeviceSP src,
KisPaintDeviceSP dst,
KisPaintDeviceSP filteredSource,
bool filteredSourceValid,
const QRect & boundingRect,
KisNodeSP progressNode,
bool prefilterOnly = false )

Definition at line 67 of file kis_colorize_stroke_strategy.cpp.

74 : KisRunnableBasedStrokeStrategy(QLatin1String("colorize-stroke"), prefilterOnly ? kundo2_i18n("Prefilter Colorize Mask") : kundo2_i18n("Colorize")),
75 m_d(new Private)
76{
77 m_d->progressNode = progressNode;
78 m_d->src = src;
79 m_d->dst = dst;
80 m_d->filteredSource = filteredSource;
81 m_d->boundingRect = boundingRect;
82 m_d->filteredSourceValid = filteredSourceValid;
83 m_d->prefilterOnly = prefilterOnly;
84
88
92}
const QScopedPointer< Private > m_d
KisRunnableBasedStrokeStrategy(const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
void enableJob(JobType type, bool enable=true, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
void setClearsRedoOnStart(bool value)
void setRequestsOtherStrokesToEnd(bool value)
void setNeedsExplicitCancel(bool value)
KUndo2MagicString kundo2_i18n(const char *text)

References KisSimpleStrokeStrategy::enableJob(), KisStrokeJobData::EXCLUSIVE, KisSimpleStrokeStrategy::JOB_CANCEL, KisSimpleStrokeStrategy::JOB_DOSTROKE, KisSimpleStrokeStrategy::JOB_INIT, m_d, KisStrokeJobData::SEQUENTIAL, KisStrokeStrategy::setClearsRedoOnStart(), KisStrokeStrategy::setNeedsExplicitCancel(), and KisStrokeStrategy::setRequestsOtherStrokesToEnd().

◆ KisColorizeStrokeStrategy() [2/2]

KisColorizeStrokeStrategy::KisColorizeStrokeStrategy ( const KisColorizeStrokeStrategy & rhs,
int levelOfDetail )

Definition at line 94 of file kis_colorize_stroke_strategy.cpp.

96 m_d(new Private(*rhs.m_d, levelOfDetail))
97{
98 KisLodTransform t(levelOfDetail);
99 m_d->boundingRect = t.map(rhs.m_d->boundingRect);
100}

References m_d, and KisLodTransform::map().

◆ ~KisColorizeStrokeStrategy()

KisColorizeStrokeStrategy::~KisColorizeStrokeStrategy ( )
override

Definition at line 102 of file kis_colorize_stroke_strategy.cpp.

103{
104}

Member Function Documentation

◆ addKeyStroke()

void KisColorizeStrokeStrategy::addKeyStroke ( KisPaintDeviceSP dev,
const KoColor & color )

Definition at line 116 of file kis_colorize_stroke_strategy.cpp.

117{
118 KoColor convertedColor(color);
119 convertedColor.convertTo(m_d->dst->colorSpace());
120
121 m_d->keyStrokes << KeyStroke(dev, convertedColor);
122}

References KoColor::convertTo(), and m_d.

◆ cancelStrokeCallback()

void KisColorizeStrokeStrategy::cancelStrokeCallback ( )
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 263 of file kis_colorize_stroke_strategy.cpp.

264{
265 Q_EMIT sigCancelled();
266}

References sigCancelled().

◆ createLodClone()

KisStrokeStrategy * KisColorizeStrokeStrategy::createLodClone ( int levelOfDetail)
overridevirtual

Reimplemented from KisStrokeStrategy.

Definition at line 277 of file kis_colorize_stroke_strategy.cpp.

278{
279 KisImageConfig cfg(true);
280 if (!cfg.useLodForColorizeMask()) return 0;
281
282 KisColorizeStrokeStrategy *clone = new KisColorizeStrokeStrategy(*this, levelOfDetail);
283 return clone;
284}
KisColorizeStrokeStrategy(KisPaintDeviceSP src, KisPaintDeviceSP dst, KisPaintDeviceSP filteredSource, bool filteredSourceValid, const QRect &boundingRect, KisNodeSP progressNode, bool prefilterOnly=false)

References KisColorizeStrokeStrategy(), and KisImageConfig::useLodForColorizeMask().

◆ filteringOptions()

FilteringOptions KisColorizeStrokeStrategy::filteringOptions ( ) const

Definition at line 111 of file kis_colorize_stroke_strategy.cpp.

112{
113 return m_d->filteringOptions;
114}

References m_d.

◆ initStrokeCallback()

void KisColorizeStrokeStrategy::initStrokeCallback ( )
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 124 of file kis_colorize_stroke_strategy.cpp.

125{
126 using namespace KritaUtils;
127
129
130 const QVector<QRect> patchRects =
131 splitRectIntoPatches(m_d->boundingRect, optimalPatchSize());
132
133 if (!m_d->filteredSourceValid) {
134 // TODO: make this conversion concurrent!!!
136 filteredMainDev->setDefaultBounds(m_d->src->defaultBounds());
137
138 struct PrefilterSharedState {
139 QRect boundingRect;
140 KisPaintDeviceSP filteredMainDev;
141 KisPaintDeviceSP filteredMainDevSavedCopy;
142 QScopedPointer<KisTransaction> activeTransaction;
143 FilteringOptions filteringOptions;
144 };
145
146 QSharedPointer<PrefilterSharedState> state(new PrefilterSharedState());
147 state->boundingRect = m_d->boundingRect;
148 state->filteredMainDev = filteredMainDev;
149 state->filteringOptions = m_d->filteringOptions;
150
151 if (m_d->filteringOptions.useEdgeDetection &&
152 m_d->filteringOptions.edgeDetectionSize > 0.0) {
153
154 addJobSequential(jobs, [state] () {
155 state->activeTransaction.reset(new KisTransaction(state->filteredMainDev));
156 });
157
158 Q_FOREACH (const QRect &rc, patchRects) {
159 addJobConcurrent(jobs, [state, rc] () {
160 KisLodTransformScalar t(state->filteredMainDev);
161 KisGaussianKernel::applyLoG(state->filteredMainDev,
162 rc,
163 t.scale(0.5 * state->filteringOptions.edgeDetectionSize),
164 -1.0,
165 QBitArray(), 0);
166 });
167 }
168
169 addJobSequential(jobs, [state] () {
170 state->activeTransaction.reset();
171 normalizeAlpha8Device(state->filteredMainDev, state->boundingRect);
172 state->activeTransaction.reset(new KisTransaction(state->filteredMainDev));
173 });
174
175 Q_FOREACH (const QRect &rc, patchRects) {
176 addJobConcurrent(jobs, [state, rc] () {
177 KisLodTransformScalar t(state->filteredMainDev);
178 KisGaussianKernel::applyGaussian(state->filteredMainDev,
179 rc,
180 t.scale(state->filteringOptions.edgeDetectionSize),
181 t.scale(state->filteringOptions.edgeDetectionSize),
182 QBitArray(), 0);
183 });
184 }
185
186 addJobSequential(jobs, [state] () {
187 state->activeTransaction.reset();
188 });
189 }
190
191 if (m_d->filteringOptions.fuzzyRadius > 0) {
192
193 addJobSequential(jobs, [state] () {
194 state->filteredMainDevSavedCopy = new KisPaintDevice(*state->filteredMainDev);
195 state->activeTransaction.reset(new KisTransaction(state->filteredMainDev));
196 });
197
198 Q_FOREACH (const QRect &rc, patchRects) {
199 addJobConcurrent(jobs, [state, rc] () {
200 KisLodTransformScalar t(state->filteredMainDev);
201 KisGaussianKernel::applyGaussian(state->filteredMainDev,
202 rc,
203 t.scale(state->filteringOptions.fuzzyRadius),
204 t.scale(state->filteringOptions.fuzzyRadius),
205 QBitArray(), 0);
206 KisPainter gc(state->filteredMainDev);
207 gc.bitBlt(rc.topLeft(), state->filteredMainDevSavedCopy, rc);
208 });
209 }
210
211 addJobSequential(jobs, [state] () {
212 state->activeTransaction.reset();
213 });
214 }
215
216 addJobSequential(jobs, [this, state] () {
217 normalizeAndInvertAlpha8Device(state->filteredMainDev, state->boundingRect);
218
219 KisDefaultBoundsBaseSP oldBounds = m_d->filteredSource->defaultBounds();
220 m_d->filteredSource->makeCloneFrom(state->filteredMainDev, m_d->boundingRect);
221 m_d->filteredSource->setDefaultBounds(oldBounds);
222 m_d->filteredSourceValid = true;
223 });
224 }
225
226 if (!m_d->prefilterOnly) {
227 addJobSequential(jobs, [this] () {
228 m_d->heightMap = new KisPaintDevice(*m_d->filteredSource);
229 });
230
231 Q_FOREACH (const QRect &rc, patchRects) {
232 addJobConcurrent(jobs, [this, rc] () {
233 KritaUtils::filterAlpha8Device(m_d->heightMap, rc,
234 [](quint8 pixel) {
235 return quint8(255 - pixel);
236 });
237 });
238 }
239
240 addJobSequential(jobs, [this] () {
241 m_d->progressHelper.reset(new KisProcessingVisitor::ProgressHelper(m_d->progressNode));
242
243 KisWatershedWorker worker(m_d->heightMap, m_d->dst, m_d->boundingRect, m_d->progressHelper->updater());
244 Q_FOREACH (const KeyStroke &stroke, m_d->keyStrokes) {
245 KoColor color =
246 !stroke.isTransparent ?
247 stroke.color : KoColor::createTransparent(m_d->dst->colorSpace());
248
249 worker.addKeyStroke(stroke.dev, color);
250 }
251 worker.run(m_d->filteringOptions.cleanUpAmount);
252 m_d->progressHelper.reset();
253 });
254 }
255
256 addJobSequential(jobs, [this] () {
257 Q_EMIT sigFinished(m_d->prefilterOnly);
258 });
259
261}
void sigFinished(bool prefilterOnly)
static void applyGaussian(KisPaintDeviceSP device, const QRect &rect, qreal xRadius, qreal yRadius, const QBitArray &channelFlags, KoUpdater *updater, bool createTransaction=false, KisConvolutionBorderOp borderOp=BORDER_REPEAT)
static void applyLoG(KisPaintDeviceSP device, const QRect &rect, qreal radius, qreal coeff, const QBitArray &channelFlags, KoUpdater *progressUpdater)
void setDefaultBounds(KisDefaultBoundsBaseSP bounds)
static KisPaintDeviceSP convertToAlphaAsAlpha(KisPaintDeviceSP src)
KisRunnableStrokeJobsInterface * runnableJobsInterface() const
virtual void addRunnableJobs(const QVector< KisRunnableStrokeJobDataBase * > &list)=0
static KoColor createTransparent(const KoColorSpace *cs)
Definition KoColor.cpp:681
void normalizeAndInvertAlpha8Device(KisPaintDeviceSP dev, const QRect &rect)
void normalizeAlpha8Device(KisPaintDeviceSP dev, const QRect &rect)
QVector< QRect > splitRectIntoPatches(const QRect &rc, const QSize &patchSize)
void filterAlpha8Device(KisPaintDeviceSP dev, const QRect &rc, std::function< quint8(quint8)> func)
void addJobConcurrent(QVector< Job * > &jobs, Func func)
void addJobSequential(QVector< Job * > &jobs, Func func)
QSize optimalPatchSize()

References KisWatershedWorker::addKeyStroke(), KisRunnableStrokeJobsInterface::addRunnableJobs(), KisGaussianKernel::applyGaussian(), KisGaussianKernel::applyLoG(), KisPainter::bitBlt(), KisLazyFillTools::KeyStroke::color, KisPainter::convertToAlphaAsAlpha(), KoColor::createTransparent(), KisLazyFillTools::KeyStroke::dev, KritaUtils::filterAlpha8Device(), KisLazyFillTools::KeyStroke::isTransparent, m_d, KisLazyFillTools::normalizeAlpha8Device(), KisLazyFillTools::normalizeAndInvertAlpha8Device(), KisWatershedWorker::run(), KisRunnableBasedStrokeStrategy::runnableJobsInterface(), KisLodTransformScalar::scale(), KisPaintDevice::setDefaultBounds(), and sigFinished().

◆ setFilteringOptions()

void KisColorizeStrokeStrategy::setFilteringOptions ( const KisLazyFillTools::FilteringOptions & value)

Definition at line 106 of file kis_colorize_stroke_strategy.cpp.

107{
108 m_d->filteringOptions = value;
109}
float value(const T *src, size_t ch)

References m_d, and value().

◆ sigCancelled

void KisColorizeStrokeStrategy::sigCancelled ( )
signal

◆ sigFinished

void KisColorizeStrokeStrategy::sigFinished ( bool prefilterOnly)
signal

◆ tryCancelCurrentStrokeJobAsync()

void KisColorizeStrokeStrategy::tryCancelCurrentStrokeJobAsync ( )
overridevirtual

tryCancelCurrentStrokeJobAsync is called by the strokes queue when the stroke is being cancelled. The stroke strategy may or may not handle this request and cancel the currently running long action.

Reimplemented from KisStrokeStrategy.

Definition at line 268 of file kis_colorize_stroke_strategy.cpp.

269{
270 // NOTE: this method may be called by the GUI thread asynchronously!
272 if (helper) {
273 helper->cancel();
274 }
275}

References m_d.

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisColorizeStrokeStrategy::m_d
private

Definition at line 56 of file kis_colorize_stroke_strategy.h.


The documentation for this class was generated from the following files: