18 #include <kis_debug.h>
23 #include <QMouseEvent>
25 #include <QLinearGradient>
28 #define HANDLE_SIZE 10
41 , m_gammaEnabled(false)
42 , m_whiteEnabled(true)
75 const int gradientHeight = qRound((
double)wHeight / 7.0 * 2);
84 grayGradient.
setColorAt(0, m_inverted ? Qt::white : Qt::black);
85 grayGradient.
setColorAt(1, m_inverted ? Qt::black : Qt::white);
92 if (m_blackCursor > 0 && !m_inverted) {
94 }
else if (m_blackCursor < wWidth && m_inverted) {
95 p1.
fillRect(
MARGIN + m_blackCursor,
y, wWidth - m_blackCursor, gradientHeight, Qt::black);
99 int left = qMin(m_blackCursor, m_whiteCursor);
100 int right = qMax(m_blackCursor, m_whiteCursor);
101 for (
x = left;
x <= right; ++
x) {
102 double inten = (double)(
x - m_blackCursor) /
103 (double)(m_whiteCursor - m_blackCursor);
104 inten = pow(inten, (1.0 / m_gamma));
105 int gray = (int)(255 * inten);
116 const int cursorHalfBase = (int)(gradientHeight / 1.5);
119 a[1] =
QPoint(m_blackCursor +
MARGIN + cursorHalfBase, wHeight - 1);
120 a[2] =
QPoint(m_blackCursor +
MARGIN - cursorHalfBase, wHeight - 1);
125 if (m_gammaEnabled) {
127 a[1] =
QPoint(m_gammaCursor +
MARGIN + cursorHalfBase, wHeight - 1);
128 a[2] =
QPoint(m_gammaCursor +
MARGIN - cursorHalfBase, wHeight - 1);
133 if (m_whiteEnabled) {
135 a[1] =
QPoint(m_whiteCursor +
MARGIN + cursorHalfBase, wHeight - 1);
136 a[2] =
QPoint(m_whiteCursor +
MARGIN - cursorHalfBase, wHeight - 1);
144 m_scalingFactor = (double)(
width() - 2 *
MARGIN) / 255;
145 calculateCursorPositions();
151 eCursor closest_cursor = KisGradientSlider::None;
154 if (e->
button() != Qt::LeftButton)
157 unsigned int x = e->
pos().
x();
160 distance =
width() + 1;
162 if (abs((
int)(xMinusMargin - m_blackCursor)) < distance) {
163 distance = abs((
int)(xMinusMargin - m_blackCursor));
164 closest_cursor = BlackCursor;
167 if (abs((
int)(xMinusMargin - m_whiteCursor)) < distance) {
168 distance = abs((
int)(xMinusMargin - m_whiteCursor));
169 closest_cursor = WhiteCursor;
172 if (m_gammaEnabled) {
173 int gammaDistance = (int)xMinusMargin - m_gammaCursor;
175 if (abs(gammaDistance) < distance) {
176 distance = abs((
int)xMinusMargin - m_gammaCursor);
177 closest_cursor = GammaCursor;
178 }
else if (abs(gammaDistance) == distance) {
179 if ((closest_cursor == BlackCursor) && (gammaDistance > 0)) {
180 distance = abs(gammaDistance);
181 closest_cursor = GammaCursor;
182 }
else if ((closest_cursor == WhiteCursor) && (gammaDistance < 0)) {
183 distance = abs(gammaDistance);
184 closest_cursor = GammaCursor;
196 switch (closest_cursor) {
198 m_blackCursor = xMinusMargin;
199 m_grabCursor = closest_cursor;
201 m_leftmost = m_whiteCursor + 1;
205 m_rightmost = m_whiteCursor - 1;
208 m_gammaCursor = calculateGammaCursor();
211 m_whiteCursor = xMinusMargin;
212 m_grabCursor = closest_cursor;
215 m_rightmost = m_blackCursor - 1;
217 m_leftmost = m_blackCursor + 1;
221 m_gammaCursor = calculateGammaCursor();
225 m_grabCursor = closest_cursor;
226 m_leftmost = qMin(m_blackCursor, m_whiteCursor);
227 m_rightmost = qMax(m_blackCursor, m_whiteCursor);
229 double delta = (double)(m_whiteCursor - m_blackCursor) / 2.0;
230 double mid = (double)m_blackCursor + delta +
MARGIN;
231 double tmp = (xMinusMargin - mid) / delta;
232 m_gamma = 1.0 / pow(10, tmp);
243 if (e->
button() != Qt::LeftButton)
248 switch (m_grabCursor) {
250 m_black = qRound(m_blackCursor / m_scalingFactor);
255 m_white = qRound(m_whiteCursor / m_scalingFactor);
272 int x = e->
pos().
x();
274 if (m_grabCursor != None) {
275 if (xMinusMargin <= m_leftmost)
276 xMinusMargin = m_leftmost;
278 if (xMinusMargin >= m_rightmost)
279 xMinusMargin = m_rightmost;
281 switch (m_grabCursor) {
283 if (m_blackCursor != xMinusMargin) {
284 m_blackCursor = xMinusMargin;
285 if (m_gammaEnabled) {
286 m_gammaCursor = calculateGammaCursor();
291 if (m_whiteCursor != xMinusMargin) {
292 m_whiteCursor = xMinusMargin;
293 if (m_gammaEnabled) {
294 m_gammaCursor = calculateGammaCursor();
299 if (m_gammaCursor != xMinusMargin) {
300 m_gammaCursor = xMinusMargin;
301 double delta = (double)(m_whiteCursor - m_blackCursor) / 2.0;
302 double mid = (double)m_blackCursor + delta;
303 double tmp = (xMinusMargin - mid) / delta;
304 m_gamma = 1.0 / pow(10, tmp);
315 void KisGradientSlider::calculateCursorPositions()
317 m_blackCursor = qRound(m_black * m_scalingFactor);
318 m_whiteCursor = qRound(m_white * m_scalingFactor);
320 m_gammaCursor = calculateGammaCursor();
323 unsigned int KisGradientSlider::calculateGammaCursor()
325 double delta = (double)(m_whiteCursor - m_blackCursor) / 2.0;
326 double mid = (double)m_blackCursor + delta;
327 double tmp = log10(1.0 / m_gamma);
328 return (
unsigned int)qRound(mid + delta * tmp);
358 if ((m_inverted && (v < m_white || v >
width())) ||
359 (!m_inverted && (v < 0 || v > m_white)) ||
364 m_blackCursor = qRound(m_black * m_scalingFactor);
365 m_gammaCursor = calculateGammaCursor();
371 if ((m_inverted && (v < 0 || v > m_white)) ||
372 (!m_inverted && (v < m_black && v >
width())) ||
376 m_whiteCursor = qRound(m_white * m_scalingFactor);
377 m_gammaCursor = calculateGammaCursor();
387 m_gammaCursor = calculateGammaCursor();