24
24
#include < stdlib.h> // for random()
25
25
#include < QTime>
26
26
27
- QgsVectorGradientColorRampV2::QgsVectorGradientColorRampV2 ( QColor color1, QColor color2 )
28
- : mColor1( color1 ), mColor2( color2 )
27
+ // ////////////
28
+
29
+ static QColor _interpolate ( QColor c1, QColor c2, double value )
30
+ {
31
+ int r = ( int )( c1.red () + value * ( c2.red () - c1.red () ) );
32
+ int g = ( int )( c1.green () + value * ( c2.green () - c1.green () ) );
33
+ int b = ( int )( c1.blue () + value * ( c2.blue () - c1.blue () ) );
34
+ int a = ( int )( c1.alpha () + value * ( c2.alpha () - c1.alpha () ) );
35
+
36
+ return QColor::fromRgb ( r, g, b, a );
37
+ }
38
+
39
+ // ////////////
40
+
41
+ QgsVectorGradientColorRampV2::QgsVectorGradientColorRampV2 ( QColor color1, QColor color2,
42
+ bool discrete, QgsGradientStopsList stops )
43
+ : mColor1( color1 ), mColor2( color2 ), mDiscrete( discrete ), mStops( stops )
29
44
{
30
45
}
31
46
@@ -38,7 +53,7 @@ QgsVectorColorRampV2* QgsVectorGradientColorRampV2::create( const QgsStringMap&
38
53
if ( props.contains ( " color2" ) )
39
54
color2 = QgsSymbolLayerV2Utils::decodeColor ( props[" color2" ] );
40
55
41
- StopsMap stops;
56
+ QgsGradientStopsList stops;
42
57
if ( props.contains ( " stops" ) )
43
58
{
44
59
foreach ( QString stop, props[" stops" ].split ( ' :' ) )
@@ -48,48 +63,51 @@ QgsVectorColorRampV2* QgsVectorGradientColorRampV2::create( const QgsStringMap&
48
63
continue ;
49
64
50
65
QColor c = QgsSymbolLayerV2Utils::decodeColor ( stop.mid ( i + 1 ) );
51
- stops.insert ( stop.left ( i ).toDouble (), c );
66
+ stops.append ( QgsGradientStop ( stop.left ( i ).toDouble (), c ) );
52
67
}
53
68
}
69
+ bool discrete = false ;
70
+ if ( props.contains ( " discrete" ) )
71
+ {
72
+ if ( props[" discrete" ] == " 1" )
73
+ discrete = true ;
74
+ }
54
75
55
- QgsVectorGradientColorRampV2* r = new QgsVectorGradientColorRampV2 ( color1, color2 );
56
- r->setStops ( stops );
76
+ QgsVectorGradientColorRampV2* r = new QgsVectorGradientColorRampV2 ( color1, color2, discrete, stops );
57
77
return r;
58
78
}
59
79
60
- static QColor _interpolate ( QColor c1, QColor c2, double value )
61
- {
62
- int r = ( int )( c1.red () + value * ( c2.red () - c1.red () ) );
63
- int g = ( int )( c1.green () + value * ( c2.green () - c1.green () ) );
64
- int b = ( int )( c1.blue () + value * ( c2.blue () - c1.blue () ) );
65
- int a = ( int )( c1.alpha () + value * ( c2.alpha () - c1.alpha () ) );
66
-
67
- return QColor::fromRgb ( r, g, b, a );
68
- }
69
-
70
80
QColor QgsVectorGradientColorRampV2::color ( double value ) const
71
81
{
72
82
if ( mStops .isEmpty () )
73
83
{
84
+ if ( mDiscrete )
85
+ return mColor1 ;
74
86
return _interpolate ( mColor1 , mColor2 , value );
75
87
}
76
88
else
77
89
{
78
- double lower = 0 , upper;
90
+ double lower = 0 , upper = 0 ;
79
91
QColor c1 = mColor1 , c2;
80
- for ( StopsMap ::const_iterator it = mStops .begin (); it != mStops .end (); ++it )
92
+ for ( QgsGradientStopsList ::const_iterator it = mStops .begin (); it != mStops .end (); ++it )
81
93
{
82
- if ( it. key () >= value )
94
+ if ( it-> offset > value )
83
95
{
84
- upper = it.key ();
85
- c2 = it.value ();
96
+ if ( mDiscrete )
97
+ return c1;
98
+
99
+ upper = it->offset ;
100
+ c2 = it->color ;
86
101
87
102
return upper == lower ? c1 : _interpolate ( c1, c2, ( value - lower ) / ( upper - lower ) );
88
103
}
89
- lower = it. key () ;
90
- c1 = it. value () ;
104
+ lower = it-> offset ;
105
+ c1 = it-> color ;
91
106
}
92
107
108
+ if ( mDiscrete )
109
+ return c1;
110
+
93
111
upper = 1 ;
94
112
c2 = mColor2 ;
95
113
return upper == lower ? c1 : _interpolate ( c1, c2, ( value - lower ) / ( upper - lower ) );
@@ -98,8 +116,8 @@ QColor QgsVectorGradientColorRampV2::color( double value ) const
98
116
99
117
QgsVectorColorRampV2* QgsVectorGradientColorRampV2::clone () const
100
118
{
101
- QgsVectorGradientColorRampV2* r = new QgsVectorGradientColorRampV2 ( mColor1 , mColor2 );
102
- r-> setStops ( mStops );
119
+ QgsVectorGradientColorRampV2* r = new QgsVectorGradientColorRampV2 ( mColor1 , mColor2 ,
120
+ mDiscrete , mStops );
103
121
return r;
104
122
}
105
123
@@ -111,15 +129,17 @@ QgsStringMap QgsVectorGradientColorRampV2::properties() const
111
129
if ( !mStops .isEmpty () )
112
130
{
113
131
QStringList lst;
114
- for ( StopsMap ::const_iterator it = mStops .begin (); it != mStops .end (); ++it )
132
+ for ( QgsGradientStopsList ::const_iterator it = mStops .begin (); it != mStops .end (); ++it )
115
133
{
116
- lst.append ( QString ( " %1;%2" ).arg ( it. key () ).arg ( QgsSymbolLayerV2Utils::encodeColor ( it. value () ) ) );
134
+ lst.append ( QString ( " %1;%2" ).arg ( it-> offset ).arg ( QgsSymbolLayerV2Utils::encodeColor ( it-> color ) ) );
117
135
}
118
136
map[" stops" ] = lst.join ( " :" );
119
137
}
138
+ map[" discrete" ] = mDiscrete ? " 1" : " 0" ;
120
139
return map;
121
140
}
122
141
142
+
123
143
// ////////////
124
144
125
145
@@ -256,33 +276,12 @@ QgsStringMap QgsVectorColorBrewerColorRampV2::properties() const
256
276
257
277
// //////////
258
278
259
- /*
260
- TODO
261
- - return a suitable name (scheme_variant) ??
262
- - re-organize and rename colorramp classes and widgets
263
- */
264
-
265
- /*
266
- TODO load schemes
267
- - don't show empty dirs? (e.g. jjg/hatch)
268
-
269
- - better grouping:
270
- - cl/fs2????
271
- - cw
272
- - dca
273
- - dirs with one scheme ( cl/ es/ ma/ occ/ wkp/
274
- jjg/neo10/env/green-crystal jjg/neo10/face/eyes/blue )
275
-
276
- - fix rendering:
277
- - ibcao
278
-
279
- */
280
279
281
280
QgsCptCityColorRampV2::QgsCptCityColorRampV2 ( QString schemeName, QString variantName,
282
281
bool doLoadFile )
283
- : mSchemeName( schemeName ), mVariantName( variantName ),
284
- mVariantList( QStringList() ), mFileLoaded( false ),
285
- mGradientType( Continuous )
282
+ : QgsVectorGradientColorRampV2( ),
283
+ mSchemeName( schemeName ), mVariantName( variantName ),
284
+ mVariantList( QStringList() ), mFileLoaded( false ), mMultiStops( false )
286
285
{
287
286
// TODO replace this with hard-coded data in the default case
288
287
// don't load file if variant is missing
@@ -292,9 +291,9 @@ QgsCptCityColorRampV2::QgsCptCityColorRampV2( QString schemeName, QString varian
292
291
293
292
QgsCptCityColorRampV2::QgsCptCityColorRampV2 ( QString schemeName, QStringList variantList,
294
293
QString variantName, bool doLoadFile )
295
- : mSchemeName( schemeName ), mVariantName( variantName ),
296
- mVariantList( variantList ), mFileLoaded( false ),
297
- mGradientType( Continuous )
294
+ : QgsVectorGradientColorRampV2( ),
295
+ mSchemeName( schemeName ), mVariantName( variantName ),
296
+ mVariantList( variantList ), mFileLoaded( false ), mMultiStops( false )
298
297
{
299
298
mVariantList = variantList;
300
299
@@ -317,41 +316,6 @@ QgsVectorColorRampV2* QgsCptCityColorRampV2::create( const QgsStringMap& props )
317
316
return new QgsCptCityColorRampV2 ( schemeName, variantName );
318
317
}
319
318
320
- QColor QgsCptCityColorRampV2::color ( double value ) const
321
- {
322
- int numStops = mPalette .count ();
323
- if ( mPalette .isEmpty () || value < 0 || value > 1 || numStops < 2 )
324
- return QColor ( 255 , 0 , 0 ); // red color as a warning :)
325
-
326
- double lower = 0 , upper = 0 ;
327
- QColor c1, c2;
328
- c1 = mPalette [0 ].second ;
329
- for ( int i = 0 ; i < numStops; i++ )
330
- {
331
- if ( mPalette [i].first > value )
332
- {
333
- if ( mGradientType == Discrete )
334
- return c1;
335
-
336
- upper = mPalette [i].first ;
337
- c2 = mPalette [i].second ;
338
-
339
- return upper == lower ? c1 : _interpolate ( c1, c2, ( value - lower ) / ( upper - lower ) );
340
- }
341
-
342
- lower = mPalette [i].first ;
343
- c1 = mPalette [i].second ;
344
- }
345
-
346
- if ( mGradientType == Discrete )
347
- return c1;
348
-
349
- upper = 1 ;
350
- c2 = mPalette [ numStops - 1 ].second ;
351
-
352
- return upper == lower ? c1 : _interpolate ( c1, c2, ( value - lower ) / ( upper - lower ) );
353
- }
354
-
355
319
QgsVectorColorRampV2* QgsCptCityColorRampV2::clone () const
356
320
{
357
321
QgsCptCityColorRampV2* ramp = new QgsCptCityColorRampV2 ( " " , " " , false );
@@ -363,15 +327,14 @@ void QgsCptCityColorRampV2::copy( const QgsCptCityColorRampV2* other )
363
327
{
364
328
if ( ! other )
365
329
return ;
330
+ mColor1 = other->color1 ();
331
+ mColor2 = other->color2 ();
332
+ mDiscrete = other->isDiscrete ();
333
+ mStops = other->stops ();
366
334
mSchemeName = other->mSchemeName ;
367
335
mVariantName = other->mVariantName ;
368
336
mVariantList = other->mVariantList ;
369
337
mFileLoaded = other->mFileLoaded ;
370
- if ( other->mFileLoaded )
371
- {
372
- mGradientType = other->mGradientType ;
373
- mPalette = other->mPalette ;
374
- }
375
338
}
376
339
377
340
QgsStringMap QgsCptCityColorRampV2::properties () const
@@ -434,12 +397,13 @@ bool QgsCptCityColorRampV2::loadFile()
434
397
435
398
// add colors to palette
436
399
mFileLoaded = false ;
437
- mPalette .clear ();
400
+ mStops .clear ();
438
401
QMap<double , QPair<QColor, QColor> >::const_iterator it, prev;
439
402
// first detect if file is gradient is continuous or dicrete
440
403
// discrete: stop contains 2 colors and first color is identical to previous second
441
404
// multi: stop contains 2 colors and no relation with previous stop
442
- mGradientType = Continuous;
405
+ mDiscrete = false ;
406
+ mMultiStops = false ;
443
407
it = prev = colorMap.constBegin ();
444
408
while ( it != colorMap.constEnd () )
445
409
{
@@ -448,12 +412,12 @@ bool QgsCptCityColorRampV2::loadFile()
448
412
{
449
413
if ( it.value ().first == prev.value ().second )
450
414
{
451
- mGradientType = Discrete ;
415
+ mDiscrete = true ;
452
416
break ;
453
417
}
454
418
else
455
419
{
456
- mGradientType = ContinuousMulti ;
420
+ mMultiStops = true ;
457
421
break ;
458
422
}
459
423
}
@@ -464,17 +428,19 @@ bool QgsCptCityColorRampV2::loadFile()
464
428
it = prev = colorMap.constBegin ();
465
429
while ( it != colorMap.constEnd () )
466
430
{
467
- if ( mGradientType == Discrete )
431
+ if ( mDiscrete )
468
432
{
469
- mPalette << qMakePair ( it.key (), it.value ().second );
433
+ // mPalette << qMakePair( it.key(), it.value().second );
434
+ mStops .append ( QgsGradientStop ( it.key (), it.value ().second ) );
470
435
}
471
436
else
472
437
{
473
- mPalette << qMakePair ( it.key (), it.value ().first );
474
- if (( mGradientType == ContinuousMulti ) &&
438
+ // mPalette << qMakePair( it.key(), it.value().first );
439
+ mStops .append ( QgsGradientStop ( it.key (), it.value ().first ) );
440
+ if (( mMultiStops ) &&
475
441
( it.key () != 0.0 && it.key () != 1.0 ) )
476
442
{
477
- mPalette << qMakePair ( it.key (), it.value ().second );
443
+ mStops . append ( QgsGradientStop ( it.key (), it.value ().second ) );
478
444
}
479
445
}
480
446
prev = it;
0 commit comments