1 module rip.concepts.channel; 2 3 private { 4 import std.algorithm; 5 import std.math; 6 7 import rip.concepts.color; 8 } 9 10 /++ 11 Class for working with colors on channel level 12 +/ 13 class Channel { 14 float[2] range; 15 16 /++ +/ 17 uint function(in RGBColor color) getValue; 18 19 /++ +/ 20 RGBColor function( in RGBColor color, 21 in float value) injectValue; 22 23 /++ +/ 24 this( float rangeMin, float rangeMax, 25 uint function(in RGBColor color) func, 26 RGBColor function(in RGBColor color, in float value) colorFunc){ 27 28 range[0] = rangeMin; 29 range[1] = rangeMax; 30 getValue = func; 31 injectValue = colorFunc; 32 } 33 34 /++ +/ 35 T getRangeSize(T)() const { 36 return cast(T)round(range[1] - range[0] + 1); 37 } 38 } 39 40 /++ 41 +/ 42 enum DefaultChannels { 43 44 /++ +/ 45 Red = new Channel( 46 0.0f, 255.0f, 47 (in color) => color.red!int, 48 (in color, in value) => new RGBColor( 49 value, 50 color.green!ubyte, 51 color.blue!ubyte) 52 ), 53 54 /++ +/ 55 Green = new Channel( 56 0.0f, 255.0f, 57 (in color) => color.green!int, 58 (in color, in value) => new RGBColor( 59 color.red!ubyte, 60 value, 61 color.blue!ubyte) 62 ), 63 64 /++ +/ 65 Blue = new Channel( 66 0.0f, 255.0f, 67 (in color) => color.blue!int, 68 (in color, in value) => new RGBColor( 69 color.red!ubyte, 70 color.green!ubyte, 71 value) 72 ), 73 74 /++ +/ 75 Grayscale = new Channel( 76 0.0f, 255.0f, 77 //так-как для построении гистограммы требуется черно-белое изображение, 78 //достаточно узнать только значение одного из каналов 79 (in color) => color.blue!int, 80 (in color, in value) => new RGBColor( 81 value, value, value) 82 ) 83 }