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

#include <histogramdockerwidget.h>

+ Inheritance diagram for HistogramDockerWidget:

Public Slots

void enableLogarithmic (bool enable)
 
void receiveNewHistogram (HistogramData data)
 

Public Member Functions

 HistogramDockerWidget (QWidget *parent=0, const char *name=0, Qt::WindowFlags f=Qt::WindowFlags())
 
void paintEvent (QPaintEvent *event) override
 
 ~HistogramDockerWidget () override
 
- Public Member Functions inherited from KisWidgetWithIdleTask< QLabel >
void hideEvent (QHideEvent *event) override
 
 KisWidgetWithIdleTask (QWidget *parent=0, Qt::WindowFlags flags=Qt::WindowFlags())
 
virtual void setCanvas (KisCanvas2 *canvas)
 
void showEvent (QShowEvent *event) override
 
void triggerCacheUpdate ()
 
 ~KisWidgetWithIdleTask () override=default
 

Private Member Functions

void clearCachedState () override
 
KisIdleTasksManager::TaskGuard registerIdleTask (KisCanvas2 *canvas) override
 

Private Attributes

const KoColorSpacem_colorSpace {0}
 
HistVector m_histogramData
 
HistVector m_histogramDataLog
 
bool m_logarithmic {false}
 
float m_maximumValue {1.0}
 
bool m_smoothHistogram {false}
 

Additional Inherited Members

- Protected Attributes inherited from KisWidgetWithIdleTask< QLabel >
KisCanvas2m_canvas
 
KisIdleTasksManager::TaskGuard m_idleTaskGuard
 
bool m_isVisibleState
 

Detailed Description

Definition at line 20 of file histogramdockerwidget.h.

Constructor & Destructor Documentation

◆ HistogramDockerWidget()

HistogramDockerWidget::HistogramDockerWidget ( QWidget * parent = 0,
const char * name = 0,
Qt::WindowFlags f = Qt::WindowFlags() )

Definition at line 24 of file histogramdockerwidget.cpp.

26{
27 setObjectName(name);
28 qRegisterMetaType<HistogramData>();
29}

◆ ~HistogramDockerWidget()

HistogramDockerWidget::~HistogramDockerWidget ( )
override

Definition at line 31 of file histogramdockerwidget.cpp.

32{
33}

Member Function Documentation

◆ clearCachedState()

void HistogramDockerWidget::clearCachedState ( )
overrideprivatevirtual

Implements KisWidgetWithIdleTask< QLabel >.

Definition at line 67 of file histogramdockerwidget.cpp.

68{
69 m_colorSpace = 0;
70 m_histogramData.clear();
71 m_histogramDataLog.clear();
72}
const KoColorSpace * m_colorSpace

References m_colorSpace, m_histogramData, and m_histogramDataLog.

◆ enableLogarithmic

void HistogramDockerWidget::enableLogarithmic ( bool enable)
slot

Definition at line 44 of file histogramdockerwidget.cpp.

45{
46 if (m_logarithmic == enable) return;
47 m_logarithmic = enable;
48 update();
49}
bool update(QSpinBox *spinBox)

References m_logarithmic.

◆ paintEvent()

void HistogramDockerWidget::paintEvent ( QPaintEvent * event)
override

Definition at line 118 of file histogramdockerwidget.cpp.

119{
120 if (m_colorSpace && !m_histogramData.empty()) {
121 int nBins = m_logarithmic? m_histogramData.at(0).size(): m_histogramDataLog.at(0).size();
122 const KoColorSpace* cs = m_colorSpace;
123
124 QLabel::paintEvent(event);
125 QPainter painter(this);
126 painter.fillRect(0, 0, this->width(), this->height(), this->palette().dark().color());
127 painter.setPen(this->palette().light().color());
128
129 const int gridHeight = this->height() - painter.fontMetrics().height();
130
131 painter.save();
132
133 QMap<float, float> horGrid = m_logarithmic? calculateLogGridLines(this->width(), m_maximumValue): calculateLinearGridLines(this->width(), m_maximumValue);
134 Q_FOREACH (float k, horGrid.keys()) {
135 float i = horGrid.value(k);
136 painter.drawLine(qRound(i), 0, qRound(i), gridHeight);
137 painter.drawText(QPointF(qRound(i), this->height()-2), QString::number(k));
138 }
139
140 unsigned int nChannels = cs->channelCount();
141 const QList<KoChannelInfo *> channels = cs->channels();
142 unsigned int highest = 0;
143 //find the most populous bin in the histogram to scale it properly
144 for (int chan = 0; chan < channels.size(); chan++) {
145 if (channels.at(chan)->channelType() != KoChannelInfo::ALPHA) {
146 std::vector<quint32> histogramTemp = m_logarithmic? m_histogramDataLog.at(chan): m_histogramData.at(chan);
147 //use 98th percentile, rather than max for better visual appearance
148 int nthPercentile = 2 * histogramTemp.size() / 100;
149 //unsigned int max = *std::max_element(m_histogramData.at(chan).begin(),m_histogramData.at(chan).end());
150 std::nth_element(histogramTemp.begin(),
151 histogramTemp.begin() + nthPercentile, histogramTemp.end(), std::greater<int>());
152 unsigned int max = *(histogramTemp.begin() + nthPercentile);
153
154 highest = std::max(max, highest);
155 }
156 }
157
158 QMap<float, float> vertGrid = m_logarithmic? calculateLogGridLines(gridHeight, highest): calculateLinearGridLines(gridHeight, highest);
159 Q_FOREACH (float k, vertGrid.keys()) {
160 float i = vertGrid.value(k);
161 painter.drawLine(0., gridHeight -i, this->width(), gridHeight -i);
162 }
163
164 painter.restore();
165
166 painter.setCompositionMode(QPainter::CompositionMode_Plus);
167 const float barWidth = float(this->width()-1) / float(nBins);
168 float logVerticalMax = std::log10(vertGrid.keys().last()*10)*0.1;
169
170 for (int chan = 0; chan < (int)nChannels; chan++) {
171 if (channels.at(chan)->channelType() != KoChannelInfo::ALPHA) {
172 QColor color = channels.at(chan)->color();
173
174 //special handling of grayscale color spaces. can't use color returned above.
175 if(cs->colorChannelCount()==1){
176 color = QColor(Qt::gray);
177 }
178
179 QColor fill_color = color;
180 fill_color.setAlphaF(.25);
181 painter.setBrush(fill_color);
182 QPen pen = QPen(color);
183 pen.setWidth(0);
184 painter.setPen(pen);
185
186 if (m_smoothHistogram) {
187 QPainterPath path;
188 path.moveTo(QPointF(1, gridHeight));
189 for (qint32 i = 0; i < nBins; ++i) {
190 const float curBinVertical = !m_logarithmic? m_histogramData[chan][i]
191 : std::log(m_histogramDataLog[chan][i]+1);
192 const float maxBin = !m_logarithmic? highest: logVerticalMax;
193 const float v = curBinVertical > 0? ((std::max((float)maxBin - curBinVertical, 0.f))/maxBin)*gridHeight: 0;
194 path.lineTo(QPointF((i*barWidth) - (barWidth*0.5), v));
195
196 }
197 path.lineTo(QPointF(this->width(), gridHeight));
198 path.closeSubpath();
199 painter.drawPath(path);
200 } else {
201 painter.setBrush(color);
202 painter.setPen(Qt::transparent);
203 float start = 1.0;
204 for (qint32 i = 0; i < nBins; ++i) {
205
206 const float curBinEnd = 1.0+(i*barWidth)+barWidth;
207 const float curBinVertical = m_logarithmic? std::log10(m_histogramDataLog[chan][i] *10)*0.1: m_histogramData[chan][i];
208 const float maxBin = m_logarithmic? logVerticalMax: highest;
209 if (curBinVertical > 0) {
210 const int v = std::max(qRound((curBinVertical/maxBin)*gridHeight), 1);
211 const QRect bar(QPoint(qRound(start), std::max(gridHeight - v, 0)),
212 QPoint(qRound(curBinEnd), gridHeight));
213 painter.drawRect(bar);
214 }
215 start = curBinEnd;
216 }
217 }
218 }
219 }
220 }
221}
qreal v
@ ALPHA
The channel represents the opacity of a pixel.
QList< KoChannelInfo * > channels
virtual quint32 channelCount() const =0
virtual quint32 colorChannelCount() const =0
QMap< float, float > calculateLogGridLines(int width, qreal maximumValue)
QMap< float, float > calculateLinearGridLines(int width, qreal maximumValue)
constexpr std::enable_if< sizeof...(values)==0, size_t >::type max()
rgba palette[MAX_PALETTE]
Definition palette.c:35

References KoChannelInfo::ALPHA, calculateLinearGridLines(), calculateLogGridLines(), KoColorSpace::channelCount(), KoColorSpace::channels, KoColorSpace::colorChannelCount(), m_colorSpace, m_histogramData, m_histogramDataLog, m_logarithmic, m_maximumValue, m_smoothHistogram, palette, and v.

◆ receiveNewHistogram

◆ registerIdleTask()

KisIdleTasksManager::TaskGuard HistogramDockerWidget::registerIdleTask ( KisCanvas2 * canvas)
overrideprivatevirtual

Implements KisWidgetWithIdleTask< QLabel >.

Definition at line 51 of file histogramdockerwidget.cpp.

52{
54
55 return
56 canvas->viewManager()->idleTasksManager()->
57 addIdleTaskWithGuard([this](KisImageSP image) {
60
61 connect(strategy, SIGNAL(computationResultReady(HistogramData)), this, SLOT(receiveNewHistogram(HistogramData)));
62
63 return strategy;
64 });
65}
void receiveNewHistogram(HistogramData data)
KisViewManager * viewManager() const
KisIdleTasksManager * idleTasksManager()
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129

References KisViewManager::idleTasksManager(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, receiveNewHistogram(), and KisCanvas2::viewManager().

Member Data Documentation

◆ m_colorSpace

const KoColorSpace* HistogramDockerWidget::m_colorSpace {0}
private

Definition at line 40 of file histogramdockerwidget.h.

40{0};

◆ m_histogramData

HistVector HistogramDockerWidget::m_histogramData
private

Definition at line 38 of file histogramdockerwidget.h.

◆ m_histogramDataLog

HistVector HistogramDockerWidget::m_histogramDataLog
private

Definition at line 39 of file histogramdockerwidget.h.

◆ m_logarithmic

bool HistogramDockerWidget::m_logarithmic {false}
private

Definition at line 42 of file histogramdockerwidget.h.

42{false};

◆ m_maximumValue

float HistogramDockerWidget::m_maximumValue {1.0}
private

Definition at line 43 of file histogramdockerwidget.h.

43{1.0};

◆ m_smoothHistogram

bool HistogramDockerWidget::m_smoothHistogram {false}
private

Definition at line 41 of file histogramdockerwidget.h.

41{false};

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