|
shun-iwasawa |
78dff8 |
#include "cameracapturelevelcontrol_qt.h"
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
#include "toonzqt/intfield.h"
|
|
shun-iwasawa |
78dff8 |
#include "toonzqt/doublefield.h"
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
#include <qpainter></qpainter>
|
|
shun-iwasawa |
78dff8 |
#include <qmouseevent></qmouseevent>
|
|
shun-iwasawa |
78dff8 |
#include <qhboxlayout></qhboxlayout>
|
|
shun-iwasawa |
78dff8 |
#include <qvboxlayout></qvboxlayout>
|
|
shun-iwasawa |
78dff8 |
#include <cmath></cmath>
|
|
shun-iwasawa |
78dff8 |
#include <iostream></iostream>
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
using namespace DVGui;
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
namespace {
|
|
shun-iwasawa |
78dff8 |
const int HISTOGRAM_HEIGHT = 50;
|
|
shun-iwasawa |
78dff8 |
const int SIDE_MARGIN = 7;
|
|
shun-iwasawa |
78dff8 |
static bool histogramObtained = false;
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
// returns the horizontal position of gamma slider (0-255)
|
|
shun-iwasawa |
78dff8 |
int gammaToHPos(float gamma, int black, int white) {
|
|
shun-iwasawa |
78dff8 |
float ratio = std::pow(0.5f, gamma);
|
|
shun-iwasawa |
78dff8 |
return black + (int)std::round((float)(white - black) * ratio);
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
// returns the gamma value from the slider position
|
|
shun-iwasawa |
78dff8 |
float hPosToGamma(int hPos, int black, int white) {
|
|
shun-iwasawa |
78dff8 |
if (hPos <= black + 1)
|
|
shun-iwasawa |
78dff8 |
return 9.99f;
|
|
shun-iwasawa |
78dff8 |
else if (hPos >= white - 1)
|
|
shun-iwasawa |
78dff8 |
return 0.01f;
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
float ratio = (float)(hPos - black) / (float)(white - black);
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
float gamma = std::log(ratio) / std::log(0.5);
|
|
shun-iwasawa |
78dff8 |
int decimals = 2;
|
|
shun-iwasawa |
78dff8 |
gamma =
|
|
shun-iwasawa |
78dff8 |
std::round(gamma * std::pow(10.0, decimals)) / std::pow(10.0, decimals);
|
|
shun-iwasawa |
78dff8 |
return gamma;
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
void drawSliderHandle(QPoint pos, QPainter& p, QColor color, bool selected) {
|
|
shun-iwasawa |
78dff8 |
p.setPen((selected) ? Qt::yellow : Qt::black);
|
|
shun-iwasawa |
78dff8 |
p.setBrush(color);
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
p.translate(pos);
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
static const QPoint points[5] = {QPoint(0, 0), QPoint(-6, 8), QPoint(-3, 12),
|
|
shun-iwasawa |
78dff8 |
QPoint(3, 12), QPoint(6, 8)};
|
|
shun-iwasawa |
78dff8 |
p.drawConvexPolygon(points, 5);
|
|
shun-iwasawa |
78dff8 |
p.resetTransform();
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
}; // namespace
|
|
shun-iwasawa |
78dff8 |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
CameraCaptureLevelHistogram::CameraCaptureLevelHistogram(QWidget* parent)
|
|
shun-iwasawa |
78dff8 |
: QFrame(parent)
|
|
shun-iwasawa |
78dff8 |
, m_histogramCue(false)
|
|
shun-iwasawa |
78dff8 |
, m_currentItem(None)
|
|
shun-iwasawa |
78dff8 |
, m_black(0)
|
|
shun-iwasawa |
78dff8 |
, m_white(255)
|
|
shun-iwasawa |
78dff8 |
, m_gamma(1.0)
|
|
shun-iwasawa |
78dff8 |
, m_threshold(128)
|
|
shun-iwasawa |
78dff8 |
, m_offset(0)
|
|
shun-iwasawa |
78dff8 |
, m_mode(Color_GrayScale)
|
|
shun-iwasawa |
78dff8 |
, m_histogramData(256) {
|
|
shun-iwasawa |
78dff8 |
setFixedSize(256 + SIDE_MARGIN * 2, HISTOGRAM_HEIGHT + 15);
|
|
shun-iwasawa |
78dff8 |
setMouseTracking(true);
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
m_histogramData.fill(0);
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
void CameraCaptureLevelHistogram::updateHistogram(QImage& image) {
|
|
shun-iwasawa |
78dff8 |
// obtain histogram only when clicked
|
|
shun-iwasawa |
78dff8 |
if (!m_histogramCue) return;
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
QVector<int> tmpHisto(256);</int>
|
|
shun-iwasawa |
78dff8 |
tmpHisto.fill(0);
|
|
shun-iwasawa |
78dff8 |
for (int y = 0; y < image.height(); y++) {
|
|
shun-iwasawa |
78dff8 |
QRgb* rgb_p = (QRgb*)(image.scanLine(y));
|
|
shun-iwasawa |
78dff8 |
for (int x = 0; x < image.width(); x++, rgb_p++) {
|
|
shun-iwasawa |
78dff8 |
tmpHisto[qGray(*rgb_p)]++;
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
// obtain max value and normalize
|
|
shun-iwasawa |
78dff8 |
int max = 0;
|
|
shun-iwasawa |
78dff8 |
for (int c = 0; c < 256; c++) {
|
|
shun-iwasawa |
78dff8 |
if (tmpHisto.at(c) > max) max = tmpHisto.at(c);
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
for (int c = 0; c < 256; c++) {
|
|
shun-iwasawa |
78dff8 |
m_histogramData[c] = tmpHisto.at(c) * HISTOGRAM_HEIGHT / max;
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
histogramObtained = true;
|
|
shun-iwasawa |
78dff8 |
update();
|
|
shun-iwasawa |
78dff8 |
m_histogramCue = false;
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
void CameraCaptureLevelHistogram::paintEvent(QPaintEvent* event) {
|
|
shun-iwasawa |
78dff8 |
QPainter p(this);
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
QRect histoRect(SIDE_MARGIN, 1, 256, HISTOGRAM_HEIGHT);
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
// draw histogram
|
|
shun-iwasawa |
78dff8 |
p.setPen(Qt::black);
|
|
shun-iwasawa |
78dff8 |
p.setBrush((m_currentItem == Histogram) ? Qt::darkGray : QColor(32, 32, 32));
|
|
shun-iwasawa |
78dff8 |
p.drawRect(histoRect.adjusted(-1, -1, 0, 0));
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
if (histogramObtained) {
|
|
shun-iwasawa |
78dff8 |
p.setPen(Qt::white);
|
|
shun-iwasawa |
78dff8 |
for (int c = 0; c < 256; c++) {
|
|
shun-iwasawa |
78dff8 |
if (m_histogramData.at(c) == 0) continue;
|
|
shun-iwasawa |
78dff8 |
p.drawLine(histoRect.bottomLeft() + QPoint(c, 0),
|
|
shun-iwasawa |
78dff8 |
histoRect.bottomLeft() + QPoint(c, -m_histogramData.at(c)));
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
if (!histogramObtained || m_currentItem == Histogram) {
|
|
shun-iwasawa |
78dff8 |
p.setPen(Qt::white);
|
|
shun-iwasawa |
78dff8 |
p.drawText(histoRect, Qt::AlignCenter, tr("Click to Update Histogram"));
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
p.setRenderHint(QPainter::Antialiasing);
|
|
shun-iwasawa |
78dff8 |
// draw slider handles
|
|
shun-iwasawa |
78dff8 |
QPoint sliderBasePos(SIDE_MARGIN, HISTOGRAM_HEIGHT + 2);
|
|
shun-iwasawa |
78dff8 |
if (m_mode == Color_GrayScale) {
|
|
shun-iwasawa |
78dff8 |
// black
|
|
shun-iwasawa |
78dff8 |
drawSliderHandle(sliderBasePos + QPoint(m_black, 0), p, QColor(32, 32, 32),
|
|
shun-iwasawa |
78dff8 |
m_currentItem == BlackSlider);
|
|
shun-iwasawa |
78dff8 |
// gamma
|
|
shun-iwasawa |
78dff8 |
drawSliderHandle(
|
|
shun-iwasawa |
78dff8 |
sliderBasePos + QPoint(gammaToHPos(m_gamma, m_black, m_white), 0), p,
|
|
shun-iwasawa |
78dff8 |
Qt::gray, m_currentItem == GammaSlider);
|
|
shun-iwasawa |
78dff8 |
// white
|
|
shun-iwasawa |
78dff8 |
drawSliderHandle(sliderBasePos + QPoint(m_white, 0), p,
|
|
shun-iwasawa |
78dff8 |
QColor(220, 220, 220), m_currentItem == WhiteSlider);
|
|
shun-iwasawa |
78dff8 |
} else if (m_mode == BlackAndWhite)
|
|
shun-iwasawa |
78dff8 |
// threshold
|
|
shun-iwasawa |
78dff8 |
drawSliderHandle(sliderBasePos + QPoint(m_threshold, 0), p, Qt::gray,
|
|
shun-iwasawa |
78dff8 |
m_currentItem == ThresholdSlider);
|
|
shun-iwasawa |
78dff8 |
p.setRenderHint(QPainter::Antialiasing, false);
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
void CameraCaptureLevelHistogram::mousePressEvent(QMouseEvent* event) {
|
|
shun-iwasawa |
78dff8 |
if (event->button() != Qt::LeftButton) return;
|
|
shun-iwasawa |
78dff8 |
if (m_currentItem == Histogram) {
|
|
shun-iwasawa |
78dff8 |
m_histogramCue = true;
|
|
shun-iwasawa |
78dff8 |
return;
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
if (m_currentItem == None) return;
|
|
shun-iwasawa |
78dff8 |
QPoint pos = event->pos();
|
|
shun-iwasawa |
78dff8 |
if (m_currentItem == BlackSlider)
|
|
shun-iwasawa |
78dff8 |
m_offset = pos.x() - SIDE_MARGIN - m_black;
|
|
shun-iwasawa |
78dff8 |
else if (m_currentItem == GammaSlider)
|
|
shun-iwasawa |
78dff8 |
m_offset = pos.x() - SIDE_MARGIN - gammaToHPos(m_gamma, m_black, m_white);
|
|
shun-iwasawa |
137846 |
else if (m_currentItem == WhiteSlider)
|
|
shun-iwasawa |
78dff8 |
m_offset = pos.x() - SIDE_MARGIN - m_white;
|
|
shun-iwasawa |
78dff8 |
else if (m_currentItem == ThresholdSlider)
|
|
shun-iwasawa |
78dff8 |
m_offset = pos.x() - SIDE_MARGIN - m_threshold;
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
void CameraCaptureLevelHistogram::mouseMoveEvent(QMouseEvent* event) {
|
|
shun-iwasawa |
78dff8 |
QPoint pos = event->pos();
|
|
shun-iwasawa |
78dff8 |
if (event->buttons() & Qt::LeftButton) {
|
|
shun-iwasawa |
78dff8 |
if (m_currentItem == None || m_currentItem == Histogram) return;
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
int hPos = pos.x() - SIDE_MARGIN - m_offset;
|
|
shun-iwasawa |
78dff8 |
bool changed = false;
|
|
shun-iwasawa |
78dff8 |
if (m_currentItem == BlackSlider) {
|
|
shun-iwasawa |
78dff8 |
if (hPos < 0)
|
|
shun-iwasawa |
78dff8 |
hPos = 0;
|
|
shun-iwasawa |
78dff8 |
else if (hPos > m_white - 2)
|
|
shun-iwasawa |
78dff8 |
hPos = m_white - 2;
|
|
shun-iwasawa |
78dff8 |
if (hPos != m_black) {
|
|
shun-iwasawa |
78dff8 |
m_black = hPos;
|
|
shun-iwasawa |
78dff8 |
changed = true;
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
} else if (m_currentItem == GammaSlider) {
|
|
shun-iwasawa |
78dff8 |
if (hPos < m_black + 1)
|
|
shun-iwasawa |
78dff8 |
hPos = m_black + 1;
|
|
shun-iwasawa |
78dff8 |
else if (hPos > m_white - 1)
|
|
shun-iwasawa |
78dff8 |
hPos = m_white - 1;
|
|
shun-iwasawa |
78dff8 |
float gamma = hPosToGamma(hPos, m_black, m_white);
|
|
shun-iwasawa |
78dff8 |
if (gamma != m_gamma) {
|
|
shun-iwasawa |
78dff8 |
m_gamma = gamma;
|
|
shun-iwasawa |
78dff8 |
changed = true;
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
} else if (m_currentItem == WhiteSlider) {
|
|
shun-iwasawa |
78dff8 |
if (hPos < m_black + 2)
|
|
shun-iwasawa |
78dff8 |
hPos = m_black + 2;
|
|
shun-iwasawa |
78dff8 |
else if (hPos > 255)
|
|
shun-iwasawa |
78dff8 |
hPos = 255;
|
|
shun-iwasawa |
78dff8 |
if (hPos != m_white) {
|
|
shun-iwasawa |
78dff8 |
m_white = hPos;
|
|
shun-iwasawa |
78dff8 |
changed = true;
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
} else if (m_currentItem == ThresholdSlider) {
|
|
shun-iwasawa |
78dff8 |
if (hPos < 0)
|
|
shun-iwasawa |
78dff8 |
hPos = 0;
|
|
shun-iwasawa |
78dff8 |
else if (hPos > 255)
|
|
shun-iwasawa |
78dff8 |
hPos = 255;
|
|
shun-iwasawa |
78dff8 |
if (hPos != m_threshold) {
|
|
shun-iwasawa |
78dff8 |
m_threshold = hPos;
|
|
shun-iwasawa |
78dff8 |
changed = true;
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
if (changed) {
|
|
shun-iwasawa |
78dff8 |
update();
|
|
shun-iwasawa |
78dff8 |
emit valueChange(m_currentItem);
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
return;
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
// on hover
|
|
shun-iwasawa |
78dff8 |
LevelControlItem oldItem = m_currentItem;
|
|
shun-iwasawa |
78dff8 |
m_currentItem = None;
|
|
shun-iwasawa |
78dff8 |
setToolTip("");
|
|
shun-iwasawa |
78dff8 |
QRect histoRect(5, 1, 256, HISTOGRAM_HEIGHT);
|
|
shun-iwasawa |
78dff8 |
if (histoRect.contains(pos)) {
|
|
shun-iwasawa |
78dff8 |
setToolTip(tr("Click to Update Histogram"));
|
|
shun-iwasawa |
78dff8 |
m_currentItem = Histogram;
|
|
shun-iwasawa |
78dff8 |
} else {
|
|
shun-iwasawa |
78dff8 |
// slider handles
|
|
shun-iwasawa |
78dff8 |
QPoint sliderBasePos(SIDE_MARGIN, HISTOGRAM_HEIGHT + 2);
|
|
shun-iwasawa |
78dff8 |
QRect sliderRect(-6, 0, 12, 12);
|
|
shun-iwasawa |
78dff8 |
if (m_mode == Color_GrayScale) {
|
|
shun-iwasawa |
78dff8 |
// white
|
|
shun-iwasawa |
78dff8 |
if (sliderRect.translated(sliderBasePos + QPoint(m_white, 0))
|
|
shun-iwasawa |
78dff8 |
.contains(pos)) {
|
|
shun-iwasawa |
78dff8 |
m_currentItem = WhiteSlider;
|
|
shun-iwasawa |
78dff8 |
setToolTip(tr("Drag to Move White Point"));
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
// gamma
|
|
shun-iwasawa |
78dff8 |
else if (sliderRect
|
|
shun-iwasawa |
78dff8 |
.translated(
|
|
shun-iwasawa |
78dff8 |
sliderBasePos +
|
|
shun-iwasawa |
78dff8 |
QPoint(gammaToHPos(m_gamma, m_black, m_white), 0))
|
|
shun-iwasawa |
78dff8 |
.contains(pos)) {
|
|
shun-iwasawa |
78dff8 |
m_currentItem = GammaSlider;
|
|
shun-iwasawa |
78dff8 |
setToolTip(tr("Drag to Move Gamma"));
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
// black
|
|
shun-iwasawa |
78dff8 |
else if (sliderRect.translated(sliderBasePos + QPoint(m_black, 0))
|
|
shun-iwasawa |
78dff8 |
.contains(pos)) {
|
|
shun-iwasawa |
78dff8 |
m_currentItem = BlackSlider;
|
|
shun-iwasawa |
78dff8 |
setToolTip(tr("Drag to Move Black Point"));
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
} else if (m_mode == BlackAndWhite) {
|
|
shun-iwasawa |
78dff8 |
// threshold
|
|
shun-iwasawa |
78dff8 |
if (sliderRect.translated(sliderBasePos + QPoint(m_threshold, 0))
|
|
shun-iwasawa |
78dff8 |
.contains(pos)) {
|
|
shun-iwasawa |
78dff8 |
m_currentItem = ThresholdSlider;
|
|
shun-iwasawa |
78dff8 |
setToolTip(tr("Drag to Move Threshold Point"));
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
if (oldItem != m_currentItem) update();
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
void CameraCaptureLevelHistogram::mouseReleaseEvent(QMouseEvent* event) {
|
|
shun-iwasawa |
78dff8 |
m_offset = 0;
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
void CameraCaptureLevelHistogram::leaveEvent(QEvent* event) {
|
|
shun-iwasawa |
78dff8 |
m_currentItem = None;
|
|
shun-iwasawa |
78dff8 |
m_offset = 0;
|
|
shun-iwasawa |
78dff8 |
update();
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
//=============================================================================
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
CameraCaptureLevelControl::CameraCaptureLevelControl(QWidget* parent)
|
|
shun-iwasawa |
78dff8 |
: QFrame(parent) {
|
|
shun-iwasawa |
78dff8 |
m_histogram = new CameraCaptureLevelHistogram(this);
|
|
shun-iwasawa |
78dff8 |
m_blackFld = new IntLineEdit(this, m_histogram->black(), 0, 253);
|
|
shun-iwasawa |
78dff8 |
m_whiteFld = new IntLineEdit(this, m_histogram->white(), 2, 255);
|
|
shun-iwasawa |
78dff8 |
m_thresholdFld = new IntLineEdit(this, m_histogram->threshold(), 0, 255);
|
|
shun-iwasawa |
78dff8 |
m_gammaFld = new DoubleLineEdit(this, m_histogram->gamma());
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
m_blackFld->setToolTip(tr("Black Point Value"));
|
|
shun-iwasawa |
78dff8 |
m_whiteFld->setToolTip(tr("White Point Value"));
|
|
shun-iwasawa |
78dff8 |
m_thresholdFld->setToolTip(tr("Threshold Value"));
|
|
shun-iwasawa |
78dff8 |
m_thresholdFld->hide();
|
|
shun-iwasawa |
78dff8 |
m_gammaFld->setRange(0.01, 9.99);
|
|
shun-iwasawa |
78dff8 |
m_gammaFld->setDecimals(2);
|
|
shun-iwasawa |
78dff8 |
m_gammaFld->setFixedWidth(54);
|
|
shun-iwasawa |
78dff8 |
m_gammaFld->setToolTip(tr("Gamma Value"));
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
QVBoxLayout* mainLay = new QVBoxLayout();
|
|
shun-iwasawa |
78dff8 |
mainLay->setMargin(0);
|
|
shun-iwasawa |
78dff8 |
mainLay->setSpacing(4);
|
|
shun-iwasawa |
78dff8 |
{
|
|
shun-iwasawa |
78dff8 |
mainLay->addWidget(m_histogram, 0, Qt::AlignHCenter);
|
|
shun-iwasawa |
78dff8 |
QHBoxLayout* fieldsLay = new QHBoxLayout();
|
|
shun-iwasawa |
78dff8 |
fieldsLay->setMargin(1);
|
|
shun-iwasawa |
78dff8 |
fieldsLay->setSpacing(0);
|
|
shun-iwasawa |
78dff8 |
{
|
|
shun-iwasawa |
78dff8 |
fieldsLay->addWidget(m_blackFld, 0);
|
|
shun-iwasawa |
78dff8 |
fieldsLay->addStretch(1);
|
|
shun-iwasawa |
78dff8 |
fieldsLay->addWidget(m_gammaFld, 0);
|
|
shun-iwasawa |
78dff8 |
fieldsLay->addWidget(m_thresholdFld, 0);
|
|
shun-iwasawa |
78dff8 |
fieldsLay->addStretch(1);
|
|
shun-iwasawa |
78dff8 |
fieldsLay->addWidget(m_whiteFld, 0);
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
mainLay->addLayout(fieldsLay, 0);
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
setLayout(mainLay);
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
connect(m_histogram, SIGNAL(valueChange(int)), this,
|
|
shun-iwasawa |
78dff8 |
SLOT(onHistogramValueChanged(int)));
|
|
shun-iwasawa |
78dff8 |
connect(m_blackFld, SIGNAL(editingFinished()), this, SLOT(onFieldChanged()));
|
|
shun-iwasawa |
78dff8 |
connect(m_whiteFld, SIGNAL(editingFinished()), this, SLOT(onFieldChanged()));
|
|
shun-iwasawa |
78dff8 |
connect(m_gammaFld, SIGNAL(editingFinished()), this, SLOT(onFieldChanged()));
|
|
shun-iwasawa |
78dff8 |
connect(m_thresholdFld, SIGNAL(editingFinished()), this,
|
|
shun-iwasawa |
78dff8 |
SLOT(onFieldChanged()));
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
void CameraCaptureLevelControl::onHistogramValueChanged(int itemId) {
|
|
shun-iwasawa |
78dff8 |
if (itemId == CameraCaptureLevelHistogram::BlackSlider) {
|
|
shun-iwasawa |
78dff8 |
m_blackFld->setValue(m_histogram->black());
|
|
shun-iwasawa |
78dff8 |
m_whiteFld->setRange(m_histogram->black() + 2, 255);
|
|
shun-iwasawa |
78dff8 |
} else if (itemId == CameraCaptureLevelHistogram::WhiteSlider) {
|
|
shun-iwasawa |
78dff8 |
m_whiteFld->setValue(m_histogram->white());
|
|
shun-iwasawa |
78dff8 |
m_blackFld->setRange(0, m_histogram->white() - 2);
|
|
shun-iwasawa |
78dff8 |
} else if (itemId == CameraCaptureLevelHistogram::GammaSlider) {
|
|
shun-iwasawa |
78dff8 |
m_gammaFld->setValue(m_histogram->gamma());
|
|
shun-iwasawa |
78dff8 |
} else if (itemId == CameraCaptureLevelHistogram::ThresholdSlider) {
|
|
shun-iwasawa |
78dff8 |
m_thresholdFld->setValue(m_histogram->threshold());
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
void CameraCaptureLevelControl::onFieldChanged() {
|
|
shun-iwasawa |
78dff8 |
if (m_histogram->mode() == CameraCaptureLevelHistogram::Color_GrayScale)
|
|
shun-iwasawa |
78dff8 |
m_histogram->setValues(m_blackFld->getValue(), m_whiteFld->getValue(),
|
|
shun-iwasawa |
78dff8 |
m_gammaFld->getValue());
|
|
shun-iwasawa |
78dff8 |
else if (m_histogram->mode() == CameraCaptureLevelHistogram::BlackAndWhite)
|
|
shun-iwasawa |
78dff8 |
m_histogram->setThreshold(m_thresholdFld->getValue());
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
m_histogram->update();
|
|
shun-iwasawa |
78dff8 |
}
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
78dff8 |
|
|
shun-iwasawa |
78dff8 |
void CameraCaptureLevelControl::setMode(bool color_grayscale) {
|
|
shun-iwasawa |
78dff8 |
m_histogram->setMode((color_grayscale)
|
|
shun-iwasawa |
78dff8 |
? CameraCaptureLevelHistogram::Color_GrayScale
|
|
shun-iwasawa |
78dff8 |
: CameraCaptureLevelHistogram::BlackAndWhite);
|
|
shun-iwasawa |
78dff8 |
m_blackFld->setVisible(color_grayscale);
|
|
shun-iwasawa |
78dff8 |
m_whiteFld->setVisible(color_grayscale);
|
|
shun-iwasawa |
78dff8 |
m_gammaFld->setVisible(color_grayscale);
|
|
shun-iwasawa |
78dff8 |
m_thresholdFld->setVisible(!color_grayscale);
|
|
shun-iwasawa |
78dff8 |
update();
|
|
shun-iwasawa |
78dff8 |
}
|