File indexing completed on 2024-04-28 04:52:22
0001 /* 0002 SPDX-FileCopyrightText: 2010 Simon Andreas Eugster <simon.eu@gmail.com> 0003 This file is part of kdenlive. See www.kdenlive.org. 0004 0005 SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0006 */ 0007 0008 #include "histogram.h" 0009 #include "histogramgenerator.h" 0010 #include <QElapsedTimer> 0011 0012 #include "klocalizedstring.h" 0013 #include <KConfigGroup> 0014 #include <KSharedConfig> 0015 #include <QActionGroup> 0016 #include <QButtonGroup> 0017 0018 Histogram::Histogram(QWidget *parent) 0019 : AbstractGfxScopeWidget(false, parent) 0020 { 0021 m_ui = new Ui::Histogram_UI(); 0022 m_ui->setupUi(this); 0023 0024 m_aUnscaled = new QAction(i18n("Unscaled"), this); 0025 m_aUnscaled->setCheckable(true); 0026 0027 m_aRec601 = new QAction(i18n("Rec. 601"), this); 0028 m_aRec601->setCheckable(true); 0029 m_aRec709 = new QAction(i18n("Rec. 709"), this); 0030 m_aRec709->setCheckable(true); 0031 m_agRec = new QActionGroup(this); 0032 m_agRec->addAction(m_aRec601); 0033 m_agRec->addAction(m_aRec709); 0034 0035 m_menu->addSeparator(); 0036 m_menu->addAction(m_aUnscaled); 0037 m_menu->addSeparator()->setText(i18n("Luma mode")); 0038 m_menu->addAction(m_aRec601); 0039 m_menu->addAction(m_aRec709); 0040 0041 QButtonGroup scaleGroup; 0042 scaleGroup.addButton(m_ui->rbLinear); 0043 scaleGroup.addButton(m_ui->rbLogarithmic); 0044 0045 connect(m_ui->cbY, &QAbstractButton::toggled, this, &AbstractScopeWidget::forceUpdateScope); 0046 connect(m_ui->cbS, &QAbstractButton::toggled, this, &AbstractScopeWidget::forceUpdateScope); 0047 connect(m_ui->cbR, &QAbstractButton::toggled, this, &AbstractScopeWidget::forceUpdateScope); 0048 connect(m_ui->cbG, &QAbstractButton::toggled, this, &AbstractScopeWidget::forceUpdateScope); 0049 connect(m_ui->cbB, &QAbstractButton::toggled, this, &AbstractScopeWidget::forceUpdateScope); 0050 connect(m_aUnscaled, &QAction::toggled, this, &Histogram::forceUpdateScope); 0051 connect(m_aRec601, &QAction::toggled, this, &Histogram::forceUpdateScope); 0052 connect(m_aRec709, &QAction::toggled, this, &Histogram::forceUpdateScope); 0053 connect(m_ui->rbLogarithmic, &QAbstractButton::toggled, this, &Histogram::forceUpdateScope); 0054 0055 init(); 0056 m_histogramGenerator = new HistogramGenerator(); 0057 } 0058 0059 Histogram::~Histogram() 0060 { 0061 writeConfig(); 0062 delete m_histogramGenerator; 0063 delete m_ui; 0064 delete m_aUnscaled; 0065 delete m_aRec601; 0066 delete m_aRec709; 0067 delete m_agRec; 0068 } 0069 0070 void Histogram::readConfig() 0071 { 0072 AbstractGfxScopeWidget::readConfig(); 0073 0074 KSharedConfigPtr config = KSharedConfig::openConfig(); 0075 KConfigGroup scopeConfig(config, configName()); 0076 m_ui->cbY->setChecked(scopeConfig.readEntry("yEnabled", true)); 0077 m_ui->cbS->setChecked(scopeConfig.readEntry("sEnabled", false)); 0078 m_ui->cbR->setChecked(scopeConfig.readEntry("rEnabled", true)); 0079 m_ui->cbG->setChecked(scopeConfig.readEntry("gEnabled", true)); 0080 m_ui->cbB->setChecked(scopeConfig.readEntry("bEnabled", true)); 0081 m_aRec601->setChecked(scopeConfig.readEntry("rec601", false)); 0082 m_aRec709->setChecked(!m_aRec601->isChecked()); 0083 m_ui->rbLogarithmic->setChecked(scopeConfig.readEntry("logScale", false)); 0084 } 0085 0086 void Histogram::writeConfig() 0087 { 0088 KSharedConfigPtr config = KSharedConfig::openConfig(); 0089 KConfigGroup scopeConfig(config, configName()); 0090 scopeConfig.writeEntry("yEnabled", m_ui->cbY->isChecked()); 0091 scopeConfig.writeEntry("sEnabled", m_ui->cbS->isChecked()); 0092 scopeConfig.writeEntry("rEnabled", m_ui->cbR->isChecked()); 0093 scopeConfig.writeEntry("gEnabled", m_ui->cbG->isChecked()); 0094 scopeConfig.writeEntry("bEnabled", m_ui->cbB->isChecked()); 0095 scopeConfig.writeEntry("rec601", m_aRec601->isChecked()); 0096 scopeConfig.writeEntry("logScale", m_ui->rbLogarithmic->isChecked()); 0097 scopeConfig.sync(); 0098 } 0099 0100 QString Histogram::widgetName() const 0101 { 0102 return QStringLiteral("Histogram"); 0103 } 0104 0105 bool Histogram::isHUDDependingOnInput() const 0106 { 0107 return false; 0108 } 0109 bool Histogram::isScopeDependingOnInput() const 0110 { 0111 return true; 0112 } 0113 bool Histogram::isBackgroundDependingOnInput() const 0114 { 0115 return false; 0116 } 0117 0118 QRect Histogram::scopeRect() 0119 { 0120 // qCDebug(KDENLIVE_LOG) << "According to the spacer, the top left point is " << m_ui->verticalSpacer->geometry().x() << '/' << 0121 // m_ui->verticalSpacer->geometry().y(); 0122 QPoint topleft(offset, offset + m_ui->verticalSpacer->geometry().y()); 0123 return QRect(topleft, this->rect().size() - QSize(topleft.x() + offset, topleft.y() + offset)); 0124 } 0125 0126 QImage Histogram::renderHUD(uint) 0127 { 0128 Q_EMIT signalHUDRenderingFinished(0, 1); 0129 return QImage(); 0130 } 0131 QImage Histogram::renderGfxScope(uint accelFactor, const QImage &qimage) 0132 { 0133 QElapsedTimer timer; 0134 timer.start(); 0135 const int componentFlags = 0136 (m_ui->cbY->isChecked() ? 1 : 0) * HistogramGenerator::ComponentY | (m_ui->cbS->isChecked() ? 1 : 0) * HistogramGenerator::ComponentSum | 0137 (m_ui->cbR->isChecked() ? 1 : 0) * HistogramGenerator::ComponentR | (m_ui->cbG->isChecked() ? 1 : 0) * HistogramGenerator::ComponentG | 0138 (m_ui->cbB->isChecked() ? 1 : 0) * HistogramGenerator::ComponentB; 0139 0140 ITURec rec = m_aRec601->isChecked() ? ITURec::Rec_601 : ITURec::Rec_709; 0141 0142 QImage histogram = m_histogramGenerator->calculateHistogram(m_scopeRect.size(), qimage, componentFlags, rec, m_aUnscaled->isChecked(), 0143 m_ui->rbLogarithmic->isChecked(), accelFactor); 0144 0145 Q_EMIT signalScopeRenderingFinished(uint(timer.elapsed()), accelFactor); 0146 return histogram; 0147 } 0148 QImage Histogram::renderBackground(uint) 0149 { 0150 Q_EMIT signalBackgroundRenderingFinished(0, 1); 0151 return QImage(); 0152 }