56 m_d->results.resize(tileRects.size());
57 m_d->resultsLog.resize(tileRects.size());
59 Q_FOREACH (
const QRect &tileRectangle, tileRects) {
78 QRect imageBounds =
m_d->image->bounds();
84 int imageSize = imageBounds.width() * imageBounds.height();
85 int nSkip = 1 + (imageSize >> 20);
87 if (calculate.isEmpty())
93 quint32 toSkip = nSkip;
104 for (
int k = 0; k < numConseqPixels; ++k) {
106 for (
int chan = 0; chan < (int)channelCount; ++chan) {
107 maximum = qMax(maximum, channelValues.at(chan));
113 m_d->maximumValue = maximum;
115 const double maximumMultiplier = 255.0/maximum;
116 const double logMaxMultiplier = 255.0/(std::log10(maximum*10)*0.1);
126 for (
int k = 0; k < numConseqPixels; ++k) {
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) ]++;
147 if (
m_d->results.size() == 1) {
148 hisData.
bins =
m_d->results[0];
153 quint32 channelCount =
m_d->image->projection()->channelCount();
158 for (
int chan = 0; chan < (int)channelCount; chan++) {
159 int bsize = hisData.
bins[chan].size();
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];
167 int b2size = hisData.
binsLog[chan].size();
169 for (
int bi = 0; bi < b2size; bi++) {
171 for (
int i = 0; i < (int)
m_d->resultsLog.size(); i++) {
172 hisData.
binsLog[chan][bi] +=
m_d->resultsLog[i][chan][bi];
186 for (
auto &bin : vec) {
187 bin.resize(std::numeric_limits<quint8>::max() + 1);
std::vector< std::vector< quint32 > > HistVector
ProcessData(QRect rect, int _jobId)
void initStrokeCallback() override
void finishStrokeCallback() override
void initiateVector(HistVector &vec, const KoColorSpace *colorSpace)
const QScopedPointer< Private > m_d
~HistogramComputationStrokeStrategy() override
void computationResultReady(HistogramData data)
HistogramComputationStrokeStrategy(KisImageSP image)
void doStrokeCallback(KisStrokeJobData *data) override
void finishStrokeCallback() override
void initStrokeCallback() override
quint32 pixelSize() const
quint32 channelCount() const
const KoColorSpace * colorSpace() const
bool nextPixels(int numPixels)
int nConseqPixels() const
ALWAYS_INLINE const quint8 * rawDataConst() const
virtual void doStrokeCallback(KisStrokeJobData *data)
void addMutatedJobs(const QVector< KisStrokeJobData * > list)
virtual bool hasHighDynamicRange() const =0
virtual quint32 channelCount() const =0
virtual void normalisedChannelsValue(const quint8 *pixel, QVector< float > &channels) const =0
KUndo2MagicString kundo2_i18n(const char *text)
QVector< QRect > splitRectIntoPatches(const QRect &rc, const QSize &patchSize)
std::vector< HistVector > resultsLog
std::vector< HistVector > results
const KoColorSpace * colorSpace