1 module magicalrainbows.gradient;
2 
3 import magicalrainbows.formats;
4 import magicalrainbows.utils;
5 
6 struct Gradient {
7 	ulong index;
8 	ulong count;
9 	RGB888 start;
10 	RGB888 end;
11 	RGB888 front;
12 	void popFront() @safe pure {
13 		index++;
14 		double redInc = ((cast(double)end.red - cast(double)start.red) / cast(double)(count-1));
15 		double greenInc = ((cast(double)end.green - cast(double)start.green) / cast(double)(count-1));
16 		double blueInc = ((cast(double)end.blue - cast(double)start.blue) / cast(double)(count-1));
17 		front.red = cast(ubyte)(start.red + redInc * index);
18 		front.green = cast(ubyte)(start.green + greenInc * index);
19 		front.blue = cast(ubyte)(start.blue + blueInc * index);
20 	}
21 	bool empty() @safe pure {
22 		return index >= count;
23 	}
24 	this(T)(T from, T to, ulong steps) if(isColourFormat!T){
25 		count = steps;
26 		start = front = from.convert!RGB888;
27 		end = to.convert!RGB888;
28 	}
29 }
30 ///
31 @safe pure unittest {
32 	import std.algorithm;
33 	import std.range;
34 	assert(Gradient(RGB888(255,0,0), RGB888(0,0,255), 20).equal(
35 		only(
36 			RGB888(255, 0, 0),
37 			RGB888(241, 0, 13),
38 			RGB888(228, 0, 26),
39 			RGB888(214, 0, 40),
40 			RGB888(201, 0, 53),
41 			RGB888(187, 0, 67),
42 			RGB888(174, 0, 80),
43 			RGB888(161, 0, 93),
44 			RGB888(147, 0, 107),
45 			RGB888(134, 0, 120),
46 			RGB888(120, 0, 134),
47 			RGB888(107, 0, 147),
48 			RGB888(93, 0, 161),
49 			RGB888(80, 0, 174),
50 			RGB888(67, 0, 187),
51 			RGB888(53, 0, 201),
52 			RGB888(40, 0, 214),
53 			RGB888(26, 0, 228),
54 			RGB888(13, 0, 241),
55 			RGB888(0, 0, 254)
56 		)
57 	));
58 }