100
100
int progressCount; // Position of animation during loading/calculation.
101
101
ChannelType channelType; // Channel type to draw
102
102
HistogramScale scaleType; // Scale to use for drawing
103
ImageHistogram *imageHistogram; // Full image
104
ImageHistogram *selectionHistogram; // Image selection
103
ImageHistogram* imageHistogram; // Full image
104
ImageHistogram* selectionHistogram; // Image selection
106
106
// Current selection information.
111
QTimer *progressTimer;
111
QTimer* progressTimer;
113
113
QPixmap progressPix;
115
115
DColor colorGuide;
117
HistogramPainter *histogramPainter;
117
HistogramPainter* histogramPainter;
121
121
// Constructor without image data (needed to use updateData() method after instance created).
123
123
HistogramWidget::HistogramWidget(int w, int h,
124
QWidget *parent, bool selectMode,
124
QWidget* parent, bool selectMode,
125
125
bool showProgress, bool statisticsVisible)
126
: QWidget(parent), d(new HistogramWidgetPriv)
126
: QWidget(parent), d(new HistogramWidgetPriv)
128
128
setup(w, h, selectMode, showProgress, statisticsVisible);
129
129
setAttribute(Qt::WA_DeleteOnClose);
158
158
// Constructor with image selection.
160
160
HistogramWidget::HistogramWidget(int w, int h,
161
uchar *i_data, uint i_w, uint i_h,
162
uchar *s_data, uint s_w, uint s_h,
161
uchar* i_data, uint i_w, uint i_h,
162
uchar* s_data, uint s_w, uint s_h,
163
163
bool i_sixteenBits,
164
QWidget *parent, bool selectMode,
164
QWidget* parent, bool selectMode,
165
165
bool showProgress, bool statisticsVisible)
166
: QWidget(parent), d(new HistogramWidgetPriv)
166
: QWidget(parent), d(new HistogramWidgetPriv)
168
168
d->sixteenBits = i_sixteenBits;
169
169
setup(w, h, selectMode, showProgress, statisticsVisible);
430
473
connectHistogram(d->selectionHistogram);
433
477
d->selectionHistogram = 0L;
435
480
if (d->renderingType == ImageSelectionHistogram && d->selectionHistogram)
436
482
d->selectionHistogram->calculateInThread();
438
486
d->imageHistogram->calculateInThread();
441
void HistogramWidget::updateSelectionData(uchar *s_data, uint s_w, uint s_h,
490
void HistogramWidget::updateSelectionData(uchar* s_data, uint s_w, uint s_h,
445
494
d->showProgress = showProgress;
447
496
// Remove old histogram data from memory.
449
498
if (d->selectionHistogram)
450
delete d->selectionHistogram;
500
delete d->selectionHistogram;
452
503
// Calc new histogram data
453
504
d->selectionHistogram = new ImageHistogram(s_data, s_w, s_h, i_sixteenBits);
454
505
connectHistogram(d->selectionHistogram);
456
507
if (d->renderingType == ImageSelectionHistogram)
457
509
d->selectionHistogram->calculateInThread();
460
513
void HistogramWidget::slotProgressTimerDone()
475
528
d->clearFlag == HistogramWidgetPriv::HistogramDataLoading))
479
p1.fillRect(0, 0, width(), height(), palette().color(QPalette::Disabled, QPalette::Background));
480
p1.setPen(QPen(palette().color(QPalette::Active, QPalette::Foreground), 1, Qt::SolidLine));
481
p1.drawRect(0, 0, width()-1, height()-1);
482
QPen pen(palette().color(QPalette::Disabled, QPalette::Foreground));
483
pen.setStyle(Qt::SolidLine);
487
p1.drawRect(0, 0, width(), height());
532
p1.fillRect(0, 0, width(), height(), palette().color(QPalette::Disabled, QPalette::Background));
533
p1.setPen(QPen(palette().color(QPalette::Active, QPalette::Foreground), 1, Qt::SolidLine));
534
p1.drawRect(0, 0, width()-1, height()-1);
535
QPen pen(palette().color(QPalette::Disabled, QPalette::Foreground));
536
pen.setStyle(Qt::SolidLine);
540
p1.drawRect(0, 0, width(), height());
492
545
// Image data is loading or histogram is being computed:
494
547
else if ( d->showProgress &&
495
(d->clearFlag == HistogramWidgetPriv::HistogramStarted ||
496
d->clearFlag == HistogramWidgetPriv::HistogramDataLoading)
548
(d->clearFlag == HistogramWidgetPriv::HistogramStarted ||
549
d->clearFlag == HistogramWidgetPriv::HistogramDataLoading)
499
// In first, we draw an animation.
501
QPixmap anim(d->progressPix.copy(0, d->progressCount*22, 22, 22));
503
if (d->progressCount == 8) d->progressCount = 0;
505
// ... and we render busy text.
508
p1.fillRect(0, 0, width(), height(), palette().color(QPalette::Active, QPalette::Background));
509
p1.setPen(QPen(palette().color(QPalette::Active, QPalette::Foreground), 1, Qt::SolidLine));
510
p1.drawRect(0, 0, width()-1, height()-1);
511
p1.drawPixmap(width()/2 - anim.width() /2, anim.height(), anim);
512
p1.setPen(palette().color(QPalette::Active, QPalette::Text));
514
if (d->clearFlag == HistogramWidgetPriv::HistogramDataLoading)
515
p1.drawText(0, 0, width(), height(), Qt::AlignCenter,
516
i18n("Loading image..."));
518
p1.drawText(0, 0, width(), height(), Qt::AlignCenter,
519
i18n("Histogram calculation..."));
552
// In first, we draw an animation.
554
QPixmap anim(d->progressPix.copy(0, d->progressCount*22, 22, 22));
557
if (d->progressCount == 8)
559
d->progressCount = 0;
562
// ... and we render busy text.
565
p1.fillRect(0, 0, width(), height(), palette().color(QPalette::Active, QPalette::Background));
566
p1.setPen(QPen(palette().color(QPalette::Active, QPalette::Foreground), 1, Qt::SolidLine));
567
p1.drawRect(0, 0, width()-1, height()-1);
568
p1.drawPixmap(width()/2 - anim.width() /2, anim.height(), anim);
569
p1.setPen(palette().color(QPalette::Active, QPalette::Text));
571
if (d->clearFlag == HistogramWidgetPriv::HistogramDataLoading)
572
p1.drawText(0, 0, width(), height(), Qt::AlignCenter,
573
i18n("Loading image..."));
575
p1.drawText(0, 0, width(), height(), Qt::AlignCenter,
576
i18n("Histogram calculation..."));
524
582
// Histogram computation failed:
526
584
else if (d->clearFlag == HistogramWidgetPriv::HistogramFailed)
529
p1.fillRect(0, 0, width(), height(), palette().color(QPalette::Active, QPalette::Background));
530
p1.setPen(QPen(palette().color(QPalette::Active, QPalette::Foreground), 1, Qt::SolidLine));
531
p1.drawRect(0, 0, width()-1, height()-1);
532
p1.setPen(palette().color(QPalette::Active, QPalette::Text));
533
p1.drawText(0, 0, width(), height(), Qt::AlignCenter,
534
i18n("Histogram\ncalculation\nfailed."));
587
p1.fillRect(0, 0, width(), height(), palette().color(QPalette::Active, QPalette::Background));
588
p1.setPen(QPen(palette().color(QPalette::Active, QPalette::Foreground), 1, Qt::SolidLine));
589
p1.drawRect(0, 0, width()-1, height()-1);
590
p1.setPen(palette().color(QPalette::Active, QPalette::Text));
591
p1.drawText(0, 0, width(), height(), Qt::AlignCenter,
592
i18n("Histogram\ncalculation\nfailed."));
540
598
// render histogram in normal case
541
599
ImageHistogram* histogram = 0;
542
601
if (d->renderingType == ImageSelectionHistogram && d->selectionHistogram)
544
histogram = d->selectionHistogram;
603
histogram = d->selectionHistogram;
548
histogram = d->imageHistogram;
607
histogram = d->imageHistogram;
582
642
// render statistics if needed
583
643
if (d->statisticsVisible)
585
DToolTipStyleSheet cnt;
586
QString tipText, value;
587
tipText = "<qt><table cellspacing=0 cellpadding=0>";
589
tipText += cnt.cellBeg + i18n("Mean:") + cnt.cellMid;
590
double mean = histogram->getMean(d->channelType, 0, histogram->getHistogramSegments()-1);
591
tipText += value.setNum(mean, 'f', 1) + cnt.cellEnd;
593
tipText += cnt.cellBeg + i18n("Pixels:") + cnt.cellMid;
594
double pixels = histogram->getPixels();
595
tipText += value.setNum((float)pixels, 'f', 0) + cnt.cellEnd;
597
tipText += cnt.cellBeg + i18n("Std dev.:") + cnt.cellMid;
598
double stddev = histogram->getStdDev(d->channelType, 0, histogram->getHistogramSegments()-1);
599
tipText += value.setNum(stddev, 'f', 1) + cnt.cellEnd;
601
tipText += cnt.cellBeg + i18n("Count:") + cnt.cellMid;
602
double counts = histogram->getCount(d->channelType, 0, histogram->getHistogramSegments()-1);
603
tipText += value.setNum((float)counts, 'f', 0) + cnt.cellEnd;
605
tipText += cnt.cellBeg + i18n("Median:") + cnt.cellMid;
606
double median = histogram->getMedian(d->channelType, 0, histogram->getHistogramSegments()-1);
607
tipText += value.setNum(median, 'f', 1) + cnt.cellEnd;
609
tipText += cnt.cellBeg + i18n("Percent:") + cnt.cellMid;
610
double percentile = (pixels > 0 ? (100.0 * counts / pixels) : 0.0);
611
tipText += value.setNum(percentile, 'f', 1) + cnt.cellEnd;
613
tipText += "</table></qt>";
615
this->setToolTip(tipText);
645
DToolTipStyleSheet cnt;
646
QString tipText, value;
647
tipText = "<qt><table cellspacing=0 cellpadding=0>";
649
tipText += cnt.cellBeg + i18n("Mean:") + cnt.cellMid;
650
double mean = histogram->getMean(d->channelType, 0, histogram->getHistogramSegments()-1);
651
tipText += value.setNum(mean, 'f', 1) + cnt.cellEnd;
653
tipText += cnt.cellBeg + i18n("Pixels:") + cnt.cellMid;
654
double pixels = histogram->getPixels();
655
tipText += value.setNum((float)pixels, 'f', 0) + cnt.cellEnd;
657
tipText += cnt.cellBeg + i18n("Std dev.:") + cnt.cellMid;
658
double stddev = histogram->getStdDev(d->channelType, 0, histogram->getHistogramSegments()-1);
659
tipText += value.setNum(stddev, 'f', 1) + cnt.cellEnd;
661
tipText += cnt.cellBeg + i18n("Count:") + cnt.cellMid;
662
double counts = histogram->getCount(d->channelType, 0, histogram->getHistogramSegments()-1);
663
tipText += value.setNum((float)counts, 'f', 0) + cnt.cellEnd;
665
tipText += cnt.cellBeg + i18n("Median:") + cnt.cellMid;
666
double median = histogram->getMedian(d->channelType, 0, histogram->getHistogramSegments()-1);
667
tipText += value.setNum(median, 'f', 1) + cnt.cellEnd;
669
tipText += cnt.cellBeg + i18n("Percent:") + cnt.cellMid;
670
double percentile = (pixels > 0 ? (100.0 * counts / pixels) : 0.0);
671
tipText += value.setNum(percentile, 'f', 1) + cnt.cellEnd;
673
tipText += "</table></qt>";
675
this->setToolTip(tipText);
620
void HistogramWidget::mousePressEvent ( QMouseEvent * e )
680
void HistogramWidget::mousePressEvent ( QMouseEvent* e )
622
682
if ( d->selectMode == true && d->clearFlag == HistogramWidgetPriv::HistogramCompleted )