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_NRGBXYZ_HH
00030 # define OLENA_CONVERT_NRGBXYZ_HH
00031
00032 # include <oln/convert/abstract/colorconv.hh>
00033
00034 # include <ntg/color/nrgb.hh>
00035 # include <ntg/color/xyz.hh>
00036 # include <ntg/basics.hh>
00037
00038 # include <sstream>
00039
00046 namespace oln {
00047
00048
00049 using namespace ntg;
00050
00051 namespace convert {
00052
00082 template <unsigned inbits, unsigned outbits>
00083 struct f_nrgb_to_xyz
00084 : public abstract::color_conversion<3, inbits, nrgb_traits,
00085 3, outbits, xyz_traits, f_nrgb_to_xyz<inbits, outbits> >
00086 {
00087 color<3, outbits, xyz_traits>
00088 doit(const color<3, inbits, nrgb_traits>& v) const
00089 {
00090 vec<3, float> in = v.to_float();
00091 vec<3, float> out;
00092 out[xyz_X] =
00093 0.606734 * in[nrgb_R] + 0.173564 * in[nrgb_G] + 0.200112 * in[nrgb_B];
00094
00095 out[xyz_Y] =
00096 0.298839 * in[nrgb_R] + 0.586811 * in[nrgb_G] + 0.114350 * in[nrgb_B];
00097
00098 out[xyz_Z] =
00099 0.0661196 * in[nrgb_G] + 1.11491 * in[nrgb_B];
00100
00101 return out;
00102 }
00103
00104 static std::string
00105 name()
00106 {
00107 std::ostringstream s;
00108 s << "f_nrgb_to_xyz<" << inbits << ", " << outbits << '>';
00109 s.str();
00110 }
00111 };
00112
00119 template <unsigned inbits, unsigned outbits>
00120 color<3, outbits, xyz_traits>
00121 nrgb_to_xyz(const color<3, inbits, nrgb_traits>& v)
00122 {
00123 f_nrgb_to_xyz<inbits, outbits> f;
00124
00125 return f(v);
00126 }
00127
00134 template<unsigned inbits, unsigned outbits>
00135 struct f_xyz_to_nrgb
00136 : public abstract::color_conversion<3, inbits, xyz_traits,
00137 3, outbits, nrgb_traits, f_xyz_to_nrgb<inbits, outbits> >
00138 {
00139 color<3, outbits, nrgb_traits>
00140 doit(const color<3, inbits, xyz_traits>& v) const
00141 {
00142 vec<3, float> in = v.to_float();
00143 vec<3, float> out;
00144 out[nrgb_R] =
00145 1.91049 * in[xyz_X] - 0.532592 * in[xyz_Y] - 0.288284 * in[xyz_Z];
00146 out[nrgb_G] =
00147 - 0.984310 * in[xyz_X] + 1.99845 * in[xyz_Y] - 0.0282980 * in[xyz_Z];
00148 out[nrgb_B] =
00149 0.0583744 * in[xyz_X] - 0.118518 * in[xyz_Y] + 0.898611 * in[xyz_Z];
00150 return out;
00151 }
00152
00153 static std::string
00154 name()
00155 {
00156 std::ostringstream s;
00157 s << "f_xyz_to_nrgb<" << inbits << ", " << outbits << '>';
00158 s.str();
00159 }
00160 };
00161
00162
00169 template <unsigned inbits, unsigned outbits>
00170 color<3, outbits, nrgb_traits>
00171 xyz_to_nrgb(const color<3, inbits, xyz_traits>& v)
00172 {
00173 f_xyz_to_nrgb<inbits, outbits> f;
00174
00175 return f(v);
00176 }
00177
00178 }
00179 }
00180
00181 #endif // OLENA_CONVERT_NRGBXYZ_HH