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 }