[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [krita/krita-testing-wolthera] libs/ui/widgets: Fix channel-order, hue rortaton and the mirrored cir
From: Wolthera van Hovell tot Westerflier <griffinvalley () gmail ! com>
Date: 2016-08-20 16:23:17
Message-ID: E1bb93F-0003bC-GE () code ! kde ! org
[Download RAW message or body]
Git commit eb1232be68bae9d71130d4c3a56f4f139b89c4ba by Wolthera van Hovell tot \
Westerflier. Committed on 20/08/2016 at 16:22.
Pushed by woltherav into branch 'krita-testing-wolthera'.
Fix channel-order, hue rortaton and the mirrored circle border
M +54 -30 libs/ui/widgets/kis_visual_color_selector.cpp
http://commits.kde.org/krita/eb1232be68bae9d71130d4c3a56f4f139b89c4ba
diff --git a/libs/ui/widgets/kis_visual_color_selector.cpp \
b/libs/ui/widgets/kis_visual_color_selector.cpp index e7d6a46..ebd43a8 100644
--- a/libs/ui/widgets/kis_visual_color_selector.cpp
+++ b/libs/ui/widgets/kis_visual_color_selector.cpp
@@ -104,7 +104,7 @@ void KisVisualColorSelector::slotsetColorSpace(const KoColorSpace \
*cs)
\
KisVisualColorSelectorShape::onedimensional,
\
KisVisualColorSelectorShape::HSV,
\
cs, 0, 0,
- \
m_d->displayRenderer, borderWidth,KisVisualEllipticalSelectorShape::border); + \
m_d->displayRenderer, \
borderWidth,KisVisualEllipticalSelectorShape::borderMirrored);
KisVisualTriangleSelectorShape *block = new \
KisVisualTriangleSelectorShape(this, \
KisVisualColorSelectorShape::twodimensional,
\
KisVisualColorSelectorShape::HSV,
\
cs, 1, 2, @@ -349,6 +349,7 @@ KoColor \
KisVisualColorSelectorShape::convertShapeCoordinateToKoColor(QPointF coo QVector \
<float> channelValues (c.colorSpace()->channelCount()); channelValues.fill(1.0);
c.colorSpace()->normalisedChannelsValue(c.data(), channelValues);
+ QVector <float> channelValuesDisplay = channelValues;
QVector <qreal> maxvalue(c.colorSpace()->channelCount());
maxvalue.fill(1.0);
if (m_d->displayRenderer
@@ -358,6 +359,11 @@ KoColor \
KisVisualColorSelectorShape::convertShapeCoordinateToKoColor(QPointF coo \
KoChannelInfo *channel = m_d->cs->channels()[ch];
maxvalue[ch] = m_d->displayRenderer->maxVisibleFloatValue(channel);
channelValues[ch] = channelValues[ch]/(maxvalue[ch]);
+ channelValuesDisplay[KoChannelInfo::displayPositionToChannelIndex(ch, \
m_d->cs->channels())] = channelValues[ch]; + }
+ } else {
+ for (int i =0; i<channelValues.size();i++) {
+ channelValuesDisplay[KoChannelInfo::displayPositionToChannelIndex(i, \
m_d->cs->channels())] = channelValues[i]; }
}
qreal huedivider = 1.0;
@@ -378,43 +384,43 @@ KoColor \
KisVisualColorSelectorShape::convertShapeCoordinateToKoColor(QPointF \
coo
* used for the KoColorSelector... For now implement a qMax here.
*/
QVector <float> inbetween(3);
- RGBToHSV(channelValues[2],channelValues[1], channelValues[0], \
&inbetween[0], &inbetween[1], &inbetween[2]); + \
RGBToHSV(channelValuesDisplay[0],channelValuesDisplay[1], channelValuesDisplay[2], \
&inbetween[0], &inbetween[1], &inbetween[2]);
inbetween = \
convertvectorqrealTofloat(getHSX(convertvectorfloatToqreal(inbetween))); \
inbetween[m_d->channel1] = coordinates.x()*huedivider; if (m_d->dimension == \
Dimensions::twodimensional) {
inbetween[m_d->channel2] = coordinates.y()*huedivider2;
}
if (cursor==true){setHSX(convertvectorfloatToqreal(inbetween));}
- HSVToRGB(qMax(inbetween[0],(float)0.0), inbetween[1], inbetween[2], \
&channelValues[2], &channelValues[1], &channelValues[0]); + \
HSVToRGB(qMax(inbetween[0],(float)0.0), inbetween[1], inbetween[2], \
&channelValuesDisplay[0], &channelValuesDisplay[1], &channelValuesDisplay[2]); } \
else if (m_d->model == ColorModel::HSL) { /*
* HSLToRGB can give negative values on the grey. I fixed the \
fromNormalisedChannel function to clamp,
* but you might want to manually clamp for floating point values.
*/
QVector <float> inbetween(3);
- RGBToHSL(channelValues[2],channelValues[1], channelValues[0], \
&inbetween[0], &inbetween[1], &inbetween[2]); + \
RGBToHSL(channelValuesDisplay[1],channelValuesDisplay[1], channelValuesDisplay[2], \
&inbetween[0], &inbetween[1], &inbetween[2]);
inbetween = \
convertvectorqrealTofloat(getHSX(convertvectorfloatToqreal(inbetween))); \
inbetween[m_d->channel1] = coordinates.x()*huedivider; if (m_d->dimension == \
Dimensions::twodimensional) {
inbetween[m_d->channel2] = coordinates.y()*huedivider2;
}
if (cursor==true){setHSX(convertvectorfloatToqreal(inbetween));}
- HSLToRGB(inbetween[0], inbetween[1], \
inbetween[2],&channelValues[2],&channelValues[1], &channelValues[0]); + \
HSLToRGB(inbetween[0], inbetween[1], \
inbetween[2],&channelValuesDisplay[0],&channelValuesDisplay[1], \
&channelValuesDisplay[2]); } else if (m_d->model == ColorModel::HSI) {
/*
* HSI is a modified HSY function.
*/
- QVector <qreal> chan2 = convertvectorfloatToqreal(channelValues);
+ QVector <qreal> chan2 = \
convertvectorfloatToqreal(channelValuesDisplay); QVector <qreal> inbetween(3);
- RGBToHSI(chan2[2],chan2[1], chan2[0], &inbetween[0], &inbetween[1], \
&inbetween[2]); + RGBToHSI(chan2[0],chan2[1], chan2[2], &inbetween[0], \
&inbetween[1], &inbetween[2]); inbetween = getHSX(inbetween);
inbetween[m_d->channel1] = coordinates.x();
if (m_d->dimension == Dimensions::twodimensional) {
inbetween[m_d->channel2] = coordinates.y();
}
if (cursor==true){setHSX(inbetween);}
- HSIToRGB(inbetween[0], inbetween[1], \
inbetween[2],&chan2[2],&chan2[1], &chan2[0]);
- channelValues = convertvectorqrealTofloat(chan2);
+ HSIToRGB(inbetween[0], inbetween[1], \
inbetween[2],&chan2[0],&chan2[1], &chan2[2]); + channelValuesDisplay = \
convertvectorqrealTofloat(chan2); } else /*if (m_d->model == ColorModel::HSY)*/ {
/*
* HSY is pretty slow to render due being a pretty over-the-top \
function. @@ -422,9 +428,9 @@ KoColor \
KisVisualColorSelectorShape::convertShapeCoordinateToKoColor(QPointF \
coo
* some weird results with that.
*/
QVector <qreal> luma= m_d->cs->lumaCoefficients();
- QVector <qreal> chan2 = convertvectorfloatToqreal(channelValues);
+ QVector <qreal> chan2 = \
convertvectorfloatToqreal(channelValuesDisplay); QVector <qreal> inbetween(3);
- RGBToHSY(chan2[2],chan2[1], chan2[0], &inbetween[0], &inbetween[1], \
&inbetween[2], + RGBToHSY(chan2[0],chan2[1], chan2[2], &inbetween[0], \
&inbetween[1], &inbetween[2], luma[0], luma[1], luma[2]);
inbetween = getHSX(inbetween);
inbetween[m_d->channel1] = coordinates.x();
@@ -432,19 +438,19 @@ KoColor \
KisVisualColorSelectorShape::convertShapeCoordinateToKoColor(QPointF coo \
inbetween[m_d->channel2] = coordinates.y(); }
if (cursor==true){setHSX(inbetween);}
- HSYToRGB(inbetween[0], inbetween[1], \
inbetween[2],&chan2[2],&chan2[1], &chan2[0], + HSYToRGB(inbetween[0], \
inbetween[1], inbetween[2],&chan2[0],&chan2[1], &chan2[1], luma[0], luma[1], \
luma[2]);
- channelValues = convertvectorqrealTofloat(chan2);
+ channelValuesDisplay = convertvectorqrealTofloat(chan2);
}
}
} else {
- channelValues[m_d->channel1] = coordinates.x();
+ channelValuesDisplay[m_d->channel1] = coordinates.x();
if (m_d->dimension == Dimensions::twodimensional) {
- channelValues[m_d->channel2] = coordinates.y();
+ channelValuesDisplay[m_d->channel2] = coordinates.y();
}
}
for (int i=0; i<channelValues.size();i++) {
- channelValues[i] = channelValues[i]*(maxvalue[i]);
+ channelValues[i] = \
channelValuesDisplay[KoChannelInfo::displayPositionToChannelIndex(i, \
m_d->cs->channels())]*(maxvalue[i]); }
c.colorSpace()->fromNormalisedChannelsValue(c.data(), channelValues);
return c;
@@ -458,6 +464,7 @@ QPointF \
KisVisualColorSelectorShape::convertKoColorToShapeCoordinate(KoColor \
c)
QVector <float> channelValues (m_d->currentColor.colorSpace()->channelCount());
channelValues.fill(1.0);
m_d->cs->normalisedChannelsValue(c.data(), channelValues);
+ QVector <float> channelValuesDisplay = channelValues;
QVector <qreal> maxvalue(c.colorSpace()->channelCount());
maxvalue.fill(1.0);
if (m_d->displayRenderer
@@ -467,6 +474,11 @@ QPointF \
KisVisualColorSelectorShape::convertKoColorToShapeCoordinate(KoColor c) \
KoChannelInfo *channel = m_d->cs->channels()[ch];
maxvalue[ch] = m_d->displayRenderer->maxVisibleFloatValue(channel);
channelValues[ch] = channelValues[ch]/(maxvalue[ch]);
+ channelValuesDisplay[KoChannelInfo::displayPositionToChannelIndex(ch, \
m_d->cs->channels())] = channelValues[ch]; + }
+ } else {
+ for (int i =0; i<channelValues.size();i++) {
+ channelValuesDisplay[KoChannelInfo::displayPositionToChannelIndex(i, \
m_d->cs->channels())] = channelValues[i]; }
}
QPointF coordinates(0.0,0.0);
@@ -482,7 +494,7 @@ QPointF \
KisVisualColorSelectorShape::convertKoColorToShapeCoordinate(KoColor c) if \
(c.colorSpace()->colorModelId().id() == "RGBA") { if (m_d->model == \
ColorModel::HSV){ QVector <float> inbetween(3);
- RGBToHSV(channelValues[2],channelValues[1], channelValues[0], \
&inbetween[0], &inbetween[1], &inbetween[2]); + \
RGBToHSV(channelValuesDisplay[0],channelValuesDisplay[1], channelValuesDisplay[2], \
&inbetween[0], &inbetween[1], &inbetween[2]);
inbetween = \
convertvectorqrealTofloat(getHSX(convertvectorfloatToqreal(inbetween))); \
coordinates.setX(inbetween[m_d->channel1]/huedivider); if (m_d->dimension == \
Dimensions::twodimensional) { @@ -490,16 +502,16 @@ QPointF \
KisVisualColorSelectorShape::convertKoColorToShapeCoordinate(KoColor c) }
} else if (m_d->model == ColorModel::HSL) {
QVector <float> inbetween(3);
- RGBToHSL(channelValues[2],channelValues[1], channelValues[0], \
&inbetween[0], &inbetween[1], &inbetween[2]); + \
RGBToHSL(channelValuesDisplay[0],channelValuesDisplay[1], channelValuesDisplay[2], \
&inbetween[0], &inbetween[1], &inbetween[2]);
inbetween = \
convertvectorqrealTofloat(getHSX(convertvectorfloatToqreal(inbetween))); \
coordinates.setX(inbetween[m_d->channel1]/huedivider); if (m_d->dimension == \
Dimensions::twodimensional) {
coordinates.setY(inbetween[m_d->channel2]/huedivider2);
}
} else if (m_d->model == ColorModel::HSI) {
- QVector <qreal> chan2 = convertvectorfloatToqreal(channelValues);
+ QVector <qreal> chan2 = \
convertvectorfloatToqreal(channelValuesDisplay); QVector <qreal> inbetween(3);
- RGBToHSI(chan2[2],chan2[1], chan2[0], &inbetween[0], &inbetween[1], \
&inbetween[2]); + \
RGBToHSI(channelValuesDisplay[0],channelValuesDisplay[1], channelValuesDisplay[2], \
&inbetween[0], &inbetween[1], &inbetween[2]); inbetween = getHSX(inbetween);
coordinates.setX(inbetween[m_d->channel1]);
if (m_d->dimension == Dimensions::twodimensional) {
@@ -507,9 +519,9 @@ QPointF \
KisVisualColorSelectorShape::convertKoColorToShapeCoordinate(KoColor c) }
} else /*if (m_d->model == ColorModel::HSY)*/ {
QVector <qreal> luma = m_d->cs->lumaCoefficients();
- QVector <qreal> chan2 = convertvectorfloatToqreal(channelValues);
+ QVector <qreal> chan2 = \
convertvectorfloatToqreal(channelValuesDisplay); QVector <qreal> inbetween(3);
- RGBToHSY(chan2[2],chan2[1], chan2[0], &inbetween[0], &inbetween[1], \
&inbetween[2], luma[0], luma[1], luma[2]); + \
RGBToHSY(channelValuesDisplay[0],channelValuesDisplay[1], channelValuesDisplay[2], \
&inbetween[0], &inbetween[1], &inbetween[2], luma[0], luma[1], luma[2]); inbetween = \
getHSX(inbetween); coordinates.setX(inbetween[m_d->channel1]);
if (m_d->dimension == Dimensions::twodimensional) {
@@ -518,9 +530,9 @@ QPointF \
KisVisualColorSelectorShape::convertKoColorToShapeCoordinate(KoColor c) }
}
} else {
- coordinates.setX(channelValues[m_d->channel1]);
+ coordinates.setX(channelValuesDisplay[m_d->channel1]);
if (m_d->dimension == Dimensions::twodimensional) {
- coordinates.setY(channelValues[m_d->channel2]);
+ coordinates.setY(channelValuesDisplay[m_d->channel2]);
}
}
return coordinates;
@@ -936,12 +948,15 @@ QPointF \
KisVisualEllipticalSelectorShape::convertShapeCoordinateToWidgetCoordina QLineF \
line(center, QPoint((m_barWidth*0.5),a)); qreal angle = coordinate.x()*360.0;
angle = fmod(angle+180.0,360.0);
+ angle = 180.0-angle;
+ angle = angle+180.0;
+ if (m_type==KisVisualEllipticalSelectorShape::borderMirrored) {
+ angle = (coordinate.x()/2)*360.0;
+ angle = fmod((angle+90.0), 360.0);
+ }
line.setAngle(angle);
if (getDimensions()!=KisVisualColorSelectorShape::onedimensional) {
-
- if (m_type!=KisVisualEllipticalSelectorShape::borderMirrored) {
- line.setLength(coordinate.y()*a);
- }
+ line.setLength(coordinate.y()*a);
}
x = qRound(line.p2().x());
y = qRound(line.p2().y());
@@ -958,13 +973,22 @@ QPointF \
KisVisualEllipticalSelectorShape::convertWidgetCoordinateToShapeCoordina QRect \
total(0, 0, width(), height()); QLineF line(total.center(), coordinate);
qreal a = total.width()/2;
+ qreal angle;
if (m_type!=KisVisualEllipticalSelectorShape::borderMirrored){
- x = fmod((line.angle()+180.0), 360.0)/360.0;
+ angle = fmod((line.angle()+180.0), 360.0);
+ angle = 180.0-angle;
+ angle = angle+180.0;
+ x = angle/360.0;
y = qBound(0.0,line.length()/a, 1.0);
} else {
- x = (fmod((line.angle()+180.0), 360.0)/360.0)/2;
+ angle = fmod((line.angle()+270.0), 360.0);
+ if (angle>180.0) {
+ angle = 180.0-angle;
+ angle = angle+180;
+ }
+ x = (angle/360.0)*2;
y = line.length()/a;
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic