20#include "kis_gradient.h"
21#include "kis_autogradient_resource.h"
24#define PREVIEW_WIDTH 64
25#define PREVIEW_HEIGHT 64
28void KisAutogradientResource::createSegment(
int interpolation,
int colorInterpolation,
double startOffset,
double endOffset,
double middleOffset, TQColor left, TQColor right )
30 pushSegment(
new KisGradientSegment(interpolation, colorInterpolation, startOffset, middleOffset, endOffset, Color( left, 1 ), Color( right, 1 )));
34const TQValueVector<double> KisAutogradientResource::getHandlePositions()
const
36 TQValueVector<double> handlePositions;
38 handlePositions.push_back(m_segments[0]->startOffset());
39 for (uint i = 0; i < m_segments.count(); i++)
41 handlePositions.push_back(m_segments[i]->endOffset());
43 return handlePositions;
46const TQValueVector<double> KisAutogradientResource::getMiddleHandlePositions()
const
48 TQValueVector<double> middleHandlePositions;
50 for (uint i = 0; i < m_segments.count(); i++)
52 middleHandlePositions.push_back(m_segments[i]->middleOffset());
54 return middleHandlePositions;
57void KisAutogradientResource::moveSegmentStartOffset( KisGradientSegment* segment,
double t)
59 TQValueVector<KisGradientSegment*>::iterator it = tqFind( m_segments.begin(), m_segments.end(), segment );
60 if ( it != m_segments.end() )
62 if ( it == m_segments.begin() )
64 segment->setStartOffset( 0.0 );
67 KisGradientSegment* previousSegment = (*(it-1));
68 if ( t > segment->startOffset() )
70 if( t > segment->middleOffset() )
71 t = segment->middleOffset();
74 if( t < previousSegment->middleOffset() )
75 t = previousSegment->middleOffset();
77 previousSegment->setEndOffset( t );
78 segment->setStartOffset( t );
82void KisAutogradientResource::moveSegmentEndOffset( KisGradientSegment* segment,
double t)
84 TQValueVector<KisGradientSegment*>::iterator it = tqFind( m_segments.begin(), m_segments.end(), segment );
85 if ( it != m_segments.end() )
87 if ( it+1 == m_segments.end() )
89 segment->setEndOffset( 1.0 );
92 KisGradientSegment* followingSegment = (*(it+1));
93 if ( t < segment->endOffset() )
95 if( t < segment->middleOffset() )
96 t = segment->middleOffset();
99 if( t > followingSegment->middleOffset() )
100 t = followingSegment->middleOffset();
102 followingSegment->setStartOffset( t );
103 segment->setEndOffset( t );
107void KisAutogradientResource::moveSegmentMiddleOffset( KisGradientSegment* segment,
double t)
111 if( t > segment->endOffset() )
112 segment->setMiddleOffset( segment->endOffset() );
113 else if( t < segment->startOffset() )
114 segment->setMiddleOffset( segment->startOffset() );
116 segment->setMiddleOffset( t );
120void KisAutogradientResource::splitSegment( KisGradientSegment* segment )
122 Q_ASSERT(segment != 0);
123 TQValueVector<KisGradientSegment*>::iterator it = tqFind( m_segments.begin(), m_segments.end(), segment );
124 if ( it != m_segments.end() )
126 KisGradientSegment* newSegment =
new KisGradientSegment(
127 segment->interpolation(), segment->colorInterpolation(),
128 segment ->startOffset(),
129 ( segment->middleOffset() - segment->startOffset() ) / 2 + segment->startOffset(),
130 segment->middleOffset(),
131 segment->startColor(),
132 segment->colorAt( segment->middleOffset() ) );
133 m_segments.insert( it, newSegment );
134 segment->setStartColor( segment->colorAt( segment->middleOffset() ) );
135 segment->setStartOffset( segment->middleOffset() );
136 segment->setMiddleOffset( ( segment->endOffset() - segment->startOffset() ) / 2 + segment->startOffset() );
140void KisAutogradientResource::duplicateSegment( KisGradientSegment* segment )
142 Q_ASSERT(segment != 0);
143 TQValueVector<KisGradientSegment*>::iterator it = tqFind( m_segments.begin(), m_segments.end(), segment );
144 if ( it != m_segments.end() )
146 double middlePostionPercentage = ( segment->middleOffset() - segment->startOffset() ) / segment->length();
147 double center = segment->startOffset() + segment->length() / 2;
148 KisGradientSegment* newSegment =
new KisGradientSegment(
149 segment->interpolation(), segment->colorInterpolation(),
150 segment ->startOffset(),
151 segment->length() / 2 * middlePostionPercentage + segment->startOffset(),
152 center, segment->startColor(),
153 segment->endColor() );
154 m_segments.insert( it, newSegment );
155 segment->setStartOffset( center );
156 segment->setMiddleOffset( segment->length() * middlePostionPercentage + segment->startOffset() );
160void KisAutogradientResource::mirrorSegment( KisGradientSegment* segment )
162 Q_ASSERT(segment != 0);
163 Color tmpColor = segment->startColor();
164 segment->setStartColor( segment->endColor() );
165 segment->setEndColor( tmpColor );
166 segment->setMiddleOffset( segment->endOffset() - ( segment->middleOffset() - segment->startOffset() ) );
168 if( segment->interpolation() == INTERP_SPHERE_INCREASING )
169 segment->setInterpolation( INTERP_SPHERE_DECREASING );
170 else if( segment->interpolation() == INTERP_SPHERE_DECREASING )
171 segment->setInterpolation( INTERP_SPHERE_INCREASING );
173 if( segment->colorInterpolation() == COLOR_INTERP_HSV_CW )
174 segment->setColorInterpolation( COLOR_INTERP_HSV_CCW );
175 else if( segment->colorInterpolation() == COLOR_INTERP_HSV_CCW )
176 segment->setColorInterpolation( COLOR_INTERP_HSV_CW );
179KisGradientSegment* KisAutogradientResource::removeSegment( KisGradientSegment* segment )
181 Q_ASSERT(segment != 0);
182 if( m_segments.count() < 2 )
184 TQValueVector<KisGradientSegment*>::iterator it = tqFind( m_segments.begin(), m_segments.end(), segment );
185 if ( it != m_segments.end() )
187 double middlePostionPercentage;
188 KisGradientSegment* nextSegment;
189 if( it == m_segments.begin() )
191 nextSegment = (*(it+1));
192 middlePostionPercentage = ( nextSegment->middleOffset() - nextSegment->startOffset() ) / nextSegment->length();
193 nextSegment->setStartOffset( segment->startOffset() );
194 nextSegment->setMiddleOffset( middlePostionPercentage * nextSegment->length() + nextSegment->startOffset() );
198 nextSegment = (*(it-1));
199 middlePostionPercentage = ( nextSegment->middleOffset() - nextSegment->startOffset() ) / nextSegment->length();
200 nextSegment->setEndOffset( segment->endOffset() );
201 nextSegment->setMiddleOffset( middlePostionPercentage * nextSegment->length() + nextSegment->startOffset() );
205 m_segments.erase( it );
211bool KisAutogradientResource::removeSegmentPossible()
const
213 if( m_segments.count() < 2 )
218void KisAutogradientResource::updatePreview()
220 setImage( generatePreview( PREVIEW_WIDTH, PREVIEW_HEIGHT ) );