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 }