root/gilx/trunk/include/i3dea/gil/remove_pixel.hpp

Revision 6, 3.5 KB (checked in by anonymous, 13 months ago)
  • Property svn:mime-type set to text/plain
Line 
1/*
2 *   Boost Software License - Version 1.0 - August 17th, 2003
3 *
4 *  Permission is hereby granted, free of charge, to any person or organization
5 *  obtaining a copy of the software and accompanying documentation covered by
6 *  this license (the "Software") to use, reproduce, display, distribute,
7 *  execute, and transmit the Software, and to prepare derivative works of the
8 *  Software, and to permit third-parties to whom the Software is furnished to
9 *  do so, all subject to the following:
10 *
11 *  The copyright notices in the Software and this entire statement, including
12 *  the above license grant, this restriction and the following disclaimer,
13 *  must be included in all copies of the Software, in whole or in part, and
14 *  all derivative works of the Software, unless such copies or derivative
15 *  works are solely in the form of machine-executable object code generated by
16 *  a source language processor.
17 *
18 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 *  FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
21 *  SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
22 *  FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
23 *  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 *  DEALINGS IN THE SOFTWARE.
25 */
26
27///@file remove_pixel.hpp
28///@since Aug 18, 2008
29///@author yoyohead
30///
31
32#pragma once
33#ifndef REMOVE_PIXEL_HPP_INCLUDED
34#define REMOVE_PIXEL_HPP_INCLUDED
35
36
37
38namespace i3dea{
39namespace detail{
40
41template<class Pixel>
42struct remove_pixelbased_deref :
43    boost::gil::deref_base<
44        remove_pixelbased_deref<const Pixel>,
45        typename boost::gil::kth_element_type<Pixel,0> ::type,
46        typename boost::gil::kth_element_reference_type<Pixel,0>::type,
47        typename boost::gil::kth_element_const_reference_type<Pixel,0>::type,
48        Pixel&,
49        typename boost::gil::kth_element_reference_type<Pixel,0>::type,
50        boost::is_const<Pixel>::value
51    >
52{
53    //This is a unary function
54    typedef
55        typename boost::gil::kth_element_reference_type<Pixel,0>::type
56            result_type;
57    typedef Pixel& argument_type;
58
59    //This is also a metafunction. (Like boost::int_, etc.)
60    typedef remove_pixelbased_deref<Pixel> type;
61
62    result_type operator()(Pixel & pix) const {
63        return boost::gil::at_c<0>(pix);
64    }
65};
66} //detail
67
68namespace result_of{
69
70    ///@brief Metafunction that returns the view type for the single
71    ///       element of a gray view.
72    template<class ViewOrLoc>
73    struct remove_pixelbased:
74        ViewOrLoc::template add_deref<
75            typename detail::remove_pixelbased_deref<
76                typename ViewOrLoc::value_type
77            >::type
78        >
79    {};
80}
81
82///\brief Remove the 'pixelbased' wrapper from a view or locator to asingle channel pixel.
83///
84/// Once the 'pixelbased' wrapper is removed, the view is no longer 'PixelBased'
85/// and its value type is the first element of the pixel.
86///
87template<class ViewOrLoc>
88inline
89typename result_of::remove_pixelbased<ViewOrLoc>::type
90remove_pixelbased(ViewOrLoc src)
91{
92    typedef
93        typename detail::remove_pixelbased_deref<
94            typename ViewOrLoc::value_type
95        >::type
96        deref_fn;
97
98    return result_of::remove_pixelbased<ViewOrLoc>::make(src, deref_fn() );
99}
100
101} //i3dea
102
103
104
105#endif //REMOVE_PIXEL_HPP_INCLUDED
106
107
Note: See TracBrowser for help on using the browser.