-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcolorgradient.cpp
49 lines (35 loc) · 1.15 KB
/
colorgradient.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// Copyright © 2016 Mikko Ronkainen <[email protected]>
// License: MIT, see the LICENSE file.
#include "colorgradient.h"
#include <cassert>
void ColorGradient::addSegment(const Color& start, const Color& end, uint32_t length)
{
assert(length >= 1);
ColorGradientSegment segment;
segment.startColor = start;
segment.endColor = end;
segment.startIndex = totalLength;
segment.endIndex = totalLength + length;
segments.push_back(segment);
segmentCount = uint32_t(segments.size());
totalLength += length;
}
Color ColorGradient::getColor(float alpha) const
{
assert(alpha >= 0.0f && alpha <= 1.0f);
Color result;
uint32_t index = uint32_t(ceil(alpha * totalLength));
for (uint32_t i = 0; i < segmentCount; ++i)
{
const ColorGradientSegment& segment = segments[i];
if (index >= segment.startIndex && index <= segment.endIndex)
{
float alphaStart = segment.startIndex / float(totalLength);
float alphaEnd = segment.endIndex / float(totalLength);
float segmentAlpha = (alpha - alphaStart) / (alphaEnd - alphaStart);
result = Color::lerp(segment.startColor, segment.endColor, segmentAlpha);
break;
}
}
return result;
}