#include <math.h>
#include "colortools.h"
+#include <QColor>
+
+//#define DEBUG_CT
+#ifdef DEBUG_CT
+#include <QDebug>
+#endif
ColorTools::ColorTools()
{
}
-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!");
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));
}
}
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;
+
+}
+
+
+#include "colortools.moc"