[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [krita] /: Add an invert button to the level filter widget
From:       Boudewijn Rempt <null () kde ! org>
Date:       2017-12-08 11:03:50
Message-ID: E1eNGRa-0002Dh-B0 () code ! kde ! org
[Download RAW message or body]

Git commit 3a3010ca88ff0e2f5dcbccec8cb5e078e824cb2f by Boudewijn Rempt.
Committed on 08/12/2017 at 11:03.
Pushed by rempt into branch 'master'.

Add an invert button to the level filter widget

Differential Revision: https://phabricator.kde.org/D9052
BUG:375842
CCMAIL:vincentl13x@gmail.com

Patch by Wu Weilin -- thanks!

M  +90   -60   libs/ui/widgets/kis_gradient_slider.cpp
M  +3    -0    libs/ui/widgets/kis_gradient_slider.h
M  +34   -2    plugins/filters/levelfilter/kis_level_filter.cpp
M  +4    -0    plugins/filters/levelfilter/kis_level_filter.h
M  +7    -0    plugins/filters/levelfilter/wdg_level.ui

https://commits.kde.org/krita/3a3010ca88ff0e2f5dcbccec8cb5e078e824cb2f

diff --git a/libs/ui/widgets/kis_gradient_slider.cpp \
b/libs/ui/widgets/kis_gradient_slider.cpp index b2580eeeb5d..16c0619c38f 100644
--- a/libs/ui/widgets/kis_gradient_slider.cpp
+++ b/libs/ui/widgets/kis_gradient_slider.cpp
@@ -53,6 +53,7 @@ KisGradientSlider::KisGradientSlider(QWidget *parent)
     , m_gammaEnabled(false)
     , m_whiteEnabled(true)
     , m_feedback(false)
+    , m_inverted(false)
 {
     m_grabCursor = None;
 
@@ -90,25 +91,31 @@ void KisGradientSlider::paintEvent(QPaintEvent *e)
     p1.drawRect(MARGIN, MARGIN, wWidth, height() - 2 * MARGIN - HANDLE_SIZE);
 
     // Draw first gradient
-    QLinearGradient grayGradient(MARGIN, 0, wWidth, gradientHeight);
-    grayGradient.setColorAt(0, Qt::black);
-    grayGradient.setColorAt(1, Qt::white);
+    QLinearGradient grayGradient(MARGIN, y, wWidth, gradientHeight);
+    grayGradient.setColorAt(0, m_inverted ? Qt::white : Qt::black);
+    grayGradient.setColorAt(1, m_inverted ? Qt::black : Qt::white);
     p1.fillRect(MARGIN, 0, wWidth, gradientHeight, QBrush(grayGradient));
 
     // Draw second gradient
     y = gradientHeight;
     p1.fillRect(MARGIN, y, wWidth, gradientHeight, Qt::white);
 
-    if (m_blackCursor > 0) {
+    if (m_blackCursor > 0 && !m_inverted) {
         p1.fillRect(MARGIN, y, m_blackCursor, gradientHeight, Qt::black);
+    } else if (m_blackCursor < wWidth && m_inverted) {
+        p1.fillRect(MARGIN + m_blackCursor, y, wWidth - m_blackCursor, \
gradientHeight, Qt::black);  }
 
-    for (x = (int)m_blackCursor + MARGIN; x < (int)m_whiteCursor - MARGIN; ++x) {
-        double inten = (double)(x - (m_blackCursor + MARGIN)) / \
(double)((m_whiteCursor - MARGIN) - (m_blackCursor + MARGIN)); +
+    int left = qMin(m_blackCursor, m_whiteCursor);
+    int right = qMax(m_blackCursor, m_whiteCursor);
+    for (x = left; x <= right; ++x) {
+        double inten = (double)(x - m_blackCursor) /
+                       (double)(m_whiteCursor - m_blackCursor);
         inten = pow(inten, (1.0 / m_gamma));
         int gray = (int)(255 * inten);
         p1.setPen(QColor(gray, gray, gray));
-        p1.drawLine(x, y, x, y + gradientHeight - 1);
+        p1.drawLine(x + MARGIN, y, x + MARGIN, y + gradientHeight - 1);
     }
 
     // Draw cursors
@@ -127,17 +134,17 @@ void KisGradientSlider::paintEvent(QPaintEvent *e)
 
     p1.setPen(Qt::black);
     if (m_gammaEnabled) {
-        a[0] = QPoint(m_gammaCursor, y);
-        a[1] = QPoint(m_gammaCursor + cursorHalfBase, wHeight - 1);
-        a[2] = QPoint(m_gammaCursor - cursorHalfBase, wHeight - 1);
+        a[0] = QPoint(m_gammaCursor + MARGIN, y);
+        a[1] = QPoint(m_gammaCursor + MARGIN + cursorHalfBase, wHeight - 1);
+        a[2] = QPoint(m_gammaCursor + MARGIN - cursorHalfBase, wHeight - 1);
         p1.setBrush(Qt::gray);
         p1.drawPolygon(a, 3);
     }
 
     if (m_whiteEnabled) {
-        a[0] = QPoint(m_whiteCursor - MARGIN, y);
-        a[1] = QPoint(m_whiteCursor - MARGIN + cursorHalfBase, wHeight - 1);
-        a[2] = QPoint(m_whiteCursor - MARGIN - cursorHalfBase, wHeight - 1);
+        a[0] = QPoint(m_whiteCursor + MARGIN, y);
+        a[1] = QPoint(m_whiteCursor + MARGIN + cursorHalfBase, wHeight - 1);
+        a[2] = QPoint(m_whiteCursor + MARGIN - cursorHalfBase, wHeight - 1);
         p1.setBrush(Qt::white);
         p1.drawPolygon(a, 3);
     }
@@ -145,12 +152,12 @@ void KisGradientSlider::paintEvent(QPaintEvent *e)
 
 void KisGradientSlider::resizeEvent(QResizeEvent *)
 {
-    m_scalingFactor = (double)(width() - MARGIN) / 255;
+    m_scalingFactor = (double)(width() - 2 * MARGIN) / 255;
     calculateCursorPositions();
     update();
 }
 
-void KisGradientSlider::mousePressEvent(QMouseEvent * e)
+void KisGradientSlider::mousePressEvent(QMouseEvent *e)
 {
     eCursor closest_cursor;
     int distance;
@@ -159,25 +166,25 @@ void KisGradientSlider::mousePressEvent(QMouseEvent * e)
         return;
 
     unsigned int x = e->pos().x();
-    int xPlusMargin = x + MARGIN;
+    int xMinusMargin = x - MARGIN;
 
     distance = width() + 1; // just a big number
 
-    if (abs((int)(xPlusMargin - m_blackCursor)) < distance) {
-        distance = abs((int)(xPlusMargin - m_blackCursor));
+    if (abs((int)(xMinusMargin - m_blackCursor)) < distance) {
+        distance = abs((int)(xMinusMargin - m_blackCursor));
         closest_cursor = BlackCursor;
     }
 
-    if (abs((int)(xPlusMargin - m_whiteCursor)) < distance) {
-        distance = abs((int)(xPlusMargin - m_whiteCursor));
+    if (abs((int)(xMinusMargin - m_whiteCursor)) < distance) {
+        distance = abs((int)(xMinusMargin - m_whiteCursor));
         closest_cursor = WhiteCursor;
     }
 
     if (m_gammaEnabled) {
-        int gammaDistance = (int)xPlusMargin - m_gammaCursor;
+        int gammaDistance = (int)xMinusMargin - m_gammaCursor;
 
         if (abs(gammaDistance) < distance) {
-            distance = abs((int)xPlusMargin - m_gammaCursor);
+            distance = abs((int)xMinusMargin - m_gammaCursor);
             closest_cursor = GammaCursor;
         } else if (abs(gammaDistance) == distance) {
             if ((closest_cursor == BlackCursor) && (gammaDistance > 0)) {
@@ -199,30 +206,40 @@ void KisGradientSlider::mousePressEvent(QMouseEvent * e)
 
     switch (closest_cursor) {
     case BlackCursor:
-        m_blackCursor = x - MARGIN;
+        m_blackCursor = xMinusMargin;
         m_grabCursor = closest_cursor;
-        m_leftmost = 0;
-        m_rightmost = m_whiteCursor - ((MARGIN + 1) * m_scalingFactor);
+        if (m_inverted) {
+            m_leftmost = m_whiteCursor + 1;
+            m_rightmost = width() - 2 * MARGIN - 1;
+        } else {
+            m_leftmost = 0;
+            m_rightmost = m_whiteCursor - 1;
+        }
         if (m_gammaEnabled)
             m_gammaCursor = calculateGammaCursor();
         break;
     case WhiteCursor:
-        m_whiteCursor = x + MARGIN;
+        m_whiteCursor = xMinusMargin;
         m_grabCursor = closest_cursor;
-        m_leftmost = m_blackCursor + (MARGIN * m_scalingFactor);
-        m_rightmost = width() - MARGIN ;
+        if (m_inverted) {
+            m_leftmost = 0;
+            m_rightmost = m_blackCursor - 1;
+        } else {
+            m_leftmost = m_blackCursor + 1;
+            m_rightmost = width() - 2 * MARGIN - 1;
+        }
         if (m_gammaEnabled)
             m_gammaCursor = calculateGammaCursor();
         break;
     case GammaCursor:
         m_gammaCursor = x;
         m_grabCursor = closest_cursor;
-        m_leftmost = m_blackCursor + (MARGIN * m_scalingFactor);
-        m_rightmost = m_whiteCursor - (MARGIN * m_scalingFactor);
+        m_leftmost = qMin(m_blackCursor, m_whiteCursor);
+        m_rightmost = qMax(m_blackCursor, m_whiteCursor);
     {
         double delta = (double)(m_whiteCursor - m_blackCursor) / 2.0;
         double mid = (double)m_blackCursor + delta + MARGIN;
-        double tmp = (x - mid) / delta;
+        double tmp = (xMinusMargin - mid) / delta;
         m_gamma = 1.0 / pow(10, tmp);
     }
         break;
@@ -241,12 +258,12 @@ void KisGradientSlider::mouseReleaseEvent(QMouseEvent * e)
 
     switch (m_grabCursor) {
     case BlackCursor:
-        m_black = qRound( m_blackCursor / m_scalingFactor);
+        m_black = qRound(m_blackCursor / m_scalingFactor);
         m_feedback = true;
         emit sigModifiedBlack(m_black);
         break;
     case WhiteCursor:
-        m_white = qRound( (m_whiteCursor - MARGIN) / m_scalingFactor);
+        m_white = qRound(m_whiteCursor / m_scalingFactor);
         m_feedback = true;
         emit sigModifiedWhite(m_white);
         break;
@@ -264,37 +281,37 @@ void KisGradientSlider::mouseReleaseEvent(QMouseEvent * e)
 void KisGradientSlider::mouseMoveEvent(QMouseEvent * e)
 {
     int x = e->pos().x();
-
+    int xMinusMargin = x - MARGIN;
     if (m_grabCursor != None) { // Else, drag the selected point
-        if (x + MARGIN <= m_leftmost)
-            x = m_leftmost;
+        if (xMinusMargin <= m_leftmost)
+            xMinusMargin = m_leftmost;
 
-        if (x >= m_rightmost)
-            x = m_rightmost;
+        if (xMinusMargin >= m_rightmost)
+            xMinusMargin = m_rightmost;
 
         switch (m_grabCursor) {
         case BlackCursor:
-            if (m_blackCursor != x) {
-                m_blackCursor = x;
+            if (m_blackCursor != xMinusMargin) {
+                m_blackCursor = xMinusMargin;
                 if (m_gammaEnabled) {
                     m_gammaCursor = calculateGammaCursor();
                 }
             }
             break;
         case WhiteCursor:
-            if (m_whiteCursor != x) {
-                m_whiteCursor = x + MARGIN;
+            if (m_whiteCursor != xMinusMargin) {
+                m_whiteCursor = xMinusMargin;
                 if (m_gammaEnabled) {
                     m_gammaCursor = calculateGammaCursor();
                 }
             }
             break;
         case GammaCursor:
-            if (m_gammaCursor != x) {
-                m_gammaCursor = x;
+            if (m_gammaCursor != xMinusMargin) {
+                m_gammaCursor = xMinusMargin;
                 double delta = (double)(m_whiteCursor - m_blackCursor) / 2.0;
                 double mid = (double)m_blackCursor + delta;
-                double tmp = (x - mid) / delta;
+                double tmp = (xMinusMargin - mid) / delta;
                 m_gamma = 1.0 / pow(10, tmp);
             }
             break;
@@ -309,7 +326,7 @@ void KisGradientSlider::mouseMoveEvent(QMouseEvent * e)
 void KisGradientSlider::calculateCursorPositions()
 {
     m_blackCursor = qRound(m_black * m_scalingFactor);
-    m_whiteCursor = qRound(m_white * m_scalingFactor + MARGIN);
+    m_whiteCursor = qRound(m_white * m_scalingFactor);
 
     m_gammaCursor = calculateGammaCursor();
 }
@@ -317,8 +334,8 @@ void KisGradientSlider::calculateCursorPositions()
 unsigned int KisGradientSlider::calculateGammaCursor()
 {
     double delta = (double)(m_whiteCursor - m_blackCursor) / 2.0;
-    double mid   = (double)m_blackCursor + delta;
-    double tmp   = log10(1.0 / m_gamma);
+    double mid = (double)m_blackCursor + delta;
+    double tmp = log10(1.0 / m_gamma);
     return (unsigned int)qRound(mid + delta * tmp);
 }
 
@@ -341,24 +358,37 @@ void KisGradientSlider::enableWhite(bool b)
     update();
 }
 
+void KisGradientSlider::setInverted(bool b)
+{
+    m_inverted = b;
+    update();
+}
+
 void KisGradientSlider::slotModifyBlack(int v)
 {
-    if (v >= 0 && v <= (int)m_white && !m_feedback) {
-        m_black = v;
-        m_blackCursor = qRound(m_black * m_scalingFactor);
-        m_gammaCursor = calculateGammaCursor();
-        update();
-    }
+    if ((m_inverted && (v < m_white || v > width())) ||
+        (!m_inverted && (v < 0 || v > m_white)) ||
+        m_feedback)
+        return;
+
+    m_black = v;
+    m_blackCursor = qRound(m_black * m_scalingFactor);
+    m_gammaCursor = calculateGammaCursor();
+    update();
 }
+
 void KisGradientSlider::slotModifyWhite(int v)
 {
-    if (v >= (int)m_black && v <= width() && !m_feedback) {
-        m_white = v;
-        m_whiteCursor = qRound(m_white * m_scalingFactor + MARGIN);
-        m_gammaCursor = calculateGammaCursor();
-        update();
-    }
+    if ((m_inverted && (v < 0 || v > m_white)) ||
+        (!m_inverted && (v < m_black && v > width())) ||
+        m_feedback)
+        return;
+    m_white = v;
+    m_whiteCursor = qRound(m_white * m_scalingFactor);
+    m_gammaCursor = calculateGammaCursor();
+    update();
 }
+
 void KisGradientSlider::slotModifyGamma(double v)
 {
     if (m_gamma != v) {
diff --git a/libs/ui/widgets/kis_gradient_slider.h \
b/libs/ui/widgets/kis_gradient_slider.h index 97a09e828c6..2a8450aabf0 100644
--- a/libs/ui/widgets/kis_gradient_slider.h
+++ b/libs/ui/widgets/kis_gradient_slider.h
@@ -76,6 +76,8 @@ public:
 
     void enableWhite(bool b);
 
+    void setInverted(bool b);
+
 private:
     int m_leftmost;
     int m_rightmost;
@@ -93,6 +95,7 @@ private:
     bool m_gammaEnabled;
     bool m_whiteEnabled;
     bool m_feedback;
+    bool m_inverted;
 };
 
 #endif /* KIS_GRADIENT_SLIDER_H */
diff --git a/plugins/filters/levelfilter/kis_level_filter.cpp \
b/plugins/filters/levelfilter/kis_level_filter.cpp index 35e8db9021b..25ba596fb76 \
                100644
--- a/plugins/filters/levelfilter/kis_level_filter.cpp
+++ b/plugins/filters/levelfilter/kis_level_filter.cpp
@@ -134,6 +134,7 @@ KisLevelConfigWidget::KisLevelConfigWidget(QWidget * parent, \
                KisPaintDeviceSP de
     connect(m_page.outgradient, SIGNAL(sigModifiedWhite(int)), m_page.outwhitespin, \
SLOT(setValue(int)));  
     connect(m_page.butauto, SIGNAL(clicked(bool)), this, SLOT(slotAutoLevel(void)));
+    connect(m_page.butinvert, SIGNAL(clicked(bool)), this, SLOT(slotInvert(void)));
 
     connect((QObject*)(m_page.chkLogarithmic), SIGNAL(toggled(bool)), this, \
SLOT(slotDrawHistogram(bool)));  
@@ -141,6 +142,7 @@ KisLevelConfigWidget::KisLevelConfigWidget(QWidget * parent, \
                KisPaintDeviceSP de
     m_histogram.reset( new KisHistogram(dev, dev->exactBounds(), producer, LINEAR) \
);  m_histlog = false;
     m_page.histview->resize(288,100);
+    m_inverted = false;
     slotDrawHistogram();
 
 }
@@ -207,12 +209,20 @@ void KisLevelConfigWidget::slotModifyInWhiteLimit(int limit)
 
 void KisLevelConfigWidget::slotModifyOutBlackLimit(int limit)
 {
-    m_page.outblackspin->setMaximum(limit - 1);
+    if (m_inverted) {
+        m_page.outblackspin->setMinimum(limit + 1);
+    } else {
+        m_page.outblackspin->setMaximum(limit - 1);
+    }
 }
 
 void KisLevelConfigWidget::slotModifyOutWhiteLimit(int limit)
 {
-    m_page.outwhitespin->setMinimum(limit + 1);
+    if (m_inverted) {
+        m_page.outwhitespin->setMaximum(limit - 1);
+    } else {
+        m_page.outwhitespin->setMinimum(limit + 1);
+    }
 }
 
 void KisLevelConfigWidget::slotAutoLevel(void)
@@ -273,6 +283,18 @@ void KisLevelConfigWidget::slotAutoLevel(void)
     }
 }
 
+void KisLevelConfigWidget::slotInvert(void)
+{
+    m_inverted = !m_inverted;
+    int white = m_page.outwhitespin->value();
+    int black = m_page.outblackspin->value();
+
+    resetOutSpinLimit();
+    m_page.outgradient->setInverted(m_inverted);
+    m_page.outwhitespin->setValue(black);
+    m_page.outblackspin->setValue(white);
+}
+
 KisPropertiesConfigurationSP  KisLevelConfigWidget::configuration() const
 {
     KisColorTransformationConfiguration * config = new \
KisColorTransformationConfiguration(KisLevelFilter::id().id(), 1); @@ -310,3 +332,13 \
@@ void KisLevelConfigWidget::setConfiguration(const KisPropertiesConfigurationSP  \
m_page.outgradient->slotModifyWhite(value.toUInt());  }
 }
+
+void KisLevelConfigWidget::resetOutSpinLimit() {
+    if (m_inverted) {
+        m_page.outblackspin->setMaximum(255);
+        m_page.outwhitespin->setMinimum(0);
+    } else {
+        m_page.outblackspin->setMinimum(0);
+        m_page.outwhitespin->setMaximum(255);
+    }
+}
diff --git a/plugins/filters/levelfilter/kis_level_filter.h \
b/plugins/filters/levelfilter/kis_level_filter.h index 4d581d577b3..6655fb25160 \
                100644
--- a/plugins/filters/levelfilter/kis_level_filter.h
+++ b/plugins/filters/levelfilter/kis_level_filter.h
@@ -75,10 +75,14 @@ protected Q_SLOTS:
     void slotModifyOutWhiteLimit(int);
 
     void slotAutoLevel(void);
+    void slotInvert(void);
+
+    void resetOutSpinLimit();
 
 protected:
     QScopedPointer<KisHistogram> m_histogram;
     bool m_histlog;
+    bool m_inverted;
 };
 
 #endif
diff --git a/plugins/filters/levelfilter/wdg_level.ui \
b/plugins/filters/levelfilter/wdg_level.ui index faa3ea90a71..a873f063ee1 100644
--- a/plugins/filters/levelfilter/wdg_level.ui
+++ b/plugins/filters/levelfilter/wdg_level.ui
@@ -288,6 +288,13 @@
        </property>
       </widget>
      </item>
+     <item>
+      <widget class="QPushButton" name="butinvert">
+       <property name="text">
+        <string>&amp;Invert</string>
+       </property>
+      </widget>
+     </item>
      <item>
       <spacer name="horizontalSpacer">
        <property name="orientation">


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic