Skip to content

Commit f429563

Browse files
author
jef
committedAug 20, 2008

File tree

2 files changed

+188
-190
lines changed

2 files changed

+188
-190
lines changed
 

‎src/core/raster/qgscolortable.cpp

Lines changed: 120 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -23,191 +23,190 @@
2323
/* compare ramps */
2424
bool compareRampSort ( const RAMP &a, const RAMP &b)
2525
{
26-
if ( a.min < b.min || a.max < b.max ) return true;
26+
if ( a.min < b.min || a.max < b.max ) return true;
2727

28-
return false;
28+
return false;
2929
}
3030

3131
bool compareRampSearch ( const RAMP &a, const RAMP &b)
3232
{
33-
if( a.max < b.min ) return true;
34-
return false;
33+
if( a.max < b.min ) return true;
34+
return false;
3535
}
3636

3737

3838
QgsColorTable::QgsColorTable ( int interp )
3939
{
40-
QgsDebugMsg("QgsColorTable::QgsColorTable()");
41-
mInterp = interp;
40+
QgsDebugMsg("QgsColorTable::QgsColorTable()");
41+
mInterp = interp;
4242
}
4343

4444
QgsColorTable::~QgsColorTable()
4545
{
4646
}
4747

48-
void QgsColorTable::add ( uint index, unsigned char c1, unsigned char c2, unsigned char c3, unsigned char c4 )
48+
void QgsColorTable::add ( int index, unsigned char c1, unsigned char c2, unsigned char c3, unsigned char c4 )
4949
{
5050
#ifdef QGISDEBUG
51-
QgsLogger::debug("QgsColorTable::add() index", (int)index, 1, __FILE__, __FUNCTION__, __LINE__);
51+
QgsLogger::debug("QgsColorTable::add() index", (int)index, 1, __FILE__, __FUNCTION__, __LINE__);
5252
#endif
5353

54-
if ( mDiscrete.size() == 0 ) {
55-
mMin = index;
56-
mMax = index;
57-
} else {
58-
if ( index < mMin ) mMin = index;
59-
if ( index > mMax ) mMax = index;
60-
}
61-
62-
if ( mDiscrete.size() <= index ) {
63-
mDiscrete.resize ( index + 1 );
64-
}
65-
66-
mDiscrete[index].c1 = c1;
67-
mDiscrete[index].c2 = c2;
68-
mDiscrete[index].c3 = c3;
69-
mDiscrete[index].c4 = c4;
54+
if ( mDiscrete.size() == 0 ) {
55+
mMin = index;
56+
mMax = index;
57+
} else {
58+
if ( index < mMin ) mMin = index;
59+
if ( index > mMax ) mMax = index;
60+
}
61+
62+
if ( mDiscrete.size() <= index ) {
63+
mDiscrete.resize ( index + 1 );
64+
}
65+
66+
mDiscrete[index].c1 = c1;
67+
mDiscrete[index].c2 = c2;
68+
mDiscrete[index].c3 = c3;
69+
mDiscrete[index].c4 = c4;
7070
}
7171

7272
void QgsColorTable::clear()
7373
{
74-
QgsDebugMsg("QgsColorTable::clear() called ");
75-
mDiscrete.clear();
76-
mRamp.clear();
77-
mMax=0;
78-
mMin=0;
74+
QgsDebugMsg("QgsColorTable::clear() called ");
75+
mDiscrete.clear();
76+
mRamp.clear();
77+
mMax=0;
78+
mMin=0;
7979
}
8080

8181

8282
void QgsColorTable::add ( double min, double max,
83-
unsigned char min_c1, unsigned char min_c2, unsigned char min_c3, unsigned char min_c4,
83+
unsigned char min_c1, unsigned char min_c2, unsigned char min_c3, unsigned char min_c4,
8484
unsigned char max_c1, unsigned char max_c2, unsigned char max_c3, unsigned char max_c4 )
8585
{
86-
RAMP ramp;
86+
RAMP ramp;
8787
#ifdef QGISDEBUG
88-
QgsLogger::debug("QgsColorTable::add() min", min, 1, __FILE__, __FUNCTION__, __LINE__);
89-
QgsLogger::debug("QgsColorTable::add() max", max, 1, __FILE__, __FUNCTION__, __LINE__);
88+
QgsLogger::debug("QgsColorTable::add() min", min, 1, __FILE__, __FUNCTION__, __LINE__);
89+
QgsLogger::debug("QgsColorTable::add() max", max, 1, __FILE__, __FUNCTION__, __LINE__);
9090
#endif
9191

92-
if ( mRamp.size() == 0 ) {
93-
mMin = min;
94-
mMax = max;
95-
} else {
96-
if ( min < mMin ) mMin = min;
97-
if ( max > mMax ) mMax = max;
98-
}
99-
100-
ramp.min = min;
101-
ramp.max = max;
102-
ramp.min_c1 = min_c1;
103-
ramp.min_c2 = min_c2;
104-
ramp.min_c3 = min_c3;
105-
ramp.min_c4 = min_c4;
106-
ramp.max_c1 = max_c1;
107-
ramp.max_c2 = max_c2;
108-
ramp.max_c3 = max_c3;
109-
ramp.max_c4 = max_c4;
110-
111-
mRamp.push_back ( ramp );
92+
if ( mRamp.size() == 0 ) {
93+
mMin = min;
94+
mMax = max;
95+
} else {
96+
if ( min < mMin ) mMin = min;
97+
if ( max > mMax ) mMax = max;
98+
}
99+
100+
ramp.min = min;
101+
ramp.max = max;
102+
ramp.min_c1 = min_c1;
103+
ramp.min_c2 = min_c2;
104+
ramp.min_c3 = min_c3;
105+
ramp.min_c4 = min_c4;
106+
ramp.max_c1 = max_c1;
107+
ramp.max_c2 = max_c2;
108+
ramp.max_c3 = max_c3;
109+
ramp.max_c4 = max_c4;
110+
111+
mRamp.push_back ( ramp );
112112
}
113113

114114
bool QgsColorTable::color ( double value, int *c1, int *c2, int *c3 )
115115
{
116-
if ( mRamp.size() > 0 ) {
117-
std::vector<RAMP>::iterator it;
118-
119-
RAMP ramp;
120-
ramp.min = ramp.max = value;
121-
122-
it = std::lower_bound ( mRamp.begin(), mRamp.end(), ramp, compareRampSearch );
123-
124-
if ( it != mRamp.end() ) { // Found
125-
double k, d;
126-
d = it->max - it->min;
127-
128-
if ( d <= 0 ) {
129-
k = 0;
130-
} else {
131-
k = (value - it->min)/d;
132-
}
133-
134-
*c1 = (int) (it->min_c1 + k * (it->max_c1 - it->min_c1));
135-
*c2 = (int) (it->min_c2 + k * (it->max_c2 - it->min_c2));
136-
*c3 = (int) (it->min_c3 + k * (it->max_c3 - it->min_c3));
137-
138-
return true;
139-
}
140-
} else if ( mDiscrete.size() > 0 ) {
141-
uint index = (uint) value;
142-
if ( index < mDiscrete.size() ) {
143-
*c1 = mDiscrete[index].c1;
144-
*c2 = mDiscrete[index].c2;
145-
*c3 = mDiscrete[index].c3;
146-
return true;
147-
}
116+
if ( mRamp.size() > 0 ) {
117+
QVector<RAMP>::iterator it;
118+
119+
RAMP ramp;
120+
ramp.min = ramp.max = value;
121+
122+
it = qLowerBound ( mRamp.begin(), mRamp.end(), ramp, compareRampSearch );
123+
124+
if ( it != mRamp.end() ) { // Found
125+
double k, d;
126+
d = it->max - it->min;
127+
128+
if ( d <= 0 ) {
129+
k = 0;
130+
} else {
131+
k = (value - it->min)/d;
132+
}
133+
134+
*c1 = (int) (it->min_c1 + k * (it->max_c1 - it->min_c1));
135+
*c2 = (int) (it->min_c2 + k * (it->max_c2 - it->min_c2));
136+
*c3 = (int) (it->min_c3 + k * (it->max_c3 - it->min_c3));
137+
138+
return true;
148139
}
140+
} else if ( mDiscrete.size() > 0 ) {
141+
int index = (uint) value;
142+
if ( index < mDiscrete.size() ) {
143+
*c1 = mDiscrete[index].c1;
144+
*c2 = mDiscrete[index].c2;
145+
*c3 = mDiscrete[index].c3;
146+
return true;
147+
}
148+
}
149149

150-
*c1 = 0; *c2 = 0; *c3 = 0;
151-
return false;
150+
*c1 = 0; *c2 = 0; *c3 = 0;
151+
return false;
152152
}
153153

154154
void QgsColorTable::sort ( void )
155155
{
156-
std::sort ( mRamp.begin(), mRamp.end(), compareRampSort );
156+
qSort ( mRamp.begin(), mRamp.end(), compareRampSort );
157157
}
158158

159159
bool QgsColorTable::defined ( void )
160160
{
161-
if ( mDiscrete.size() > 0 || mRamp.size() > 0 ) {
162-
return true;
163-
}
164-
return false;
161+
if ( mDiscrete.size() > 0 || mRamp.size() > 0 ) {
162+
return true;
163+
}
164+
return false;
165165
}
166166

167167
int QgsColorTable::interpretation ( void )
168168
{
169-
return mInterp;
169+
return mInterp;
170170
}
171171

172172
double QgsColorTable::rmin ( void )
173173
{
174-
return mMin;
174+
return mMin;
175175
}
176176

177177
double QgsColorTable::rmax ( void )
178178
{
179-
return mMax;
179+
return mMax;
180180
}
181181

182182

183183
void QgsColorTable::print ( void )
184184
{
185185
#ifdef QGISDEBUG
186-
QgsLogger::debug("******** Color table ********", 1, __FILE__, __FUNCTION__, __LINE__);
187-
QgsLogger::debug("Discrete table size", (int)mDiscrete.size(), 1, __FILE__, __FUNCTION__, __LINE__);
188-
189-
for ( uint i = 0; i < mDiscrete.size(); i++ ) {
190-
QgsLogger::debug("i", (int)i, 2, __FILE__, __FUNCTION__, __LINE__);
191-
QgsLogger::debug("c1", (int) mDiscrete[i].c1, 2, __FILE__, __FUNCTION__, __LINE__);
192-
QgsLogger::debug("c2", (int) mDiscrete[i].c2, 2, __FILE__, __FUNCTION__, __LINE__);
193-
QgsLogger::debug("c3", (int) mDiscrete[i].c3, 2, __FILE__, __FUNCTION__, __LINE__);
194-
}
195-
196-
QgsLogger::debug("Ramp table size", (int)mRamp.size(), 1, __FILE__, __FUNCTION__, __LINE__);
197-
for ( uint i = 0; i < mRamp.size(); i++ ) {
198-
std::cerr << " min = " << mRamp[i].min << " max = " << mRamp[i].max
199-
<< " min_c1 = " << (int)mRamp[i].min_c1 << " min_c2 = " << (int)mRamp[i].min_c2
200-
<< " min_c3 = " << (int)mRamp[i].min_c3 << " max_c1 = " << (int)mRamp[i].max_c1
201-
<< " max_c2 = " << (int)mRamp[i].max_c2 << " max_c3 = " << (int)mRamp[i].max_c3
202-
<< std::endl;
203-
QgsLogger::debug("min", mRamp[i].min, 2, __FILE__, __FUNCTION__, __LINE__);
204-
QgsLogger::debug("min_c1", (int)mRamp[i].min_c1, 2, __FILE__, __FUNCTION__, __LINE__);
205-
QgsLogger::debug("min_c2", (int)mRamp[i].min_c2, 2, __FILE__, __FUNCTION__, __LINE__);
206-
QgsLogger::debug("min_c3", (int)mRamp[i].min_c3, 2, __FILE__, __FUNCTION__, __LINE__);
207-
QgsLogger::debug("max_c1", (int)mRamp[i].max_c1, 2, __FILE__, __FUNCTION__, __LINE__);
208-
QgsLogger::debug("max_c2", (int)mRamp[i].max_c2, 2, __FILE__, __FUNCTION__, __LINE__);
209-
QgsLogger::debug("max_c3", (int)mRamp[i].max_c3, 2, __FILE__, __FUNCTION__, __LINE__);
210-
}
186+
QgsLogger::debug("******** Color table ********", 1, __FILE__, __FUNCTION__, __LINE__);
187+
QgsLogger::debug("Discrete table size", (int)mDiscrete.size(), 1, __FILE__, __FUNCTION__, __LINE__);
188+
189+
for ( int i = 0; i < mDiscrete.size(); i++ ) {
190+
QgsLogger::debug("i", (int)i, 2, __FILE__, __FUNCTION__, __LINE__);
191+
QgsLogger::debug("c1", (int) mDiscrete[i].c1, 2, __FILE__, __FUNCTION__, __LINE__);
192+
QgsLogger::debug("c2", (int) mDiscrete[i].c2, 2, __FILE__, __FUNCTION__, __LINE__);
193+
QgsLogger::debug("c3", (int) mDiscrete[i].c3, 2, __FILE__, __FUNCTION__, __LINE__);
194+
}
195+
196+
QgsLogger::debug("Ramp table size", (int)mRamp.size(), 1, __FILE__, __FUNCTION__, __LINE__);
197+
for ( int i = 0; i < mRamp.size(); i++ ) {
198+
std::cerr << " min = " << mRamp[i].min << " max = " << mRamp[i].max
199+
<< " min_c1 = " << (int)mRamp[i].min_c1 << " min_c2 = " << (int)mRamp[i].min_c2
200+
<< " min_c3 = " << (int)mRamp[i].min_c3 << " max_c1 = " << (int)mRamp[i].max_c1
201+
<< " max_c2 = " << (int)mRamp[i].max_c2 << " max_c3 = " << (int)mRamp[i].max_c3
202+
<< std::endl;
203+
QgsLogger::debug("min", mRamp[i].min, 2, __FILE__, __FUNCTION__, __LINE__);
204+
QgsLogger::debug("min_c1", (int)mRamp[i].min_c1, 2, __FILE__, __FUNCTION__, __LINE__);
205+
QgsLogger::debug("min_c2", (int)mRamp[i].min_c2, 2, __FILE__, __FUNCTION__, __LINE__);
206+
QgsLogger::debug("min_c3", (int)mRamp[i].min_c3, 2, __FILE__, __FUNCTION__, __LINE__);
207+
QgsLogger::debug("max_c1", (int)mRamp[i].max_c1, 2, __FILE__, __FUNCTION__, __LINE__);
208+
QgsLogger::debug("max_c2", (int)mRamp[i].max_c2, 2, __FILE__, __FUNCTION__, __LINE__);
209+
QgsLogger::debug("max_c3", (int)mRamp[i].max_c3, 2, __FILE__, __FUNCTION__, __LINE__);
210+
}
211211
#endif
212212
}
213-

‎src/core/raster/qgscolortable.h

Lines changed: 68 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717
#ifndef QGSCOLORTABLE_H
1818
#define QGSCOLORTABLE_H
1919

20-
#include <vector>
21-
#include <algorithm>
20+
#include <QVector>
2221

2322
/*
2423
* Because of performance, this class can store color rules in 2 forms:
@@ -43,79 +42,79 @@ typedef struct {
4342
class CORE_EXPORT QgsColorTable
4443
{
4544
public:
46-
/**
47-
* \brief Constructor.
48-
* \param interp color table interpretation
49-
*/
50-
QgsColorTable ( int interp = Rgb );
51-
52-
/** \brief The destuctor. */
53-
~QgsColorTable();
54-
55-
/** \brief Color table interpretation. */
56-
// This is taken from GDAL, GPI_RGB is mapped to Rgba
57-
enum Interp {
58-
Gray = 0, // Use c1 as grayscale value.
59-
Rgb, // Use c1 as red, c2 as green, c3 as blue
60-
Rgba, // Use c1 as red, c2 as green, c3 as blue and c4 as alpha.
61-
Cmyk, // Use c1 as cyan, c2 as magenta, c3 as yellow and c4 as black.
62-
Hls // c1 hue, c2 lightness, c3 saturation; should be His ?
63-
};
64-
65-
/**
66-
* \brief Color table is defined
67-
* \return true if at least one rule is defined
68-
* \false no rule defined
69-
*/
70-
bool defined ( void );
71-
72-
/** \brief Get color table interpretation */
73-
int interpretation ( void );
74-
75-
/** \brief Add a discrete color */
76-
void add ( unsigned int index, unsigned char c1, unsigned char c2, unsigned char c3, unsigned char c4 = 0 );
77-
78-
/** \brief Add a ramp rule */
79-
void add ( double min, double max,
80-
unsigned char min_c1, unsigned char min_c2, unsigned char min_c3, unsigned char min_c4,
81-
unsigned char max_c1, unsigned char max_c2, unsigned char max_c3, unsigned char max_c4);
82-
83-
/** \brief Get color
84-
* \return true color was found
85-
* \return false color was no found
86-
*/
87-
bool color ( double value, int *c1, int *c2, int *c3 );
88-
89-
/** \brief Sort ramp rules */
90-
void sort ( void );
91-
92-
/** \brief Print to stderr - for debuging */
93-
void print ( void );
94-
95-
/** \brief Minimum value */
96-
double rmin();
97-
98-
/** \brief Maximum value */
99-
double rmax();
100-
101-
/** \brief Clear the color table */
102-
void clear();
45+
/**
46+
* \brief Constructor.
47+
* \param interp color table interpretation
48+
*/
49+
QgsColorTable ( int interp = Rgb );
50+
51+
/** \brief The destuctor. */
52+
~QgsColorTable();
53+
54+
/** \brief Color table interpretation. */
55+
// This is taken from GDAL, GPI_RGB is mapped to Rgba
56+
enum Interp {
57+
Gray = 0, // Use c1 as grayscale value.
58+
Rgb, // Use c1 as red, c2 as green, c3 as blue
59+
Rgba, // Use c1 as red, c2 as green, c3 as blue and c4 as alpha.
60+
Cmyk, // Use c1 as cyan, c2 as magenta, c3 as yellow and c4 as black.
61+
Hls // c1 hue, c2 lightness, c3 saturation; should be His ?
62+
};
63+
64+
/**
65+
* \brief Color table is defined
66+
* \return true if at least one rule is defined
67+
* \false no rule defined
68+
*/
69+
bool defined ( void );
70+
71+
/** \brief Get color table interpretation */
72+
int interpretation ( void );
73+
74+
/** \brief Add a discrete color */
75+
void add ( int index, unsigned char c1, unsigned char c2, unsigned char c3, unsigned char c4 = 0 );
76+
77+
/** \brief Add a ramp rule */
78+
void add ( double min, double max,
79+
unsigned char min_c1, unsigned char min_c2, unsigned char min_c3, unsigned char min_c4,
80+
unsigned char max_c1, unsigned char max_c2, unsigned char max_c3, unsigned char max_c4);
81+
82+
/** \brief Get color
83+
* \return true color was found
84+
* \return false color was no found
85+
*/
86+
bool color ( double value, int *c1, int *c2, int *c3 );
87+
88+
/** \brief Sort ramp rules */
89+
void sort ( void );
90+
91+
/** \brief Print to stderr - for debuging */
92+
void print ( void );
93+
94+
/** \brief Minimum value */
95+
double rmin();
96+
97+
/** \brief Maximum value */
98+
double rmax();
99+
100+
/** \brief Clear the color table */
101+
void clear();
103102

104103
private:
105-
/** \brief vector of discrete values */
106-
std::vector<DISCRETE> mDiscrete;
104+
/** \brief vector of discrete values */
105+
QVector<DISCRETE> mDiscrete;
107106

108-
/** \brief vector of ramp rules */
109-
std::vector<RAMP> mRamp;
107+
/** \brief vector of ramp rules */
108+
QVector<RAMP> mRamp;
110109

111-
/** \brief color table interpretation */
112-
int mInterp;
110+
/** \brief color table interpretation */
111+
int mInterp;
113112

114-
/** \brief min value */
115-
double mMin;
113+
/** \brief min value */
114+
double mMin;
116115

117-
/** \brief max value */
118-
double mMax;
116+
/** \brief max value */
117+
double mMax;
119118
};
120119

121120
#endif

0 commit comments

Comments
 (0)
Please sign in to comment.