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_RGBNRGB_HH
00030 # define OLENA_CONVERT_RGBNRGB_HH
00031
00032 # include <oln/convert/abstract/colorconv.hh>
00033
00034 # include <ntg/color/rgb.hh>
00035 # include <ntg/color/nrgb.hh>
00036 # include <ntg/basics.hh>
00037
00038 # include <sstream>
00039
00046 namespace oln {
00047
00048 using namespace ntg;
00049
00050 namespace convert {
00051
00056 template<unsigned inbits, unsigned outbits>
00057 struct f_rgb_to_nrgb
00058 : public abstract::color_conversion<3, inbits, rgb_traits,
00059 3, outbits, nrgb_traits, f_rgb_to_nrgb<inbits, outbits> >
00060 {
00061 color<3, outbits, nrgb_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[nrgb_R] =
00067 + 0.8417270*in[rgb_R] + 0.1560987*in[rgb_G] + 0.0906747*in[rgb_B];
00068 out[nrgb_G] =
00069 - 0.1290152*in[rgb_R] + 1.3189264*in[rgb_G] - 0.2031832*in[rgb_B];
00070 out[nrgb_B] =
00071 + 0.0074943*in[rgb_R] - 0.0688480*in[rgb_G] + 0.8972327*in[rgb_B];
00072 return out;
00073 }
00074
00075 static std::string
00076 name()
00077 {
00078 std::ostringstream s;
00079 s << "f_rgb_to_nrgb<" << inbits << ", " << outbits << '>';
00080 s.str();
00081 }
00082 };
00083
00088 template <unsigned inbits, unsigned outbits>
00089 color<3, outbits, nrgb_traits>
00090 rgb_to_nrgb(const color<3, inbits, rgb_traits>& v)
00091 {
00092 f_rgb_to_nrgb<inbits, outbits> f;
00093
00094 return f(v);
00095 }
00096
00101 template <unsigned inbits, unsigned outbits>
00102 struct f_nrgb_to_rgb
00103 : public abstract::color_conversion<3, inbits, nrgb_traits,
00104 3, outbits, rgb_traits, f_nrgb_to_rgb<inbits, outbits> >
00105 {
00106 color<3, outbits, rgb_traits>
00107 doit(const color<3, inbits, nrgb_traits>& v) const
00108 {
00109 vec<3, float> in = v.to_float();
00110 vec<3, float> out;
00111 out[rgb_R] =
00112 + 1.167 * in[nrgb_R] - 0.146 * in[nrgb_G] - 0.151 * in[nrgb_B];
00113 out[rgb_G] =
00114 + 0.114 * in[nrgb_R] + 0.753 * in[nrgb_G] + 0.159 * in[nrgb_B];
00115 out[rgb_B] =
00116 - 0.001 * in[nrgb_R] + 0.059 * in[nrgb_G] + 1.128 * in[nrgb_B];
00117 return out;
00118 }
00119
00120 static std::string
00121 name()
00122 {
00123 std::ostringstream s;
00124 s << "f_nrgb_to_rgb<" << inbits << ", " << outbits << '>';
00125 s.str();
00126 }
00127 };
00128
00133 template <unsigned inbits, unsigned outbits>
00134 color<3, outbits, rgb_traits>
00135 nrgb_to_rgb(const color<3, inbits, nrgb_traits>& v)
00136 {
00137 f_nrgb_to_rgb<inbits, outbits> f;
00138
00139 return f(v);
00140 }
00141
00142 }
00143 }
00144
00145 #endif // OLENA_CONVERT_RGBNRGB_HH