2
* Copyright (c) 2004 Cyrille Berger <cberger@cberger.net>
3
* 2004 Sven Langkamp <longamp@reallygood.de>
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20
#include "kis_autogradient.h"
23
#include <qcombobox.h>
25
#include <kcolorbutton.h>
26
#include <knuminput.h>
28
#include "kis_gradient_slider_widget.h"
30
// FIXME: use the same #define as in kis_gradient.cc, probably best customizable?
31
#define PREVIEW_WIDTH 64
32
#define PREVIEW_HEIGHT 64
34
/************************** KisAutogradientResource **************************/
36
void KisAutogradientResource::createSegment( int interpolation, int colorInterpolation, double startOffset, double endOffset, double middleOffset, QColor left, QColor right )
38
pushSegment(new KisGradientSegment(interpolation, colorInterpolation, startOffset, middleOffset, endOffset, Color( left, 1 ), Color( right, 1 )));
42
const QValueVector<double> KisAutogradientResource::getHandlePositions() const
44
QValueVector<double> handlePositions;
46
handlePositions.push_back(m_segments[0] -> startOffset());
47
for (uint i = 0; i < m_segments.count(); i++)
49
handlePositions.push_back(m_segments[i] -> endOffset());
51
return handlePositions;
54
const QValueVector<double> KisAutogradientResource::getMiddleHandlePositions() const
56
QValueVector<double> middleHandlePositions;
58
for (uint i = 0; i < m_segments.count(); i++)
60
middleHandlePositions.push_back(m_segments[i] -> middleOffset());
62
return middleHandlePositions;
65
void KisAutogradientResource::moveSegmentStartOffset( KisGradientSegment* segment, double t)
67
QValueVector<KisGradientSegment*>::iterator it = qFind( m_segments.begin(), m_segments.end(), segment );
68
if ( it != m_segments.end() )
70
if ( it == m_segments.begin() )
72
segment -> setStartOffset( 0.0 );
75
KisGradientSegment* previousSegment = (*(it-1));
76
if ( t > segment -> startOffset() )
78
if( t > segment -> middleOffset() )
79
t = segment -> middleOffset();
82
if( t < previousSegment -> middleOffset() )
83
t = previousSegment -> middleOffset();
85
previousSegment -> setEndOffset( t );
86
segment -> setStartOffset( t );
90
void KisAutogradientResource::moveSegmentEndOffset( KisGradientSegment* segment, double t)
92
QValueVector<KisGradientSegment*>::iterator it = qFind( m_segments.begin(), m_segments.end(), segment );
93
if ( it != m_segments.end() )
95
if ( it+1 == m_segments.end() )
97
segment -> setEndOffset( 1.0 );
100
KisGradientSegment* followingSegment = (*(it+1));
101
if ( t < segment -> endOffset() )
103
if( t < segment -> middleOffset() )
104
t = segment -> middleOffset();
107
if( t > followingSegment -> middleOffset() )
108
t = followingSegment -> middleOffset();
110
followingSegment -> setStartOffset( t );
111
segment -> setEndOffset( t );
115
void KisAutogradientResource::moveSegmentMiddleOffset( KisGradientSegment* segment, double t)
119
if( t > segment -> endOffset() )
120
segment -> setMiddleOffset( segment -> endOffset() );
121
else if( t < segment -> startOffset() )
122
segment -> setMiddleOffset( segment -> startOffset() );
124
segment -> setMiddleOffset( t );
128
void KisAutogradientResource::splitSegment( KisGradientSegment* segment )
130
Q_ASSERT(segment != 0);
131
QValueVector<KisGradientSegment*>::iterator it = qFind( m_segments.begin(), m_segments.end(), segment );
132
if ( it != m_segments.end() )
134
KisGradientSegment* newSegment = new KisGradientSegment(
135
segment -> interpolation(), segment -> colorInterpolation(),
136
segment -> startOffset(),
137
( segment -> middleOffset() - segment -> startOffset() ) / 2 + segment -> startOffset(),
138
segment -> middleOffset(),
139
segment -> startColor(),
140
segment -> colorAt( segment -> middleOffset() ) );
141
m_segments.insert( it, newSegment );
142
segment -> setStartColor( segment -> colorAt( segment -> middleOffset() ) );
143
segment -> setStartOffset( segment -> middleOffset() );
144
segment -> setMiddleOffset( ( segment -> endOffset() - segment -> startOffset() ) / 2 + segment -> startOffset() );
148
void KisAutogradientResource::duplicateSegment( KisGradientSegment* segment )
150
Q_ASSERT(segment != 0);
151
QValueVector<KisGradientSegment*>::iterator it = qFind( m_segments.begin(), m_segments.end(), segment );
152
if ( it != m_segments.end() )
154
double middlePostionPercentage = ( segment -> middleOffset() - segment -> startOffset() ) / segment -> length();
155
double center = segment -> startOffset() + segment -> length() / 2;
156
KisGradientSegment* newSegment = new KisGradientSegment(
157
segment -> interpolation(), segment -> colorInterpolation(),
158
segment -> startOffset(),
159
segment -> length() / 2 * middlePostionPercentage + segment -> startOffset(),
160
center, segment -> startColor(),
161
segment -> endColor() );
162
m_segments.insert( it, newSegment );
163
segment -> setStartOffset( center );
164
segment -> setMiddleOffset( segment -> length() * middlePostionPercentage + segment -> startOffset() );
168
void KisAutogradientResource::mirrorSegment( KisGradientSegment* segment )
170
Q_ASSERT(segment != 0);
171
Color tmpColor = segment -> startColor();
172
segment -> setStartColor( segment -> endColor() );
173
segment -> setEndColor( tmpColor );
174
segment -> setMiddleOffset( segment -> endOffset() - ( segment -> middleOffset() - segment -> startOffset() ) );
176
if( segment -> interpolation() == INTERP_SPHERE_INCREASING )
177
segment -> setInterpolation( INTERP_SPHERE_DECREASING );
178
else if( segment -> interpolation() == INTERP_SPHERE_DECREASING )
179
segment -> setInterpolation( INTERP_SPHERE_INCREASING );
181
if( segment -> colorInterpolation() == COLOR_INTERP_HSV_CW )
182
segment -> setColorInterpolation( COLOR_INTERP_HSV_CCW );
183
else if( segment -> colorInterpolation() == COLOR_INTERP_HSV_CCW )
184
segment -> setColorInterpolation( COLOR_INTERP_HSV_CW );
187
KisGradientSegment* KisAutogradientResource::removeSegment( KisGradientSegment* segment )
189
Q_ASSERT(segment != 0);
190
if( m_segments.count() < 2 )
192
QValueVector<KisGradientSegment*>::iterator it = qFind( m_segments.begin(), m_segments.end(), segment );
193
if ( it != m_segments.end() )
195
double middlePostionPercentage;
196
KisGradientSegment* nextSegment;
197
if( it == m_segments.begin() )
199
nextSegment = (*(it+1));
200
middlePostionPercentage = ( nextSegment -> middleOffset() - nextSegment -> startOffset() ) / nextSegment -> length();
201
nextSegment -> setStartOffset( segment -> startOffset() );
202
nextSegment -> setMiddleOffset( middlePostionPercentage * nextSegment -> length() + nextSegment -> startOffset() );
206
nextSegment = (*(it-1));
207
middlePostionPercentage = ( nextSegment -> middleOffset() - nextSegment -> startOffset() ) / nextSegment -> length();
208
nextSegment -> setEndOffset( segment -> endOffset() );
209
nextSegment -> setMiddleOffset( middlePostionPercentage * nextSegment -> length() + nextSegment -> startOffset() );
213
m_segments.erase( it );
219
bool KisAutogradientResource::removeSegmentPossible() const
221
if( m_segments.count() < 2 )
226
void KisAutogradientResource::updatePreview()
228
setImage( generatePreview( PREVIEW_WIDTH, PREVIEW_HEIGHT ) );
231
/****************************** KisAutogradient ******************************/
233
KisAutogradient::KisAutogradient(QWidget *parent, const char* name, const QString& caption) : KisWdgAutogradient(parent, name)
236
m_autogradientResource = new KisAutogradientResource();
237
m_autogradientResource->createSegment( INTERP_LINEAR, COLOR_INTERP_RGB, 0.0, 1.0, 0.5, Qt::black, Qt::white );
238
connect(gradientSlider, SIGNAL( sigSelectedSegment( KisGradientSegment* ) ), SLOT( slotSelectedSegment(KisGradientSegment*) ));
239
connect(gradientSlider, SIGNAL( sigChangedSegment(KisGradientSegment*) ), SLOT( slotChangedSegment(KisGradientSegment*) ));
240
gradientSlider->setGradientResource( m_autogradientResource );
241
connect(comboBoxColorInterpolationType, SIGNAL( activated(int) ), SLOT( slotChangedColorInterpolation(int) ));
242
connect(comboBoxInterpolationType, SIGNAL( activated(int) ), SLOT( slotChangedInterpolation(int) ));
243
connect(leftColorButton, SIGNAL( changed(const QColor&) ), SLOT( slotChangedLeftColor(const QColor&) ));
244
connect(rightColorButton, SIGNAL( changed(const QColor&) ), SLOT( slotChangedRightColor(const QColor&) ));
246
// intNumInputLeftOpacity -> setRange( 0, 100, false);
247
connect(intNumInputLeftOpacity, SIGNAL( valueChanged(int) ), SLOT( slotChangedLeftOpacity(int) ));
248
// intNumInputRightOpacity -> setRange( 0, 100, false);
249
connect(intNumInputRightOpacity, SIGNAL( valueChanged(int) ), SLOT( slotChangedRightOpacity(int) ));
252
void KisAutogradient::slotSelectedSegment(KisGradientSegment* segment)
254
leftColorButton -> setColor( segment -> startColor().color() );
255
rightColorButton -> setColor( segment -> endColor().color() );
256
comboBoxColorInterpolationType -> setCurrentItem( segment -> colorInterpolation() );
257
comboBoxInterpolationType -> setCurrentItem( segment -> interpolation() );
259
int leftOpacity = qRound(segment -> startColor().alpha() * 100);
260
intNumInputLeftOpacity -> setValue( leftOpacity );
262
int rightOpacity = qRound(segment -> endColor().alpha() * 100);
263
intNumInputRightOpacity -> setValue( rightOpacity );
268
void KisAutogradient::slotChangedSegment(KisGradientSegment* segment)
273
void KisAutogradient::slotChangedInterpolation(int type)
275
KisGradientSegment* segment = gradientSlider -> selectedSegment();
277
segment -> setInterpolation( type );
278
gradientSlider -> repaint();
283
void KisAutogradient::slotChangedColorInterpolation(int type)
285
KisGradientSegment* segment = gradientSlider -> selectedSegment();
287
segment -> setColorInterpolation( type );
288
gradientSlider -> repaint();
293
void KisAutogradient::slotChangedLeftColor( const QColor& color)
295
KisGradientSegment* segment = gradientSlider -> selectedSegment();
297
segment -> setStartColor( Color( color, segment -> startColor().alpha() ) );
298
gradientSlider -> repaint();
303
void KisAutogradient::slotChangedRightColor( const QColor& color)
305
KisGradientSegment* segment = gradientSlider -> selectedSegment();
307
segment -> setEndColor( Color( color, segment -> endColor().alpha() ) );
308
gradientSlider -> repaint();
313
void KisAutogradient::slotChangedLeftOpacity( int value )
315
KisGradientSegment* segment = gradientSlider -> selectedSegment();
317
segment -> setStartColor( Color( segment -> startColor().color(), (double)value / 100 ) );
318
gradientSlider -> repaint(false);
323
void KisAutogradient::slotChangedRightOpacity( int value )
325
KisGradientSegment* segment = gradientSlider -> selectedSegment();
327
segment -> setEndColor( Color( segment -> endColor().color(), (double)value / 100 ) );
328
gradientSlider -> repaint(false);
333
void KisAutogradient::paramChanged()
335
m_autogradientResource -> updatePreview ();
336
emit activatedResource( m_autogradientResource );
339
#include "kis_autogradient.moc"