]> git.sesse.net Git - kdenlive/blobdiff - src/colortools.cpp
Const'ref
[kdenlive] / src / colortools.cpp
index c0cd5b73464ebbac73b4e9cf3865a75e575c6e90..7f513a701e2dd5ae211bdcae2ca098753878c87a 100644 (file)
 
 #include <math.h>
 #include "colortools.h"
+#include <QColor>
+
+//#define DEBUG_CT
+#ifdef DEBUG_CT
+#include <QDebug>
+#endif
 
 ColorTools::ColorTools()
 {
@@ -134,8 +140,10 @@ QImage ColorTools::yuvVerticalPlane(const QSize &size, const float &angle, const
 
 }
 
-QImage ColorTools::rgbCurvePlane(const QSize &size, const ColorsRGB &color)
+QImage ColorTools::rgbCurvePlane(const QSize &size, const ColorTools::ColorsRGB &color, float scaling, const QRgb &background)
 {
+    Q_ASSERT(scaling > 0 && scaling <= 1);
+
     QImage plane(size, QImage::Format_ARGB32);
     if (size.width() == 0 || size.height() == 0) {
         qCritical("ERROR: Size of the color plane must not be 0!");
@@ -146,19 +154,31 @@ QImage ColorTools::rgbCurvePlane(const QSize &size, const ColorsRGB &color)
     const int h = size.height();
 
     double dcol, dval;
+    double dx, dy;
 
     for (int x = 0; x < w; x++) {
         dval = (double)255*x/(w-1);
 
         for (int y = 0; y < h; y++) {
-            dcol = (double)255*y/(h-1);
+            dy = (double)y/(h-1);
+            dx = (double)x/(w-1);
+
+            if (1-scaling < 0.0001) {
+                dcol = (double)255*dy;
+            } else {
+                dcol = (double)255 * (dy - (dy-dx)*(1-scaling));
+            }
 
             if (color == ColorTools::COL_R) {
                 plane.setPixel(x, (h-y-1), qRgb(dcol, dval, dval));
             } else if (color == ColorTools::COL_G) {
                 plane.setPixel(x, (h-y-1), qRgb(dval, dcol, dval));
-            } else {
+            } else if (color == ColorTools::COL_B){
                 plane.setPixel(x, (h-y-1), qRgb(dval, dval, dcol));
+            } else if (color == ColorTools::COL_A) {
+                plane.setPixel(x, (h-y-1), qRgb(dcol / 255. * qRed(background), dcol / 255. * qGreen(background), dcol / 255. * qBlue(background)));
+            } else {
+                plane.setPixel(x, (h-y-1), qRgb(dcol, dcol, dcol));
             }
 
         }
@@ -227,6 +247,122 @@ QImage ColorTools::yPbPrColorWheel(const QSize &size, const unsigned char &Y, co
     return wheel;
 }
 
+QImage ColorTools::hsvHueShiftPlane(const QSize &size, const uint &S, const uint &V, const int &MIN, const int &MAX)
+{
+    Q_ASSERT(size.width() > 0);
+    Q_ASSERT(size.height() > 0);
+    Q_ASSERT(MAX > MIN);
+
+    QImage plane(size, QImage::Format_ARGB32);
+
+#ifdef DEBUG_CT
+    qDebug() << "Requested: Saturation " << S << ", Value " << V;
+    QColor colTest(-1, 256, 257);
+    qDebug() << "-1 mapped to " << colTest.red() << ", 256 to " << colTest.green() << ", 257 to " << colTest.blue();
+#endif
+
+    QColor col(0, 0, 0);
+
+    const int hueValues = MAX-MIN;
+
+    float hue, huediff;
+    int newhue;
+    for (int x = 0; x < size.width(); x++) {
+        hue = x/(size.width() - 1.0) * 359;
+        for (int y = 0; y < size.height(); y++) {
+            huediff = (1.0f - y/(size.height() - 1.0)) * hueValues + MIN;
+//            qDebug() << "hue: " << hue << ", huediff: " << huediff;
+
+            newhue = hue + huediff + 360; // Avoid negative numbers. Rest (>360) will be mapped correctly.
+
+            col.setHsv(newhue, S, V);
+            plane.setPixel(x, y, col.rgba());
+
+        }
+    }
+
+    return plane;
+
+}
+
+QImage ColorTools::hsvCurvePlane(const QSize &size, const QColor &baseColor,
+                                 const ComponentsHSV &xVariant, const ComponentsHSV &yVariant, const bool &shear, const float offsetY)
+{
+    Q_ASSERT(size.width() > 0);
+    Q_ASSERT(size.height() > 0);
+
+    /*int xMax, yMax;
+
+    switch(xVariant) {
+    case COM_H:
+        xMax = 360;
+        break;
+    case COM_S:
+    case COM_V:
+        xMax = 256;
+        break;
+    }
+
+    switch (yVariant) {
+    case COM_H:
+        yMax = 360;
+        break;
+    case COM_S:
+    case COM_V:
+        yMax = 256;
+        break;
+    }*/
+
+
+    QImage plane(size, QImage::Format_ARGB32);
+
+    QColor col(0, 0, 0);
+
+    float hue, sat, val;
+    hue = baseColor.hueF();
+    sat = baseColor.saturationF();
+    val = baseColor.valueF();
+
+    for (int x = 0; x < size.width(); x++) {
+        switch (xVariant) {
+        case COM_H:
+            hue = x / (size.width()-1.0);
+            break;
+        case COM_S:
+            sat = x / (size.width()-1.0);
+            break;
+        case COM_V:
+            val = x / (size.width()-1.0);
+            break;
+        }
+        for (int y = 0; y < size.height(); y++) {
+            switch (yVariant) {
+            case COM_H:
+                hue = 1.0 - y / (size.height()-1.0);
+                break;
+            case COM_S:
+                sat = 1.0 - y / (size.height()-1.0);
+                break;
+            case COM_V:
+                val = 1.0 - y / (size.height()-1.0);
+                break;
+            }
+
+            col.setHsvF(hue, sat, val);
+
+            if (!shear) {
+                plane.setPixel(x, y, col.rgba());
+            } else {
+                plane.setPixel(x, int(2*size.height() + y - x*size.width()/size.height() - offsetY * size.height()) % size.height(), col.rgba());
+            }
+        }
+    }
+
+    return plane;
+
+}
+
+
 
 
 
@@ -234,3 +370,4 @@ QImage ColorTools::yPbPrColorWheel(const QSize &size, const unsigned char &Y, co
 
 
 
+#include "colortools.moc"