00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef OLENA_CONVERT_RGBXYZ_HH
00030 # define OLENA_CONVERT_RGBXYZ_HH
00031
00032 # include <oln/convert/abstract/colorconv.hh>
00033
00034 # include <ntg/color/rgb.hh>
00035 # include <ntg/color/xyz.hh>
00036 # include <ntg/basics.hh>
00037
00038 # include <sstream>
00039
00046 namespace oln {
00047
00048 using namespace ntg;
00049
00050 namespace convert {
00051
00052
00053
00054
00055
00056 template <unsigned inbits, unsigned outbits>
00057 struct f_rgb_to_xyz
00058 : public abstract::color_conversion<3, inbits, rgb_traits,
00059 3, outbits, xyz_traits, f_rgb_to_xyz <inbits, outbits> >
00060 {
00061 color<3, outbits, xyz_traits>
00062 doit(const color<3, inbits, rgb_traits>& v) const
00063 {
00064 vec<3, float> in = v.to_float();
00065 vec<3, float> out;
00066 out[xyz_X] = 0.490 * in[rgb_R] + 0.310 * in[rgb_G] + 0.200 * in[rgb_B];
00067 out[xyz_Y] = 0.177 * in[rgb_R] + 0.812 * in[rgb_G] + 0.011 * in[rgb_B];
00068 out[xyz_Z] = 0.010 * in[rgb_G] + 0.990 * in[rgb_B];
00069 return out;
00070 }
00071
00072 static std::string
00073 name()
00074 {
00075 std::ostringstream s;
00076 s << "f_rgb_to_xyz<" << inbits << ", " << outbits << '>';
00077 s.str();
00078 }
00079 };
00080
00081
00082
00083
00084
00085
00086 template <unsigned inbits, unsigned outbits>
00087 color<3, outbits, xyz_traits>
00088 rgb_to_xyz(const color<3, inbits, rgb_traits>& v)
00089 {
00090 f_rgb_to_xyz<inbits, outbits> f;
00091
00092 return f(v);
00093 }
00094
00095
00096
00097
00098
00099 template <unsigned inbits, unsigned outbits>
00100 struct f_xyz_to_rgb
00101 : public abstract::color_conversion<3, inbits, xyz_traits,
00102 3, outbits, rgb_traits, f_xyz_to_rgb <inbits, outbits> >
00103 {
00104 color<3, outbits, rgb_traits>
00105 doit(const color<3, inbits, xyz_traits>& v) const
00106 {
00107 vec<3, float> in = v.to_float();
00108 vec<3, float> out;
00109 out[rgb_R] =
00110 2.365 * in[xyz_X] - 0.896 * in[xyz_Y] - 0.468 * in[xyz_Z];
00111 out[rgb_G] =
00112 - 0.515 * in[xyz_X] + 1.425 * in[xyz_Y] + 0.089 * in[xyz_Z];
00113 out[rgb_B] =
00114 0.005 * in[xyz_X] - 0.014 * in[xyz_Y] + 1.01 * in[xyz_Z];
00115 return out;
00116 }
00117
00118 static std::string
00119 name()
00120 {
00121 std::ostringstream s;
00122 s << "f_xyz_to_rgb<" << inbits << ", " << outbits << '>';
00123 s.str();
00124 }
00125 };
00126
00127
00128
00129
00130
00131 template <unsigned inbits, unsigned outbits>
00132 color<3, outbits, rgb_traits>
00133 xyz_to_rgb(const color<3, outbits, xyz_traits>& v)
00134 {
00135 f_xyz_to_rgb<inbits, outbits> f;
00136
00137 return f(v);
00138 }
00139
00140 }
00141 }
00142
00143 #endif // OLENA_CONVERT_RGBXYZ_HH