|
Boost : |
Subject: Re: [boost] [GIL] color_convert
From: Christian Henning (chhenning_at_[hidden])
Date: 2010-07-28 21:25:54
Hi there, I'm in Cuda school this week. Please allow me some time to
have a look at this over the weekend.
Regards,
Christian
On Wed, Jul 28, 2010 at 5:49 AM, <fabien.castan_at_[hidden]> wrote:
> Hi,
>
> I use the GIL extension: HSL.
> I need to make conversions from hsl to other colorspaces.
> So I define generic default conversion using intermediate rgb colorspace.
> I define 2 templates:
> * default_color_convert<C1,hsl_t>
> * default_color_convert<hsl_t,C2>
>
> But it creates an ambiguity with rgba_t, because it defines the same thing for rgba_t:
> * default_color_convert<C1,rgba_t>
> * default_color_convert<rgba_t,C2>
>
> So default_color_convert<hsl_t,rgba_t> is ambiguous.
>
> The only solution I see is:
> * to remove default_color_convert<C1,rgba_t>
> * to define gray_t->rgba_t, rgb_t->rgba_t
> * to remove default_color_convert<C1,hsl_t>
> * to define default_color_convert<cmyk_t,C2>
>
> So all colorspaces have to:
> * define a generic conversion to another colorspace using an intermediate rgb colorspace conversion
> * redefine the conversion for colorspaces we want to make a direct conversion
>
> Best regards,
>
> Fabien Castan
>
>
> /// \ingroup ColorConvert
> /// \brief Converting CMYK to any pixel type. Note: Supports homogeneous pixels only.
> ///
> /// Done by an intermediate RGB conversion
> template <typename C2>
> struct default_color_converter_impl<cmyk_t,C2>
> {
> template <typename P1, typename P2>
> void operator()(const P1& src, P2& dst) const
> {
> typedef cmyk_t C1;
> typedef typename channel_type<P1>::type T1;
> typedef typename channel_type<P2>::type T2;
> pixel<T2,rgb_layout_t> tmp;
> default_color_converter_impl<C1,rgb_t>()(src, tmp);
> default_color_converter_impl<rgb_t,C2>()(tmp, dst);
> }
> };
>
>
>
> /*
> /// \ingroup ColorConvert
> /// \brief Converting any pixel type to RGBA. Note: Supports homogeneous pixels only.
> template <typename C1>
> struct default_color_converter_impl<C1,rgba_t> {
> template <typename P1, typename P2>
> void operator()(const P1& src, P2& dst) const {
> typedef typename channel_type<P2>::type T2;
> pixel<T2,rgb_layout_t> tmp;
> default_color_converter_impl<C1,rgb_t>()(src,tmp);
> get_color(dst,red_t()) = get_color(tmp,red_t());
> get_color(dst,green_t())= get_color(tmp,green_t());
> get_color(dst,blue_t()) = get_color(tmp,blue_t());
> get_color(dst,alpha_t())= channel_convert<T2>(alpha_or_max(src));
> }
> };
> */
>
> /// \ingroup ColorConvert
> /// \brief Converting grayscale pixel type to RGBA. Note: Supports homogeneous pixels only.
> template <>
> struct default_color_converter_impl<gray_t,rgba_t> {
> template <typename P1, typename P2>
> void operator()(const P1& src, P2& dst) const
> {
> typedef gray_t C1;
> typedef typename channel_type<P2>::type T2;
> get_color(dst,red_t()) = get_color(src,gray_color_t());
> get_color(dst,green_t())= get_color(src,gray_color_t());
> get_color(dst,blue_t()) = get_color(src,gray_color_t());
> get_color(dst,alpha_t())= channel_convert<T2>(alpha_or_max(src));
> }
> };
>
> /// \ingroup ColorConvert
> /// \brief Converting grayscale pixel type to RGBA. Note: Supports homogeneous pixels only.
> template <>
> struct default_color_converter_impl<rgb_t,rgba_t> {
> template <typename P1, typename P2>
> void operator()(const P1& src, P2& dst) const
> {
> typedef rgb_t C1;
> typedef typename channel_type<P2>::type T2;
> get_color(dst,red_t()) = get_color(src,red_t());
> get_color(dst,green_t())= get_color(src,green_t());
> get_color(dst,blue_t()) = get_color(src,blue_t());
> get_color(dst,alpha_t())= channel_convert<T2>(alpha_or_max(src));
> }
> };
>
> /// \ingroup ColorConvert
> /// \brief Converting RGBA to any pixel type. Note: Supports homogeneous pixels only.
> ///
> /// Done by multiplying the alpha to get to RGB, then converting the RGB to the target pixel type
> /// Note: This may be slower if the compiler doesn't optimize out constructing/destructing a temporary RGB pixel.
> /// Consider rewriting if performance is an issue
> template <typename C2>
> struct default_color_converter_impl<rgba_t,C2> {
> template <typename P1, typename P2>
> void operator()(const P1& src, P2& dst) const {
> typedef typename channel_type<P1>::type T1;
> default_color_converter_impl<rgb_t,C2>()(
> pixel<T1,rgb_layout_t>(channel_multiply(get_color(src,red_t()), get_color(src,alpha_t())),
> channel_multiply(get_color(src,green_t()),get_color(src,alpha_t())),
> channel_multiply(get_color(src,blue_t()), get_color(src,alpha_t())))
> ,dst);
> }
> };
>
>
>
>
>
> /// \ingroup ColorConvert
> /// \brief Converting HSL to any pixel type. Note: Supports homogeneous pixels only.
> ///
> /// Done by an intermediate RGB conversion
> template <typename C2>
> struct default_color_converter_impl<hsl_t,C2>
> {
> template <typename P1, typename P2>
> void operator()(const P1& src, P2& dst) const
> {
> typedef hsl_t C1;
> typedef typename channel_type<P1>::type T1;
> typedef typename channel_type<P2>::type T2;
> pixel<T2,rgb_layout_t> tmp;
> default_color_converter_impl<C1,rgb_t>()(src, tmp);
> default_color_converter_impl<rgb_t,C2>()(tmp, dst);
> }
> };
>
> /// \ingroup ColorConvert
> /// \brief Unfortunately HSL to HSL must be explicitly provided - otherwise we get ambiguous specialization error.
> template <>
> struct default_color_converter_impl<hsl_t,hsl_t>
> {
> template <typename P1, typename P2>
> void operator()(const P1& src, P2& dst) const
> {
> static_for_each(src,dst,default_channel_converter());
> }
> };
>
> _______________________________________________
> Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
>
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk