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

#include <HistogramComputationStrokeStrategy.h>

+ Inheritance diagram for HistogramComputationStrokeStrategy:

Classes

struct  Private
 

Signals

void computationResultReady (HistogramData data)
 
- Signals inherited from KisIdleTaskStrokeStrategy
void sigIdleTaskFinished ()
 

Public Member Functions

 HistogramComputationStrokeStrategy (KisImageSP image)
 
 ~HistogramComputationStrokeStrategy () override
 
- Public Member Functions inherited from KisIdleTaskStrokeStrategy
KisStrokeStrategycreateLodClone (int levelOfDetail) override
 
QWeakPointer< boost::none_t > idleTaskCookie ()
 
 KisIdleTaskStrokeStrategy (const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
 
 ~KisIdleTaskStrokeStrategy ()
 
- 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
virtual void cancelStrokeCallback ()
 
KisStrokeJobDatacreateCancelData () override
 
KisStrokeJobStrategycreateCancelStrategy () override
 
KisStrokeJobStrategycreateDabStrategy () override
 
KisStrokeJobDatacreateFinishData () override
 
KisStrokeJobStrategycreateFinishStrategy () override
 
KisStrokeJobDatacreateInitData () override
 
KisStrokeJobStrategycreateInitStrategy () override
 
KisStrokeJobDatacreateResumeData () override
 
KisStrokeJobStrategycreateResumeStrategy () override
 
KisStrokeJobDatacreateSuspendData () override
 
KisStrokeJobStrategycreateSuspendStrategy () override
 
 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 void tryCancelCurrentStrokeJobAsync ()
 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.
 
virtual ~KisStrokeStrategy ()
 

Private Member Functions

void doStrokeCallback (KisStrokeJobData *data) override
 
void finishStrokeCallback () override
 
void initiateVector (HistVector &vec, const KoColorSpace *colorSpace)
 
void initStrokeCallback () override
 

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 KisIdleTaskStrokeStrategy
static int preferredIdleTaskMaximumTime ()
 
static int preferredIdleWatcherInterval ()
 
- Static Public Member Functions inherited from KisSimpleStrokeStrategy
static QLatin1String jobTypeToString (JobType type)
 
- Protected Member Functions inherited from KisIdleTaskStrokeStrategy
void finishStrokeCallback () override
 
void initStrokeCallback () override
 
- 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 28 of file HistogramComputationStrokeStrategy.h.

Constructor & Destructor Documentation

◆ HistogramComputationStrokeStrategy()

HistogramComputationStrokeStrategy::HistogramComputationStrokeStrategy ( KisImageSP image)

Definition at line 38 of file HistogramComputationStrokeStrategy.cpp.

39 : KisIdleTaskStrokeStrategy(QLatin1String("ComputeHistogram"), kundo2_i18n("Update histogram"))
40 , m_d(new Private)
41{
42 m_d->image = image;
43}
KisIdleTaskStrokeStrategy(const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
KUndo2MagicString kundo2_i18n(const char *text)

References m_d.

◆ ~HistogramComputationStrokeStrategy()

HistogramComputationStrokeStrategy::~HistogramComputationStrokeStrategy ( )
override

Definition at line 45 of file HistogramComputationStrokeStrategy.cpp.

46{
47}

Member Function Documentation

◆ computationResultReady

void HistogramComputationStrokeStrategy::computationResultReady ( HistogramData data)
signal

◆ doStrokeCallback()

void HistogramComputationStrokeStrategy::doStrokeCallback ( KisStrokeJobData * data)
overrideprivatevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 66 of file HistogramComputationStrokeStrategy.cpp.

67{
68 Private::ProcessData *d_pd = dynamic_cast<Private::ProcessData*>(data);
69
70 if (!d_pd) {
72 return;
73 }
74
75 QRect calculate = d_pd->rectToCalculate;
76
77 KisPaintDeviceSP m_dev = m_d->image->projection();
78 QRect imageBounds = m_d->image->bounds();
79
80 const KoColorSpace *cs = m_dev->colorSpace();
81 quint32 channelCount = m_dev->channelCount();
82 quint32 pixelSize = m_dev->pixelSize();
83
84 int imageSize = imageBounds.width() * imageBounds.height();
85 int nSkip = 1 + (imageSize >> 20); //for speed use about 1M pixels for computing histograms
86
87 if (calculate.isEmpty())
88 return;
89
90 initiateVector(m_d->results[d_pd->jobId], cs);
91 initiateVector(m_d->resultsLog[d_pd->jobId], cs);
92
93 quint32 toSkip = nSkip;
94
95 float maximum = 1.0;
96 QVector<float> channelValues(channelCount);
97 if (cs->hasHighDynamicRange()) {
98 KisSequentialConstIterator it(m_dev, calculate);
99
100 int numConseqPixels = it.nConseqPixels();
101 while (it.nextPixels(numConseqPixels)) {
102 numConseqPixels = it.nConseqPixels();
103 const quint8* pixel = it.rawDataConst();
104 for (int k = 0; k < numConseqPixels; ++k) {
105 cs->normalisedChannelsValue(pixel, channelValues);
106 for (int chan = 0; chan < (int)channelCount; ++chan) {
107 maximum = qMax(maximum, channelValues.at(chan));
108 }
109 pixel += pixelSize;
110 }
111 }
112 }
113 m_d->maximumValue = maximum;
114
115 const double maximumMultiplier = 255.0/maximum;
116 const double logMaxMultiplier = 255.0/(std::log10(maximum*10)*0.1);
117
118
119 KisSequentialConstIterator it(m_dev, calculate);
120
121 int numConseqPixels = it.nConseqPixels();
122 while (it.nextPixels(numConseqPixels)) {
123
124 numConseqPixels = it.nConseqPixels();
125 const quint8* pixel = it.rawDataConst();
126 for (int k = 0; k < numConseqPixels; ++k) {
127 cs->normalisedChannelsValue(pixel, channelValues);
128 if (--toSkip == 0) {
129
130 for (int chan = 0; chan < (int)channelCount; ++chan) {
131 m_d->results[d_pd->jobId][chan][ qBound(0, qRound(channelValues.at(chan)*maximumMultiplier), 255) ]++;
132 m_d->resultsLog[d_pd->jobId][chan][ qBound(0, qRound(std::log10(channelValues.at(chan)*10)*0.1*logMaxMultiplier), 255) ]++;
133 }
134 toSkip = nSkip;
135 }
136 pixel += pixelSize;
137 }
138 }
139}
void initiateVector(HistVector &vec, const KoColorSpace *colorSpace)
quint32 pixelSize() const
quint32 channelCount() const
const KoColorSpace * colorSpace() const
virtual void doStrokeCallback(KisStrokeJobData *data)
virtual bool hasHighDynamicRange() const =0
virtual void normalisedChannelsValue(const quint8 *pixel, QVector< float > &channels) const =0

References KisPaintDevice::channelCount(), KisPaintDevice::colorSpace(), KisSimpleStrokeStrategy::doStrokeCallback(), KoColorSpace::hasHighDynamicRange(), initiateVector(), HistogramComputationStrokeStrategy::Private::ProcessData::jobId, m_d, KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nConseqPixels(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixels(), KoColorSpace::normalisedChannelsValue(), KisPaintDevice::pixelSize(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawDataConst(), and HistogramComputationStrokeStrategy::Private::ProcessData::rectToCalculate.

◆ finishStrokeCallback()

void HistogramComputationStrokeStrategy::finishStrokeCallback ( )
overrideprivatevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 141 of file HistogramComputationStrokeStrategy.cpp.

142{
143 HistogramData hisData;
144 hisData.colorSpace = m_d->image->projection()->colorSpace();
145 hisData.maximumValue = m_d->maximumValue;
146
147 if (m_d->results.size() == 1) {
148 hisData.bins = m_d->results[0];
149 hisData.binsLog = m_d->resultsLog[0];
150 Q_EMIT computationResultReady(hisData);
151 } else {
152
153 quint32 channelCount = m_d->image->projection()->channelCount();
154
155 initiateVector(hisData.bins, hisData.colorSpace);
156 initiateVector(hisData.binsLog, hisData.colorSpace);
157
158 for (int chan = 0; chan < (int)channelCount; chan++) {
159 int bsize = hisData.bins[chan].size();
160
161 for (int bi = 0; bi < bsize; bi++) {
162 hisData.bins[chan][bi] = 0;
163 for (int i = 0; i < (int)m_d->results.size(); i++) {
164 hisData.bins[chan][bi] += m_d->results[i][chan][bi];
165 }
166 }
167 int b2size = hisData.binsLog[chan].size();
168
169 for (int bi = 0; bi < b2size; bi++) {
170 hisData.binsLog[chan][bi] = 0;
171 for (int i = 0; i < (int)m_d->resultsLog.size(); i++) {
172 hisData.binsLog[chan][bi] += m_d->resultsLog[i][chan][bi];
173 }
174 }
175 }
176
177 Q_EMIT computationResultReady(hisData);
178 }
179
181}
void computationResultReady(HistogramData data)

References HistogramData::bins, HistogramData::binsLog, HistogramData::colorSpace, computationResultReady(), KisIdleTaskStrokeStrategy::finishStrokeCallback(), initiateVector(), m_d, and HistogramData::maximumValue.

◆ initiateVector()

void HistogramComputationStrokeStrategy::initiateVector ( HistVector & vec,
const KoColorSpace * colorSpace )
private

Definition at line 183 of file HistogramComputationStrokeStrategy.cpp.

184{
185 vec.resize(colorSpace->channelCount());
186 for (auto &bin : vec) {
187 bin.resize(std::numeric_limits<quint8>::max() + 1);
188 }
189}
virtual quint32 channelCount() const =0

References KoColorSpace::channelCount().

◆ initStrokeCallback()

void HistogramComputationStrokeStrategy::initStrokeCallback ( )
overrideprivatevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 49 of file HistogramComputationStrokeStrategy.cpp.

50{
52
54 int i = 0;
56 m_d->results.resize(tileRects.size());
57 m_d->resultsLog.resize(tileRects.size());
58
59 Q_FOREACH (const QRect &tileRectangle, tileRects) {
60 jobsData << new HistogramComputationStrokeStrategy::Private::ProcessData(tileRectangle, i);
61 i++;
62 }
63 addMutatedJobs(jobsData);
64}
void addMutatedJobs(const QVector< KisStrokeJobData * > list)
QVector< QRect > splitRectIntoPatches(const QRect &rc, const QSize &patchSize)
QSize optimalPatchSize()

References KisStrokeStrategy::addMutatedJobs(), KisIdleTaskStrokeStrategy::initStrokeCallback(), m_d, KritaUtils::optimalPatchSize(), and KritaUtils::splitRectIntoPatches().

Member Data Documentation

◆ m_d

const QScopedPointer<Private> HistogramComputationStrokeStrategy::m_d
private

Definition at line 48 of file HistogramComputationStrokeStrategy.h.


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